/* ============================================================
   app.css — the coach app's own component sheet, second link on
   every page after /assets/stica.css.

   Built by merging assets/parts/_shell.css, assets/grid-app.css,
   assets/grid.css, assets/mast.css and every assets/parts/<page>.css
   fragment into one file, then dropping what stica.css (the synced
   copy of the live site's design system) already carries exactly.
   grid.css contributed nothing of its own — it was just
   `@import url('stica.css'); @import url('grid-app.css');`, a
   re-export shim with no rules — so there is nothing from it to
   fold in here; both imports are superseded by this page linking
   stica.css and app.css directly.

   One exact duplicate of a stica.css rule was found and dropped:
   `:root[data-theme="light"]{color-scheme:light;}` (was in
   grid-app.css, byte-identical to stica.css §2). Everything else
   in the source sheets uses this app's own unprefixed component
   names (.mast, .paper, .pill, .chip, .tile, .flow-*, the page-
   local classes below) rather than stica.css's `.st-*` vocabulary,
   so there was very little other overlap to remove — see the
   build note in the work-package for the full comparison.

   A handful of rules were repeated byte-for-byte across two of the
   merged fragments (the settings-drawer chrome duplicated between
   mast.css and coach-dashboard.css, a few survey/hero-strip/frow
   rules shared between two page fragments that used to ship
   separately). Those are deduplicated below, keeping the first
   occurrence; nothing was reworded or reordered otherwise.
   ============================================================ */


/* ============================================================
   SETTINGS DRAWER (assets/parts/_shell.css)
   ============================================================ */

/* Header shell additions (WP-member-app-one-shell step 4). Everything the
   mounted header needs — .st-head, .st-nav, .st-navpanel, .st-btn--pill,
   .st-themetoggle, .st-btnrow, .st-wrap, .st-small — already exists in
   stica.css and is reused unchanged. The one row this app's header adds
   that the site sheet never needed is the identity line inside the account
   panel: plain text (name · email), not a link, sitting in the same
   .st-navpanel <li> list as the "Account settings" anchor. .st-navpanel a
   gets its row height from `display:flex;align-items:center;min-height:
   44px` (stica.css §7.3); a bare <p> doesn't inherit a type selector, so
   it sits flush instead of matching the anchor rows above and below it.
   Same three values, no new ones. */
.st-navpanel li p.st-small{display:flex;align-items:center;min-height:44px;margin:0;}

/* The site puts .st-btn--pill on an <a>. This header has to use a <button> for the
   account control, because it opens a panel rather than going anywhere. A button
   carries the browser's own border and font family where an anchor inherits the
   page's, and that is the entire 4px: every signed-in page measured 72px against
   the site's 68px, while all four public pages, which use anchors, matched exactly.
   This claims no new values, it just gives the button the anchor's box. */
.st-head [data-mast-account]{font-family:inherit;border:0;box-sizing:border-box;}


/* ============================================================
   SHARED APP CHROME (assets/grid-app.css + assets/mast.css)
   ============================================================ */

/* ============================================================
   Sticai coaching app — app-specific components layer
   (loaded after the synced stica.css copy, which now carries the
   shared tokens — data-theme attribute support, --hl-mix, --shadow —
   folded in from this file on 2026-07-20. Only app-only rules and
   the deliberate --amber override remain here.)
   ============================================================ */
:root{
  /* deliberate app override: the coaching app's amber reads lighter than
     the main site's --amber (#9A6207); kept distinct pending a design
     decision on reconciling the two, not an accidental fork. */
  --amber:#8F5A06;
  /* pointer-spotlight coordinates: app-only, not a shared design token.
     initSpotlight() in ui.js lerps these on <html> at runtime; this is
     just the static default so body.spotlight-on has something to read
     before the first pointer move. */
  --sx:50%; --sy:16%;
}

/* ============================================================
   Base
   ============================================================ */
html,body{margin:0;}
/* Let native controls (date/time pickers, their calendar/clock icons,
   scrollbars) render for the active theme, so the picker indicator is not
   dark-on-dark in dark mode. Follows prefers-color-scheme by default and the
   forced data-theme when the user toggles. */
:root{color-scheme:light dark;}
:root[data-theme="dark"]{color-scheme:dark;}
body{
  background:var(--bg);color:var(--ink);
  font-family:var(--sans);line-height:1.6;font-size:16px;
  -webkit-font-smoothing:antialiased;
  background-image:linear-gradient(var(--grid) 1px,transparent 1px),linear-gradient(90deg,var(--grid) 1px,transparent 1px);
  background-size:48px 48px;background-position:-1px -1px;
}
.wrap{max-width:1120px;margin:0 auto;padding:0 20px 90px;}
p{margin:0 0 12px;}
button{font-family:var(--sans);}
:where(button,a,textarea,input):focus-visible{outline:2px solid var(--acc);outline-offset:2px;border-radius:4px;}

/* page masthead */
.mast{position:sticky;top:0;z-index:40;display:flex;align-items:center;justify-content:space-between;gap:14px;
  padding:14px 24px;border-bottom:1px solid var(--line);background:var(--bg);}
.brand{font-weight:700;font-size:24px;letter-spacing:-1px;display:inline-block;width:max-content;white-space:nowrap;
  --logo-hl:color-mix(in srgb, var(--acc) var(--hl-mix), transparent);
  background-image:linear-gradient(var(--logo-hl),var(--logo-hl));
  background-repeat:no-repeat;background-position:left 78%;background-size:100% 52%;
  border-radius:2px;padding:0 4px 1px;}
.brand .dot{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--acc);
  margin-left:2px;vertical-align:baseline;overflow:hidden;font-size:0;}
.brand-link{text-decoration:none;color:inherit;flex:none;}
.mast .tag{font-family:var(--mono);font-size:11px;letter-spacing:1.2px;text-transform:uppercase;color:var(--mut);text-align:right;}
.mast-right{display:flex;align-items:center;gap:12px;}

/* mobile mast: keep the brand a fixed-size, non-wrapping unit (so its
   highlight band always hugs the text line rather than a stretched flex
   box), tighten spacing so brand + icon cluster hold one row down to
   ~390px, and give the right-hand cluster breathing room off the screen
   edge. .mast-right's own children shrink first; if a <nav> inside it
   (the coach dashboard's page-local Dashboard/Schedule pills) still can't
   share the row with the icon cluster, it drops to a deliberate second
   row rather than wrapping mid-pill. */
@media (max-width:480px){
  .mast{padding:10px 14px;gap:8px;}
  .brand{font-size:20px;}
  .mast .tag{display:none;}
  .mast-right{flex-wrap:wrap;justify-content:flex-end;row-gap:6px;gap:8px;padding-right:2px;}
  .mast-right nav{order:3;flex-basis:100%;display:flex;justify-content:flex-end;gap:6px;}
}
.savecue{font-family:var(--mono);font-size:10.5px;letter-spacing:.8px;text-transform:uppercase;color:var(--green);
  opacity:0;transition:opacity .25s;}
.savecue.show{opacity:1;}

/* intro block */
.intro{padding:54px 4px 8px;max-width:640px;}
.intro h1{font-weight:700;font-size:clamp(30px,5vw,44px);letter-spacing:-1.6px;line-height:1.05;margin:0 0 12px;text-wrap:balance;}
.intro p{color:var(--ink2);max-width:58ch;}

/* specimen divider between surfaces */
.spec{display:flex;align-items:baseline;gap:14px;margin:76px 4px 22px;}
.spec .no{font-family:var(--mono);font-size:11px;letter-spacing:1.5px;color:var(--acc-text);white-space:nowrap;}
.spec h2{font-weight:600;font-size:15px;letter-spacing:-.2px;margin:0;white-space:nowrap;}
.spec .why{font-size:13.5px;color:var(--mut);min-width:0;}
.spec::after{content:"";flex:1;height:1px;background:var(--line);align-self:center;min-width:24px;}
@media (max-width:640px){ .spec{flex-wrap:wrap;row-gap:2px;} .spec .why{flex-basis:100%;} }

/* shared idiom */
/* vertical rhythm inside a view (2026-07-20 spacing pass): one rule for the
   whole page. A section kicker always gets clear air above it when it
   follows anything (card, tile grid, hero), and card/tile blocks breathe
   between themselves. No per-element inline margins. */
.screen > * + .kick{margin-top:30px;}
.screen > .paper + .paper,
.screen > .paper + .tilegrid,
.screen > .tilegrid + .paper,
.screen > .tilegrid + .tilegrid{margin-top:30px;}
.kick{font-family:var(--mono);font-size:11px;letter-spacing:1.5px;text-transform:uppercase;color:var(--acc-text);margin:0 0 10px;font-weight:500;}
.kick.mut{color:var(--mut);}
.paper{background:var(--surface);border:1px solid var(--line);border-radius:16px;padding:24px 26px;box-shadow:var(--shadow);
  margin:0 0 var(--s4);}
.pill{display:inline-block;padding:11px 24px;font-size:14.5px;font-weight:600;color:#fff;background:var(--acc-fill);
  border:none;border-radius:999px;cursor:pointer;text-decoration:none;line-height:1.3;}
.pill.sm{padding:8px 17px;font-size:13px;}
.ghost{display:inline-block;padding:10px 20px;font-size:13.5px;font-weight:500;color:var(--ink);background:transparent;
  border:1px solid var(--line2);border-radius:999px;cursor:pointer;text-decoration:none;line-height:1.3;}
.ghost.sm{padding:7px 15px;font-size:12.5px;}
.chip{display:inline-flex;align-items:center;gap:6px;font-family:var(--mono);font-size:10px;letter-spacing:.5px;
  text-transform:uppercase;padding:4px 9px;border-radius:5px;white-space:nowrap;}
.chip .d{width:6px;height:6px;border-radius:50%;background:currentColor;flex:none;}
.chip.ok{background:var(--green-bg);color:var(--green);}
.chip.warn{background:var(--amber-bg);color:var(--amber);}
.chip.info{background:var(--cobalt-bg);color:var(--cobalt);}
.chip.plain{background:transparent;color:var(--mut);border:1px solid var(--line);}
.bar{height:4px;background:var(--line);border-radius:99px;overflow:hidden;}
.bar .fill{height:100%;background:var(--acc);border-radius:99px;transition:width .5s cubic-bezier(.2,.85,.25,1);}
.hand{font-family:var(--hand);font-weight:700;}
.stamp{font-family:var(--mono);font-size:10.5px;letter-spacing:.8px;text-transform:uppercase;color:var(--mut);}
.mono{font-family:var(--mono);}

/* ============================================================
   Surface 1 — coachee home (phone-width, coach-branded teal)
   ============================================================ */
.phone-col{max-width:460px;margin:0 auto;}
.coachee{border:1px solid var(--line);border-radius:22px;background:var(--bg);overflow:hidden;box-shadow:var(--shadow);}
.coachee .apphead{display:flex;align-items:center;justify-content:space-between;gap:10px;
  padding:14px 20px;border-bottom:1px solid var(--line);background:var(--bg);}
.coachee .apphead .brand{font-size:21px;}
.coachee .avatar{width:32px;height:32px;border-radius:50%;background:var(--acc-fill);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:12.5px;font-weight:600;flex:none;}
.coachee .inner{padding:22px 20px 26px;display:flex;flex-direction:column;gap:16px;}
.coachee h3{font-weight:700;font-size:24px;letter-spacing:-.8px;margin:0 0 2px;}
.next-chip{display:inline-flex;align-items:center;gap:9px;font-family:var(--mono);font-size:11px;letter-spacing:.6px;
  color:var(--ink2);border:1px solid var(--line);background:var(--surface);border-radius:999px;padding:7px 14px;
  margin-top:var(--s3);}
.next-chip .d{width:7px;height:7px;border-radius:50%;background:var(--acc);flex:none;}
.takeaway h4{font-weight:700;font-size:20px;letter-spacing:-.5px;line-height:1.3;margin:0 0 10px;text-wrap:balance;}
.takeaway p{font-size:14.5px;color:var(--ink2);margin:0 0 14px;}
.takeaway .sig{font-family:var(--hand);font-weight:700;font-size:21px;color:var(--acc-text);margin:0;}

/* actions card */
.acts .head{display:flex;align-items:center;justify-content:space-between;gap:16px;margin-bottom:14px;}
.ring{position:relative;width:64px;height:64px;flex:none;}
.ring svg{display:block;width:64px;height:64px;transform:rotate(-90deg);}
.ring .track{fill:none;stroke:var(--line);stroke-width:5;}
.ring .val{fill:none;stroke:var(--acc);stroke-width:5;stroke-linecap:round;
  stroke-dasharray:163.36;transition:stroke-dashoffset .7s cubic-bezier(.2,.85,.25,1);}
.ring .num{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  font-family:var(--mono);font-size:12.5px;font-weight:600;color:var(--ink);letter-spacing:.3px;}
.act{padding:13px 0;border-top:1px solid var(--line);display:flex;gap:12px;align-items:flex-start;}
.act:first-of-type{border-top:none;padding-top:2px;}
.tick{width:24px;height:24px;flex:none;margin-top:1px;border-radius:50%;border:1.5px solid var(--line2);
  background:transparent;cursor:pointer;position:relative;padding:0;}
.tick.done{background:var(--acc-fill);border-color:var(--acc-fill);cursor:default;}
.tick.done::after{content:"";position:absolute;left:7.5px;top:4.5px;width:5px;height:9px;
  border:solid #fff;border-width:0 2px 2px 0;transform:rotate(42deg);}
.act .txt{flex:1;min-width:0;}
.act .txt .t{font-size:14.5px;line-height:1.45;margin:0 0 7px;color:var(--ink);}
.act.kept .txt .t{color:var(--mut);}
.act .meta{display:flex;align-items:center;gap:10px;}
.act .bar{flex:1;}
.moment{display:none;margin-top:12px;padding:12px 15px;border-radius:10px;background:var(--green-bg);
  color:var(--green);font-size:13.5px;line-height:1.45;}
.moment.on{display:block;animation:pop .45s cubic-bezier(.2,.85,.25,1);}
@keyframes pop{0%{transform:scale(.96);opacity:0;}100%{transform:scale(1);opacity:1;}}
.acts .foot{margin-top:14px;display:flex;justify-content:center;}

/* sessions list */
.sess{display:flex;flex-direction:column;}
.sess a{display:flex;align-items:center;gap:12px;padding:12px 2px;border-top:1px solid var(--line);
  text-decoration:none;color:var(--ink);}
.sess a:first-of-type{border-top:none;padding-top:2px;}
.sess .date{font-family:var(--mono);font-size:10.5px;letter-spacing:.5px;color:var(--mut);width:52px;flex:none;line-height:1.5;text-transform:uppercase;}
.sess .t{flex:1;font-size:14.5px;line-height:1.4;min-width:0;}
.sess .arr{color:var(--line2);font-size:16px;flex:none;}

/* message box */
.msg textarea{width:100%;min-height:76px;padding:12px 14px;font:inherit;font-size:14.5px;color:var(--ink);
  border:1px solid var(--line2);border-radius:10px;background:var(--bg);resize:vertical;}
.msg textarea::placeholder{color:var(--mut);}
.msg .row{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-top:10px;}
.msg .hint{font-size:12.5px;color:var(--mut);}
.coachee .foot{padding:20px;border-top:1px solid var(--line);text-align:center;background:var(--surface);}
.coachee .foot .sig{font-family:var(--hand);font-weight:700;font-size:19px;color:var(--ink);margin:0 0 8px;}
.coachee .foot .sub{font-family:var(--mono);font-size:9.5px;letter-spacing:1.2px;text-transform:uppercase;color:var(--mut);}
.brandnote{margin:14px auto 0;max-width:460px;text-align:center;font-size:13px;color:var(--mut);}
.brandnote .sw{display:inline-block;width:10px;height:10px;border-radius:3px;background:#12A6B5;vertical-align:-1px;margin:0 3px;}

/* ============================================================
   Surface 2 — coach dashboard
   ============================================================ */
.dash{display:grid;grid-template-columns:300px 1fr;gap:18px;align-items:start;}
@media (max-width:820px){ .dash{grid-template-columns:1fr;} }
.dash-head{display:flex;align-items:flex-end;justify-content:space-between;gap:16px;flex-wrap:wrap;margin:6px 0 26px;}
.dash-head h3{font-weight:700;font-size:28px;letter-spacing:-1px;margin:0 0 2px;}
.dash-head .sub{font-size:14px;color:var(--mut);margin:6px 0 0;}
.dash-head .kick{margin-bottom:10px;}
.roster{padding:14px;display:flex;flex-direction:column;gap:4px;}
/* Coach console + My templates as compact rows under the roster (they were
   full-width .paper tiles at the page foot; same ids/wiring, quieter frame).
   Each reads as a control, not stray text: bordered row, one-line truncated
   sub, chevron affordance. */
.side-nav{border-top:1px solid var(--line);padding:14px;display:flex;flex-direction:column;gap:8px;}
.side-link{position:relative;padding:11px 34px 11px 13px;border:1px solid var(--line);border-radius:12px;
  cursor:pointer;background:var(--surface);transition:border-color .15s ease;min-width:0;}
.side-link:hover,.side-link:focus-visible{border-color:var(--acc);}
.side-link::after{content:'\203A';position:absolute;right:14px;top:50%;transform:translateY(-50%);
  font-size:18px;line-height:1;color:var(--mut);}
.side-link .kick{margin:0;}
.side-link .sub{font-size:12.5px;color:var(--ink2);margin:4px 0 0;line-height:1.45;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.roster .label{font-family:var(--mono);font-size:10.5px;letter-spacing:1.2px;text-transform:uppercase;color:var(--mut);padding:6px 10px 10px;}
.person{display:flex;align-items:center;gap:11px;padding:11px 12px;border-radius:10px;border-left:3px solid transparent;
  cursor:pointer;background:transparent;border-top:0;border-right:0;border-bottom:0;text-align:left;width:100%;font:inherit;color:var(--ink);}
.person:hover{background:var(--bg);}
.person.sel{background:var(--bg);border-left-color:var(--acc);}
.person .av{width:34px;height:34px;border-radius:50%;flex:none;display:flex;align-items:center;justify-content:center;
  font-size:12px;font-weight:600;color:var(--surface);background:var(--ink2);}
.person.sel .av{background:var(--acc-fill);color:#fff;}
.person .nm{flex:1;min-width:0;}
.person .nm .n{font-size:14.5px;font-weight:600;letter-spacing:-.2px;line-height:1.3;}
.person .nm .r{font-size:12px;color:var(--mut);line-height:1.35;}
.roster .add{margin:10px 10px 6px;}

.detail{display:flex;flex-direction:column;gap:16px;min-width:0;}
.detail-head{display:flex;align-items:flex-start;justify-content:space-between;gap:14px;flex-wrap:wrap;}
.detail-head h4{font-weight:700;font-size:21px;letter-spacing:-.5px;margin:0 0 3px;}
.detail-head .meta{font-family:var(--mono);font-size:11px;letter-spacing:.5px;color:var(--mut);line-height:1.7;}

.draftrow{display:flex;gap:14px;align-items:flex-start;padding:14px 0;border-top:1px solid var(--line);}
.draftrow:first-of-type{border-top:none;padding-top:0;}
.draftrow .txt{flex:1;min-width:0;}
.draftrow .t{font-size:15px;font-weight:600;letter-spacing:-.2px;margin:0 0 3px;}
.draftrow .p{font-size:13.5px;color:var(--mut);margin:0 0 10px;max-width:60ch;}
.draftrow .btns{display:flex;gap:8px;flex-wrap:wrap;align-items:center;}
.gatenote{margin-top:12px;font-family:var(--mono);font-size:10.5px;letter-spacing:.6px;text-transform:uppercase;color:var(--mut);}

.two-col{display:grid;grid-template-columns:1fr 1fr;gap:16px;align-items:start;}
@media (max-width:680px){ .two-col{grid-template-columns:1fr;} }
.list-rows{display:flex;flex-direction:column;}
.lrow{display:flex;align-items:center;gap:10px;padding:10px 0;border-top:1px solid var(--line);}
.lrow:first-of-type{border-top:none;padding-top:2px;}
.lrow .t{flex:1;font-size:13.5px;line-height:1.4;min-width:0;}
.lrow .d{font-family:var(--mono);font-size:10px;letter-spacing:.4px;color:var(--mut);width:46px;flex:none;text-transform:uppercase;line-height:1.5;}

.brain{border-left:3px solid var(--acc);}
.brain .hd{font-family:var(--hand);font-weight:700;font-size:22px;margin:0 0 8px;color:var(--ink);}
.brain p{font-size:14px;color:var(--ink2);margin:0 0 8px;}
.brain .stamp{display:block;margin-top:6px;}

.msgthread{display:flex;flex-direction:column;gap:10px;}
.bubble{max-width:88%;padding:10px 14px;border-radius:12px;font-size:13.5px;line-height:1.5;}
.bubble.them{background:var(--bg);border:1px solid var(--line);align-self:flex-start;border-bottom-left-radius:4px;}
.bubble.me{background:color-mix(in srgb, var(--acc) 10%, var(--surface));border:1px solid color-mix(in srgb, var(--acc) 22%, var(--line));align-self:flex-end;border-bottom-right-radius:4px;}
.bubble .who{font-family:var(--mono);font-size:9.5px;letter-spacing:.8px;text-transform:uppercase;color:var(--mut);display:block;margin-bottom:3px;}

.entries{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;margin-top:16px;}
@media (max-width:820px){ .entries{grid-template-columns:1fr;} }
.entry{display:flex;flex-direction:column;gap:8px;}
.entry .t{font-size:15px;font-weight:600;letter-spacing:-.2px;margin:0;}
.entry .p{font-size:13px;color:var(--mut);margin:0;flex:1;}
.entry .bar{margin:2px 0 4px;}
.swatches{display:flex;gap:8px;align-items:center;margin:2px 0 4px;}
.sw{width:24px;height:24px;border-radius:7px;cursor:pointer;border:2px solid transparent;position:relative;padding:0;}
.sw.sel{border-color:var(--ink);box-shadow:inset 0 0 0 2px var(--surface);}
.drop{border:1.5px dashed var(--line2);border-radius:10px;padding:14px;text-align:center;
  font-family:var(--mono);font-size:10.5px;letter-spacing:.8px;text-transform:uppercase;color:var(--mut);margin:2px 0 4px;}

/* ============================================================
   Surface 3 — coach profile build
   ============================================================ */
.prof-head{max-width:640px;margin:0 0 20px;}
.prof-head h3{font-weight:700;font-size:28px;letter-spacing:-1px;margin:0 0 8px;}
.prof-head p{color:var(--ink2);font-size:15px;}
.onramp{display:grid;grid-template-columns:minmax(0,1.05fr) minmax(0,1fr);gap:18px;align-items:start;margin-bottom:18px;}
@media (max-width:820px){ .onramp{grid-template-columns:1fr;} }
.interview .topbar{margin-bottom:6px;}
.interview .stat{font-family:var(--mono);font-size:11px;color:var(--mut);margin:8px 0 18px;}
.interview h4{font-weight:600;font-size:21px;letter-spacing:-.5px;line-height:1.3;margin:0 0 6px;text-wrap:balance;}
.interview .hint{color:var(--mut);font-size:14px;margin:0 0 16px;}
.interview textarea{width:100%;min-height:120px;padding:12px 14px;font:inherit;font-size:14.5px;color:var(--ink);
  border:1px solid var(--line2);border-radius:10px;background:var(--bg);resize:vertical;}
.interview .btns{display:flex;align-items:center;gap:6px;margin-top:16px;}
.onramp-note{font-size:13.5px;color:var(--mut);max-width:52ch;margin:12px 2px 0;}
.onramp-note .arrow{color:var(--acc-text);}

.seclist{display:flex;flex-direction:column;gap:16px;}
.secgrid{display:grid;grid-template-columns:1fr 1fr;gap:16px;align-items:start;}
@media (max-width:820px){ .secgrid{grid-template-columns:1fr;} }
.psec .top{display:flex;align-items:baseline;justify-content:space-between;gap:12px;margin-bottom:4px;}
.psec .top .kick{margin:0;}
.field{padding:12px 0;border-top:1px solid var(--line);}
.field:first-of-type{border-top:none;}
.field .lab{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:3px;}
.field .lab .l{font-family:var(--mono);font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(--mut);}
.field .lab .edit{font-family:var(--mono);font-size:10px;letter-spacing:.8px;text-transform:uppercase;color:var(--acc-text);
  background:none;border:none;cursor:pointer;padding:0;}
.field .val{font-size:14px;line-height:1.55;color:var(--ink);}
.field .val.mut{color:var(--ink2);}
.langchips{display:flex;gap:6px;margin-top:2px;}
.field.editing textarea{width:100%;min-height:64px;padding:10px 12px;font:inherit;font-size:14px;color:var(--ink);
  border:1px solid var(--acc);border-radius:8px;background:var(--bg);resize:vertical;box-shadow:0 0 0 1px var(--acc);}
.field.editing .ebtns{display:flex;gap:8px;margin-top:8px;align-items:center;}
.field.editing .ebtns .cancel{font-size:12.5px;color:var(--mut);background:none;border:none;cursor:pointer;padding:6px 4px;}
.selfnote{display:flex;align-items:center;gap:8px;margin:2px 0 8px;}

/* footer */
.pagefoot{margin-top:80px;padding-top:22px;border-top:1px solid var(--line);display:flex;justify-content:space-between;gap:14px;flex-wrap:wrap;}
.pagefoot .stamp{line-height:1.8;}

/* ============================================================
   CRAFT LAYER (Sticai Design System v1.0 extension)
   Motion, pointer spotlight, load choreography, tiles, avatars, toast,
   modal/drawer, calendar picker, hero strip, week strip. Ported from the
   approved coaching-UX mockup; paired with assets/ui.js, which installs
   and wires all of this. Every new piece reads from the token blocks
   above, so it works unchanged in both themes.
   ============================================================ */

/* pointer spotlight: a very soft radial wash that follows the pointer.
   Opt in per page by calling initSpotlight() from ui.js, which adds
   .spotlight-on to <body> and lerps --sx/--sy on <html>; pages that never
   call it keep the plain grid background exactly as before. */
@media (pointer:fine){
  body.spotlight-on{
    background-image:
      radial-gradient(640px circle at var(--sx) var(--sy), var(--spot-c1), transparent 62%),
      linear-gradient(var(--grid) 1px,transparent 1px),
      linear-gradient(90deg,var(--grid) 1px,transparent 1px);
    background-attachment:fixed,scroll,scroll;
    background-size:100% 100%,48px 48px,48px 48px;
    background-position:0 0,-1px -1px,-1px -1px;
  }
}

/* load choreography: cascade(rootEl) in ui.js stamps --i on each
   .cascade-item (or [data-cascade]) child, then triggers .cascade-run. */
.cascade-item{opacity:0;transform:translateY(14px);}
.cascade-item.cascade-run{animation:cascadeIn var(--dur-3) var(--ease) forwards;animation-delay:calc(var(--i,0) * 55ms);}
@keyframes cascadeIn{to{opacity:1;transform:translateY(0);}}

/* generic press feedback for the new craft-layer controls */
:where(.icon-btn,.drawer-close,.calpop-day,.caltime,.tile){transition:transform var(--dur-1) var(--ease),
  box-shadow var(--dur-1) var(--ease),border-color var(--dur-1) var(--ease),background var(--dur-1) var(--ease),color var(--dur-1) var(--ease);}
:where(.icon-btn,.drawer-close,.caltime):active{transform:scale(.97);}

/* icon button: round chrome button, e.g. a notifications/settings glyph */
.icon-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;width:36px;height:36px;
  border-radius:50%;border:1px solid var(--line);background:var(--surface);color:var(--ink2);cursor:pointer;padding:0;flex:none;}
.icon-btn:hover{color:var(--ink);border-color:var(--line2);}
.icon-btn .dot{position:absolute;top:6px;right:7px;width:7px;height:7px;border-radius:50%;background:var(--acc);
  border:1.5px solid var(--surface);}

/* ============================================================
   Tile: responsive coachee-grid card with a hover lift and a
   cursor-tracked border glow (attachTileGlow() sets --mx/--my per pointer move)
   ============================================================ */
.tilegrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:14px;}
.tile{position:relative;--mx:50%;--my:50%;overflow:hidden;display:flex;flex-direction:column;gap:10px;
  padding:18px 18px 16px;text-align:left;cursor:pointer;background:var(--surface);border:1px solid var(--line);
  border-radius:14px;box-shadow:var(--shadow);font:inherit;color:inherit;
  transition:border-color var(--dur-2) var(--ease),box-shadow var(--dur-2) var(--ease),transform var(--dur-2) var(--ease);}
.tile:not(.add):hover,.tile:not(.add):focus-visible{border-color:var(--line2);transform:translateY(-3px);
  box-shadow:var(--shadow), 0 16px 30px -12px color-mix(in srgb, var(--acc) 30%, transparent);}
.tile:active{transform:translateY(-1px) scale(.985);}
@media (pointer:fine){
  .tile::before{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;opacity:0;
    background:radial-gradient(180px circle at var(--mx) var(--my), color-mix(in srgb, var(--acc) 65%, transparent), transparent 70%);
    -webkit-mask:linear-gradient(#000 0 0) content-box,linear-gradient(#000 0 0);-webkit-mask-composite:xor;
    mask-composite:exclude;transition:opacity var(--dur-2) var(--ease);}
  .tile:hover::before,.tile:focus-visible::before{opacity:1;}
  .tile.add::before{display:none;}
}
.tile.flash::after{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;
  background:linear-gradient(120deg, transparent 35%, color-mix(in srgb, var(--acc) 32%, transparent) 50%, transparent 65%);
  transform:translateX(-130%);animation:tilesweep 1.1s var(--ease);}
@keyframes tilesweep{to{transform:translateX(130%);}}
.tile .trow{display:flex;align-items:center;gap:11px;}
.tile .av{width:40px;height:40px;border-radius:50%;flex:none;display:flex;align-items:center;justify-content:center;
  font-size:13.5px;font-weight:600;color:#fff;background:var(--ink2);}
.tile .nm{flex:1;min-width:0;}
.tile .nm .n{font-size:15.5px;font-weight:600;letter-spacing:-.2px;line-height:1.3;}
.tile .nm .lang{font-family:var(--mono);font-size:10px;letter-spacing:.6px;color:var(--mut);border:1px solid var(--line);
  border-radius:4px;padding:1px 5px;margin-left:6px;vertical-align:1px;}
.tile .status{font-size:13px;color:var(--mut);margin:0;}
.tile .chiprow{display:flex;justify-content:space-between;align-items:center;gap:8px;}
.tile.add{align-items:center;justify-content:center;border-style:dashed;border-color:var(--line2);box-shadow:none;
  color:var(--mut);min-height:118px;background:transparent;}
.tile.add:hover{color:var(--ink);border-color:var(--acc);transform:none;}
.tile.add .plus{font-size:26px;line-height:1;font-weight:400;}

/* draft-ready pulse dot, e.g. inside a .chip on a tile */
.chip .d.pulse{animation:dotpulse 2.4s ease-in-out infinite;}
@keyframes dotpulse{0%,100%{opacity:1;transform:scale(1);}50%{opacity:.4;transform:scale(.72);}}

/* ============================================================
   Avatar: reusable circle for initials or a photo, three sizes.
   A separate component from the pre-existing .av/.avatar-xl idiom
   (which stays as-is inside .person/.tile/.detail-id) so nothing already
   shipped changes shape; use this one for any new surface.
   ============================================================ */
.avatar{border-radius:50%;flex:none;display:flex;align-items:center;justify-content:center;
  font-weight:600;color:var(--surface);background:var(--ink2);overflow:hidden;}
.avatar img{width:100%;height:100%;object-fit:cover;display:block;}
.avatar.sm{width:28px;height:28px;font-size:11px;}
.avatar.md{width:40px;height:40px;font-size:13.5px;}
.avatar.lg{width:56px;height:56px;font-size:18px;}

/* ============================================================
   Toast: bottom, ephemeral confirmation. toast() in ui.js appends one
   .toast per call into a shared .toast-stack, so overlapping calls queue
   instead of clobbering each other.
   ============================================================ */
.toast-stack{position:fixed;left:50%;bottom:24px;transform:translateX(-50%);z-index:130;
  display:flex;flex-direction:column;align-items:center;gap:8px;pointer-events:none;}
.toast{background:var(--ink);color:var(--bg);font-size:13px;font-weight:600;padding:11px 22px;border-radius:999px;
  box-shadow:var(--shadow);opacity:0;transform:translateY(16px);
  transition:transform var(--dur-2) var(--ease),opacity var(--dur-2) var(--ease);}
.toast.show{opacity:1;transform:translateY(0);}

/* ============================================================
   Modal: scrim + centred card, spring entrance. openModal()/closeModal()
   in ui.js build and tear this down; .scrim is shared with the drawer.
   ============================================================ */
.scrim{position:fixed;inset:0;background:var(--scrim);z-index:100;opacity:1;transition:opacity var(--dur-2) var(--ease);}
.modal{position:fixed;inset:0;z-index:101;display:flex;align-items:center;justify-content:center;padding:20px;}
.modal-card{width:100%;max-width:480px;max-height:88vh;overflow:auto;animation:modalIn var(--dur-3) var(--ease);}
@keyframes modalIn{from{opacity:0;transform:translateY(10px) scale(.96);}to{opacity:1;transform:none;}}

/* ============================================================
   Drawer: right-side panel. openDrawer(el)/closeDrawer() in ui.js show
   the caller's own element as a slide-in drawer with a shared .scrim.
   ============================================================ */
.drawer{position:fixed;top:0;right:0;bottom:0;width:min(420px,92vw);background:var(--surface);
  border-left:1px solid var(--line);z-index:102;overflow-y:auto;box-shadow:-8px 0 30px rgba(20,20,19,.12);
  animation:drawerin var(--dur-3) var(--ease);}
@keyframes drawerin{from{transform:translateX(24px);opacity:.6;}to{transform:none;opacity:1;}}
.drawer-head{display:flex;align-items:center;justify-content:space-between;padding:18px 22px;
  border-bottom:1px solid var(--line);background:var(--surface);}
.drawer-head h3{font-size:18px;font-weight:700;margin:0;letter-spacing:-.3px;}
.drawer-close{background:none;border:none;font-size:20px;color:var(--mut);cursor:pointer;line-height:1;
  padding:6px;min-width:24px;min-height:24px;display:inline-flex;align-items:center;justify-content:center;}
.drawer-close:hover{color:var(--ink);}
.drawer-body{padding:6px 22px 32px;}
/* calibration emphasis: while incomplete, the section reads as the one
   thing worth doing next, not one row among many (2026-07-20) */
.cal-emph{border:1.5px solid var(--acc);border-radius:10px;padding:14px 16px;background:color-mix(in srgb, var(--acc) 6%, var(--surface));}
.cal-emph .bar{height:8px;}
.cal-emph .calwhy{font-size:12.5px;color:var(--ink2);margin:0 0 10px;line-height:1.5;}

/* ============================================================
   Calendar picker: month grid popover + time chips. Rendered by
   calendarPicker() in ui.js; fixed-positioned near its anchor so it
   needs no positioned wrapper from the caller.
   ============================================================ */
.calpop{position:fixed;z-index:103;width:300px;padding:16px 18px;transform-origin:top left;animation:modalIn var(--dur-2) var(--ease);}
.calpop-head{display:flex;justify-content:space-between;align-items:center;font-size:12.5px;font-weight:600;margin-bottom:8px;}
.calpop-head .nav{display:flex;gap:4px;}
.calpop-head button{background:none;border:none;color:var(--ink2);cursor:pointer;padding:4px;font-size:14px;line-height:1;
  border-radius:4px;min-width:24px;min-height:24px;display:inline-flex;align-items:center;justify-content:center;}
.calpop-head button:hover{color:var(--ink);background:var(--grid);}
.calpop-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:3px;text-align:center;}
.calpop-grid .wd{font-family:var(--mono);font-size:9px;color:var(--mut);text-transform:uppercase;padding-bottom:3px;}
.calpop-day{display:block;width:100%;margin:0;font-size:12.5px;padding:5px 0;border-radius:6px;color:var(--ink);
  cursor:pointer;text-align:center;background:none;border:none;}
.calpop-day:hover:not(.sel):not(.mut){background:var(--grid);}
.calpop-day.mut{color:var(--line2);cursor:default;pointer-events:none;}
.calpop-day.sel{background:var(--acc-fill);color:#fff;font-weight:600;}
.calpop-day.pop{animation:daypop .35s var(--ease);}
@keyframes daypop{0%{transform:scale(1);}45%{transform:scale(1.22);}100%{transform:scale(1);}}
.caltime-row{display:flex;align-items:center;gap:10px;margin:12px 0 2px;}
.caltime-lbl{font-family:var(--mono);font-size:10px;letter-spacing:.5px;text-transform:uppercase;color:var(--mut);}
.caltime-input{flex:1;min-width:0;font:inherit;font-size:13px;color:var(--ink);background:var(--bg);
  border:1px solid var(--line2);border-radius:8px;padding:7px 10px;}
.caltime-input:focus{outline:none;border-color:var(--acc);}
.calpop-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:12px;}
.caltimes{display:flex;gap:7px;margin:10px 0 4px;flex-wrap:wrap;}
.caltime{font-family:var(--mono);font-size:11.5px;padding:6px 12px;border-radius:999px;border:1px solid var(--line2);
  background:var(--bg);cursor:pointer;color:var(--ink);}
.caltime.sel{background:var(--acc-fill);border-color:var(--acc-fill);color:#fff;}
.calhint{font-size:11.5px;color:var(--mut);margin:8px 0 0;}

/* ============================================================
   Hero strip: one or two summary cards atop a dashboard
   ============================================================ */
.hero-strip{display:grid;grid-template-columns:1.4fr 1fr;gap:14px;}
@media (max-width:680px){ .hero-strip{grid-template-columns:1fr;} }
.hero-card{display:flex;align-items:center;justify-content:space-between;gap:14px;padding:18px 22px;flex-wrap:wrap;}
.hero-card .htxt{min-width:0;}
.hero-card .k{font-family:var(--mono);font-size:10.5px;letter-spacing:1px;text-transform:uppercase;color:var(--mut);margin:0 0 5px;}
.hero-card .m{font-size:16.5px;font-weight:600;letter-spacing:-.3px;margin:0;}
.hero-card.warn{background:var(--amber-bg);border-color:color-mix(in srgb, var(--amber) 30%, var(--line));cursor:pointer;}
.hero-card.warn .k{color:var(--amber);}
.hero-card.warn .m{color:var(--amber);}

/* ============================================================
   Week strip: 7-day mini schedule
   ============================================================ */
.weekstrip{display:grid;grid-template-columns:repeat(7,1fr);gap:8px;}
.weekday{border:1px solid var(--line);border-radius:10px;padding:9px 8px 10px;background:var(--surface);min-height:78px;}
.weekday .dn{font-family:var(--mono);font-size:10px;letter-spacing:.6px;text-transform:uppercase;color:var(--mut);margin:0 0 6px;}
.weekday.today{border-color:var(--acc);}
.weekday.today .dn{color:var(--acc-text);}
.sessblock{font-size:11px;line-height:1.4;padding:5px 7px;border-radius:6px;background:var(--amber-bg);color:var(--amber);
  margin-bottom:4px;font-weight:600;}
.sessblock.ok{background:var(--green-bg);color:var(--green);}

/* ============================================================
   Reduced motion: one consolidated block. Zeroes every duration, kills
   the spotlight and tile glow, and shows cascade items in their final
   state instantly (covers the pre-existing bar/ring/moment rules too).
   ============================================================ */
@media (prefers-reduced-motion: reduce){
  *,*::before,*::after{
    animation-duration:.001ms !important;
    animation-iteration-count:1 !important;
    transition-duration:.001ms !important;
    scroll-behavior:auto !important;
  }
  .bar .fill,.ring .val{transition:none;}
  .moment.on{animation:none;}
  .cascade-item{opacity:1 !important;transform:none !important;}
  .tile::before{display:none !important;}
  .tile:not(.add):hover,.tile:not(.add):focus-visible{transform:none !important;}
  body.spotlight-on{
    background-image:linear-gradient(var(--grid) 1px,transparent 1px),linear-gradient(90deg,var(--grid) 1px,transparent 1px) !important;
    background-attachment:scroll !important;background-size:48px 48px !important;
  }
}

/* ============================================================
   Coach console + My templates tiles, and the what-is explainers
   (2026-07-20). [data-explain] draws its own ? dot via ::after so
   i18n textContent rewrites never eat it; the tipbox is a single
   floating element driven by delegated pointer events. */
/* .tilegrid dropped here: this second definition already existed
   duplicated inside grid-app.css itself before this file existed
   (confirmed via `git show 1e87993:.../grid-app.css`, lines 357 and 535),
   so it predates the four-page merge this stage exists to fix. Nothing in
   the app currently uses class="tilegrid" (checked across every .html and
   .js file), so it is dead in both forms; kept the first (line ~412) per
   the same "keep when in doubt" rule the rest of this file uses, dropped
   this one rather than inventing a scope for code with no page to own it. */
.navtile{cursor:pointer;transition:border-color .15s ease;}
.navtile:hover,.navtile:focus-visible{border-color:var(--acc);}
.navtile .sub{font-size:13.5px;color:var(--ink2);margin:6px 0 0;line-height:1.5;}
[data-explain]{cursor:help;}
[data-explain]::after{content:'?';display:inline-flex;align-items:center;justify-content:center;
  width:14px;height:14px;border-radius:50%;border:1px solid currentColor;font-size:9px;
  margin-left:7px;vertical-align:1px;opacity:.6;}
.tipbox{position:fixed;z-index:10000;max-width:300px;background:var(--surface);
  border:1px solid var(--acc);border-radius:10px;padding:12px 14px;font-size:13px;
  color:var(--ink);line-height:1.55;box-shadow:var(--shadow);pointer-events:none;}
.tipbox .tt{font-weight:700;margin:0 0 4px;font-size:12.5px;}

/* ============================================================
   Guided asks: the shared flow module (assets/flow.js).
   WP-ask-pattern step 2. One look for every place the product asks
   somebody for something, so a Craft brief and an Apply capture feel
   like the same place.

   A flow is a full page, never a dialog. That is signed, see
   DESIGN-ask-pattern.md. The column is narrow on purpose: one question
   in view, nothing competing with it.

   .cue / .hide / .vh are scoped under .flow rather than promoted to
   the top level, because several pages already define their own with
   different display values. Step 6 (one saved signal, one error style)
   is where those page-local copies collapse into one.
   ============================================================ */
.flow{max-width:640px;margin:0 auto;}
.flow .cue{font-size:13px;color:var(--mut);margin:8px 0 0;display:block;line-height:1.5;}
.flow .cue.err{color:var(--amber);}
.flow .hide{display:none !important;}
.flow .vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0 0 0 0);white-space:nowrap;border:0;}

/* Start screen, review screen and task list all lead with this. */
.flow-title{font-size:27px;font-weight:600;letter-spacing:-.6px;line-height:1.25;margin:0 0 12px;}
.flow-title:focus-visible,.flow-q:focus-visible{outline:2px solid var(--acc);outline-offset:6px;border-radius:4px;}
.flow-title:focus,.flow-q:focus{outline:none;}
.flow-intro{font-size:15px;color:var(--ink2);line-height:1.6;margin:0 0 14px;}
.flow-meta{font-family:var(--mono);font-size:11px;letter-spacing:.8px;text-transform:uppercase;
  color:var(--mut);margin:0 0 16px;}
.flow-preview{margin:0 0 20px;padding:0 0 0 20px;color:var(--ink2);font-size:14px;line-height:1.7;}
.flow-preview li{margin:0 0 3px;}
.flow-resume{font-size:14px;color:var(--ink);background:var(--surface);border:1px solid var(--line);
  border-left:3px solid var(--acc);border-radius:8px;padding:11px 14px;margin:0 0 18px;line-height:1.5;}

/* One question in view. */
.flow-progress{font-family:var(--mono);font-size:11px;letter-spacing:1.2px;text-transform:uppercase;
  color:var(--mut);margin:0 0 10px;}
.flow-optional{font-family:var(--mono);font-size:10px;letter-spacing:1px;text-transform:uppercase;
  color:var(--acc-text);margin:0 0 6px;}
.flow-q{font-size:23px;font-weight:600;letter-spacing:-.4px;line-height:1.3;margin:0 0 8px;}
.flow-q label{display:block;font-size:inherit;font-weight:inherit;color:inherit;margin:0;letter-spacing:inherit;}
.flow-hint{font-size:14px;color:var(--mut);line-height:1.6;margin:0 0 14px;}
.flow-field,.flow-fieldset{border:0;padding:0;margin:0 0 4px;min-width:0;}
.flow-legend{padding:0;width:100%;}
.flow-input{width:100%;box-sizing:border-box;font:400 15px var(--sans);color:var(--ink);
  background:var(--bg);border:1px solid var(--line);border-radius:10px;padding:12px 14px;}
.flow-textarea{resize:vertical;min-height:132px;line-height:1.6;}
.flow-input[aria-invalid="true"]{border-color:var(--amber);}
.flow-options{display:grid;gap:8px;margin-top:6px;}
.flow-option{display:flex;align-items:flex-start;gap:11px;border:1px solid var(--line);border-radius:10px;
  padding:12px 14px;background:var(--surface);cursor:pointer;transition:border-color .15s ease;}
.flow-option:hover,.flow-option:focus-within{border-color:var(--acc);}
.flow-option input{margin:2px 0 0;width:17px;height:17px;accent-color:var(--acc);flex:none;}
.flow-option label{margin:0;font-size:14.5px;font-weight:400;color:var(--ink);line-height:1.45;cursor:pointer;}
.flow-error{margin:0 0 10px;font-weight:600;}

/* Buttons sit on one line; Back is a link, because going back is not a
   decision that deserves the same weight as going on. */
.flow-nav{display:flex;flex-wrap:wrap;align-items:center;gap:12px;margin-top:22px;}
.flow-back{font-size:13.5px;color:var(--mut);text-decoration:underline;text-underline-offset:3px;}
.flow-back:hover{color:var(--ink);}

/* Mechanic 3: say that we keep them, on every screen that asks. */
.flow-foot{margin-top:26px;padding-top:16px;border-top:1px solid var(--line);}
.flow-foot .flow-promise{margin:0;}
.flow-saved{font-family:var(--mono);font-size:10.5px;letter-spacing:1px;text-transform:uppercase;
  color:var(--green);margin:8px 0 0;opacity:0;transition:opacity .2s ease;}
.flow-saved.on{opacity:1;}
.flow-save-error{margin-top:8px;}

/* The task list, for a sectioned ask (Stica Craft's brief). */
.flow-tasks{list-style:none;margin:0 0 4px;padding:0;border-top:1px solid var(--line);}
.flow-task{display:flex;align-items:center;justify-content:space-between;gap:14px;
  padding:15px 2px;border-bottom:1px solid var(--line);}
.flow-task-link{font-size:15.5px;font-weight:600;color:var(--ink);text-decoration:underline;text-underline-offset:3px;}
.flow-task-link:hover{color:var(--acc-text);}

/* Extra content under one question (WP-ask-pattern step 4): today, Stica
   Craft's material uploader beside the question it answers. Sits between
   the field and the buttons, set apart just enough to read as an offer
   rather than as part of the answer. */
.flow-extra{margin:16px 0 0;}

/* The material uploader (assets/material-upload.js). Deliberately NOT
   scoped under .flow: the same block is used on member/craft.html's
   engagement rows, and one uploader that looks the same in both places is
   the whole point of moving it into a module. */
.uploader{border:1px solid var(--line);border-radius:10px;padding:14px 16px;background:var(--surface);}
.uploader-actions{display:flex;gap:8px;flex-wrap:wrap;margin:10px 0 0;}
.uploader-actions + .cue{margin-top:10px;}

/* Check your answers. */
.flow-review{margin:0 0 6px;border-top:1px solid var(--line);}
.flow-row{display:grid;grid-template-columns:1fr auto;gap:2px 16px;padding:14px 2px;border-bottom:1px solid var(--line);}
.flow-row-q{grid-column:1;font-size:13px;font-weight:600;color:var(--ink2);margin:0;}
.flow-row-a{grid-column:1;font-size:14.5px;color:var(--ink);margin:0;line-height:1.55;white-space:pre-wrap;}
.flow-row-a.none{color:var(--mut);font-style:italic;}
.flow-row-act{grid-column:2;grid-row:1 / span 2;align-self:center;margin:0;font-size:13.5px;}
.flow-row-act a{text-decoration:underline;text-underline-offset:3px;color:var(--acc-text);}

@media(max-width:520px){
  .flow-title{font-size:23px;}
  .flow-q{font-size:20px;}
  .flow-nav{gap:10px;}
}

/* ============================================================
   Shared member-area mast + quick-settings drawer rules (S3-O,
   AUDIT-member-area-2026-07-23). member.html is the source-of-truth
   pattern for this component; member/learner.html and member/report.html
   link this file and assets/mast.js instead of re-defining it, so there is
   one mast, not three. Base .mast/.mast-right/.avatar/.drawer/.drawer-head/
   .drawer-body/.drawer-close rules already live in grid-app.css - this
   file only carries what grid-app.css does not. */
.mast-nav{display:flex;align-items:center;gap:6px;margin-right:6px;}
.mast-nav a{font-size:13px;font-weight:500;color:var(--ink2);text-decoration:none;padding:7px 12px;
  border-radius:999px;border:1px solid transparent;}
.mast-nav a:hover,.mast-nav a.on{background:var(--surface);border-color:var(--line);color:var(--ink);}
.mast-nav a.hide{display:none;}
body[data-page="member"] .mast-right{display:flex;align-items:center;gap:10px;}
.mast-avatar-btn{background:none;border:none;padding:0;cursor:pointer;border-radius:50%;line-height:0;}
.mast-avatar-btn .avatar{background:var(--acc-fill);color:#fff;}

.dsec{padding:20px 0;border-top:1px solid var(--line);}
.dsec:first-child{border-top:none;padding-top:2px;}
.dsec .dsh{font-size:14px;font-weight:600;margin:0 0 12px;letter-spacing:-.1px;}
.dsec.hide{display:none;}
.avatar-row{display:flex;align-items:center;gap:14px;margin-bottom:12px;}
.avatar-row .avatar{background:var(--ink2);}
.radiorow{display:flex;gap:16px;align-items:center;font-size:14px;margin-bottom:4px;flex-wrap:wrap;}
.radiorow label{display:flex;align-items:center;gap:6px;cursor:pointer;}
.drawernote{font-size:12.5px;color:var(--mut);margin:8px 0 0;}
.hide{display:none !important;}


/* ============================================================
   PAGE FRAGMENTS (assets/parts/<page>.css)

   A handful of rules below were byte-identical to a rule already merged
   above from mast.css, or to a rule in an earlier page fragment (the
   fragments used to ship one-per-page, so the same small rule existing
   twice cost nothing; concatenated into one file it is dead weight).
   Each drop is called out where it happened; every rule that differs even
   slightly from an earlier one was left alone, on the "keep when in
   doubt" rule.
   ============================================================ */

/* ---- coach/dashboard.html ---- */
/* Small utilities the shared stylesheet doesn't define: plain form
   controls, the page's own view-switch/notif/settings toolbar, the
   drawer's section chrome, the onboarding wizard, session timeline
   cards and the this-week/agenda rows. Everything else (.paper, .pill,
   .chip, .tile, .avatar, .drawer, .modal, .calpop, .hero-strip,
   .weekstrip, .toast, …) comes from grid.css / ui.js and is used as-is. */

/* dash-toolbar: the view-switch (Dashboard/Schedule) and notif/settings
   controls that used to live in the hand-written header now sit in the
   page content, since the header is the shared st-head mount. */
.dash-toolbar{display:flex;align-items:center;justify-content:flex-end;gap:10px;margin:6px 0 26px;}
body[data-page="coach-dashboard"] .mast-nav{display:flex;align-items:center;gap:6px;margin-right:auto;}
/* .mast-nav a / .mast-nav a:hover,.mast-nav a.on / .mast-avatar-btn /
   .mast-avatar-btn .avatar dropped here: byte-identical to the mast.css
   copy merged above. */

body[data-page="coach-dashboard"] .finput{width:100%;box-sizing:border-box;padding:10px 12px;font:inherit;font-size:14px;color:var(--ink);
  border:1px solid var(--line2);border-radius:8px;background:var(--bg);}
.finput::placeholder{color:var(--mut);}
body[data-page="coach-dashboard"] .frow{display:flex;flex-direction:column;gap:4px;margin-bottom:12px;}
.frow .l{font-family:var(--mono);font-size:10px;letter-spacing:.8px;text-transform:uppercase;color:var(--mut);}
.fgrid{display:grid;grid-template-columns:1fr 1fr;gap:12px;}
@media (max-width:520px){ .fgrid{grid-template-columns:1fr;} }
body[data-page="coach-dashboard"] .fbtns{display:flex;gap:8px;align-items:center;margin-top:6px;}
.err{margin:10px 0;padding:10px 14px;border-radius:8px;background:var(--amber-bg);color:var(--amber);
  font-size:13px;}
.empty{font-size:13.5px;color:var(--mut);margin:4px 0;}
/* .hide dropped here: byte-identical to the mast.css copy merged above. */
.capnote{font-size:12.5px;color:var(--mut);margin:8px 0 16px;}
.scheduling-card{padding:16px 18px;margin-bottom:16px;}
.scheduling-card .sched-status{margin:0 0 8px;}
body[data-page="coach-dashboard"] .sched-slot-row{display:flex;gap:12px;flex-wrap:wrap;margin:0 0 10px;}
.sched-slot-row label{display:flex;flex-direction:column;gap:4px;font-size:12.5px;color:var(--mut);}
.sched-slot-row input,.sched-slot-row select{font:inherit;padding:8px 10px;border:1px solid var(--line2);border-radius:8px;background:var(--surface);color:var(--ink);}
.sched-counter-form{margin-top:10px;}
.sched-run{margin:12px 0 4px;padding:12px 14px;border:1px solid var(--line2);border-radius:10px;background:var(--bg);}
.sched-run .kick{margin:0 0 8px;}
.sched-run-row{display:flex;align-items:flex-start;gap:10px;cursor:pointer;font-size:13.5px;color:var(--ink2);line-height:1.5;}
.sched-run-row input{margin-top:3px;flex:none;}
.sched-delivery{margin-top:4px;}
.tpl-picker{display:flex;flex-direction:column;gap:8px;max-height:320px;overflow-y:auto;}
.two-col.solo{grid-template-columns:1fr;}
.sched-prepare{margin-top:14px;padding-top:12px;border-top:1px solid var(--line2);}
.sched-prepare .kick{margin:0 0 8px;}
.sched-prepare .prep-block{margin:0 0 8px;}
.ghost.danger{color:#c0392b;border-color:#c0392b;}
/* ---- session composer + transcript modals (WP-session-composer phase 2) ----
   Both popups are ordinary modal-card content: the shared .frow/.finput/
   .fbtns form furniture above, plus these few extras for the read-only
   "carried forward" recap and the file row. */
.dash-head-actions{display:flex;gap:8px;align-items:center;flex-wrap:wrap;}
.modal-lede{font-size:13px;color:var(--mut);margin:0 0 14px;line-height:1.55;}
.sess-carried{margin:14px 0 4px;padding:12px 14px;border:1px solid var(--line2);border-radius:10px;background:var(--bg);}
.sess-carried .kick{margin:0 0 8px;}
.sess-carried ul{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:6px;}
.sess-carried li{font-size:13px;color:var(--ink2);line-height:1.5;display:flex;gap:8px;align-items:baseline;}
.sess-carried li .tk{color:var(--acc);flex:none;}
.sess-carried .empty{margin:0;font-size:13px;}
.file-row{display:flex;gap:10px;align-items:center;flex-wrap:wrap;}
.file-name{font-size:13px;color:var(--ink2);word-break:break-all;}
.name-chips{display:flex;gap:6px;flex-wrap:wrap;margin:6px 0 0;}
.name-chip{font:inherit;font-size:12.5px;padding:5px 11px;border:1px solid var(--line2);border-radius:999px;
  background:var(--surface);color:var(--ink2);cursor:pointer;}
.name-chip:hover,.name-chip:focus-visible{border-color:var(--acc);color:var(--acc-text);}
/* WP-transcript-upload-clarity: the collapsed "what happens" detail on the
   transcript modal. A <details> so the always-usable fields (client, file,
   session) stay reachable near the top on a small screen, with the fuller
   explanation one tap away rather than pushed into the copy permanently. */
.tr-explain{margin:0 0 14px;}
.tr-explain summary{cursor:pointer;font-size:12.5px;font-weight:600;color:var(--acc-text);list-style:revert;}
.tr-explain[open] summary{margin-bottom:8px;}
.tr-explain ul{list-style:none;padding:0;margin:0 0 10px;display:flex;flex-direction:column;gap:6px;}
.tr-explain li{font-size:13px;color:var(--ink2);line-height:1.5;display:flex;gap:8px;align-items:baseline;}
.tr-explain li .tk{color:var(--acc);flex:none;}
.tr-explain .tr-notes{margin:0;}
.tr-explain .tr-notes li{color:var(--mut);}
.tr-max-promo{margin:0 0 14px;}
/* The session composer is a tall form, and `.modal-card` scrolls its whole
   self, so the action row sat at the very bottom of the scroll and the
   last line read as cut off (Ian, 2026-07-28). Pinning the actions to the
   bottom of the card fixes both halves: nothing is hidden below the fold,
   and "Book session" is reachable without scrolling to find it. */
.modal-foot{position:sticky;bottom:0;z-index:1;display:flex;gap:8px;align-items:center;
  margin-top:16px;padding:14px 0 6px;background:var(--surface);border-top:1px solid var(--line2);}
/* ---- a client's sessions, grouped (2026-07-28) ---- */
.sess-group + .sess-group{margin-top:22px;}
.sess-group-h{display:flex;align-items:baseline;gap:8px;margin:0 0 10px;}
.sess-count{font-family:var(--mono);font-size:10px;letter-spacing:.6px;color:var(--mut);}
.sesscard.upcoming{border-color:var(--acc);}
.sess-actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px;}
.sess-actions.link-actions{align-items:center;}
/* ---- reissue-link result modal (migration 043) ---- */
.reissue-link-text{display:block;font-family:var(--mono);font-size:12.5px;
  word-break:break-all;background:var(--bg);
  border:1px solid var(--line2);border-radius:8px;padding:10px 12px;user-select:all;}
/* Landing mark: when a session is opened from the week strip or the
   Schedule, its card says so for a couple of seconds. */
.sesscard.sess-focus{box-shadow:0 0 0 2px var(--acc);outline:none;}
@media (prefers-reduced-motion: no-preference){
  .sesscard{transition:box-shadow var(--dur-2) var(--ease);}
}
/* Week-strip blocks are buttons now, not decoration. */
body[data-page="coach-dashboard"] .sessblock{display:block;width:100%;text-align:left;border:0;font:inherit;cursor:pointer;}
.sessblock:hover,.sessblock:focus-visible{filter:brightness(0.94);}
#schedProposalList{list-style:none;padding:0;margin:0 0 10px;}
#schedProposalList li{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:6px 0;border-bottom:1px solid var(--line2);}
.draftedit{margin-top:10px;}
.draftedit textarea{width:100%;min-height:140px;padding:12px 14px;font:inherit;font-size:13.5px;color:var(--ink);
  border:1px solid var(--acc);border-radius:10px;background:var(--bg);resize:vertical;box-shadow:0 0 0 1px var(--acc);}
.draftedit .ebtns{display:flex;gap:8px;margin-top:8px;}

/* full-read expansion for a draft row (report-types teaching): a modest
   bordered block, same visual language as .prep-answer, not a redesign. */
.draftread{margin-top:10px;padding:12px 14px;border-left:2px solid var(--line2);background:var(--bg);
  border-radius:0 8px 8px 0;font-size:13.5px;color:var(--ink2);max-width:70ch;}
.draftread h4{font-size:14px;font-weight:600;letter-spacing:-.1px;margin:0 0 6px;color:var(--ink);}
.draftread p{margin:0 0 10px;}
.draftread ul,.draftread ol{margin:0 0 10px;padding-left:20px;}
.draftread hr{border:0;border-top:1px solid var(--line);margin:14px 0;}
.draftread p:last-child,.draftread ul:last-child,.draftread ol:last-child{margin-bottom:0;}
/* comments and change requests (WP-owner-control step 6) */
.dchips{display:inline-flex;gap:5px;margin-left:7px;vertical-align:middle;}
.dchip{display:inline-block;padding:1px 7px;border:1px solid var(--line);border-radius:10px;
  font-size:11px;line-height:16px;color:var(--ink2);background:var(--bg);white-space:nowrap;}
.dchip.work{border-color:var(--accent);color:var(--accent);}
.dchip.bad{border-color:var(--red,#b4483c);color:var(--red,#b4483c);}
.docfeed{margin-top:10px;padding:10px 14px;border-left:2px solid var(--line2);}
.docfeed .empty{font-size:13px;color:var(--ink2);margin:0 0 8px;}
.dorigin{font-size:12px;color:var(--ink2);margin:0 0 8px;}
.dpending{font-size:13px;color:var(--accent);margin:0 0 10px;}
.dfailed{font-size:13px;color:var(--red,#b4483c);margin:0 0 10px;}
.dcom{margin:0 0 10px;}
.dcom .b{font-size:13px;color:var(--ink);margin:0 0 2px;white-space:pre-wrap;}
.dcom .m{font-size:11px;color:var(--ink2);margin:0;display:flex;gap:8px;align-items:center;flex-wrap:wrap;}
.dcom.asked .b{border-left:2px solid var(--accent);padding-left:8px;}
.dcombox textarea,.dcomedit{width:100%;box-sizing:border-box;font:inherit;font-size:13px;
  padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:var(--bg);color:var(--ink);}
.dcombox .ebtns{display:flex;gap:6px;margin-top:6px;flex-wrap:wrap;}
.dhint{font-size:11px;color:var(--ink2);margin:6px 0 0;}
.linkbtn{background:none;border:0;padding:0;font:inherit;font-size:11px;color:var(--ink2);
  text-decoration:underline;cursor:pointer;}
.linkbtn:hover{color:var(--ink);}

/* coach-only draft rows (coach-report, session-summary): same visual
   weight as .gatenote (assets/grid.css) but scoped here since this file
   is the only owner that needs the coach-only copy. */
.privatenote{margin-top:12px;font-family:var(--mono);font-size:10.5px;letter-spacing:.6px;text-transform:uppercase;color:var(--mut);}
.colourpicker{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.colourwell{width:34px;height:34px;padding:0;border:1px solid var(--line2);border-radius:8px;
  background:none;cursor:pointer;flex:none;}
.colourwell::-webkit-color-swatch-wrapper{padding:3px;}
.colourwell::-webkit-color-swatch{border-radius:6px;border:none;}
.colourwell::-moz-color-swatch{border-radius:6px;border:none;}
.hexinput{width:100px;flex:0 0 auto;font-family:var(--mono);text-transform:uppercase;}
.brandpreview{display:flex;align-items:center;gap:12px;margin:12px 0 4px;padding:14px 16px;
  border:1px solid var(--line);border-radius:10px;background:var(--bg);}
.brandpreview img{max-height:30px;max-width:150px;object-fit:contain;display:block;}
.accentbar{display:inline-block;width:34px;height:6px;border-radius:99px;background:var(--acc);flex:none;}

/* coach console: two-column body reusing .dash (defined in grid-app.css
   for the earlier "Surface 2" mock but never wired up) - left is the
   client roster (.roster/.person, also previously dead), right is the
   selected client's detail panel (former view-coachee content, now
   rendered inline instead of on its own page - WP-member-dashboard-v2
   ws5). Roster card gets a tighter kicker than the default .paper. */
.console-card > .kick{padding:0 10px;}
/* review-queue banner reads as a link to the draft waiting - the design's
   chevron affordance, using the same warn palette as the card itself. */
#draftHero::after{content:'\203a';font-size:22px;line-height:1;color:var(--amber);margin-left:auto;flex:none;}
.roster .person{border-radius:10px;}
.person .dot-draft{width:7px;height:7px;border-radius:50%;background:var(--amber);flex:none;margin-left:8px;}
.roster-add{display:block;width:calc(100% - 20px);margin:10px 10px 6px;padding:10px 12px;
  border:1.5px dashed var(--line2);border-radius:10px;background:transparent;color:var(--mut);
  font:inherit;font-family:var(--mono);font-size:11px;letter-spacing:.6px;text-transform:uppercase;
  text-align:center;cursor:pointer;}
.roster-add:hover,.roster-add:focus-visible{color:var(--ink);border-color:var(--acc);}
@media (max-width:820px){ .console-card{order:1;} #view-coachee{order:2;} }

/* visually-hidden utility (screen-reader-only content); the skip link
   and mast nav/avatar now come from stica.css via the shared st-head
   mount (assets/mast.js), so their rules were dropped here. */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0,0,0,0);white-space:nowrap;border:0;}

/* screens */
.screen.hide{display:none;}

/* tip card: dismissible one-liner keyed in localStorage */
.tipcard{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 14px;
  border-radius:10px;background:var(--cobalt-bg);color:var(--cobalt);font-size:12.5px;margin:0 0 12px;}
.tipcard button{background:none;border:none;color:inherit;cursor:pointer;font-size:16px;line-height:1;padding:0 2px;flex:none;}

/* schedule card on coachee detail */
.schedrow{display:flex;flex-wrap:wrap;align-items:center;gap:10px;}

/* session timeline */
.timeline{display:flex;flex-direction:column;gap:14px;margin-bottom:4px;}
.sesscard{padding:18px 20px;}
.sesscard .sh{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;margin-bottom:4px;}
.sesscard .sh .dt{font-size:15px;font-weight:600;letter-spacing:-.2px;}
.sesscard .sub{font-size:12.5px;color:var(--mut);margin:0 0 12px;}
.upload-zone{display:block;width:100%;box-sizing:border-box;font:inherit;color:inherit;background:none;
  border:1.5px dashed var(--line2);border-radius:12px;padding:20px;text-align:center;cursor:pointer;margin-top:6px;}
.upload-zone:hover,.upload-zone:focus-visible{border-color:var(--acc);}
.upload-zone .ut{font-size:13.5px;font-weight:600;margin:0 0 4px;}
.upload-zone .uh{font-size:12.5px;color:var(--mut);margin:0;max-width:44ch;margin-left:auto;margin-right:auto;}
.upload-zone.done{border-style:solid;border-color:var(--green);background:var(--green-bg);}
.upload-zone.done .ut{color:var(--green);}
.docline{display:flex;align-items:center;gap:9px;padding:7px 0;font-size:13px;color:var(--ink2);}
.docline .tk{color:var(--green);font-weight:700;}
/* Read / Download / Recall on a released document, pushed to the right as
   one group (recall used to carry margin-left:auto on its own; it now
   sits inside this group so the three keep their order and spacing when
   any of them is absent). */
.docline .docacts{margin-left:auto;display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
/* Download is an <a download>, not a button, so it needs the underline
   off and the same box as the .ghost buttons it sits beside. Used on both
   the draft row and the released line. */
a.ghost.dl{text-decoration:none;display:inline-flex;align-items:center;}
.capture-chip{display:inline-flex;align-items:center;gap:6px;font-family:var(--mono);font-size:10px;letter-spacing:.4px;
  text-transform:uppercase;padding:4px 9px;border-radius:5px;background:var(--cobalt-bg);color:var(--cobalt);margin-top:8px;}

/* coachee detail head, incl. photo affordance */
.detail-id{display:flex;align-items:flex-start;gap:14px;}
.detail-id .avatar{background:var(--ink2);cursor:pointer;border:none;padding:0;flex:none;}
.detail-id-info{display:flex;flex-direction:column;align-items:flex-start;gap:5px;min-width:0;}
.detail-id-info h4{font-weight:700;font-size:22px;letter-spacing:-.5px;margin:0;text-wrap:balance;}
.detail-id-info .meta{font-family:var(--mono);font-size:11px;letter-spacing:.5px;line-height:1.6;color:var(--mut);}
.detail-actions{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.photo-affordance{font-family:var(--mono);font-size:10px;letter-spacing:.6px;text-transform:uppercase;color:var(--acc-text);
  background:none;border:none;cursor:pointer;display:inline-block;padding:7px 4px;margin:-5px -4px -5px;border-radius:6px;}
.photo-affordance:hover{background:var(--grid);}

/* agenda (schedule view) */
.agenda{display:flex;flex-direction:column;gap:10px;}
.agenda-day{padding:14px 18px;}
.agenda-day .dh{display:flex;align-items:baseline;gap:8px;margin-bottom:2px;}
.agenda-day .dh .d1{font-size:14.5px;font-weight:700;letter-spacing:-.2px;}
.agenda-day .dh .d2{font-family:var(--mono);font-size:10.5px;color:var(--mut);text-transform:uppercase;}
.agenda-row{display:flex;align-items:center;gap:14px;padding:11px 0;border-top:1px solid var(--line);flex-wrap:wrap;}
.agenda-row:first-of-type{border-top:none;}
.agenda-row .tm{font-family:var(--mono);font-size:12.5px;color:var(--ink2);width:52px;flex:none;}
.agenda-row .an{flex:1;min-width:0;font-size:14px;}
.agenda-row .an .sn{display:block;font-size:11.5px;color:var(--mut);}
.agenda-empty{font-size:13px;color:var(--mut);padding:2px 0;}

/* survey preview (mirrors coachee/home.html's survey card styles; keep in step) */
.survey-q{margin-bottom:20px;}
.survey-q .ql{font-size:14.5px;font-weight:600;margin:0 0 4px;color:var(--ink);}
.survey-q .req-mark{color:var(--acc-text,var(--acc));margin-left:2px;}
.survey-q .qhelp{font-size:12.5px;color:var(--mut);margin:0 0 10px;}
.survey-scale input[type="range"]{width:100%;accent-color:var(--acc);height:28px;display:block;}
.survey-scale .scale-val{text-align:center;font-size:15px;font-weight:700;color:var(--ink);margin:0 0 4px;}
.survey-scale .scale-anchors{display:flex;justify-content:space-between;font-size:12px;color:var(--mut);}
.survey-choice{display:flex;flex-direction:column;gap:8px;}
.survey-choice label{display:flex;align-items:flex-start;gap:9px;font-size:14px;color:var(--ink);}
/* settings drawer */
/* .dsec / .dsec .dsh / .radiorow label / .avatar-row / .avatar-row .avatar
   dropped here: byte-identical to the mast.css copies merged above. */
.dsec:first-child{border-top:none;}
body[data-page="coach-dashboard"] .radiorow{display:flex;gap:16px;align-items:center;font-size:14px;margin-bottom:4px;}
.avatar-row .avbtns{display:flex;gap:8px;flex-wrap:wrap;}

/* onboarding wizard */
.ob-scrim{position:fixed;inset:0;background:var(--scrim);z-index:100;}
.ob-wrap{position:fixed;inset:0;z-index:101;display:flex;align-items:center;justify-content:center;padding:20px;}
.ob-card{width:100%;max-width:480px;max-height:88vh;overflow:auto;}
.ob-step.hide{display:none;}
.ob-step h2{font-size:22px;font-weight:700;letter-spacing:-.5px;margin:0 0 8px;text-wrap:balance;}
.ob-step .lede{color:var(--ink2);font-size:14.5px;margin:0 0 18px;}
.ob-step .note{font-size:12.5px;color:var(--mut);margin:14px 0 0;}
.lang-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-bottom:6px;}
.lang-opt{padding:18px 14px;border:1.5px solid var(--line2);border-radius:12px;background:var(--bg);cursor:pointer;
  font:inherit;font-size:15.5px;font-weight:600;color:var(--ink);text-align:center;}
.lang-opt:hover{border-color:var(--acc);}
.lang-opt.sel{border-color:var(--acc);background:color-mix(in srgb, var(--acc) 8%, var(--bg));color:var(--acc-text);}
.ob-btns{display:flex;gap:10px;align-items:center;margin-top:20px;flex-wrap:wrap;}
.ob-q{margin-bottom:16px;}
.ob-q .ql{font-size:14.5px;font-weight:600;margin:0 0 8px;}
.ob-q textarea{width:100%;min-height:56px;padding:10px 12px;font:inherit;font-size:13.5px;color:var(--ink);
  border:1px solid var(--line2);border-radius:9px;background:var(--bg);resize:vertical;}
.ob-avatar-row{display:flex;align-items:center;gap:16px;margin-bottom:14px;}
.ob-field{margin-bottom:12px;}
.ob-field .l{display:block;font-family:var(--mono);font-size:10px;letter-spacing:.8px;text-transform:uppercase;color:var(--mut);margin-bottom:4px;}
.wordmark-preview{display:flex;align-items:center;gap:10px;padding:12px 14px;border:1px solid var(--line);
  border-radius:10px;background:var(--bg);margin:10px 0 4px;}
.wordmark-preview .accentbar{margin-left:auto;}
.ob-check-wrap{display:flex;justify-content:center;margin:0 0 16px;}
.ob-check-circle{stroke:var(--acc);stroke-width:2;fill:none;}
.ob-check-mark{stroke:var(--acc);stroke-width:3;fill:none;stroke-linecap:round;stroke-linejoin:round;}
.ob-dots{display:flex;gap:6px;margin:0 0 18px;}
.ob-dot{width:7px;height:7px;border-radius:50%;background:var(--line2);flex:none;}
.ob-dot.done{background:color-mix(in srgb, var(--acc) 55%, var(--line2));}
.ob-dot.on{background:var(--acc);}

/* dashboard tile-grid empty state: a guided moment, not a bare dashed tile */
.tile-empty{grid-column:1/-1;display:flex;flex-direction:column;align-items:center;justify-content:center;
  text-align:center;gap:10px;padding:44px 24px;}
.tile-empty h4{font-size:18px;font-weight:700;letter-spacing:-.3px;margin:0;}
.tile-empty p{font-size:13.5px;color:var(--ink2);margin:0;max-width:40ch;}

/* hero-strip with only one card visible (no drafts waiting): the grid
   still reserves the second 1fr track by default, leaving the visible
   card looking narrower than the tile grid/week strip below it - collapse
   to a single track so it spans the same width as everything else. */
.hero-strip.solo{grid-template-columns:1fr;}

/* toggle switch: session capture status */
.toggle-row{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:6px;}
.capture-status{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:8px;}

/* notifications: mast bell badge + popover panel */
.notif-badge{position:absolute;top:-3px;right:-4px;min-width:16px;height:16px;padding:0 4px;border-radius:999px;
  background:var(--acc-fill);color:#fff;font-family:var(--mono);font-size:9.5px;font-weight:700;line-height:16px;text-align:center;}
.notif-badge.hide{display:none;}
.notif-pop{position:fixed;z-index:103;width:320px;max-width:calc(100vw - 24px);max-height:420px;overflow:auto;padding:6px 0;}
.notif-pop .nph{margin:0;padding:10px 16px 8px;font-family:var(--mono);font-size:11px;letter-spacing:.8px;text-transform:uppercase;color:var(--mut);}
.notif-row{display:block;width:100%;text-align:left;padding:10px 16px;border:none;background:none;cursor:pointer;font:inherit;color:var(--ink);}
.notif-row:hover,.notif-row:focus-visible{background:var(--grid);}
.notif-row.unread{background:color-mix(in srgb, var(--acc) 6%, transparent);}
.notif-row .nt{font-size:13.5px;line-height:1.4;margin:0;}
.notif-row .nr{font-family:var(--mono);font-size:10.5px;color:var(--mut);margin:3px 0 0;}
.notif-empty{margin:0;padding:6px 16px 14px;font-size:13px;color:var(--mut);}

/* prep composer on the upcoming-session card */
.prep-block{margin-top:12px;padding-top:12px;border-top:1px solid var(--line);}
.prep-status{font-size:12.5px;color:var(--mut);margin:0 0 8px;}
.prep-answer{margin:0 0 4px;padding:10px 14px;border-left:2px solid var(--acc);background:var(--bg);
  border-radius:0 8px 8px 0;font-size:13.5px;color:var(--ink2);}
.finput-ta{width:100%;box-sizing:border-box;min-height:110px;padding:10px 12px;font:inherit;font-size:14px;
  color:var(--ink);border:1px solid var(--line2);border-radius:9px;background:var(--bg);resize:vertical;}

/* "new for you" style badge reused for the notifications drawer note */
/* .drawernote dropped here: byte-identical to the mast.css copy merged above. */

/* roster commitment digest (tile) + top-of-dashboard outstanding strip */
.commitrow{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:6px;}
.commitrow .subtle{font-family:var(--mono);font-size:10px;letter-spacing:.4px;color:var(--mut);}
.outstanding-strip{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:13px 18px;margin-bottom:14px;}
.outstanding-strip .lbl{font-family:var(--mono);font-size:10px;letter-spacing:.6px;text-transform:uppercase;color:var(--mut);}

/* per-coachee commitment rows (renderCommitments): a header line (text +
   status chip, same as before) plus an optional secondary line for the
   when/where detail, nudge progress and the stopped marker. A hand-rolled
   clone of .lrow's border/padding rhythm (own class, so it does not
   collide with .lrow's :first-of-type rule) since these rows are no
   longer single-line. */
.commit-row{padding:10px 0;border-top:1px solid var(--line);}
.commit-row:first-of-type{border-top:none;padding-top:2px;}
.commit-row .chead{display:flex;align-items:center;gap:10px;}
.commit-row .chead .t{flex:1;font-size:13.5px;line-height:1.4;min-width:0;}
.commit-row .csub{font-size:11.5px;color:var(--mut);margin:4px 0 0;}

/* proposed-commitments block: same warm, not-yet-live tint as .prep-card
   on the coachee page, read-only, clearly separated from the live list. */
.proposal-card{border:1px solid color-mix(in srgb, var(--acc) 26%, var(--line));border-radius:12px;
  background:color-mix(in srgb, var(--acc) 6%, var(--surface));margin-bottom:16px;padding:16px 18px;}
.proposal-card .lede{font-size:12.5px;color:var(--ink2);margin:2px 0 10px;}
.proposal-list{margin:0;padding-left:18px;}
.proposal-list li{font-size:13.5px;color:var(--ink);margin:0 0 6px;}
.proposal-list li:last-child{margin-bottom:0;}
.proposal-meta{display:block;font-size:11.5px;color:var(--mut);margin-top:2px;}
/* The per-item concern and the "how this reads later" preview (STICA-302).
   Deliberately quiet: this warns, it never blocks, so it must not look like
   an error. The preview is set in italic quoted voice because it is the
   member's sentence being shown to the coach, not the coach's own copy. */
.proposal-note{display:block;font-size:11.5px;color:var(--ink2);margin-top:3px;}
.proposal-reads{margin-top:12px;padding-top:10px;
  border-top:1px solid color-mix(in srgb, var(--acc) 20%, var(--line));}
.proposal-quote{font-size:12.5px;font-style:italic;color:var(--ink2);margin:4px 0 0;}

/* surveys block (coach dashboard, coachee detail): row list + inline
   draft editor + send-confirm preview + results display. Same visual
   language as .commit-row/.proposal-card, own classes so nothing here
   collides with either. */
.surveys-head{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:2px;}
.survey-row{padding:12px 0;border-top:1px solid var(--line);}
.survey-row:first-of-type{border-top:none;padding-top:2px;}
.survey-row .shead{display:flex;align-items:center;gap:10px;flex-wrap:wrap;}
.survey-row .shead .t{flex:1;font-size:13.5px;font-weight:600;min-width:0;}
.survey-row .spurpose{font-size:12px;color:var(--mut);margin:3px 0 0;}
.survey-row .sdates{font-family:var(--mono);font-size:10.5px;letter-spacing:.4px;color:var(--mut);margin:4px 0 0;}
.survey-row .sbtns{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px;}
.survey-results{margin-top:10px;padding:12px 14px;border-left:2px solid var(--acc);background:var(--bg);border-radius:0 8px 8px 0;}
.survey-results .rq{font-size:13px;color:var(--ink2);margin:0 0 10px;}
.survey-results .rq:last-child{margin-bottom:0;}
.survey-results .rq .qt{font-weight:600;color:var(--ink);display:block;margin-bottom:3px;}
.survey-results .rq .ra{display:block;}
.survey-results .rq .ranchors{display:block;font-size:11.5px;color:var(--mut);margin-top:2px;}

/* survey draft editor: title/purpose fields + a stack of question cards */
.survey-editor{margin-top:12px;padding-top:12px;border-top:1px dashed var(--line2);}
.qcard{border:1px solid var(--line2);border-radius:10px;padding:14px 16px;margin-bottom:12px;}
.qcard .qhead{display:flex;align-items:center;gap:8px;margin-bottom:10px;flex-wrap:wrap;}
.qcard .qhead .qnum{font-family:var(--mono);font-size:10.5px;letter-spacing:.5px;text-transform:uppercase;color:var(--mut);flex:1;}
.qcard .qhead select{font:inherit;font-size:13px;padding:6px 8px;border:1px solid var(--line2);border-radius:7px;background:var(--bg);color:var(--ink);}
.qcard .qmove{background:none;border:1px solid var(--line2);border-radius:6px;width:28px;height:28px;cursor:pointer;color:var(--ink2);font-size:13px;line-height:1;}
.qcard .qmove:disabled{opacity:.35;cursor:default;}
.qcard .qremove{background:none;border:none;color:var(--amber);cursor:pointer;font-size:13px;padding:4px 6px;}
.qreqrow{display:flex;align-items:center;gap:8px;font-size:13px;color:var(--ink2);margin:8px 0 0;}
.scalefields{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:8px;}
@media (max-width:520px){ .scalefields{grid-template-columns:1fr;} }
.optrow{display:flex;align-items:center;gap:8px;margin-bottom:6px;}
.optrow .finput{flex:1;}
.optremove{background:none;border:1px solid var(--line2);border-radius:6px;color:var(--amber);cursor:pointer;
  font-size:15px;line-height:1;width:28px;height:28px;flex:none;}
.optremove:disabled{opacity:.35;cursor:default;}
.addopt{margin-top:2px;}
.editor-actions{display:flex;gap:8px;align-items:center;margin-top:6px;}

/* My templates view: row rhythm. Rows in #templatesList use .list-row,
   which had no vertical styling of its own - tiles sat flush against
   each other and against the open inline editor. Consistent row gaps,
   and the editor gets clear separation from its own row header. */
#templatesList .list-row{padding:15px 0;border-top:1px solid var(--line);}
#templatesList .list-row:first-child{border-top:none;padding-top:4px;}
#templatesList .survey-editor{margin-top:16px;padding-top:16px;}

/* new-survey modal: two big explained choices */
.survey-modechoice{display:flex;flex-direction:column;gap:10px;margin-top:6px;}
.modebtn{display:block;width:100%;text-align:left;padding:14px 16px;border:1.5px solid var(--line2);border-radius:12px;
  background:var(--bg);cursor:pointer;font:inherit;}
.modebtn:hover{border-color:var(--acc);}
.modebtn .mt{font-size:14.5px;font-weight:600;color:var(--ink);margin:0 0 3px;}
.modebtn .mh{font-size:12.5px;color:var(--mut);margin:0;}
.purposenote{font-size:12px;color:var(--mut);margin:4px 0 12px;}

/* send-confirm preview: exactly what the coachee will see */
.sendpreview{margin:10px 0 14px;padding:14px 16px;border:1px solid var(--line);border-radius:10px;background:var(--bg);}
.sendpreview h4{font-size:15px;font-weight:700;margin:0 0 10px;letter-spacing:-.2px;}
.sendpreview .pq{font-size:13.5px;color:var(--ink2);margin:0 0 10px;}
.sendpreview .pq:last-child{margin-bottom:0;}
.sendpreview .pq .qt{display:block;color:var(--ink);font-weight:500;margin-bottom:2px;}
.sendpreview .pq .qh{display:block;font-size:12px;color:var(--mut);}

/* ---- coach/profile.html ---- */
/* The page currently carries no page-local <style> block of its own: every
   rule it needs (.paper, .stamp, .field, .langchips, .onramp, .secgrid, …)
   already lives in /assets/app.css. This file exists so the page satisfies
   the same one-part-per-page contract as its siblings (index.css,
   member-report.css, …); it stays empty until this page grows a rule that
   genuinely belongs to it alone, not to the shared sheet.
*/

/* ---- index.html ---- */
/* public landing / redirect. Page-local rules only; shared chrome (.brand,
   .paper, .pill) comes from the shared app-chrome section above. */
body{min-height:100vh;display:flex;flex-direction:column;}
.index-centre{flex:1;display:flex;align-items:center;justify-content:center;padding:var(--s6) var(--s5);}
.index-card{width:100%;max-width:460px;text-align:center;}
.index-card .brand{font-size:32px;margin-bottom:14px;}
.index-card h1{font-weight:700;font-size:24px;letter-spacing:-.6px;margin:0 0 var(--s3);}
.index-card p.index-lede{color:var(--ink2);font-size:15px;max-width:36ch;margin:0 auto var(--s5);}
.index-card .pill{font-size:15px;padding:12px 28px;}
.index-note{margin:22px 0 0;font-size:13px;color:var(--mut);line-height:1.55;}

/* ---- login.html ---- */
/* page-local styles only: the split sign-in shell, the brand panel, the
   Google button wiring, and the EN/DE toggle scaffolding kept for parity
   even though the toggle itself is dead (member area is English-only,
   AUDIT-member-area S1-B). Everything else (.paper, .pill, .kick, .chip,
   .cascade-item, toast/modal plumbing) comes from the shared app-chrome
   section above — this fragment owns none of those, it only carries what
   this page needs that isn't already there. Mirrors the approved
   coaching-UX mockup's "sign in screen" section 1:1 in class names so any
   future promotion of these rules into a shared sheet is a straight lift.

   Unresolved literal: line below's color:#fff on .langbtn.on matches the
   site's own pattern (stica.css uses the same literal white-on-accent-fill
   pairing at lines 650, 692, 709, 988, 1155) — no --white/--on-accent
   token exists in stica.css to replace it with, so it stays literal here
   too rather than inventing one.

   Moved wholesale out of login.html's own <style> block (WP-member-app-one-
   shell header migration) when the page's hand-written <header> (a "back to
   stica.co.uk" link plus its own dark-mode toggle button) was replaced by
   the shared mast.js shell. Rules that only served that removed header
   (.backlink, .themetoggle, .mast, .mast-right) were dropped as dead rather
   than moved, since nothing in the page markup targets them any more. All
   remaining selectors are scoped under body.page-login so this file is safe
   to concatenate into a shared app.css with every other page's fragment. */

body.page-login{min-height:100vh;display:flex;flex-direction:column;}
.page-login .centre{flex:1;display:flex;align-items:center;justify-content:center;padding:40px 20px;}
.page-login .shell-wrap{width:100%;max-width:860px;}

/* Light paper brand panel (2026-07-21 reskin): no more dark/black block.
   Same paper + 38px graph-paper grid as the marketing site, per the design
   handoff. Not the site's own .st-grid (48px, different position offset),
   so kept literal rather than forced onto a token that would change the
   look. The panel no longer fixes its own ink colour - it reads the page
   tokens like everywhere else. */
.page-login .signin-shell{display:grid;grid-template-columns:1.1fr 1fr;
  min-height:460px;border-radius:20px;overflow:hidden;padding:0;}
@media (max-width:760px){ .page-login .signin-shell{grid-template-columns:1fr;min-height:0;} }

.page-login .signin-brand{
  background-color:var(--bg);
  background-image:linear-gradient(var(--grid) 1px,transparent 1px),linear-gradient(90deg,var(--grid) 1px,transparent 1px);
  background-size:38px 38px;
  color:var(--ink);padding:48px 42px;display:flex;
  flex-direction:column;justify-content:center;gap:var(--s4);position:relative;overflow:hidden;
  border-right:1px solid var(--line);
}
.page-login .signin-word{font-size:30px;}
.page-login .signin-promise{color:var(--ink2);font-size:15.5px;max-width:30ch;margin:0;font-weight:500;}
.page-login .signin-line{margin:6px 0 0;}
.page-login .signin-path{stroke-dasharray:1;stroke-dashoffset:1;
  animation:signinDraw 1.6s var(--ease) .3s forwards;}
@keyframes signinDraw{to{stroke-dashoffset:0;}}
.page-login .signin-pennote{font-family:var(--hand);font-weight:700;font-size:22px;color:var(--acc-text);
  transform:rotate(-2deg);margin:2px 0 0;}

.page-login .signin-form{padding:48px 42px;display:flex;flex-direction:column;}
@media (max-width:760px){ .page-login .signin-brand,.page-login .signin-form{padding:36px 28px;} }
.page-login .signin-h{font-weight:700;font-size:25px;letter-spacing:-.6px;margin:var(--s1) 0 20px;text-wrap:balance;}
.page-login .lede{color:var(--ink2);font-size:14.5px;margin:0 0 20px;}

.page-login .google-wrap.hide{display:none;}
.page-login .signin-note.hide{display:none;}
.page-login #googleBtn{min-height:40px;}
.page-login .or-divider{display:flex;align-items:center;gap:var(--s3);margin:18px 0;color:var(--mut);font-size:var(--fs-small);
  font-family:var(--mono);text-transform:uppercase;letter-spacing:1px;}
.page-login .or-divider::before,.page-login .or-divider::after{content:"";flex:1;height:1px;background:var(--line);}

.page-login label{display:block;font-family:var(--mono);font-size:var(--fs-label);letter-spacing:.8px;text-transform:uppercase;
  color:var(--mut);margin:0 0 6px;}
.page-login .fld{margin:0 0 var(--s4);}
.page-login .fld input{width:100%;box-sizing:border-box;padding:11px 13px;font:inherit;font-size:14.5px;color:var(--ink);
  border:1px solid var(--line2);border-radius:9px;background:var(--bg);}
.page-login .fld input::placeholder{color:var(--mut);}
.page-login .langchoice{display:flex;gap:var(--s2);margin:2px 0 4px;}
.page-login form button.pill{width:100%;text-align:center;border:none;margin-top:2px;}
.page-login form button.pill[disabled]{opacity:.6;cursor:default;}
.page-login .switch{margin:18px 0 0;text-align:center;font-size:13.5px;color:var(--mut);}
.page-login .switch button{background:none;border:none;padding:0;color:var(--acc-text);font:inherit;font-weight:600;cursor:pointer;text-decoration:underline;}
.page-login .signin-note{font-size:12px;color:var(--mut);margin:20px 0 0;}
.page-login .msg{margin-top:var(--s4);padding:13px 15px;border-radius:10px;font-size:13.5px;line-height:1.55;display:none;}
.page-login .msg.on{display:block;}
.page-login .msg.ok{background:var(--green-bg);color:var(--green);}
.page-login .msg.err{background:var(--amber-bg);color:var(--amber);}
.page-login .msg a{color:inherit;font-weight:600;}
.page-login .mode{display:none;}
.page-login .mode.on{display:block;}

.page-login .langtoggle{display:flex;gap:2px;border:1px solid var(--line2);border-radius:999px;padding:2px;}
.page-login .langbtn{font-family:var(--mono);font-size:var(--fs-small);letter-spacing:.5px;padding:5px 11px;border-radius:999px;
  border:none;background:none;color:var(--mut);cursor:pointer;}
.page-login .langbtn.on{background:var(--acc-fill);color:#fff;}

/* focus states: a visible border colour change on every input, on top of
   the shared :focus-visible outline in stica.css. */
.page-login .fld input:focus-visible{border-color:var(--acc);}

/* visually-hidden h1: was an inline style="" on the element; moved here so
   the page carries no inline design decisions. */
.page-login .vh-h1{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;}

/* ---- member/apply-capture.html ---- */
/* page-local rules only. Shared chrome (header, skip link, .paper/.pill/
   .ghost/.chip, .flow-*) comes from stica.css and flow.js; nothing here
   redefines them. Selectors are scoped under .apply-capture so nothing
   leaks onto other pages sharing this bundle. */
.apply-capture{min-height:100vh;max-width:720px;margin:0 auto;width:100%;padding:20px 20px 60px;}
.apply-capture__backline{margin:0 0 14px;}
.apply-capture__backline a{font-size:13px;color:var(--ink2);text-decoration:none;}
.apply-capture__backline a:hover{color:var(--acc-text);}
.apply-capture__cue{font-size:13px;color:var(--mut);}
.apply-capture__cue--err{color:var(--amber);}

/* ---- member/card.html ---- */
/* moved out of the page's own <style> block per the member-shell migration.
   WP-apply-learning-map step 3 note preserved: one card, one screen, one
   tap; no list, no history, no map here. .paper/.pill/.chip are the shared
   member classes, defined elsewhere; only this page's own chrome lives
   here. Selectors are scoped under .page-card (set on <body>) so nothing
   here can leak once this file is folded into the single app.css. */
.page-card{min-height:100vh;}
.page-card .wrap{max-width:560px;margin:0 auto;width:100%;padding:20px 20px 60px;box-sizing:border-box;}
.page-card .backline{margin:0 0 14px;}
.page-card .backline a{font-size:13px;color:var(--ink2);text-decoration:none;}
.page-card .backline a:hover{color:var(--acc-text);}
.page-card .cardkind{font-size:12px;text-transform:uppercase;letter-spacing:.08em;color:var(--mut);margin:0 0 6px;}
.page-card .cardtitle{font-size:var(--fs-h3);font-weight:650;margin:0 0 var(--s2);line-height:1.25;}
.page-card .cardprompt{font-size:15px;color:var(--ink2);margin:0 0 18px;line-height:1.5;}
.page-card .optcol{display:flex;flex-direction:column;gap:var(--s2);margin:0 0 10px;}
.page-card .optcol .chip{width:100%;box-sizing:border-box;text-align:left;font-size:14.5px;padding:11px 14px;}
.page-card .skiprow{margin-top:14px;}
.page-card .skiprow button{background:none;border:none;padding:6px 2px;font-size:13px;color:var(--mut);cursor:pointer;text-decoration:underline;text-underline-offset:3px;}
.page-card .skiprow button:hover{color:var(--ink2);}
.page-card textarea.freetext{width:100%;box-sizing:border-box;font:inherit;font-size:14.5px;padding:10px 12px;border-radius:10px;border:1px solid var(--line);background:var(--surface);color:var(--ink);min-height:74px;resize:vertical;margin:0 0 10px;}
.page-card .reveal{border-left:3px solid var(--acc-text);padding:10px 14px;margin:14px 0 0;font-size:var(--fs-body-sm);background:var(--surface);border-radius:0 var(--r-lg) var(--r-lg) 0;}
.page-card .thanks{font-size:15px;margin:0 0 14px;}
.page-card .reactrow{display:flex;gap:var(--s2);margin:6px 0 16px;}
.page-card .cue{font-size:13px;color:var(--mut);}
.page-card .cue.err{color:var(--amber);}

/* ---- member/coaching.html ---- */
/* page-local styles, moved out of the page's own <style> block (WP header/
   stylesheet migration). .skip-link and .visually-hidden were dropped
   here: the shared shell's .st-skip and .st-sr in stica.css already cover
   them exactly, so the page now uses those classes instead. Everything
   else below is unique to this page (kick/paper/avatar/act etc. are
   shared app-dashboard classes from the shared app-chrome section above,
   not redefined here). Values are var(--...) tokens from stica.css
   wherever an exact match exists; literals that had no matching token are
   left as-is. */
/* .wrap dropped here, and the reason has since changed. It was written when
   member/coaching.html had no data-page attribute, so its narrower 720px
   value could not be scoped and the page fell back to the shared 1120px base.
   That is no longer true: the page now carries data-page="member-coaching"
   and its own 720px .wrap rule further down this file. The bare base stays
   bare because every page without an override still needs it. Do not
   "restore" a narrow .wrap here; it would apply app-wide. Corrected
   2026-08-08, because the previous wording told a future reader to undo
   working code. */
.backline{margin:0 0 14px;}
.backline a{font-size:13px;color:var(--ink2);text-decoration:none;}
.backline a:hover{color:var(--acc-text);}

.pagehead{margin:0 0 20px;}
.pagehead .headrow{display:flex;align-items:center;gap:14px;flex-wrap:wrap;}
.pagehead h1{font-weight:700;font-size:26px;letter-spacing:-.5px;margin:0;text-wrap:balance;}
.pagehead .kick{margin:0 0 var(--s1);}
.avatar-btn{border:none;padding:0;cursor:pointer;position:relative;background:none;}
.avatar-btn:hover .avatar-badge{opacity:1;}
.avatar-badge{position:absolute;right:-2px;bottom:-2px;width:15px;height:15px;border-radius:var(--r-dot);
  background:var(--surface);color:var(--acc-text);border:1.5px solid var(--acc);font-size:var(--fs-label);font-weight:700;
  line-height:12px;text-align:center;opacity:.85;}
.avatar-btn.has-photo .avatar-badge{display:none;}
/* .next-chip dropped here: its margin-top folded into the shared base
   copy above (grid-app.css section) - it was unscoped and already applied
   to every .next-chip app-wide, so folding it in changes nothing that
   currently renders, it only removes the duplicate selector. */
.new-cue{display:none;margin:var(--s2) 0 0;font-size:12.5px;color:var(--mut);}

/* .paper dropped here: its margin folded into the shared base copy above
   (grid-app.css section) - it was unscoped and already applied to every
   .paper app-wide (member/coaching.html is not one of this round's four
   pages, so it cannot be given a data-page attribute here; folding is the
   only way to remove the duplicate selector without changing what any
   page currently renders). */
.cue{font-size:13px;color:var(--mut);}

/* The commit page (WP-plan-worth-committing-to step 4, 2026-08-10).

   Why this exists as classes rather than the inline sizes it replaces. The
   plan surface ran four sizes between 13px and 14.5px - 13, 13.5, 14, 14.5 -
   ratios of about 1.04 where the house wants at least 1.25. That is four
   sizes doing the work of one, and it is why the page read as an
   undifferentiated wall: nothing was bigger than anything else, so the eye
   had nowhere to land.

   Three sizes now, each with a job, and every one a house token rather than a
   number typed at the callsite:
     --fs-label (10.5px)   the six line labels
     --fs-body-sm (14px)   the supporting lines
     --fs-h3 (20px)        the two lines that carry the promise
   Ratios 1.33 and 1.43. The aspiration and rung one share the 20px size and
   are separated by weight and colour instead of by a fourth size, which is
   the point: a scale earns its steps, it does not collect them. */
.commit{display:flex;flex-direction:column;gap:20px;}
.commit-line{display:flex;flex-direction:column;gap:4px;}
.commit-line > .lbl{font-family:var(--mono);font-size:var(--fs-label);font-weight:400;
  line-height:1.4;letter-spacing:1px;text-transform:uppercase;color:var(--mut);margin:0;}
.commit-line > .say{font-size:var(--fs-body-sm);line-height:1.55;color:var(--ink2);margin:0;max-width:56ch;}
.commit-line.lead > .say{font-size:var(--fs-h3);line-height:1.3;letter-spacing:-.5px;
  font-weight:700;color:var(--ink);text-wrap:balance;}
.commit-line.promise > .say{font-size:var(--fs-h3);line-height:1.3;letter-spacing:-.5px;
  font-weight:400;color:var(--ink2);text-wrap:balance;}
/* The ladder: rung one is where they are, the rest is what it grows into, so
   the later rungs are quieter rather than absent. A member should be able to
   see the climb without being handed a syllabus. */
.commit-rungs{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:6px;}
.commit-rungs li{display:flex;gap:10px;align-items:baseline;
  font-size:var(--fs-body-sm);line-height:1.5;color:var(--mut);}
.commit-rungs li .n{font-family:var(--mono);font-size:var(--fs-label);color:var(--mut);
  flex:none;min-width:1.4em;}
.commit-rungs li.now{color:var(--ink2);font-weight:600;}
.commit-rungs li.now .n{color:var(--acc-text);}
/* What changed because they said so, on a revision. Marked rather than merely
   placed first: a member who took the trouble to say no should be able to see
   at a glance that the page answered them. */
.commit-line.changed{border-left:2px solid var(--acc-fill);padding-left:14px;}
.commit-line.changed > .lbl{color:var(--acc-text);}

/* The decision (WP-plan-worth-committing-to step 5). The only thing on this
   page that asks the member for anything, so it gets a rule above it and the
   page's own spacing rather than being another paragraph in the stack. It
   reuses the commit page's three type steps rather than introducing a fourth:
   the same .lbl and .say do the same jobs here. */
.decide{margin:22px 0 0;padding:20px 0 0;border-top:1px solid var(--line);
  display:flex;flex-direction:column;gap:4px;}
.decide > .lbl{font-family:var(--mono);font-size:var(--fs-label);font-weight:400;
  line-height:1.4;letter-spacing:1px;text-transform:uppercase;color:var(--mut);margin:0;}
.decide > .say{font-size:var(--fs-body-sm);line-height:1.55;color:var(--ink2);margin:0;max-width:56ch;}
.decide .ta{width:100%;max-width:56ch;margin-top:6px;padding:10px 12px;border-radius:10px;
  border:1px solid var(--line);background:var(--surface);color:var(--ink);
  font-family:inherit;font-size:var(--fs-body-sm);line-height:1.55;resize:vertical;}
.decide .ta:focus-visible{outline:2px solid var(--acc-fill);outline-offset:1px;}

/* released takeaway lists and rules (the shared renderMarkdown in
   assets/app.js): the shared app-chrome section above has no ul/ol/li/hr
   rule for this card, so they are added here, same rhythm as its own
   p/h4/sig rules. */
.takeaway ul,.takeaway ol{margin:0 0 14px;padding-left:20px;}
.takeaway li{font-size:14.5px;color:var(--ink2);margin:0 0 6px;}
.takeaway li:last-child{margin-bottom:0;}
.takeaway hr{border:0;border-top:1px solid var(--line);margin:var(--s4) 0;}

/* prep / scheduling / survey cards: warm but not garish - a soft accent
   tint, not the amber "review queue" warning colour the coach dashboard
   uses for drafts, since these are invitations, not alerts. */
.prep-card,.sched-card,.survey-card{border-color:color-mix(in srgb, var(--acc) 26%, var(--line));
  background:color-mix(in srgb, var(--acc) 6%, var(--surface));}
.prep-card h4,.sched-card h4,.survey-card h4{font-weight:700;font-size:19px;letter-spacing:-.4px;margin:0 0 10px;text-wrap:balance;}
.prep-card .prompt{font-size:14.5px;color:var(--ink2);margin:0 0 14px;padding:var(--s3) 14px;
  border-left:2px solid var(--acc);background:var(--surface);border-radius:0 var(--r-lg) var(--r-lg) 0;}
.prep-card textarea{width:100%;box-sizing:border-box;min-height:90px;padding:var(--s3) 14px;font:inherit;
  font-size:14.5px;color:var(--ink);border:1px solid var(--line2);border-radius:10px;background:var(--surface);
  resize:vertical;}
.prep-card .prow,#schedForm .prow{display:flex;justify-content:flex-end;margin-top:10px;}
.prep-card .answered-quote{font-size:14.5px;color:var(--ink2);margin:0 0 var(--s2);padding:var(--s3) 14px;
  border-left:2px solid var(--acc);background:var(--surface);border-radius:0 var(--r-lg) var(--r-lg) 0;}
.prep-meta{font-family:var(--mono);font-size:var(--fs-label);letter-spacing:.6px;text-transform:uppercase;color:var(--mut);margin:0;}
.prep-err,.survey-err{color:var(--amber);font-size:13px;margin:6px 0 0;}
.sched-slot-row{display:flex;gap:var(--s3);flex-wrap:wrap;margin:0 0 10px;}
.sched-slot-row label{display:flex;flex-direction:column;gap:var(--s1);font-size:12.5px;color:var(--mut);}
.sched-slot-row input,.sched-slot-row select{font:inherit;padding:var(--s2) 10px;border:1px solid var(--line2);border-radius:var(--r-lg);background:var(--surface);color:var(--ink);}
.sched-accept-list,.sched-before{list-style:none;padding:0;margin:0 0 10px;}
.sched-accept-list li,.sched-before li{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:6px 0;border-bottom:1px solid var(--line2);}
.frow{display:flex;flex-direction:column;gap:var(--s1);margin-bottom:var(--s3);}
.finput{width:100%;box-sizing:border-box;padding:10px var(--s3);font:inherit;font-size:var(--fs-body-sm);color:var(--ink);
  border:1px solid var(--line2);border-radius:var(--r-lg);background:var(--bg);}

/* commitments: a small when/where meta line under the title (all rows),
   a "check-ins stopped" quiet marker, the due-nudge highlight, its
   "how did it go" prompt and the discreet stop-checkins link. */
.act .metaline{font-size:12.5px;color:var(--mut);margin:2px 0 6px;}
.act .stopped-note{display:block;font-size:12px;color:var(--mut);margin:6px 0 0;}
.act.due{border-left:3px solid var(--acc);padding-left:11px;border-radius:0 var(--r-lg) var(--r-lg) 0;
  background:color-mix(in srgb, var(--acc) 5%, transparent);}
.nudge-prompt{margin:10px 0 0;}
.nudge-prompt .q{font-size:13.5px;font-weight:600;margin:0 0 var(--s2);color:var(--ink);}
.nudge-btns{display:flex;gap:var(--s2);flex-wrap:wrap;}
.stop-link{background:none;border:none;padding:0;margin-top:10px;font-size:12px;color:var(--mut);
  text-decoration:underline;text-underline-offset:2px;cursor:pointer;display:inline-block;font:inherit;font-size:12px;}
.stop-link:hover{color:var(--ink2);}

/* survey card */
.survey-intro{font-size:13.5px;color:var(--ink2);margin:0 0 var(--s4);}
/* .survey-q dropped here: byte-identical to the coach-dashboard.html copy
   above. */
.survey-q:last-of-type{margin-bottom:14px;}
.survey-q .ql{font-size:14.5px;font-weight:600;margin:0 0 var(--s1);color:var(--ink);}
.survey-q .req-mark{color:var(--acc-text);margin-left:2px;}
/* .survey-q .qhelp / .survey-scale input[type="range"] / .survey-scale
   .scale-anchors dropped here: byte-identical to the coach-dashboard.html
   copies above. */
.survey-scale{padding:var(--s1) 2px 0;}
.survey-scale .scale-val{text-align:center;font-size:15px;font-weight:700;color:var(--ink);margin:0 0 var(--s1);}
/* .survey-choice dropped here: computed-identical to the coach-dashboard.html
   copy above (var(--s2) resolves to the same 8px). */
.survey-choice label{display:flex;align-items:flex-start;gap:9px;font-size:var(--fs-body-sm);color:var(--ink);cursor:pointer;
  padding:9px var(--s3);border:1px solid var(--line2);border-radius:10px;background:var(--surface);}
.survey-choice input{margin-top:3px;flex:none;}
.survey-text textarea{width:100%;box-sizing:border-box;min-height:84px;padding:var(--s3) 14px;font:inherit;
  font-size:14.5px;color:var(--ink);border:1px solid var(--line2);border-radius:10px;background:var(--surface);resize:vertical;}
.survey-submitrow{display:flex;justify-content:flex-end;margin-top:6px;}

/* photo choice modal (replace / remove), reuses .paper/.modal-card chrome */
.photo-choice{display:flex;flex-direction:column;align-items:stretch;gap:var(--s2);}

/* inline styles moved from the page markup that carried real design
   decisions and are never touched by JS (display:none toggles and --i
   cascade-stagger custom properties stayed inline; they are written or
   read by app.js/ui.js at runtime). */
#noCoachH1{font-weight:700;font-size:22px;letter-spacing:-.4px;margin:0 0 var(--s2);}
#noCoachBody{color:var(--mut);font-size:var(--fs-body-sm);margin:0 0 14px;max-width:56ch;}
#noCoachState .actions{display:flex;gap:var(--s2);flex-wrap:wrap;}
#switcherRow{gap:var(--s2);flex-wrap:wrap;margin:0 0 var(--s4);}
#msgThread{margin-bottom:var(--s3);}

/* ---- member/craft-brief.html ---- */
/* Dropped here: this section used to carry the page's chrome under a bare
   #main.wrap selector. That ID selector outranks every bare .wrap rule in
   this file (id beats any number of classes), so it was silently forcing
   720px onto every OTHER page's #main.wrap too - member.html,
   coach/dashboard.html and the rest all mark their <main> id="main"
   class="wrap". Byte-identical rules already exist below, properly scoped
   under body[data-page="member-craft-brief"] (see the PAGE FRAGMENTS
   merge at the end of this file), so this copy is redundant as well as
   harmful; removed rather than merely scoped. */

/* ---- member/craft.html ---- */
/* moved out of the page's own <style> block per the member-shell migration
   (WP-member-home step 4 origin). Chrome (mast/drawer) comes from
   assets/mast.js; only this page's own sections are styled here.
   .paper/.pill/.chip/.cue/.wrap/.backline/.pagehead are the shared member
   classes, defined elsewhere; selectors are scoped under .page-craft (set
   on <body>) so nothing here can leak once this file is folded into the
   single app.css. */
.page-craft{min-height:100vh;}
.page-craft .eng-note{font-size:12.5px;color:var(--mut);margin:6px 0 0;}
.page-craft .eng-ref{font-family:var(--mono);font-size:11px;color:var(--mut);}
.page-craft .chip .d{width:6px;height:6px;border-radius:var(--r-dot);background:currentColor;}
.page-craft .links{display:flex;gap:var(--s2);flex-wrap:wrap;margin-top:var(--s2);}
.page-craft input[type=text],.page-craft textarea,.page-craft select{width:100%;box-sizing:border-box;font:400 var(--fs-body-sm) var(--sans);color:var(--ink);
  background:var(--bg);border:1px solid var(--line);border-radius:var(--r-lg);padding:9px 11px;}
.page-craft textarea{resize:vertical;}
.page-craft label{display:block;font-size:12.5px;font-weight:600;color:var(--ink2);margin:var(--s3) 0 var(--s1);}
/* WP-ask-pattern step 4: an unfinished brief, shown where the finished
   engagement would live (mechanic 4) rather than only reachable by
   remembering the address. */
.page-craft .draftrow{display:flex;align-items:center;justify-content:space-between;gap:var(--s3);flex-wrap:wrap;
  padding:var(--s3) 0;border-top:1px solid var(--line2);}
.page-craft .draftrow:first-of-type{border-top:0;}
.page-craft .draftrow .who{font-size:var(--fs-body-sm);font-weight:600;}
.page-craft .draftrow .how-far{font-size:12.5px;color:var(--mut);margin:2px 0 0;}
/* timeline (honest states: requested / in draft / in review / delivered) */
.page-craft .timeline{display:flex;gap:6px;margin:var(--s3) 0 4px;}
.page-craft .timeline .step{flex:1;text-align:center;}
.page-craft .timeline .bar{height:5px;border-radius:3px;background:var(--line2);}
.page-craft .timeline .step.done .bar,.page-craft .timeline .step.now .bar{background:var(--acc);}
.page-craft .timeline .lbl{font-family:var(--mono);font-size:9.5px;letter-spacing:.6px;text-transform:uppercase;color:var(--mut);margin-top:5px;display:block;}
.page-craft .timeline .step.now .lbl,.page-craft .timeline .step.done .lbl{color:var(--acc-text);}
/* engagement block + request queue */
.page-craft .eng-block{padding:var(--s3) 0;border-top:1px solid var(--line2);}
.page-craft .eng-block:first-of-type{border-top:0;padding-top:0;}
.page-craft .itemrow{padding:9px 0;border-top:1px solid var(--line2);font-size:13.5px;}
.page-craft .itemrow:first-child{border-top:0;}
.page-craft .itemrow .k{font-family:var(--mono);font-size:9.5px;letter-spacing:.8px;text-transform:uppercase;color:var(--mut);margin-right:var(--s2);}
.page-craft .itemrow p{margin:3px 0 0;font-size:13px;color:var(--ink2);white-space:pre-wrap;}
.page-craft .empty{font-size:13px;color:var(--mut);}
.page-craft .hide{display:none;}

/* ---- member/learner.html ---- */
/* moved out of the page's own <style> block per the member-shell migration.
   Shared chrome (header, skip link, .paper/.pill/.ghost/.chip) comes from
   stica.css and mast.js; nothing here redefines them. Selectors are scoped
   under .page-learner (set on <body>) so nothing here can leak once this
   file is folded into the single app.css. */
.page-learner{min-height:100vh;}
.page-learner .wrap{max-width:960px;margin:0 auto;width:100%;padding:20px 20px 60px;box-sizing:border-box;}
.page-learner .backline{margin:0 0 14px;}
.page-learner .backline a{font-size:13px;color:var(--ink2);text-decoration:none;}
.page-learner .backline a:hover{color:var(--acc-text);}
.page-learner .pagehead .kick{font-family:var(--mono);font-size:11px;letter-spacing:1.5px;text-transform:uppercase;color:var(--mut);margin:0 0 4px;}
.page-learner .pagehead h1{font-weight:700;font-size:22px;letter-spacing:-.4px;margin:0 0 6px;}
.page-learner .pagehead p{color:var(--mut);font-size:14px;margin:0 0 22px;max-width:60ch;}
.page-learner .paper{background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:18px 20px;
  box-shadow:0 1px 2px rgba(0,0,0,.04);margin:0 0 14px;}
.page-learner .paper h2{font-size:16px;font-weight:650;letter-spacing:-.2px;margin:0 0 10px;}
.page-learner .topicrow{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;padding:10px 0;border-top:1px solid var(--line2);}
.page-learner .topicrow:first-of-type{border-top:0;}
.page-learner .topicrow a.tt{font-size:15px;font-weight:600;color:var(--ink);text-decoration:none;}
.page-learner .topicrow a.tt:hover{color:var(--acc-text);}
.page-learner .topicrow .meta{font-size:12.5px;color:var(--mut);}
.page-learner .chip{display:inline-flex;align-items:center;gap:5px;font-family:var(--mono);font-size:10px;
  letter-spacing:1px;text-transform:uppercase;border:1px solid var(--line);border-radius:999px;
  padding:2px 9px;color:var(--mut);}
.page-learner .chip.ok{border-color:var(--acc-text);color:var(--acc-text);}
.page-learner .chip.warn{border-color:var(--amber);color:var(--amber);}
.page-learner .pill{display:inline-flex;align-items:center;gap:6px;padding:9px 18px;border-radius:999px;border:0;
  background:var(--acc);color:#fff;font:600 13.5px var(--sans);cursor:pointer;text-decoration:none;}
.page-learner .pill.ghost{background:transparent;border:1px solid var(--line);color:var(--ink2);}
.page-learner .pill.sm{padding:7px 14px;font-size:12.5px;}
.page-learner .pill:disabled{opacity:.5;cursor:default;}
.page-learner input[type=text],.page-learner textarea,.page-learner select{width:100%;box-sizing:border-box;font:400 14px var(--sans);color:var(--ink);
  background:var(--bg);border:1px solid var(--line);border-radius:8px;padding:9px 11px;}
.page-learner textarea{resize:vertical;}
.page-learner label{display:block;font-size:12.5px;font-weight:600;color:var(--ink2);margin:12px 0 4px;}
.page-learner .cue{font-size:12.5px;color:var(--mut);}
.page-learner .cue.err{color:var(--amber);}
.page-learner .itemrow{padding:10px 0;border-top:1px solid var(--line2);}
.page-learner .itemrow:first-child{border-top:0;}
.page-learner .itemrow .k{font-family:var(--mono);font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(--mut);margin-right:8px;}
.page-learner .itemrow .t{font-size:14px;font-weight:600;}
.page-learner .itemrow p{font-size:13.5px;color:var(--ink2);margin:4px 0 0;white-space:pre-wrap;}
.page-learner .itemrow a{font-size:12.5px;color:var(--acc-text);}
.page-learner .itemhead{display:flex;align-items:baseline;justify-content:space-between;gap:10px;flex-wrap:wrap;}
.page-learner .itemrow .rm{font-size:12.5px;color:var(--mut);background:none;border:0;cursor:pointer;text-decoration:underline;
  flex-shrink:0;padding:6px 2px;min-height:28px;}
.page-learner .stepitem{display:flex;gap:10px;align-items:flex-start;margin:0 0 8px;}
.page-learner .stepitem input[type=checkbox]{width:18px;height:18px;margin-top:2px;flex-shrink:0;accent-color:var(--acc);}
.page-learner .stepitem.done .t{color:var(--mut);text-decoration:line-through;}
.page-learner .stepitem.done p{color:var(--mut);}
.page-learner .stepitem.skipped .t{color:var(--mut);text-decoration:line-through;}
.page-learner .stepitem.skipped p{color:var(--mut);}
/* WP-plan-step-meaning: a step reads standalone (title + why) wherever it
   shows, and its "done" action is a small purpose-matched dialog, never a
   bare checkbox. Shared markup used by the dashboard do-list and the plan
   spine's step list alike. */
.page-learner .stepwhy{font-size:12.5px;color:var(--ink2);margin:2px 0 0;line-height:1.5;}
.page-learner .stepactions{display:flex;gap:12px;margin-top:4px;flex-wrap:wrap;}
.page-learner .stepactions button{font-size:12px;color:var(--mut);background:none;border:0;cursor:pointer;
  text-decoration:underline;padding:2px 0;}
.page-learner .stepdialog{margin-top:8px;padding:10px 12px;border:1px solid var(--line);border-radius:8px;
  background:var(--acc-bg,rgba(14,122,109,.06));}
.page-learner .stepdialog label{margin:0 0 4px;}
.page-learner .stepdialog textarea{min-height:60px;}
.page-learner .stepdialog .row{display:flex;gap:10px;align-items:center;margin-top:8px;flex-wrap:wrap;}
.page-learner .arcrow{display:flex;gap:10px;align-items:baseline;padding:8px 0;border-top:1px solid var(--line2);font-size:13.5px;}
.page-learner .arcrow:first-child{border-top:0;}
.page-learner .arcrow .when{font-family:var(--mono);font-size:11.5px;color:var(--mut);min-width:92px;}
.page-learner .arcrow .what{color:var(--ink2);}
.page-learner .arcrow.done .what{color:var(--mut);}
/* WP-apply-learning-map step 4: map explorer + Buddy's notebook */
.page-learner .mapthread{margin:16px 0 0;padding:12px 0 0;border-top:1px solid var(--line2);}
.page-learner .mapthread:first-child{margin-top:6px;border-top:0;padding-top:0;}
.page-learner .mapthread h3{font-size:14.5px;font-weight:650;margin:0 0 2px;}
.page-learner .mapthread .threadwhy{font-size:13px;color:var(--ink2);margin:0 0 4px;}
.page-learner .mapthread.aside h3{color:var(--mut);}
.page-learner .mapthread.aside .mapitem{opacity:.55;}
.page-learner .asideline{font-size:12.5px;color:var(--mut);font-style:italic;margin:2px 0 4px;}
.page-learner .mapitem{padding:8px 0 0;}
.page-learner .mapitem .t{font-size:13.5px;font-weight:600;}
.page-learner .mapitem .maptag{font-family:var(--mono);font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(--mut);margin-left:8px;}
.page-learner .mapitem .why{font-size:13px;color:var(--ink2);margin:2px 0 0;}
.page-learner .mapitem .keepfact{font-size:13px;margin:6px 0 0;padding:8px 12px;border-left:3px solid var(--acc-text);background:var(--bg2,var(--bg));border-radius:0 8px 8px 0;}
.page-learner .mapitem .srcs{font-size:12.5px;margin:4px 0 0;}
.page-learner .mapitem .srcs a{color:var(--acc-text);}
.page-learner .nbrow{padding:10px 0;border-top:1px solid var(--line2);}
.page-learner .nbrow:first-child{border-top:0;}
.page-learner .nbrow .when{font-family:var(--mono);font-size:11.5px;color:var(--mut);margin-right:8px;}
.page-learner .nbrow .t{font-size:13.5px;font-weight:600;}
.page-learner .nbrow .said{font-size:13.5px;color:var(--ink2);margin:4px 0 0;}
.page-learner .nbrow .said q{font-style:italic;}
.page-learner .nbrow .took{font-size:12.5px;color:var(--mut);margin:3px 0 0;}
.page-learner .hide{display:none;}

/* ws4 ingestion composer */
.page-learner .modes{display:flex;gap:8px;margin:0 0 14px;}
.page-learner .mode{flex:1;border:1px solid var(--line);border-radius:10px;padding:10px 12px;text-align:center;cursor:pointer;
  font:inherit;appearance:none;font-size:12.5px;font-weight:600;color:var(--ink2);background:var(--bg);}
.page-learner .mode.on{border-color:var(--acc);color:var(--acc-text);background:var(--acc-bg,rgba(14,122,109,.08));}
.page-learner .drop{border:1.5px dashed var(--line);border-radius:10px;padding:22px 16px;text-align:center;color:var(--mut);font-size:13px;margin:0 0 6px;cursor:pointer;}
.page-learner .drop.over{border-color:var(--acc);color:var(--acc-text);}
.page-learner .drop b{color:var(--ink2);}
.page-learner .drop .types{font-family:var(--mono);font-size:10.5px;letter-spacing:.6px;margin-top:6px;display:block;}
.page-learner .cue.warn{color:var(--amber,#a3620a);}
.page-learner .chips{display:flex;flex-wrap:wrap;gap:7px;}
.page-learner .slotchip{border:1px solid var(--line);border-radius:999px;padding:5px 12px;font:inherit;appearance:none;font-size:12px;color:var(--ink2);cursor:pointer;background:var(--surface);}
.page-learner .slotchip.on{border-color:var(--acc);background:var(--acc-bg,rgba(14,122,109,.08));color:var(--acc-text);font-weight:600;}
.page-learner .slotchip .k{font-family:var(--mono);font-size:9.5px;letter-spacing:.8px;text-transform:uppercase;margin-right:5px;opacity:.75;}
.page-learner .tag{font-family:var(--mono);font-size:9.5px;letter-spacing:1px;text-transform:uppercase;border:1px solid var(--line);
  border-radius:999px;padding:2px 8px;color:var(--mut);}
.page-learner .tag.used{border-color:var(--acc-text);color:var(--acc-text);}
.page-learner .tag.waiting{border-color:var(--amber,#a3620a);color:var(--amber,#a3620a);}
.page-learner .capline{display:flex;align-items:center;gap:10px;margin-top:10px;}
.page-learner .capbar{flex:1;height:5px;border-radius:3px;background:var(--line2);overflow:hidden;}
.page-learner .capbar i{display:block;height:100%;background:var(--acc);border-radius:3px;}

/* dashboard (DESIGN-member-dashboard.md): two-column grid, main + rail */
.page-learner .dgrid{display:grid;grid-template-columns:minmax(0,1fr) 320px;gap:14px;align-items:start;}
.page-learner .dcol{display:flex;flex-direction:column;gap:14px;min-width:0;}
@media(max-width:900px){.page-learner .dgrid{grid-template-columns:1fr;}}

.page-learner .quickrow{display:flex;gap:8px;flex-wrap:wrap;margin-top:14px;}
.page-learner .hero{border-color:var(--acc);}
.page-learner .hero .committed{font-size:14.5px;color:var(--ink2);margin:6px 0 0;}
.page-learner .hero .committed b{color:var(--ink);}
.page-learner .kick{font-family:var(--mono);font-size:11px;letter-spacing:1.5px;text-transform:uppercase;color:var(--mut);margin:0 0 4px;}
.page-learner .heroh1{font-weight:700;font-size:20px;letter-spacing:-.4px;margin:0 0 2px;}

/* zone 2: prompt cards */
.page-learner .prompt{border:1px solid var(--acc);border-radius:10px;padding:14px 16px;background:var(--acc-bg,rgba(14,122,109,.08));}
.page-learner .prompt .chip{margin-bottom:6px;}
.page-learner .prompt .q{font-weight:600;font-size:14.5px;margin:4px 0 10px;color:var(--ink);}
.page-learner .prompt .row{display:flex;align-items:center;gap:10px;margin-top:10px;flex-wrap:wrap;}
/* The doors on a topic page (WP-apply-gives-first step 5). A closed door
   has to read as an invitation rather than as something withheld, so the
   summary is a real control - underlined on hover, its own focus ring -
   and it says what is behind it rather than "show more". */
.page-learner details.fold{margin-top:14px;border-top:1px solid var(--line);padding-top:12px;}
.page-learner details.fold > summary{cursor:pointer;font-size:13.5px;font-weight:600;color:var(--acc-text);
  list-style:none;display:flex;align-items:center;gap:8px;padding:2px 0;}
.page-learner details.fold > summary::-webkit-details-marker{display:none;}
.page-learner details.fold > summary::before{content:'';width:7px;height:7px;flex:0 0 auto;
  border-right:2px solid currentColor;border-bottom:2px solid currentColor;
  transform:rotate(-45deg);transition:transform .15s ease;margin-left:2px;}
.page-learner details.fold[open] > summary::before{transform:rotate(45deg);}
.page-learner details.fold > summary:hover{text-decoration:underline;text-underline-offset:3px;}
.page-learner details.fold > summary:focus-visible{outline:2px solid var(--acc);outline-offset:3px;border-radius:4px;}
.page-learner details.fold > .inner{margin-top:12px;}
@media (prefers-reduced-motion: reduce){
  .page-learner details.fold > summary::before{transition:none;}
}
.page-learner .promptmore{margin-top:10px;}
.page-learner details.promptmore summary{cursor:pointer;font-size:13px;color:var(--ink2);font-weight:600;}
.page-learner details.promptmore .inner{margin-top:10px;display:flex;flex-direction:column;gap:10px;}

/* zone 3: today do-list */
.page-learner .todo{display:flex;gap:10px;align-items:flex-start;padding:10px 0;border-top:1px solid var(--line2);}
.page-learner .todo:first-of-type{border-top:0;}
.page-learner .todo input[type=checkbox]{width:18px;height:18px;margin-top:2px;flex-shrink:0;accent-color:var(--acc);}
.page-learner .todo .t{font-size:14px;font-weight:600;margin:0;}
.page-learner .todo .m{font-size:12.5px;color:var(--mut);margin:1px 0 0;}
.page-learner .todo.done .t{color:var(--mut);text-decoration:line-through;}

/* zone 4: plan spine */
.page-learner .plancard{padding:14px 0;border-top:1px solid var(--line2);}
.page-learner .plancard:first-of-type{border-top:0;padding-top:4px;}
.page-learner .plancard .head{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;}
.page-learner .plancard .head a{font-size:15px;font-weight:650;color:var(--ink);text-decoration:none;letter-spacing:-.2px;}
.page-learner .plancard .head a:hover{color:var(--acc-text);}
.page-learner .plancard .why{font-size:13px;color:var(--ink2);margin:4px 0 8px;max-width:66ch;}
.page-learner .steps{display:flex;align-items:center;gap:8px;margin:6px 0 2px;}
.page-learner .stepbar{flex:0 0 130px;height:5px;border-radius:3px;background:var(--line2);overflow:hidden;}
.page-learner .stepbar i{display:block;height:100%;background:var(--acc);border-radius:3px;}
.page-learner .nextline{display:flex;gap:10px;align-items:flex-start;margin-top:8px;}
.page-learner .nextline input[type=checkbox]{width:17px;height:17px;margin-top:2px;accent-color:var(--acc);}
.page-learner .nextline .t{font-size:13.5px;font-weight:600;margin:0;}
.page-learner .nextline .m{font-size:12.5px;color:var(--mut);margin:1px 0 0;}

/* zone 6: week rail */
.page-learner .day{display:flex;gap:10px;padding:7px 0;border-top:1px solid var(--line2);font-size:13px;align-items:baseline;}
.page-learner .day:first-of-type{border-top:0;}
.page-learner .day .d{font-family:var(--mono);font-size:11px;color:var(--mut);flex:0 0 58px;}
.page-learner .day .what{color:var(--ink2);min-width:0;}
.page-learner .day .what b{color:var(--ink);font-weight:600;}
.page-learner .day.today .d{color:var(--acc-text);font-weight:700;}
.page-learner .day.quiet .what{color:var(--mut);}

/* zone 7: buddy voice */
.page-learner .buddy{border-left:3px solid var(--acc);padding:2px 0 2px 12px;margin:0 0 12px;}
.page-learner .buddy:last-child{margin-bottom:0;}
.page-learner .buddy p{margin:0;font-size:13.5px;color:var(--ink2);}
.page-learner .buddy .from{font-family:var(--mono);font-size:10px;letter-spacing:1px;text-transform:uppercase;color:var(--mut);margin-bottom:2px;}
.page-learner .buddy a{font-size:12.5px;}

/* zone 8: growth strip */
.page-learner .stats{display:grid;grid-template-columns:repeat(2,1fr);gap:10px;margin-bottom:12px;}
.page-learner .stat{border:1px solid var(--line2);border-radius:10px;padding:10px 12px;}
.page-learner .stat .n{font-size:20px;font-weight:700;letter-spacing:-.5px;}
.page-learner .stat .l{font-size:11.5px;color:var(--mut);}
.page-learner .sparkwrap{margin-top:4px;}
.page-learner .sparkcap{font-size:12px;color:var(--mut);margin:4px 0 0;}

/* zone 5: capture bar */
.page-learner .capturebar{display:flex;gap:8px;flex-wrap:wrap;align-items:center;}
.page-learner .capturebar .lead{font-size:13.5px;color:var(--ink2);margin:0;flex:1 1 100%;}

/* zone 9: coach door */
.page-learner .door{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;}
.page-learner .door p{margin:0;font-size:13px;color:var(--ink2);}

/* ---- member/report.html ---- */
/* page-local styling, moved out of the page's <style> block as part of the
   shared-shell migration. Scoped under body.page-report so this fragment
   is safe to concatenate into a shared app.css alongside every other
   page's fragment (same pattern as login.css). */

/* A thin designed frame around an embedded Engine document: the document
   itself is already a full standalone GRID-styled page (own head, own
   "prepared for" header, own action footer) - see
   needs-analysis-model.html in the Engine templates. This page only adds
   the member-area chrome (mast, back link, load state) and hosts it. */
body.page-report{min-height:100vh;display:flex;flex-direction:column;}
.page-report .wrap{flex:1;max-width:960px;margin:0 auto;width:100%;padding:20px 20px 40px;box-sizing:border-box;
  display:flex;flex-direction:column;}
.page-report .backline{margin:0 0 14px;}
.page-report .backline a{font-size:13px;color:var(--ink2);text-decoration:none;display:inline-flex;align-items:center;gap:6px;}
.page-report .backline a:hover{color:var(--acc-text);}
.page-report .repmeta{margin:0 0 14px;}
.page-report .repmeta .kick{font-family:var(--mono);font-size:11px;letter-spacing:1.5px;text-transform:uppercase;
  color:var(--mut);margin:0 0 4px;}
.page-report .repmeta h1{font-weight:700;font-size:21px;letter-spacing:-.4px;margin:0;}
.page-report .repframe{flex:1;border:1px solid var(--line);border-radius:var(--r-xl);overflow:hidden;background:var(--surface);
  min-height:70vh;box-shadow:0 1px 2px rgba(0,0,0,.04);}
.page-report .repframe iframe{width:100%;height:100%;min-height:70vh;border:0;display:block;}
.page-report .repstate{padding:40px var(--s5);text-align:center;color:var(--mut);font-size:14px;}
.page-report .repstate.err{color:var(--amber);}
.page-report .openrow{margin:var(--s3) 0 0;text-align:right;}
.page-report .openrow a{font-size:12.5px;color:var(--mut);text-decoration:underline;text-underline-offset:2px;}
.page-report .openrow a:hover{color:var(--acc-text);}

/* Plan-to-practice (WP-apply-convergence ws1). */
.page-report .practicerow{margin:var(--s4) 0 0;padding:14px 16px;border:1px solid var(--line);border-radius:var(--r-xl);background:var(--surface);}
.page-report .practicerow__lede{margin:0 0 var(--s2);font-size:14px;color:var(--ink2);}
.page-report .practicerow__action{margin:0;}
.page-report .practicerow__action .cue{margin-left:var(--s3);font-size:13px;color:var(--mut);}

/* NOTE (collision fix, this pass): this section previously carried a second,
   later copy appended from assets/parts/member-report.css (identical
   selectors), which always won the cascade on source order — so the tokenised
   var() values above were dead and every rendered pixel already matched this
   section's literal values. Deleted the duplicate rather than the tokenised
   copy so this stays the one live definition; values above are now literal
   where they differed from the winning copy, to keep today's rendered output
   unchanged. */

/* ---- member.html ---- */
/* member home (signed in). Page-local rules only; shared chrome (.paper,
   .pill, .chip, .tile, .avatar, .drawer, .hero-strip/.hero-card,
   .tilegrid) comes from the shared app-chrome section above. The header/
   nav/account-panel markup this page used to hand-roll now comes from the
   shared shell (assets/mast.js); the .mast/.mast-nav/etc. rules that
   lived here are gone with it. */
body.page-member{min-height:100vh;display:flex;flex-direction:column;}
body[data-page="member"] .wrap{flex:1;max-width:920px;margin:0 auto;width:100%;padding:28px 20px 70px;box-sizing:border-box;}

.greet{margin:0 0 22px;}
.greet h1{font-weight:700;font-size:27px;letter-spacing:-.6px;margin:6px 0 0;text-wrap:balance;}
.greet .sub{font-size:var(--fs-body-sm);color:var(--mut);margin:var(--s1) 0 0;}

.hero-card .m a{color:inherit;}
/* .hero-strip.solo dropped here: byte-identical to the coach-dashboard.html
   copy above. */
body[data-page="member"] .hero-strip{margin-bottom:22px;}
.hero-card .chevron{font-size:20px;line-height:1;color:inherit;opacity:.7;flex:none;}

.section-kick{font-family:var(--mono);font-size:var(--fs-eyebrow);letter-spacing:1.5px;text-transform:uppercase;
  color:var(--mut);margin:26px 0 var(--s3);font-weight:500;}
.section-kick:first-of-type{margin-top:0;}

/* First-run intent chooser (WP-member-home step 2): quiet intro copy
   above the four door cards, same weight as a prod-card h2/body so it
   never reads louder than the doors themselves. */
.chooser-h{font-weight:700;font-size:19px;letter-spacing:-.4px;margin:0 0 6px;}
.chooser-sub{font-size:13.5px;color:var(--mut);margin:0 0 var(--s4);}

.prodgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px;}

.prod-card h2{font-weight:700;font-size:18px;letter-spacing:-.3px;margin:0 0 var(--s2);display:flex;
  align-items:center;gap:var(--s2);flex-wrap:wrap;}
.prod-card p.body{color:var(--ink2);font-size:var(--fs-body-sm);margin:0 0 14px;line-height:1.5;}
.prod-card .links{display:flex;gap:var(--s2);flex-wrap:wrap;}
.prod-card .eng-block{margin-bottom:14px;}
.prod-card .eng-block:last-child{margin-bottom:0;}
.prod-card .eng-status{font-size:13px;color:var(--ink2);margin:0 0 var(--s2);display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.prod-card .eng-note{font-size:12.5px;color:var(--mut);margin:6px 0 0;}
.prod-card .cue{font-size:13px;color:var(--mut);margin:var(--s2) 0 0;display:none;}
.intake-form{margin-top:var(--s3);padding:14px;border:1px solid var(--line, #e2e8f0);border-radius:10px;display:grid;gap:10px;}
.intake-q{display:grid;gap:2px;}
.intake-label{font-size:13px;font-weight:600;}
.intake-input{font:inherit;font-size:13px;padding:7px 9px;border:1px solid var(--line, #cbd5e1);border-radius:7px;width:100%;box-sizing:border-box;background:var(--bg, #fff);color:inherit;}
.intake-missing .intake-input{border-color:#c0504d;}
.intake-missing .intake-label{color:#c0504d;}

/* Not-owned "explore" cards: quiet, subdued - never upsell-loud. Muted
   border, muted ink, no shadow; the pitch is one line and the link is
   the only accent-coloured thing on the card. */
.explore-card{border-style:dashed;border-color:var(--line2);box-shadow:none;background:transparent;
  padding:20px 22px;}
.explore-card h2{font-size:15px;font-weight:600;color:var(--mut);margin:0 0 6px;letter-spacing:-.1px;}
.explore-card p{font-size:13px;color:var(--mut);margin:0 0 10px;line-height:1.5;}
.explore-card a{font-size:13px;color:var(--ink2);text-decoration:underline;text-underline-offset:2px;}
.explore-card a:hover{color:var(--acc-text);}

.tier-badge{font-size:var(--fs-eyebrow);font-weight:700;letter-spacing:.3px;text-transform:uppercase;color:var(--acc-text);
  background:color-mix(in srgb, var(--acc) 12%, transparent);border-radius:var(--r-full);padding:3px 10px;}

.footline{margin:28px 0 0;text-align:center;font-size:13px;color:var(--mut);}
.footline a{color:inherit;}

/* account drawer sections - same rhythm as coach dashboard's settings
   drawer. .dsec/.avatar-row/.radiorow/.drawernote/.hide are shared, see
   the mast.css section above; only this page's extra field/billing rules
   stay local. */
/* .frow dropped here: byte-identical to the member/coaching.html copy above. */
.frow:last-child{margin-bottom:0;}
.frow .l{font-family:var(--mono);font-size:var(--fs-chip);letter-spacing:.8px;text-transform:uppercase;color:var(--mut);}
body[data-page="member"] .finput{width:100%;box-sizing:border-box;padding:var(--s2) var(--s3);font:inherit;font-size:var(--fs-body-sm);color:var(--ink);
  border:1px solid var(--line2);border-radius:var(--r-lg);background:var(--bg);}
.avatar-row .avbtns{display:flex;gap:var(--s2);flex-wrap:wrap;}
body[data-page="member"] .fbtns{display:flex;gap:var(--s2);align-items:center;margin-top:6px;flex-wrap:wrap;}
body[data-page="member"] .savecue{font-size:12.5px;color:var(--mut);opacity:0;transition:opacity .2s ease;}
/* .savecue.show dropped here: byte-identical to the shared app-chrome copy
   (grid-app.css section) above. */
.savecue.err{color:var(--bad,#c0392b);}
.billing-row{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:var(--s2) 0;
  border-top:1px solid var(--line);}
.billing-row:first-of-type{border-top:none;padding-top:0;}
.billing-row .bp{font-size:13.5px;}
.billing-row .bp .plan-note{display:block;font-size:12px;color:var(--mut);margin-top:2px;}

/* ---- owner/membership.html ---- */
/* Owner membership console (WP-owner-admin-dashboard step 3). Deliberately
   plain: a table you can read and act on, not a chart wall. Nothing here is
   styled by colour alone - every state also carries words, so it survives
   greyscale, colour blindness and a screen reader (WCAG 2.2 AA, 1.4.1).
   Scoped under .pg-owner-membership (set on <body>) so nothing here leaks
   into other pages once this fragment joins the shared app.css. */
/* The literals below are the owner page's own, restored 2026-08-08. They had been
   swapped for the nearest design token, and the nearest token is not the same
   number: --s5 is 24px where this page has always used 20px, --s3 is 12px where
   it used 10px, --r-lg is 8px where it used 10px. Six values had shifted with
   nothing recording it. A token substitution is only a migration when the value
   is identical; otherwise it is a redesign nobody asked for. */
.pg-owner-membership .wrap{max-width:1100px;margin:0 auto;padding:20px 20px 60px;box-sizing:border-box;}
.pg-owner-membership .head{margin:0 0 18px;}
.pg-owner-membership .head .kick{font-family:var(--mono);font-size:var(--fs-eyebrow);letter-spacing:1.5px;text-transform:uppercase;color:var(--mut);margin:0 0 4px;}
.pg-owner-membership .head h1{font-weight:700;font-size:22px;letter-spacing:-.4px;margin:0 0 6px;}
.pg-owner-membership .head p{margin:0;color:var(--ink2);font-size:var(--fs-body-sm);max-width:70ch;}

/* summary strip */
.pg-owner-membership .sum{display:flex;flex-wrap:wrap;gap:10px;margin:0 0 20px;padding:0;list-style:none;}
.pg-owner-membership .sum li{border:1px solid var(--line);border-radius:10px;background:var(--surface);padding:10px 14px;min-width:120px;}
.pg-owner-membership .sum .n{display:block;font-weight:700;font-size:20px;letter-spacing:-.5px;}
.pg-owner-membership .sum .k{display:block;font-size:12px;color:var(--mut);margin-top:2px;}

/* table: scrolls in its own box so the page never scrolls sideways */
.pg-owner-membership .tablewrap{overflow-x:auto;border:1px solid var(--line);border-radius:var(--r-xl);background:var(--surface);}
.pg-owner-membership table{border-collapse:collapse;width:100%;min-width:820px;font-size:13.5px;}
.pg-owner-membership caption{text-align:left;padding:var(--s3) 14px;font-size:12.5px;color:var(--mut);border-bottom:1px solid var(--line);}
.pg-owner-membership th,.pg-owner-membership td{text-align:left;padding:10px 14px;border-bottom:1px solid var(--line);vertical-align:top;}
.pg-owner-membership th{font-size:11.5px;letter-spacing:.6px;text-transform:uppercase;color:var(--mut);font-weight:600;white-space:nowrap;}
.pg-owner-membership tbody tr:last-child td{border-bottom:0;}
.pg-owner-membership .who{font-weight:600;}
.pg-owner-membership .who .em{display:block;font-weight:400;color:var(--ink2);font-size:12.5px;word-break:break-all;}
.pg-owner-membership .tier{white-space:nowrap;}
.pg-owner-membership .tag{display:inline-block;border:1px solid var(--line);border-radius:var(--r-full);padding:1px 8px;font-size:11.5px;margin:0 4px 4px 0;}
.pg-owner-membership .tag.none{color:var(--mut);}
.pg-owner-membership .pend{color:var(--amber);font-weight:600;}
.pg-owner-membership .acts{display:flex;flex-wrap:wrap;gap:6px;}
.pg-owner-membership .acts.row{align-items:center;margin-top:4px;}
.pg-owner-membership .acts.row:first-child{margin-top:0;}
/* product name once per line, fixed width so the level pills line up */
.pg-owner-membership .acts .pl{width:5.5em;flex:none;font-size:11.5px;color:var(--mut);}
.pg-owner-membership button.mini{font:inherit;font-size:12px;padding:4px 10px;border:1px solid var(--line);border-radius:var(--r-full);
  background:var(--bg);color:var(--ink);cursor:pointer;}
.pg-owner-membership button.mini:hover{border-color:var(--acc);}
.pg-owner-membership button.mini:focus-visible{outline:2px solid var(--acc);outline-offset:2px;}
.pg-owner-membership button.mini[disabled]{opacity:.5;cursor:default;}

.pg-owner-membership .state{padding:34px 20px;text-align:center;color:var(--mut);font-size:var(--fs-body-sm);}
.pg-owner-membership .state.err{color:var(--amber);}
.pg-owner-membership .note{margin:16px 0 0;font-size:12.5px;color:var(--mut);max-width:75ch;}
.pg-owner-membership .undo{margin:14px 0 0;padding:10px 14px;border:1px solid var(--line);border-left:3px solid var(--acc);
  border-radius:var(--r-lg);background:var(--surface);font-size:13px;}
.pg-owner-membership .undo code{font-family:var(--mono);font-size:12px;}
.pg-owner-membership .vh{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;}

/* In-page nav instead of ARIA tabs: three stacked sections and plain
   anchors. Real tabs would need custom arrow-key handling to be correct,
   and there is nothing here worth that risk (WCAG 2.2 AA). */
.pg-owner-membership .pagenav{margin:0 0 22px;padding:0;list-style:none;display:flex;flex-wrap:wrap;gap:14px;font-size:13px;}
.pg-owner-membership .pagenav a{color:var(--ink2);text-decoration:none;border-bottom:1px solid var(--line);padding-bottom:2px;}
.pg-owner-membership .pagenav a:hover,.pg-owner-membership .pagenav a:focus-visible{color:var(--acc-text);border-color:var(--acc);}
.pg-owner-membership .sect{margin:40px 0 0;padding:var(--s5) 0 0;border-top:1px solid var(--line);}
.pg-owner-membership .sect h2{font-weight:700;font-size:18px;letter-spacing:-.3px;margin:0 0 6px;}
.pg-owner-membership .sub{font-size:12px;letter-spacing:.6px;text-transform:uppercase;color:var(--mut);margin:20px 0 8px;font-weight:600;}
.pg-owner-membership .lede2{margin:0 0 14px;color:var(--ink2);font-size:13.5px;max-width:75ch;}
.pg-owner-membership .ctl{margin:0 0 8px;display:flex;align-items:center;gap:var(--s2);font-size:13px;}
.pg-owner-membership .ctl label{color:var(--mut);}
.pg-owner-membership .ctl select{font:inherit;font-size:13px;padding:5px var(--s2);border:1px solid var(--line);border-radius:var(--r-lg);background:var(--bg);color:var(--ink);}
.pg-owner-membership .ctl select:focus-visible{outline:2px solid var(--acc);outline-offset:2px;}
.pg-owner-membership .gaps{margin:0;padding:0;list-style:none;}
.pg-owner-membership .gaps li{border-left:3px solid var(--line);padding:6px 0 6px var(--s3);margin:0 0 10px;font-size:13px;}
.pg-owner-membership .gaps b{display:block;}
.pg-owner-membership .gaps span{color:var(--mut);}
.pg-owner-membership .checks{margin:0 0 18px;padding:0;list-style:none;}
.pg-owner-membership .checks li{padding:8px 0 8px var(--s3);border-left:3px solid var(--line);margin:0 0 8px;font-size:13.5px;}
.pg-owner-membership .checks li.ok{border-color:var(--acc);}
.pg-owner-membership .checks li.warn{border-color:var(--amber);}
.pg-owner-membership .checks li.fail{border-color:var(--amber);font-weight:600;}
.pg-owner-membership .checks .lv{font-family:var(--mono);font-size:11px;letter-spacing:1px;text-transform:uppercase;color:var(--mut);display:block;}
.pg-owner-membership .verdict{font-size:var(--fs-body-sm);margin:0 0 14px;font-weight:600;}
.pg-owner-membership .facts{margin:0;font-size:13px;display:grid;grid-template-columns:auto 1fr;gap:4px 16px;}
.pg-owner-membership .facts dt{color:var(--mut);}
.pg-owner-membership .facts dd{margin:0;font-family:var(--mono);font-size:12.5px;word-break:break-all;}

/* ---- prep.html ---- */
/* page-local rules, moved out of the page's own <style> block when the
   page took the shared header/shell (mast.js) and dropped its
   grid-app.css link. Selectors are prep-prefixed so nothing leaks once
   this fragment sits inside the shared app.css alongside every other
   page's.

   The question loop, progress and review screen live in assets/flow.js and
   its .flow-* rules (in the shared app-chrome section above); what is
   left here is just the page chrome around the mounted flow. */
/* body.prep, .prep-wrap, .prep-brandline and .prep-brandline .prep-brand were
   removed 2026-08-08: prep.html now carries data-page="prep" and its own scoped
   copies further down this file, and no element anywhere in the tree carries
   those classes, so they matched nothing. Checked before deleting.
   #flowRoot > .cue below is NOT dead: prep.html, member/craft-brief.html and
   member/apply-capture.html all mount a flow into #flowRoot and share it. */
/* the boot-error/loading line sits outside the mounted flow's own .flow
   wrapper (which scopes its own .cue in the shared app-chrome section
   above), so it needs its own copy here, scoped to #flowRoot's direct
   child so it can't leak. */
#flowRoot > .cue{font-size:13px;color:var(--mut);}

/* #pg-register removed (collision fix, this pass): a dead near-duplicate of
   the live body[data-page="register"] fragment below, pre-existing at
   8f0ba51. No element in the tree carries id="pg-register", so it was never
   reachable; register.html is served by the data-page fragment only. */

/* ==== page: member/craft-brief.html (assets/parts/member-craft-brief.css) ==== */
/* ---- member/craft-brief.html ---- */
/* WP-ask-pattern step 4: this page IS the guided brief. assets/flow.js
   renders everything inside #flowRoot using the shared .flow-* rules; the
   uploader beside the material question comes from
   assets/material-upload.js and carries its own shared .uploader rules.
   Same page chrome as member/apply-capture.html (step 3) - the wrap
   width, the way-back line - and nothing else, because nothing else is
   this page's to own. Selectors scoped by body[data-page="member-craft-brief"]
   per the mount contract, so this fragment can never leak once it is
   folded into the shared app.css. */
body[data-page="member-craft-brief"] .wrap{min-height:100vh;max-width:720px;margin:0 auto;width:100%;padding:20px 20px 60px;box-sizing:border-box;}
body[data-page="member-craft-brief"] .backline{margin:0 0 var(--s3);}
body[data-page="member-craft-brief"] .backline a{font-size:var(--fs-body-sm);color:var(--ink2);text-decoration:none;}
body[data-page="member-craft-brief"] .backline a:hover{color:var(--acc-text);}
/* .cue is scoped under .flow elsewhere (several pages define their own
   with a different display value); the boot-error line sits outside the
   mounted flow's own .flow wrapper, so it needs its own copy here. */
body[data-page="member-craft-brief"] .cue{font-size:var(--fs-body-sm);color:var(--mut);}
body[data-page="member-craft-brief"] .cue.err{color:var(--amber);}

/* ==== page: prep.html (assets/parts/prep.css, folded in: the file was
   never linked from prep.html, so its rules never applied) ==== */
/* WP-ask-pattern step 5: this page is now a caller of assets/flow.js like
   every other ask in the product, so it owns no question rendering, no
   progress counting, no review screen and no draft store of its own. What
   is left here is the page chrome and the consent gate, which is prep's
   alone: it is the one flow nobody signs in to, so the plain-words note
   about recording, AI drafting and deletion comes before anything is
   asked, not inside the questions.

   The consent screen is built from the same .flow-* rules as the flow it
   leads into, so the two read as one place rather than two.

   The page's own skip-link and its .skip-link styling were dropped in the
   mount-contract round: the header mount now supplies the shared
   `.st-skip` from stica.css, so a second, page-local copy would be dead
   weight rather than moved behaviour. Selectors scoped by
   body[data-page="prep"] per the mount contract. */
body[data-page="prep"] { min-height: 100vh; }
body[data-page="prep"] .wrap { max-width: 720px; margin: 0 auto; width: 100%; padding: 22px 20px 60px; box-sizing: border-box; }
body[data-page="prep"] .brandline { margin: 0 0 26px; }
body[data-page="prep"] .brandline .brand { font-size: 20px; }
/* .cue is scoped under .flow in grid-app.css (several pages define their
   own with a different display value); the boot-error line sits outside
   the mounted flow's own .flow wrapper, so it needs its own copy. */
body[data-page="prep"] .cue { font-size: 13px; color: var(--mut); }

/* ==== page: register.html (assets/parts/register.css) ==== */
body[data-page="register"]{margin:0;background:var(--bg);color:var(--ink);font:16px/1.6 var(--sans)}
body[data-page="register"] .sheet{max-width:640px;margin:0 auto;padding:36px 20px}
body[data-page="register"] .paper{background:var(--surface);border:1px solid var(--line);border-radius:14px;padding:36px 40px}
body[data-page="register"] h1{font-size:var(--fs-h3-lg);margin:0 0 4px}
body[data-page="register"] .eyebrow{font-family:var(--mono);font-size:var(--fs-eyebrow);letter-spacing:.14em;text-transform:uppercase;color:var(--acc-text, var(--acc));margin:0 0 var(--s2)}
body[data-page="register"] label{display:block;font-size:13px;color:var(--mut);margin:14px 0 4px}
/* --r-lg, not --r-md: this page has always used an 8px corner and --r-md is 6px. */
body[data-page="register"] input,body[data-page="register"] select{width:100%;box-sizing:border-box;padding:9px 10px;font:inherit;color:var(--ink);border:1px solid var(--line2);border-radius:var(--r-lg);background:var(--bg)}
body[data-page="register"] button{margin-top:20px;padding:10px 22px;font:600 15px var(--sans);color:#fff;background:var(--acc-text, var(--acc));border:none;border-radius:var(--r-full);cursor:pointer}
/* 13px literal, not --fs-body-sm (14px): this is a monospace output line and its
   size was never the body-small step. */
body[data-page="register"] #out{margin-top:18px;font-family:var(--mono);font-size:13px;white-space:pre-wrap;word-break:break-all}
body[data-page="register"] .ok{color:#1a7f37}
body[data-page="register"] .err{color:var(--acc-text, var(--acc))}

/* ==== page: coach/profile.html (assets/parts/coach-profile.css) ==== */
/* Small utilities this page needs that grid.css doesn't define: visually-
   hidden text for the page h1 and the interview/field labels, the skip
   link, and an inline error line for the profile-load failure state. */
body[data-page="coach-profile"] .vh{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0,0,0,0);white-space:nowrap;border:0;}
/* .skip-link removed 2026-08-08: this page now uses the shared shell's
   .st-skip and carries no .skip-link element. Nothing in the tree does. */
body[data-page="coach-profile"] .err-msg{margin:10px 0;padding:10px 14px;border-radius:8px;background:var(--amber-bg);color:var(--amber);
  font-size:13px;}

/* ==== page: index.html (assets/parts/index.css) ==== */
body[data-page="index"] { min-height: 100vh; display: flex; flex-direction: column; }
body[data-page="index"] .centre { flex: 1; display: flex; align-items: center; justify-content: center; padding: 32px 20px; }
body[data-page="index"] .card { width: 100%; max-width: 460px; text-align: center; }
body[data-page="index"] .card .brand { font-size: 32px; margin-bottom: 14px; }
body[data-page="index"] .card h1 { font-weight: 700; font-size: 24px; letter-spacing: -.6px; margin: 0 0 10px; }
body[data-page="index"] .card p.lede { color: var(--ink2); font-size: 15px; max-width: 36ch; margin: 0 auto 24px; }
body[data-page="index"] .card .pill { font-size: 15px; padding: 12px 28px; }
body[data-page="index"] .note { margin: 22px 0 0; font-size: 13px; color: var(--mut); line-height: 1.55; }

/* ==== page: member/apply-capture.html (assets/parts/member-apply-capture.css) ==== */
/* WP-ask-pattern step 3: this page IS the guided flow. assets/flow.js
   renders everything inside #flowRoot using the shared .flow-* rules
   already in grid-app.css (built at step 2); .paper/.pill/.ghost/.chip
   are the same global classes every other member page relies on, so
   nothing about them is redefined here. Only this page's own chrome -
   the wrap width, the way-back line, the skip link - needs anything. */
body[data-page="member-apply-capture"]{min-height:100vh;}
body[data-page="member-apply-capture"] .wrap{max-width:720px;margin:0 auto;width:100%;padding:20px 20px 60px;box-sizing:border-box;}
body[data-page="member-apply-capture"] .backline{margin:0 0 14px;}
body[data-page="member-apply-capture"] .backline a{font-size:13px;color:var(--ink2);text-decoration:none;}
body[data-page="member-apply-capture"] .backline a:hover{color:var(--acc-text);}
/* .cue is scoped under .flow in grid-app.css (several pages define their
   own with a different display value); the boot-error line and the
   free-tier notice below both sit outside the mounted flow's own .flow
   wrapper, so they need their own copy, same values as every other
   member page's local override. */
body[data-page="member-apply-capture"] .cue{font-size:13px;color:var(--mut);}
body[data-page="member-apply-capture"] .cue.err{color:var(--amber);}
/* .skip-link removed 2026-08-08: shared shell's .st-skip serves this page now. */

/* ==== page: member/card.html (assets/parts/member-card.css) ==== */
/* WP-apply-learning-map step 3: one card, one screen, one tap. The page
   deliberately renders nothing but the single open card - there is no
   list, no history, no map here (the map explorer is step 4's surface).
   .paper/.pill/.ghost/.chip are the shared member classes; only this
   page's own chrome is defined below. */
body[data-page="member-card"]{min-height:100vh;}
body[data-page="member-card"] .wrap{max-width:560px;margin:0 auto;width:100%;padding:20px 20px 60px;box-sizing:border-box;}
body[data-page="member-card"] .backline{margin:0 0 14px;}
body[data-page="member-card"] .backline a{font-size:13px;color:var(--ink2);text-decoration:none;}
body[data-page="member-card"] .backline a:hover{color:var(--acc-text);}
body[data-page="member-card"] .cardkind{font-size:12px;text-transform:uppercase;letter-spacing:.08em;color:var(--mut);margin:0 0 6px;}
body[data-page="member-card"] .cardtitle{font-size:20px;font-weight:650;margin:0 0 8px;line-height:1.25;}
body[data-page="member-card"] .cardprompt{font-size:15px;color:var(--ink2);margin:0 0 18px;line-height:1.5;}
/* The link a content card hands over. It sits between the prompt and the
   answer row and has to read as the POINT of the card, not as a footnote
   under it: full-width, its own breathing room, and the site it goes to
   named underneath so nobody taps blind. */
body[data-page="member-card"] .cardlinkrow{margin:0 0 20px;}
body[data-page="member-card"] .cardlinkrow .pill{display:block;width:100%;box-sizing:border-box;text-align:center;}
body[data-page="member-card"] .cardlinkrow .cue{margin:8px 0 0;text-align:center;}
body[data-page="member-card"] .optcol{display:flex;flex-direction:column;gap:8px;margin:0 0 10px;}
body[data-page="member-card"] .optcol .chip{width:100%;box-sizing:border-box;text-align:left;font-size:14.5px;padding:11px 14px;}
body[data-page="member-card"] .skiprow{margin-top:14px;}
body[data-page="member-card"] .skiprow button{background:none;border:none;padding:6px 2px;font-size:13px;color:var(--mut);cursor:pointer;text-decoration:underline;text-underline-offset:3px;}
body[data-page="member-card"] .skiprow button:hover{color:var(--ink2);}
body[data-page="member-card"] textarea.freetext{width:100%;box-sizing:border-box;font:inherit;font-size:14.5px;padding:10px 12px;border-radius:10px;border:1px solid var(--line);background:var(--paper);color:var(--ink);min-height:74px;resize:vertical;margin:0 0 10px;}
body[data-page="member-card"] .reveal{border-left:3px solid var(--acc-text);padding:10px 14px;margin:14px 0 0;font-size:14px;background:var(--bg2);border-radius:0 8px 8px 0;}
body[data-page="member-card"] .thanks{font-size:15px;margin:0 0 14px;}
body[data-page="member-card"] .reactrow{display:flex;gap:8px;margin:6px 0 16px;}
body[data-page="member-card"] .cue{font-size:13px;color:var(--mut);}
body[data-page="member-card"] .cue.err{color:var(--amber);}

/* ==== page: member/coaching.html (assets/parts/member-coaching.css) ==== */
/* WP-member-home step 3: Home's coaching area, in full - the client view
   that used to be the standalone coachee/home.html (now a redirect stub
   to this page). Chrome (mast/drawer) comes from assets/mast.js, same as
   learner.html/craft.html/report.html; the page's own content - prep,
   scheduling, survey, takeaway, commitments, sessions, messages - is
   ported from the retired page almost as-is, reordered outcomes-first
   (what changed for the member leads; logistics like prep/scheduling/
   survey follow) and reading the one converged endpoint, /api/member/
   coaching, which now carries everything the retired /api/coachee/home
   composed. Bilingual (EN/DE) throughout, same coverage as before. */
body[data-page="member-coaching"] { min-height:100vh; }
body[data-page="member-coaching"] .wrap{max-width:720px;margin:0 auto;width:100%;padding:20px 20px 60px;box-sizing:border-box;}
body[data-page="member-coaching"] .backline{margin:0 0 14px;}
body[data-page="member-coaching"] .backline a{font-size:13px;color:var(--ink2);text-decoration:none;}
body[data-page="member-coaching"] .backline a:hover{color:var(--acc-text);}
body[data-page="member-coaching"] .visually-hidden{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;
  clip:rect(0,0,0,0);white-space:nowrap;border:0;}

body[data-page="member-coaching"] .pagehead{margin:0 0 20px;}
body[data-page="member-coaching"] .pagehead .headrow{display:flex;align-items:center;gap:14px;flex-wrap:wrap;}
body[data-page="member-coaching"] .pagehead h1{font-weight:700;font-size:26px;letter-spacing:-.5px;margin:0;text-wrap:balance;}
body[data-page="member-coaching"] .pagehead .kick{margin:0 0 4px;}
body[data-page="member-coaching"] .avatar-btn{border:none;padding:0;cursor:pointer;position:relative;background:none;}
body[data-page="member-coaching"] .avatar-btn:hover .avatar-badge{opacity:1;}
body[data-page="member-coaching"] .avatar-badge{position:absolute;right:-2px;bottom:-2px;width:15px;height:15px;border-radius:var(--r-dot);
  background:var(--surface);color:var(--acc-text);border:1.5px solid var(--acc);font-size:var(--fs-label);font-weight:700;
  line-height:12px;text-align:center;opacity:.85;}
body[data-page="member-coaching"] .avatar-btn.has-photo .avatar-badge{display:none;}
body[data-page="member-coaching"] .next-chip{margin-top:12px;}
body[data-page="member-coaching"] .new-cue{display:none;margin:8px 0 0;font-size:12.5px;color:var(--mut);}

body[data-page="member-coaching"] .paper{margin:0 0 16px;}
body[data-page="member-coaching"] .cue{font-size:13px;color:var(--mut);}

/* released takeaway lists and rules (the shared renderMarkdown in
   assets/app.js): grid-app.css has no ul/ol/li/hr rule for this card, so
   they are added here, same rhythm as its own p/h4/sig rules. */
body[data-page="member-coaching"] .takeaway ul,body[data-page="member-coaching"] .takeaway ol{margin:0 0 14px;padding-left:20px;}
body[data-page="member-coaching"] .takeaway li{font-size:14.5px;color:var(--ink2);margin:0 0 6px;}
body[data-page="member-coaching"] .takeaway li:last-child{margin-bottom:0;}
body[data-page="member-coaching"] .takeaway hr{border:0;border-top:1px solid var(--line);margin:16px 0;}

/* prep / scheduling / survey cards: warm but not garish - a soft accent
   tint, not the amber "review queue" warning colour the coach dashboard
   uses for drafts, since these are invitations, not alerts. */
body[data-page="member-coaching"] .prep-card,body[data-page="member-coaching"] .sched-card,body[data-page="member-coaching"] .survey-card{border-color:color-mix(in srgb, var(--acc) 26%, var(--line));
  background:color-mix(in srgb, var(--acc) 6%, var(--surface));}
body[data-page="member-coaching"] .prep-card h4,body[data-page="member-coaching"] .sched-card h4,body[data-page="member-coaching"] .survey-card h4{font-weight:700;font-size:19px;letter-spacing:-.4px;margin:0 0 10px;text-wrap:balance;}
body[data-page="member-coaching"] .prep-card .prompt{font-size:14.5px;color:var(--ink2);margin:0 0 14px;padding:12px 14px;
  border-left:2px solid var(--acc);background:var(--surface);border-radius:0 8px 8px 0;}
body[data-page="member-coaching"] .prep-card textarea{width:100%;box-sizing:border-box;min-height:90px;padding:12px 14px;font:inherit;
  font-size:14.5px;color:var(--ink);border:1px solid var(--line2);border-radius:10px;background:var(--surface);
  resize:vertical;}
body[data-page="member-coaching"] .prep-card .prow,body[data-page="member-coaching"] #schedForm .prow{display:flex;justify-content:flex-end;margin-top:10px;}
body[data-page="member-coaching"] .prep-card .answered-quote{font-size:14.5px;color:var(--ink2);margin:0 0 8px;padding:12px 14px;
  border-left:2px solid var(--acc);background:var(--surface);border-radius:0 8px 8px 0;}
body[data-page="member-coaching"] .prep-meta{font-family:var(--mono);font-size:var(--fs-label);letter-spacing:.6px;text-transform:uppercase;color:var(--mut);margin:0;}
body[data-page="member-coaching"] .prep-err,body[data-page="member-coaching"] .survey-err{color:var(--amber);font-size:13px;margin:6px 0 0;}
body[data-page="member-coaching"] .sched-slot-row{display:flex;gap:12px;flex-wrap:wrap;margin:0 0 10px;}
body[data-page="member-coaching"] .sched-slot-row label{display:flex;flex-direction:column;gap:4px;font-size:12.5px;color:var(--mut);}
body[data-page="member-coaching"] .sched-slot-row input,body[data-page="member-coaching"] .sched-slot-row select{font:inherit;padding:8px 10px;border:1px solid var(--line2);border-radius:8px;background:var(--surface);color:var(--ink);}
body[data-page="member-coaching"] .sched-accept-list,body[data-page="member-coaching"] .sched-before{list-style:none;padding:0;margin:0 0 10px;}
body[data-page="member-coaching"] .sched-accept-list li,body[data-page="member-coaching"] .sched-before li{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:6px 0;border-bottom:1px solid var(--line2);}
body[data-page="member-coaching"] .frow{display:flex;flex-direction:column;gap:4px;margin-bottom:12px;}
body[data-page="member-coaching"] .finput{width:100%;box-sizing:border-box;padding:10px 12px;font:inherit;font-size:var(--fs-body-sm);color:var(--ink);
  border:1px solid var(--line2);border-radius:8px;background:var(--bg);}

/* commitments: a small when/where meta line under the title (all rows),
   a "check-ins stopped" quiet marker, the due-nudge highlight, its
   "how did it go" prompt and the discreet stop-checkins link. */
body[data-page="member-coaching"] .act .metaline{font-size:12.5px;color:var(--mut);margin:2px 0 6px;}
body[data-page="member-coaching"] .act .stopped-note{display:block;font-size:12px;color:var(--mut);margin:6px 0 0;}
body[data-page="member-coaching"] .act.due{border-left:3px solid var(--acc);padding-left:11px;border-radius:0 8px 8px 0;
  background:color-mix(in srgb, var(--acc) 5%, transparent);}
body[data-page="member-coaching"] .nudge-prompt{margin:10px 0 0;}
body[data-page="member-coaching"] .nudge-prompt .q{font-size:13.5px;font-weight:600;margin:0 0 8px;color:var(--ink);}
body[data-page="member-coaching"] .nudge-btns{display:flex;gap:8px;flex-wrap:wrap;}
body[data-page="member-coaching"] .stop-link{background:none;border:none;padding:0;margin-top:10px;font-size:12px;color:var(--mut);
  text-decoration:underline;text-underline-offset:2px;cursor:pointer;display:inline-block;font:inherit;font-size:12px;}
body[data-page="member-coaching"] .stop-link:hover{color:var(--ink2);}

/* survey card */
body[data-page="member-coaching"] .survey-intro{font-size:13.5px;color:var(--ink2);margin:0 0 16px;}
body[data-page="member-coaching"] .survey-q{margin-bottom:20px;}
body[data-page="member-coaching"] .survey-q:last-of-type{margin-bottom:14px;}
body[data-page="member-coaching"] .survey-q .ql{font-size:14.5px;font-weight:600;margin:0 0 4px;color:var(--ink);}
body[data-page="member-coaching"] .survey-q .req-mark{color:var(--acc-text);margin-left:2px;}
body[data-page="member-coaching"] .survey-q .qhelp{font-size:12.5px;color:var(--mut);margin:0 0 10px;}
body[data-page="member-coaching"] .survey-scale{padding:4px 2px 0;}
body[data-page="member-coaching"] .survey-scale input[type="range"]{width:100%;accent-color:var(--acc);height:28px;display:block;}
body[data-page="member-coaching"] .survey-scale .scale-val{text-align:center;font-size:15px;font-weight:700;color:var(--ink);margin:0 0 4px;}
body[data-page="member-coaching"] .survey-scale .scale-anchors{display:flex;justify-content:space-between;font-size:12px;color:var(--mut);}
body[data-page="member-coaching"] .survey-choice{display:flex;flex-direction:column;gap:8px;}
body[data-page="member-coaching"] .survey-choice label{display:flex;align-items:flex-start;gap:9px;font-size:14px;color:var(--ink);cursor:pointer;
  padding:9px 12px;border:1px solid var(--line2);border-radius:10px;background:var(--surface);}
body[data-page="member-coaching"] .survey-choice input{margin-top:3px;flex:none;}
body[data-page="member-coaching"] .survey-text textarea{width:100%;box-sizing:border-box;min-height:84px;padding:12px 14px;font:inherit;
  font-size:14.5px;color:var(--ink);border:1px solid var(--line2);border-radius:10px;background:var(--surface);resize:vertical;}
body[data-page="member-coaching"] .survey-submitrow{display:flex;justify-content:flex-end;margin-top:6px;}

/* photo choice modal (replace / remove), reuses .paper/.modal-card chrome */
body[data-page="member-coaching"] .photo-choice{display:flex;flex-direction:column;align-items:stretch;gap:8px;}

/* ==== page: member/craft.html (assets/parts/member-craft.css) ==== */
/* WP-member-home step 4: Stica Craft's own area (start, timeline, shelf,
   request queue) - a full page, matching member/learner.html's shape,
   rather than cramming this onto Home. Chrome (mast/drawer) comes from
   assets/mast.js, same as learner.html and report.html; only this page's
   own sections are styled here. */
body[data-page="member-craft"]{min-height:100vh;}
body[data-page="member-craft"] .wrap{max-width:880px;margin:0 auto;width:100%;padding:20px 20px 60px;box-sizing:border-box;}
body[data-page="member-craft"] .backline{margin:0 0 14px;}
body[data-page="member-craft"] .backline a{font-size:13px;color:var(--ink2);text-decoration:none;}
body[data-page="member-craft"] .backline a:hover{color:var(--acc-text);}
body[data-page="member-craft"] .pagehead .kick{font-family:var(--mono);font-size:11px;letter-spacing:1.5px;text-transform:uppercase;color:var(--mut);margin:0 0 4px;}
body[data-page="member-craft"] .pagehead h1{font-weight:700;font-size:22px;letter-spacing:-.4px;margin:0 0 6px;}
body[data-page="member-craft"] .pagehead p{color:var(--mut);font-size:14px;margin:0 0 22px;max-width:60ch;}
body[data-page="member-craft"] .paper{background:var(--surface);border:1px solid var(--line);border-radius:12px;padding:18px 20px;
  box-shadow:0 1px 2px rgba(0,0,0,.04);margin:0 0 14px;}
body[data-page="member-craft"] .paper h2{font-size:16px;font-weight:650;letter-spacing:-.2px;margin:0 0 10px;}
body[data-page="member-craft"] .paper h3{font-size:14px;font-weight:650;margin:16px 0 8px;}
body[data-page="member-craft"] .eng-note{font-size:12.5px;color:var(--mut);margin:6px 0 0;}
body[data-page="member-craft"] .eng-ref{font-family:var(--mono);font-size:11px;color:var(--mut);}
body[data-page="member-craft"] .chip{display:inline-flex;align-items:center;gap:5px;font-family:var(--mono);font-size:10px;
  letter-spacing:1px;text-transform:uppercase;border:1px solid var(--line);border-radius:999px;
  padding:2px 9px;color:var(--mut);}
body[data-page="member-craft"] .chip.ok{border-color:var(--acc-text);color:var(--acc-text);}
body[data-page="member-craft"] .chip.warn{border-color:var(--amber);color:var(--amber);}
body[data-page="member-craft"] .chip .d{width:6px;height:6px;border-radius:999px;background:currentColor;}
body[data-page="member-craft"] .pill{display:inline-flex;align-items:center;gap:6px;padding:9px 18px;border-radius:999px;border:0;
  background:var(--acc);color:#fff;font:600 13.5px var(--sans);cursor:pointer;text-decoration:none;}
body[data-page="member-craft"] .pill.ghost{background:transparent;border:1px solid var(--line);color:var(--ink2);}
body[data-page="member-craft"] .pill.sm{padding:7px 14px;font-size:12.5px;}
body[data-page="member-craft"] .pill:disabled{opacity:.5;cursor:default;}
body[data-page="member-craft"] .links{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px;}
body[data-page="member-craft"] input[type=text],body[data-page="member-craft"] textarea,body[data-page="member-craft"] select{width:100%;box-sizing:border-box;font:400 14px var(--sans);color:var(--ink);
  background:var(--bg);border:1px solid var(--line);border-radius:8px;padding:9px 11px;}
body[data-page="member-craft"] textarea{resize:vertical;}
body[data-page="member-craft"] label{display:block;font-size:12.5px;font-weight:600;color:var(--ink2);margin:12px 0 4px;}
body[data-page="member-craft"] .cue{font-size:13px;color:var(--mut);margin:8px 0 0;display:block;}
body[data-page="member-craft"] .cue.err{color:var(--amber);}
/* WP-ask-pattern step 4: an unfinished brief, shown where the finished
   engagement would live (mechanic 4) rather than only reachable by
   remembering the address. */
body[data-page="member-craft"] .draftrow{display:flex;align-items:center;justify-content:space-between;gap:12px;flex-wrap:wrap;
  padding:12px 0;border-top:1px solid var(--line2);}
body[data-page="member-craft"] .draftrow:first-of-type{border-top:0;}
body[data-page="member-craft"] .draftrow .who{font-size:14px;font-weight:600;}
body[data-page="member-craft"] .draftrow .how-far{font-size:12.5px;color:var(--mut);margin:2px 0 0;}
/* timeline (honest states: requested / in draft / in review / delivered) */
body[data-page="member-craft"] .timeline{display:flex;gap:6px;margin:10px 0 4px;}
body[data-page="member-craft"] .timeline .step{flex:1;text-align:center;}
body[data-page="member-craft"] .timeline .bar{height:5px;border-radius:3px;background:var(--line2);}
body[data-page="member-craft"] .timeline .step.done .bar,body[data-page="member-craft"] .timeline .step.now .bar{background:var(--acc);}
body[data-page="member-craft"] .timeline .lbl{font-family:var(--mono);font-size:9.5px;letter-spacing:.6px;text-transform:uppercase;color:var(--mut);margin-top:5px;display:block;}
body[data-page="member-craft"] .timeline .step.now .lbl,body[data-page="member-craft"] .timeline .step.done .lbl{color:var(--acc-text);}
/* engagement block + request queue */
body[data-page="member-craft"] .eng-block{padding:14px 0;border-top:1px solid var(--line2);}
body[data-page="member-craft"] .eng-block:first-of-type{border-top:0;padding-top:0;}
body[data-page="member-craft"] .itemrow{padding:9px 0;border-top:1px solid var(--line2);font-size:13.5px;}
body[data-page="member-craft"] .itemrow:first-child{border-top:0;}
body[data-page="member-craft"] .itemrow .k{font-family:var(--mono);font-size:9.5px;letter-spacing:.8px;text-transform:uppercase;color:var(--mut);margin-right:8px;}
body[data-page="member-craft"] .itemrow p{margin:3px 0 0;font-size:13px;color:var(--ink2);white-space:pre-wrap;}
body[data-page="member-craft"] .empty{font-size:13px;color:var(--mut);}
body[data-page="member-craft"] .hide{display:none;}
