/* ============================================================
   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="light"]{color-scheme:light;}
: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);}
.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;}
.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;padding:1px;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{display:grid;grid-template-columns:1fr 1fr;gap:16px;margin-top:22px;}
@media(max-width:680px){.tilegrid{grid-template-columns:1fr;}}
.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;}
