/* ============================================================
   CoachWave design system — ported from the /design/clients
   prototype (public/design/clients/styles.css).
   All classes are ds- prefixed; tokens + body rules are scoped
   to .ds-shell so other layouts (auth/admin/portal/onboarding)
   are unaffected. Fonts are self-hosted variable woff2.
   ============================================================ */

/* ── Root font scale ─────────────────────────────────────────
   The design system sizes everything in rem against this root so
   the whole app can be rescaled from one place. On short-height
   viewports (≤900px tall — e.g. wide-but-short laptops) the root
   shrinks ~12.5%, uniformly shrinking every rem-based size.

   NB: rem always resolves against the <html> root, so the scale
   MUST target <html>. To keep the header's ".ds-shell only" scope
   contract, the shrink is gated on a .ds-shell body being present
   AND on it being the coach app — the auth / onboarding / charter
   layouts (.ds-auth / .ds-onb / .chz) share .ds-shell but are NOT
   shrunk, so their standalone card layouts are untouched. (:has()
   is already used throughout this file, so support is a non-issue.) */
html:has(body.ds-shell) { font-size: 16px; }              /* 1rem = 16px */
@media (max-height: 1000px) {
  html:has(body.ds-shell:not(.ds-auth):not(.ds-onb):not(.chz)) {
    font-size: 14px;                                       /* 14/16 = −12.5% — covers maximized 1080p (viewport ~910–960px) + shorter laptops */
  }
}

@font-face {
  font-family: "Inter";
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url("/assets/inter-latin-variable-1f021a24.woff2") format("woff2");
}
@font-face {
  font-family: "Newsreader";
  font-style: normal;
  font-weight: 200 800;
  font-display: swap;
  src: url("/assets/newsreader-latin-variable-dd08b472.woff2") format("woff2");
}

/* ============ CoachWave — "Sundays"-inspired variant ============ */
.ds-shell{
  --serif:'Inter',system-ui,sans-serif;   /* booking-app style: one clean grotesk everywhere */
  --sans:'Inter',system-ui,sans-serif;

  --ink:#243B53;
  --muted:#5B7183;
  --faint:#8CA0B3;
  --line:#DCE4ED;
  --line-soft:#EAF0F6;
  --field:#F4F8FB;
  --card:#FFFFFF;

  --lilac-1:#E3F2FB;
  --lilac-2:#EAF5FD;
  --active:#E3F2FB;
  --active-grad:linear-gradient(90deg,#FBE5D6 0%,#D4E7F8 100%);
  --active-tx:#1173C2;
  --black:#1173C2;
  --black-press:#0E5FA0;
  /* Primary-CTA fill — deliberately near-black, independent of the blue
     accent above (see DESIGN_SYSTEM.md). Every dark button routes here. */
  --cta:#17181C;
  --cta-press:#000;
  --canvas:#E2EBF8;
  --panel:#FFFFFF;

  /* restrained clinical chips */
  --green-bg:#E3F5EA;--green-tx:#177E4D;
  --laven-bg:#E7EBFC;--laven-tx:#4358C7;
  --peach-bg:#FDF0E1;--peach-tx:#B26B0C;
  --blue-bg:#E3F2FB;--blue-tx:#1173C2;
  --pink-bg:#FBE9F0;--pink-tx:#B0487E;
  --amber-bg:#FDF3E0;--amber-tx:#B26B0C;
  --teal-bg:#E1EAF6;--teal-tx:#2D5B9E;
  --mint-bg:#DFF3F1;--mint-tx:#0E7A70;

  --r-shell:0.75rem;
  --r-card:0.625rem;
  --r-row:0.625rem;
  --r-btn:0.625rem;
  --btn-h:2.5rem;
  --btn-minw:9.375rem;
  --pill:0.5rem;
  --side-w:15.5rem;
}
.ds-shell{margin:0;height:100%}
.ds-shell{
  font-family:var(--sans);color:var(--ink);
  background:var(--canvas);
  -webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;
  min-height:100vh;
}
/* Element resets at zero specificity (:where) so any ds- component class
   (e.g. .ds-sgroup, .ds-btn-new) can restyle them without fighting. */
/* Own our box model instead of leaning on Tailwind's preflight — the app
   loads Tailwind (already border-box) but the standalone charter layout does
   not, so without this its width:100% inputs overflow their grid columns. */
.ds-shell,.ds-shell :where(*,::before,::after){box-sizing:border-box}
.ds-shell :where(button){font-family:inherit;cursor:pointer;border:none;background:none;color:inherit}
.ds-shell :where(input){font-family:inherit}
.ds-shell ::selection{background:#BFE0F7}

/* ---- Shell ---- */
.ds-shell{
  height:100vh;background:var(--canvas);
  display:flex;overflow:hidden;
}

/* ---- Sidebar ---- */
.ds-side{width:var(--side-w);flex:0 0 var(--side-w);border-right:1px solid var(--line);background:#fff;
  display:flex;flex-direction:column;padding:1.25rem 1.125rem 1.25rem}
/* the wordmark keeps its serif identity — the one place serif survives the theme */
.ds-brand{font-family:'Newsreader',Georgia,serif;font-weight:700;font-size:1.5rem;letter-spacing:-.015em;color:var(--ink);padding:0 0.625rem 0.25rem;white-space:nowrap}
.ds-brand .ds-dot{color:var(--active-tx)}
.ds-menu-label{font-size:0.6875rem;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--faint);padding:0 0.75rem;margin:2.875rem 0 0.75rem}
.ds-nav{display:flex;flex-direction:column;gap:0.1875rem}
.ds-nav-item{display:flex;align-items:center;gap:0.75rem;padding:0.625rem 0.75rem;border-radius:0.6875rem;
  color:var(--muted);font-size:0.9062rem;font-weight:600;transition:.15s;width:100%;text-align:left}
.ds-nav-item svg{width:1.1875rem;height:1.1875rem;flex:0 0 1.1875rem}
.ds-nav-item:hover{background:var(--line-soft);color:var(--ink)}
.ds-nav-item.ds-on{background:var(--active-grad);color:var(--ink)}
.ds-nav-item.ds-on svg{color:var(--ink)}
.ds-nav-badge{margin-left:auto;font-size:0.6875rem;font-weight:700;background:#EF3F6A;color:#fff;width:1.1875rem;height:1.1875rem;display:grid;place-items:center;border-radius:50%}
.ds-nav-item.ds-on .ds-nav-badge{background:var(--active-tx)}

.ds-side-sp{flex:1}
.ds-upsell{position:relative;border-radius:1.125rem;padding:1.125rem 1rem 1rem;overflow:hidden;
  background:linear-gradient(160deg,#FBE5D6 0%,#F2E4F0 52%,#E8D9F3 100%);margin-bottom:1rem}
.ds-upsell h4{font-family:var(--serif);font-weight:700;font-size:1.125rem;margin:0 0 0.5rem;line-height:1.1}
.ds-upsell p{font-size:0.75rem;color:#6E6480;line-height:1.45;margin:0 0 0.875rem}
.ds-upsell .ds-bar{height:0.3125rem;border-radius:0.3125rem;background:rgba(14,138,124,.18);margin-bottom:0.875rem;overflow:hidden}
.ds-upsell .ds-bar i{display:block;height:100%;width:62%;background:#0E8A7C;border-radius:0.3125rem}
.ds-btn-dark{display:inline-flex;align-items:center;justify-content:center;gap:0.5rem;width:100%;
  background:var(--cta);color:#fff;font-weight:600;font-size:0.875rem;height:var(--btn-h);border-radius:var(--r-btn);transition:.15s}
.ds-btn-dark:hover{background:var(--cta-press)}
.ds-btn-dark svg{width:0.9375rem;height:0.9375rem}
.ds-side-foot{display:flex;flex-direction:column;gap:0.125rem;border-top:1px solid var(--line);padding-top:0.75rem}
.ds-foot-item{display:flex;align-items:center;gap:0.6875rem;padding:0.5625rem 0.75rem;border-radius:0.625rem;color:var(--muted);font-size:0.8438rem;font-weight:500;transition:.15s;width:100%}
.ds-foot-item:hover{background:var(--line-soft);color:var(--ink)}
.ds-foot-item svg{width:1.0625rem;height:1.0625rem}

/* ---- Main ---- */
.ds-main{flex:1;min-width:0;display:flex;flex-direction:column;background:var(--canvas)}
/* Topbar spans the full width (app-bar style: title hugs the sidebar, avatar the
   right edge); only the page content below is capped. */
/* Grid keeps the command box centered in the viewport: the two 1fr side
   columns always match, so a longer/shorter page title never shifts it. */
.ds-topbar{display:grid;grid-template-columns:1fr minmax(0,33.75rem) 1fr;align-items:center;gap:1.5rem;padding:1.375rem 1.875rem}
.ds-page-title{font-size:1.375rem;font-weight:700;letter-spacing:-.01em;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* breadcrumb rendered into the topbar title slot (client profile page) —
   inherits the 22px/700 title scale so location reads as the page heading */
.ds-tb-crumb{display:flex;align-items:center;gap:0.625rem;min-width:0}
.ds-tb-crumb svg{width:1.125rem;height:1.125rem;color:var(--faint);flex:0 0 1.125rem}
.ds-tb-crumb-link{color:var(--muted)}
.ds-tb-crumb-link:hover{color:var(--ink)}
.ds-tb-crumb-here{color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-cmd{width:100%;max-width:33.75rem;margin:0 auto;display:flex;align-items:center;gap:0.6875rem;height:3rem;
  background:var(--card);border:1px solid var(--line);border-radius:var(--pill);padding:0 0.5rem 0 1.125rem;transition:.15s}
.ds-cmd:focus-within{border-color:#A8D2F0;box-shadow:0 0 0 4px rgba(17,115,194,.10)}
.ds-cmd svg{width:1.125rem;height:1.125rem;color:var(--faint);flex:0 0 1.125rem}
.ds-cmd input{flex:1;border:none;outline:none;background:none;font-size:0.875rem;color:var(--ink)}
.ds-cmd input::placeholder{color:var(--faint)}
.ds-cmd .ds-kbd{font-size:0.6875rem;font-weight:700;color:var(--muted);background:var(--field);border-radius:0.4375rem;padding:0.3125rem 0.5rem}
.ds-top-right{display:flex;align-items:center;gap:0.875rem;justify-self:end}
.ds-bell{position:relative;width:3rem;height:3rem;border-radius:0.8125rem;display:grid;place-items:center;color:var(--muted);transition:.15s}
.ds-bell:hover{background:var(--line-soft);color:var(--ink)}
.ds-bell.ds-has-notif{color:var(--ink)}
.ds-bell svg{width:1.5rem;height:1.5rem}
/* plain red unread dot, overlapping the bell's top-right with a white ring */
.ds-bell .ds-notif-dot{position:absolute;top:0.5625rem;right:0.625rem;width:0.625rem;height:0.625rem;border-radius:50%;
  background:#EF3F6A;border:2px solid #fff;box-shadow:0 1px 3px rgba(239,63,106,.4)}
/* subtle attention pulse on the dot */
.ds-bell .ds-notif-dot::after{content:"";position:absolute;inset:-0.125rem;border-radius:50%;
  border:2px solid #EF3F6A;opacity:0;animation:notifPulse 2.4s ease-out infinite}
@keyframes notifPulse{0%{transform:scale(1);opacity:.5}60%{transform:scale(1.9);opacity:0}100%{opacity:0}}
.ds-me{position:relative;width:2.625rem;height:2.625rem;border-radius:50%;background:linear-gradient(140deg,#5FA8DC,#1173C2);
  display:grid;place-items:center;color:#fff;font-weight:700;font-size:0.875rem;font-family:var(--serif);
  overflow:hidden;padding:0;flex:0 0 2.625rem;box-shadow:0 0 0 2px #fff, 0 1px 4px rgba(16,42,67,.2);transition:box-shadow .15s}
.ds-me:hover{box-shadow:0 0 0 2px #fff, 0 2px 8px rgba(16,42,67,.32)}
.ds-me img{width:100%;height:100%;object-fit:cover;display:block}
.ds-me .ds-me-initials{display:none;position:absolute;inset:0;place-items:center}
.ds-me.ds-noimg .ds-me-initials{display:grid}

.ds-scroll{flex:1;overflow-y:auto;padding:1.625rem 1.875rem 2.5rem}
.ds-page{max-width:100rem;margin-inline:auto}

/* ---- White panels on canvas ---- */
/* transform:translateZ(0) promotes each panel to its own compositor layer so its
   1px border + box-shadow rasterize on whole pixels, instead of blending against
   the canvas on a fractional boundary at non-integer display scales (which produced
   a faint grey seam under the column-label row at ~100% browser zoom + OS scaling). */
.ds-panel{background:var(--panel);border:none;border-radius:0.75rem;box-shadow:0 2px 10px -2px rgba(16,42,67,.10);
  transform:translateZ(0);backface-visibility:hidden}

/* ---- Stat cards ---- */
.ds-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:0.75rem;margin-bottom:1.25rem}
.ds-stat{display:flex;align-items:center;gap:0.8125rem;border:none;border-radius:0.625rem;
  padding:0.9375rem 1.125rem;background:var(--panel);cursor:pointer;transition:.15s;position:relative;text-align:left;
  box-shadow:0 2px 6px -2px rgba(16,42,67,.08)}
.ds-stat:hover{box-shadow:0 8px 22px -12px rgba(16,42,67,.30)}
.ds-stat.ds-on{box-shadow:0 0 0 2px var(--active-tx), 0 8px 20px -14px rgba(16,42,67,.4)}
.ds-stat .ds-ic{width:2.625rem;height:2.625rem;border-radius:0.75rem;display:grid;place-items:center;flex:0 0 2.625rem}
.ds-stat .ds-ic svg{width:1.25rem;height:1.25rem}
.ds-stat .ds-txt{min-width:0}
.ds-stat .ds-val{font-size:1.5rem;font-weight:800;letter-spacing:-.02em;line-height:1}
.ds-stat .ds-lab{color:var(--muted);font-size:0.8125rem;margin-top:0.25rem;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ds-stat .ds-pin{position:absolute;top:0.6875rem;right:0.75rem;width:0.4375rem;height:0.4375rem;border-radius:50%;background:var(--active-tx);opacity:0;transition:.15s}
.ds-stat.ds-on .ds-pin{opacity:1}
.ds-ic.ds-orange{background:#FCEAD8;color:#D9670A}
.ds-ic.ds-green{background:var(--green-bg);color:var(--green-tx)}
.ds-ic.ds-violet{background:var(--laven-bg);color:var(--laven-tx)}
.ds-ic.ds-blue{background:var(--blue-bg);color:var(--blue-tx)}
.ds-ic.ds-peach{background:var(--peach-bg);color:var(--peach-tx)}

/* ---- Toolbar ---- */
.ds-toolbar{display:flex;align-items:center;gap:0.875rem;margin-bottom:1.125rem}
.ds-toolbar .ds-sp{flex:1}
.ds-seg-group{display:inline-flex;align-items:stretch;background:var(--panel);border:1px solid var(--line);
  border-radius:0.625rem;box-shadow:0 1px 2px rgba(16,42,67,.04)}
.ds-seg{display:inline-flex;align-items:center;gap:0.5rem;height:var(--btn-h);padding:0 1.0625rem;font-size:0.875rem;font-weight:600;
  color:var(--ink);background:transparent;transition:.15s}
.ds-seg:hover{background:var(--line-soft)}
.ds-seg svg{width:0.9375rem;height:0.9375rem;color:var(--muted)}
.ds-seg.ds-on{color:var(--active-tx)}
.ds-seg.ds-on svg{color:var(--active-tx)}
/* Dark-fill variant: the selected segment reads as a solid dark button
   (used by the client session-emails toggle). */
.ds-seg-dark .ds-seg.ds-on{background:var(--cta);color:#fff;border-radius:0.5rem}
.ds-seg-dark .ds-seg.ds-on:hover{background:var(--cta-press)}
.ds-seg-dark .ds-seg.ds-on svg{color:#fff}
.ds-seg-first{border-radius:0.5625rem 0 0 0.5625rem}
.ds-seg-last{border-radius:0 0.5625rem 0.5625rem 0}
.ds-seg-div{width:1px;background:var(--line);margin:0.4375rem 0}
.ds-btn-new{display:inline-flex;align-items:center;justify-content:center;gap:0.5rem;height:var(--btn-h);min-width:var(--btn-minw);padding:0 1.375rem;background:var(--cta);
  color:#fff;font-weight:600;font-size:0.875rem;border-radius:var(--r-btn);transition:.15s}
.ds-btn-new:hover{background:var(--cta-press)}
.ds-btn-new svg{width:1rem;height:1rem}

.ds-pop{position:absolute;top:3rem;left:0;background:var(--card);border:1px solid var(--line);border-radius:0.625rem;
  box-shadow:0 18px 40px -18px rgba(16,42,67,.35);padding:0.375rem;width:12.5rem;z-index:40}
.ds-pop.ds-right{left:auto;right:0}
.ds-pop button{display:flex;align-items:center;justify-content:space-between;width:100%;padding:0.5625rem 0.6875rem;border-radius:0.5625rem;
  font-size:0.8438rem;color:var(--ink);font-weight:500}
.ds-pop button:hover{background:var(--line-soft)}
.ds-pop button.ds-sel{color:var(--active-tx);font-weight:600}
.ds-pop button svg{width:1rem;height:1rem}
.ds-rel{position:relative}

/* Upward-opening popover — anchored to a trigger near the bottom of a column
   (e.g. the sidebar footer Help & Support menu) so it rises above the button. */
.ds-pop.ds-pop-up{top:auto;bottom:calc(100% + 0.5rem)}

/* Help & Support menu — nav-style rows (leading icon + label, left aligned),
   overriding the base .ds-pop button's space-between/right-meta layout. */
.ds-help-pop{width:13.75rem}
.ds-help-pop button.ds-help-item{justify-content:flex-start;gap:0.6875rem;color:var(--muted);font-weight:500}
.ds-help-pop button.ds-help-item:hover{background:var(--line-soft);color:var(--ink)}
.ds-help-pop button.ds-help-item svg{width:1.0625rem;height:1.0625rem;flex:0 0 1.0625rem;color:var(--faint)}
.ds-help-pop button.ds-help-item:hover svg{color:var(--muted)}
.ds-help-sep{height:1px;background:var(--line);margin:0.375rem 0.25rem}

/* ---- Section + rows ---- */
.ds-section-head{display:flex;align-items:center;gap:0.625rem;margin:1.375rem 0.125rem 0.625rem}
.ds-section-head .ds-t{font-size:0.75rem;font-weight:600;letter-spacing:.09em;text-transform:uppercase;color:var(--muted)}
.ds-section-head .ds-n{font-size:0.7188rem;font-weight:700;color:var(--faint);background:var(--field);border-radius:var(--pill);padding:0.0625rem 0.5rem}
.ds-section-head .ds-sp{flex:1}
.ds-section-head .ds-more{color:var(--faint);display:grid;place-items:center;width:1.625rem;height:1.625rem;border-radius:0.4375rem}
.ds-section-head .ds-more:hover{background:var(--line-soft);color:var(--muted)}
.ds-section-head .ds-more svg{width:1rem;height:1rem}

.ds-rows-panel{padding:0.375rem 0.625rem;position:relative}
/* .ds-panel's translateZ(0) makes each panel a stacking context, so a popover near the
   bottom of one panel would paint UNDER the next panel. Lift the panel that
   currently has an open popover (status/type picker or row menu) above siblings. */
.ds-rows-panel:has(.ds-pop:not(.hidden)){z-index:60}
.ds-crow{display:grid;grid-template-columns:minmax(13.125rem,1.5fr) 8.25rem 9.25rem minmax(7rem,0.9fr) 6.5rem 7.375rem 7rem minmax(8.75rem,1fr) 1.875rem 2rem;
  align-items:center;gap:0.6875rem;background:transparent;border:none;border-radius:0.5rem;
  padding:0.9375rem 0.875rem;cursor:pointer;transition:background .16s, box-shadow .16s;position:relative}
.ds-rows-panel .ds-crow:not(:last-child)::after{content:"";position:absolute;left:0.875rem;right:0.875rem;bottom:0;height:1px;
  background:var(--line-soft);transition:opacity .16s}
.ds-crow:not(.ds-crow-head):hover{background:#F3F8FC}
.ds-crow:hover::after{opacity:0}

/* Column headers (re-uses the .ds-crow grid so headers track the columns) */
.ds-crow-head{cursor:default;padding-top:0.25rem;padding-bottom:0.5625rem}
.ds-crow-head:hover{background:transparent;box-shadow:none}
.ds-crow-head>*{font-size:0.6875rem}
.ds-crow-head>*{font-size:0.6562rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* icon headers for the narrow session / notes count columns (text won't fit 42px) */
.ds-h-cnt{display:flex;align-items:center;justify-content:flex-start;width:2.625rem}
.ds-h-cnt svg{width:0.875rem;height:0.875rem;color:var(--faint)}

.ds-cl{display:flex;align-items:center;gap:0.75rem;min-width:0;padding-right:0.875rem}
.ds-cl .ds-star{flex:0 0 auto;color:#D5D1DD;display:grid;place-items:center;width:1.5rem;height:1.5rem;border-radius:0.375rem;transition:.14s}
.ds-cl .ds-star:hover{color:#E8A93C}
.ds-cl .ds-star.ds-on{color:#E8A93C}
.ds-cl .ds-star svg{width:1rem;height:1rem}
.ds-av{width:2.625rem;height:2.625rem;border-radius:50%;flex:0 0 2.625rem;display:grid;place-items:center;
  font-weight:700;font-size:0.8125rem;background:#E8EFF7;color:#3D5C7C;font-family:var(--serif)}
.ds-av-img{object-fit:cover}
.ds-cl .ds-nm{font-size:0.8438rem;font-weight:600;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* a truncated name reveals its full length while hovering the client cell */
.ds-crow:not(.ds-crow-head) .ds-cl:hover .ds-nm{overflow:visible;text-overflow:clip;position:relative;z-index:3;
  width:max-content;max-width:none;background:#F3F8FC;padding:0.125rem 0.625rem 0.125rem 0;margin:-0.125rem 0;border-radius:0.375rem}
.ds-cl .ds-sub{font-size:0.8125rem;color:var(--faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:0.0625rem}


/* count chips (sessions / notes) — outlined pill buttons */
.ds-cnts{display:flex;gap:0.625rem;justify-self:start;min-width:0}
.ds-cnt{display:inline-flex;align-items:center;justify-content:flex-start;gap:0.375rem;font-size:0.8125rem;font-weight:600;color:var(--ink);white-space:nowrap;
  min-width:2.625rem}
.ds-cnt svg{width:0.875rem;height:0.875rem;color:var(--faint)}
/* Read-only session-email indicator: its own last content column (before the ⋮
   menu). Greyed by default (off), green when the client will receive emails. */
.ds-eml-cell{display:flex;justify-content:center}
.ds-h-eml{display:flex;justify-content:center}
.ds-h-eml svg{width:0.875rem;height:0.875rem;color:var(--faint)}
.ds-eml-chip{min-width:0}
/* off = grey (inherits .ds-cnt svg --faint); on = blue (will send);
   paused = amber (coach turned it on, but sending is globally paused). */
.ds-eml-chip.ds-eml-on svg{color:#1173C2}
.ds-eml-chip.ds-eml-paused svg{color:#B26B0C}



/* goal progress */
.ds-prog{display:flex;align-items:center;gap:0.6875rem;min-width:0}
.ds-prog .ds-track{flex:1;height:0.5rem;border-radius:0.5rem;background:#ECEAF1;overflow:hidden;min-width:2.5rem}
.ds-prog .ds-track i{display:block;height:100%;background:var(--ink);border-radius:0.375rem;transition:width .3s}
.ds-prog .ds-pct{font-size:0.8125rem;font-weight:700;color:var(--ink);min-width:2.875rem;text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
.ds-prog.ds-none{color:var(--faint);font-weight:500;font-size:0.8125rem}
/* package renewal signals, matching the drawer's session-package bar */
.ds-prog.ds-warn .ds-track i{background:var(--amber-tx)}
.ds-prog.ds-warn .ds-pct{color:var(--amber-tx)}
.ds-prog.ds-full .ds-track i{background:#C0392B}
.ds-prog.ds-full .ds-pct{color:#C0392B}

.ds-crow .ds-chip{justify-self:start}
.ds-chip{display:inline-flex;align-items:center;gap:0.375rem;font-size:0.7812rem;font-weight:500;padding:0.375rem 0.75rem;border-radius:var(--pill);white-space:nowrap}
/* "by client" marker on a client-cancelled session chip */
.ds-chip-by{font-size:0.6875rem;font-weight:600;opacity:.7;font-style:italic;margin-left:-0.125rem}
.ds-chip svg{width:0.8125rem;height:0.8125rem}
/* status / type badges — time-slot style: tinted fill, dark text.
   Shared by clients (stchip/tychip) AND sessions (sstchip/typill) so the
   two pages' badges stay identical in height, weight and radius. */
.ds-stchip,.ds-tychip,.ds-sstchip,.ds-typill{border-radius:0.4375rem;font-weight:600;padding:0.4375rem 0.75rem;color:var(--ink)}
.ds-stchip .ds-chevDown,.ds-tychip .ds-chevDown{opacity:.45}
.ds-st-active{background:var(--green-bg);color:var(--green-tx)}
.ds-st-new{background:var(--laven-bg);color:var(--laven-tx)}
.ds-st-follow{background:var(--peach-bg);color:var(--peach-tx)}
.ds-st-inactive{background:#ECF1F6;color:#5B7183}

/* ---- Status / Type chips as edit triggers ---- */
.ds-st-wrap{display:inline-flex;justify-self:start}
.ds-stchip,.ds-tychip,.ds-sstchip,.ds-typill{cursor:pointer;transition:filter .14s, box-shadow .14s}
.ds-stchip .ds-chevDown,.ds-stchip svg,.ds-tychip .ds-chevDown,.ds-tychip svg,.ds-sstchip svg,.ds-typill svg{width:0.75rem;height:0.75rem;opacity:.55;margin-left:-1px}
.ds-stchip:hover,.ds-tychip:hover,.ds-sstchip:hover,.ds-typill:hover{filter:brightness(.97);box-shadow:0 0 0 2px rgba(16,42,67,.08)}
/* manual-override marker: a small ring-dot before the label */
.ds-stchip.ds-manual{box-shadow:inset 0 0 0 1px rgba(0,0,0,.06)}
.ds-man-dot{width:0.375rem;height:0.375rem;border-radius:50%;background:currentColor;flex:0 0 0.375rem;
  box-shadow:0 0 0 2px rgba(255,255,255,.6)}

/* status popover */
.ds-st-pop{width:13.75rem;padding:0.375rem;top:2.375rem}   /* chips are ~28px tall — sit just below them, not at the toolbar-button offset */
.ds-st-pop-h{font-size:0.6562rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--faint);padding:0.4375rem 0.625rem 0.375rem}
.ds-st-pop button{gap:0.625rem}
.ds-st-swatch{width:0.625rem;height:0.625rem;border-radius:50%;flex:0 0 0.625rem}
.ds-st-pop-lbl{flex:1;display:flex;align-items:center;gap:0.5rem;min-width:0}
.ds-st-auto-tag{font-size:0.5938rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--active-tx);
  background:var(--active);border-radius:var(--pill);padding:0.0625rem 0.4375rem}
.ds-st-pop-div{height:1px;background:var(--line);margin:0.3125rem 0.25rem}
.ds-st-revert{display:flex;align-items:center;gap:0.625rem;width:100%;padding:0.5625rem 0.6875rem;border-radius:0.5625rem;
  font-size:0.8438rem;color:var(--ink);font-weight:500}
.ds-st-revert:hover{background:var(--line-soft)}
.ds-st-revert svg{width:1rem;height:1rem;color:var(--muted);flex:0 0 1rem}
.ds-ty-individual{background:var(--blue-bg);color:var(--blue-tx)}
.ds-ty-corporate{background:var(--teal-bg);color:var(--teal-tx)}
/* slot style: the tinted background carries the semantic; text stays dark */
.ds-chip.ds-stchip,.ds-chip.ds-tychip{color:var(--ink)}
.ds-next-cell{display:flex;align-items:center;gap:0.4375rem;font-size:0.8125rem;font-weight:600;color:var(--ink);white-space:nowrap}
.ds-next-cell svg{width:0.875rem;height:0.875rem;color:var(--muted)}
.ds-next-cell.ds-none{color:var(--faint);font-weight:500}
.ds-company-cell{display:flex;align-items:center;gap:0.4375rem;font-size:0.8438rem;font-weight:500;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.ds-company-cell svg{width:0.9375rem;height:0.9375rem;color:var(--faint);flex:0 0 0.9375rem}
.ds-company-cell.ds-none{color:var(--faint);font-weight:500}
.ds-ls-cell{display:flex;align-items:center;gap:0.4375rem;white-space:nowrap}
.ds-ls-cell svg{width:0.875rem;height:0.875rem;color:var(--faint);flex:0 0 0.875rem}
.ds-ls-cell .ds-ls-d{font-size:0.8125rem;font-weight:600;color:var(--ink);line-height:1.15}
.ds-ls-cell .ds-ls-r{font-size:0.6875rem;color:var(--faint);margin-top:0.0625rem}
.ds-ls-cell.ds-none{color:var(--faint);font-weight:500}


.ds-rmore{color:var(--faint);display:grid;place-items:center;width:2rem;height:2rem;border-radius:0.5rem;transition:background .14s, color .14s, box-shadow .14s}
/* clear hover: white chip + ring so it reads even on the tinted row-hover background */
.ds-rmore:hover{background:#fff;color:var(--ink);box-shadow:0 0 0 1px var(--line),0 2px 6px -2px rgba(16,42,67,.25)}
.ds-rmore:active{background:var(--line-soft)}
/* keep it highlighted while its menu is open */
.ds-rmore-wrap .ds-rmore.ds-open,.ds-rmore-wrap:has(.ds-row-pop:not(.hidden)) .ds-rmore{background:var(--active);color:var(--active-tx);box-shadow:none}
.ds-rmore svg{width:1.0625rem;height:1.0625rem}
.ds-rmore-wrap{justify-self:end}

/* row action menu */
.ds-row-pop{top:2.375rem;width:13.75rem}
.ds-row-pop>button,.ds-pop.ds-row-pop>a,.ds-row-pop form button{display:flex;align-items:center;justify-content:flex-start;gap:0.625rem;width:100%;padding:0.5625rem 0.6875rem;border-radius:0.5625rem;
  font-size:0.8438rem;font-weight:500;color:var(--ink);text-align:left}
.ds-row-pop>button:hover,.ds-pop.ds-row-pop>a:hover,.ds-row-pop form button:hover{background:var(--line-soft)}
.ds-row-pop>button svg,.ds-pop.ds-row-pop>a svg,.ds-row-pop form button svg{width:1rem;height:1rem;color:var(--muted);flex:0 0 1rem}
.ds-row-pop .ds-row-danger{color:#C0392B}
.ds-row-pop .ds-row-danger svg{color:#C0392B}
.ds-row-pop .ds-row-danger:hover{background:#FBEAE7}
/* inline delete confirmation */
.ds-row-confirm{padding:0.5rem 0.5625rem 0.375rem}
.ds-row-confirm .ds-rc-q{font-size:0.8125rem;font-weight:600;color:var(--ink);margin-bottom:0.5625rem}
.ds-row-confirm .ds-rc-acts{display:flex;gap:0.5rem}
.ds-row-confirm .ds-rc-acts button{flex:1;height:2.125rem;border-radius:0.5625rem;font-size:0.7812rem;font-weight:600;
  display:inline-flex;align-items:center;justify-content:center;gap:0.375rem;transition:.14s}
.ds-row-confirm .ds-rc-cancel{background:var(--field);color:var(--ink)}
.ds-row-confirm .ds-rc-cancel:hover{background:var(--line)}
.ds-row-confirm .ds-rc-del{background:#C0392B;color:#fff}
.ds-row-confirm .ds-rc-del:hover{background:#A93226}
.ds-row-confirm .ds-rc-del svg{width:0.875rem;height:0.875rem}

.ds-add-row{display:flex;align-items:center;justify-content:center;gap:0.5625rem;border:1.5px dashed #D7D3E0;border-radius:var(--r-row);
  padding:0.8125rem;color:var(--muted);font-size:0.8438rem;font-weight:600;background:transparent;width:100%;transition:.15s;margin-bottom:0.25rem}
.ds-add-row:hover{border-color:#C9BEE0;color:var(--active-tx);background:var(--line-soft)}
.ds-add-row svg{width:1rem;height:1rem}

.ds-empty-sec{padding:1.125rem;text-align:center;color:var(--faint);font-size:0.8438rem}

/* ---- Empty states (no clients yet / no matches) ---- */
.ds-empty-state{display:flex;flex-direction:column;align-items:center;text-align:center;
  background:var(--panel);border:1px solid var(--line);border-radius:1.25rem;box-shadow:0 1px 2px rgba(16,42,67,.04);
  padding:3.375rem 1.75rem 3.125rem;margin-top:0.375rem}
.ds-es-badge{width:3.75rem;height:3.75rem;border-radius:1.0625rem;background:var(--active);color:var(--active-tx);
  display:grid;place-items:center;margin-bottom:1.25rem}
.ds-es-badge svg{width:1.6875rem;height:1.6875rem}
.ds-es-title{font-family:var(--serif);font-weight:700;font-size:1.375rem;letter-spacing:-.01em;margin:0 0 0.5rem}
.ds-es-sub{font-size:0.875rem;color:var(--muted);line-height:1.55;margin:0 0 1.375rem;max-width:22.5rem}
.ds-add-row.ds-big{width:auto;padding:0.8125rem 1.375rem;border-radius:var(--pill);margin-bottom:0}
.ds-es-clear{display:inline-flex;align-items:center;justify-content:center;gap:0.5rem;height:var(--btn-h);min-width:var(--btn-minw);
  padding:0 1.375rem;border-radius:var(--r-btn);background:var(--cta);color:#fff;font-weight:600;font-size:0.875rem;transition:.15s}
.ds-es-clear:hover{background:var(--cta-press)}

/* ---- Drawer ---- */
.ds-scrim{position:fixed;inset:0;background:rgba(13,38,63,.40);backdrop-filter:blur(2px);z-index:80;opacity:0;animation:fade .2s forwards}
@keyframes fade{to{opacity:1}}
.ds-drawer{position:fixed;top:0;right:0;height:100vh;width:35rem;max-width:96vw;z-index:90;background:#fff;
  box-shadow:-30px 0 70px -30px rgba(16,42,67,.4);display:flex;flex-direction:column;
  transform:translateX(100%);animation:slide .27s cubic-bezier(.22,.61,.36,1) forwards}
@keyframes slide{to{transform:translateX(0)}}
/* frame reload while the drawer is already open (tab switch, edit/save) — no re-entry slide */
.ds-drawer.ds-open{animation:none;transform:none}
/* exit animation — drawer slides back out and the scrim fades before removal */
.ds-drawer.ds-closing{animation:slideOut .24s cubic-bezier(.4,0,1,1) forwards}
@keyframes slideOut{from{transform:translateX(0)}to{transform:translateX(100%)}}
.ds-scrim.ds-closing{animation:fadeOut .22s ease forwards}
@keyframes fadeOut{from{opacity:1}to{opacity:0}}
/* top action bar */
.ds-dr-bar{display:flex;align-items:center;justify-content:space-between;padding:0.8125rem 1rem;border-bottom:1px solid var(--line)}
.ds-dr-bar-l,.ds-dr-bar-r{display:flex;align-items:center;gap:0.25rem}
.ds-dr-act{display:inline-flex;align-items:center;gap:0.5rem;height:2.25rem;padding:0 0.75rem;border-radius:var(--r-btn);font-size:0.875rem;font-weight:600;color:var(--ink)}
.ds-dr-act:hover{background:var(--line-soft)}
.ds-dr-act svg{width:1rem;height:1rem;color:var(--muted)}
.ds-dr-ic{width:2.25rem;height:2.25rem;border-radius:var(--r-btn);display:grid;place-items:center;color:var(--muted)}
.ds-dr-ic:hover{background:var(--line-soft);color:var(--ink)}
.ds-dr-ic svg{width:1.125rem;height:1.125rem}
.ds-dr-ic .ds-on{color:#E8A93C}

/* Prominent status actions — natural-width buttons with breathing room,
   between the pills and the quiet facts (promoted out of the top bar). */
.ds-dr-actions{display:flex;gap:0.625rem;margin:2.375rem 0 2.625rem;flex-wrap:wrap;justify-content:center}
.ds-dr-actions .ds-gbtn{min-width:0;padding:0 1rem}

.ds-dr-scroll{flex:1;overflow-y:auto;padding:1.625rem 1.875rem 1.625rem}
/* Drawer identity header: read-only avatar (photo or initials tint) beside the
   eyebrow/title/goal. Upload + crop live on the full profile page, not the peek. */
.ds-dr-head{display:flex;align-items:flex-start;gap:0.9375rem;margin-bottom:0.125rem}
.ds-dr-head-id{min-width:0;flex:1}
.ds-dr-avatar{flex:0 0 3.5rem;width:3.5rem;height:3.5rem;border-radius:50%;display:grid;place-items:center;
  font-size:1.0625rem;font-weight:700;font-family:var(--serif)}
.ds-dr-avatar.ds-av{font-size:1.0625rem}
.ds-dr-avatar-img{object-fit:cover}
.ds-dr-head .ds-dr-eyebrow{margin-bottom:0.5625rem}
.ds-dr-eyebrow{display:inline-flex;align-items:center;gap:0.5rem;font-size:0.7812rem;font-weight:600;color:var(--muted);margin-bottom:0.875rem}
.ds-dr-eyebrow svg{width:0.9375rem;height:0.9375rem;color:var(--faint)}
.ds-dr-title{font-family:var(--serif);font-weight:700;font-size:1.625rem;line-height:1.1;letter-spacing:-.015em;margin:0 0 0.6875rem}
/* title row with the "View profile" link pushed to the right edge */
.ds-dr-title-row{display:flex;align-items:baseline;gap:0.5rem;flex-wrap:wrap;margin:0 0 0.6875rem}
.ds-dr-title-row .ds-dr-title{margin:0}
.ds-dr-title-row .ds-sc-view{margin-left:auto;padding:0.25rem 0.5rem;align-self:center}
/* quiet goal/focus line under the name */
.ds-dr-goal{display:flex;align-items:center;gap:0.5rem;font-size:0.8438rem;font-weight:600;color:var(--muted);margin-bottom:0.875rem}
.ds-dr-goal svg{width:0.9375rem;height:0.9375rem;color:var(--faint)}
/* session-package banner: sessions delivered vs the agreed package, with a renewal
   nudge as it runs out (warn = almost done, full = used up) */
.ds-dr-banner{display:flex;align-items:center;justify-content:space-between;gap:1rem;border-radius:0.625rem;padding:0.8125rem 1rem;margin-bottom:1.25rem;
  background:#EAF3FC}
.ds-dr-banner.ds-warn{background:#FBF3E4}
.ds-dr-banner.ds-full{background:#FBEBE9}
.ds-dr-banner .ds-bn-l{display:flex;align-items:center;gap:0.8125rem;min-width:0}
.ds-dr-banner .ds-bn-ic{width:2.5rem;height:2.5rem;border-radius:0.6875rem;background:var(--black);color:#fff;display:grid;place-items:center;flex:0 0 2.5rem}
.ds-dr-banner .ds-bn-ic svg{width:1.1875rem;height:1.1875rem}
.ds-dr-banner .ds-bn-t{font-size:0.8438rem;font-weight:700}
.ds-dr-banner .ds-bn-s{font-size:0.7812rem;color:var(--muted);margin-top:0.125rem}
.ds-dr-banner .ds-bn-s.ds-warn{color:var(--amber-tx);font-weight:600}
.ds-dr-banner .ds-bn-s.ds-full{color:#C0392B;font-weight:600}
.ds-dr-banner .ds-bn-pct{font-family:var(--serif);font-weight:800;font-size:1.5rem;letter-spacing:-.01em;white-space:nowrap;flex:0 0 auto}
.ds-dr-pills{display:flex;gap:0.5rem;flex-wrap:wrap;margin-bottom:1.125rem}
/* Session page: status chips left, primary action + ⋮ right on the same row. */
.ds-sess-hd-pills{align-items:center}
.ds-sess-hd-actions{margin-left:auto}
.ds-chip.ds-outline{background:#fff;border:1px solid var(--line);color:var(--muted)}

.ds-dr-block{margin-bottom:1.625rem}
.ds-bk-h{font-size:0.75rem;font-weight:600;letter-spacing:.09em;text-transform:uppercase;color:var(--muted);margin-bottom:0.75rem}
.ds-bk-sub{font-size:0.7188rem;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--faint);margin-bottom:0.625rem}
.ds-bk-p{font-size:0.8438rem;line-height:1.6;color:#46617A;margin:0}
.ds-bk-empty{font-size:0.8438rem;color:var(--faint)}

.ds-dr-quick{display:flex;gap:1.375rem;padding:0.8125rem 0;border-top:1px solid var(--line-soft);border-bottom:1px solid var(--line-soft);margin-bottom:1.25rem}
.ds-dr-quick .ds-qk{display:flex;align-items:center;gap:0.4375rem;font-size:0.8125rem;color:var(--muted);font-weight:500}
.ds-dr-quick .ds-qk b{color:var(--ink);font-weight:700}
.ds-dr-quick .ds-qk svg{width:0.9375rem;height:0.9375rem;color:var(--faint)}
/* Delivery-mode glyph inlined into the "Starts at … · <mode>" fact/banner. */
.ds-mode-ic{vertical-align:-2px;margin-right:0.0625rem}

/* Session drawer — with the actions compacted onto the chips row there's room
   to open up the header rhythm. Scoped to .ds-sess-drawer so the session page
   (kept tight to fit the viewport) and the client drawer are untouched; the
   detail-field rows below keep their existing spacing. */
.ds-sess-drawer{padding-top:2rem}
.ds-sess-drawer .ds-dr-eyebrow{margin-bottom:1.25rem}
.ds-sess-drawer .ds-dr-title-row{margin-bottom:0.875rem}
.ds-sess-drawer .ds-dr-sub-date{margin:0 0 1.375rem}
.ds-sess-drawer .ds-dr-pills{margin-bottom:1.625rem}
.ds-sess-drawer .ds-dr-quick{padding:1rem 0;margin-bottom:1.75rem}

.ds-file{display:flex;align-items:center;gap:0.8125rem;padding:0.75rem 0;border-bottom:1px solid var(--line-soft)}
.ds-file:last-child{border:none;padding-bottom:0}
.ds-file-ic{width:2.375rem;height:2.375rem;border-radius:0.625rem;display:grid;place-items:center;flex:0 0 2.375rem}
.ds-file-ic svg{width:1.125rem;height:1.125rem}
.ds-file-ic.ds-pdf{background:#FBE9E7;color:#C43D3D}
.ds-file-ic.ds-docx{background:var(--blue-bg);color:var(--blue-tx)}
.ds-file-meta{flex:1;min-width:0}
.ds-file-nm{font-size:0.8438rem;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ds-file-dt{font-size:0.7188rem;color:var(--faint);margin-top:0.125rem}
.ds-file-acts{display:flex;gap:0.75rem}
.ds-lnk{display:inline-flex;align-items:center;gap:0.375rem;font-size:0.7812rem;font-weight:600;color:var(--active-tx)}
.ds-lnk:hover{color:#0E5FA0}
.ds-lnk svg{width:0.875rem;height:0.875rem}

.ds-dr-tabs{display:flex;gap:2rem;border-bottom:1px solid var(--line);margin-bottom:1rem}
.ds-dtab{display:inline-flex;align-items:center;gap:0.4375rem;font-size:0.875rem;font-weight:600;color:var(--muted);padding-bottom:0.6875rem;border-bottom:2px solid transparent;margin-bottom:-1px}
.ds-dtab.ds-on{color:var(--active-tx);border-color:var(--active-tx)}
.ds-dtab:hover{color:var(--ink)}
.ds-dtab .ds-dtab-n{font-size:0.6875rem;font-weight:700;color:var(--faint);background:var(--field);border-radius:var(--pill);
  min-width:1.125rem;height:1.125rem;padding:0 0.375rem;display:grid;place-items:center;line-height:1}
.ds-dtab.ds-on .ds-dtab-n{color:var(--ink)}

.ds-thread{display:flex;flex-direction:column}
/* hairline divider between notes — half-width, centered; margin+padding
   split keeps it vertically centered in the gap */
.ds-thread > .ds-cmt + .ds-cmt{margin-top:0.875rem;padding-top:0.9375rem;position:relative}
.ds-thread > .ds-cmt + .ds-cmt::before{content:"";position:absolute;top:0;left:25%;width:50%;height:1px;background:var(--line-soft)}
.ds-cmt{display:flex;gap:0.6875rem}
.ds-cmt-body{flex:1;min-width:0}
/* visibility chip (client-portal beta) + "(edited)" marker inside a note head */
.ds-cmt-vis{display:inline-flex;align-items:center;gap:0.1875rem;font-size:0.6875rem;font-weight:600;
  color:var(--muted);background:var(--field);border-radius:var(--pill);padding:0.0625rem 0.4375rem}
.ds-cmt-vis svg{width:0.75rem;height:0.75rem}
.ds-cmt-vis.ds-shared{color:var(--active-tx);background:var(--active)}
.ds-cmt-edited{font-style:italic}
/* hover edit/delete actions on a note */
.ds-cmt-act{display:flex;gap:0.125rem;flex:0 0 auto;opacity:0;transition:opacity .14s}
.ds-cmt:hover .ds-cmt-act,.ds-cmt:focus-within .ds-cmt-act,
.ds-note:hover .ds-cmt-act,.ds-note:focus-within .ds-cmt-act{opacity:1}
.ds-cmt-ic{width:1.75rem;height:1.75rem;border-radius:0.5rem;display:grid;place-items:center;
  color:var(--faint);transition:background .14s,color .14s}
.ds-cmt-ic:hover{background:var(--line-soft);color:var(--ink)}
.ds-cmt-ic.ds-danger:hover{background:#FDECEC;color:#C0392B}
.ds-cmt-ic svg{width:0.9375rem;height:0.9375rem}

/* ---- Notes in a comment layout: note icon + timestamp + content ---- */
/* No avatar/author name — every note is the coach's own; a soft blue note-icon
   badge leads, the timestamp sits where the name would, content below. */
.ds-note-ic{width:2.125rem;height:2.125rem;border-radius:50%;flex:0 0 2.125rem;display:grid;place-items:center;
  background:var(--blue-bg);color:var(--active-tx)}
.ds-note-ic svg{width:1.0625rem;height:1.0625rem}
.ds-note-head{display:flex;align-items:center;gap:0.5rem;min-height:1.25rem}
.ds-note-head .ds-cmt-act{margin-left:auto}
.ds-note-when{display:inline-flex;align-items:center;gap:0.3125rem;font-size:0.7812rem;font-weight:600;
  color:var(--faint);white-space:nowrap}
.ds-note-when svg{width:0.8125rem;height:0.8125rem;color:var(--faint)}
.ds-note-tx{font-size:0.8438rem;line-height:1.55;color:var(--ink);margin-top:0.125rem;overflow-wrap:break-word}
.ds-note-tx ul li::marker,.ds-note-tx ol li::marker{color:var(--faint)}
@media (prefers-reduced-motion: no-preference){
  #notes_list .ds-cmt{animation:noteIn .3s ease both}
  @keyframes noteIn{from{opacity:0;transform:translateY(0.25rem)}to{opacity:1;transform:none}}
}

.ds-timeline{display:flex;flex-direction:column;gap:0.125rem}
.ds-tl{display:flex;gap:0.75rem;padding:0.5rem 0;align-items:flex-start}
.ds-tl-dot{width:0.625rem;height:0.625rem;border-radius:50%;background:#D5D1DD;margin-top:0.25rem;flex:0 0 0.625rem}
.ds-tl-dot.ds-up{background:var(--active-tx)}
.ds-tl div b{font-size:0.8438rem;font-weight:700}
.ds-tl div span{font-size:0.8125rem;color:var(--muted)}
.ds-tl-s{font-size:0.7812rem;color:var(--faint);margin-top:0.125rem}

/* next-session pill muted state */
.ds-chip.ds-outline.ds-muted{color:var(--faint)}

/* Contact details — rows are identical in read and edit mode; only the value on
   the right swaps to an input, so fields don't jump when toggling edit. */
.ds-dr-fields{display:flex;flex-direction:column;gap:0.125rem}
.ds-dr-field{display:flex;align-items:center;justify-content:space-between;gap:1rem;padding:0.5625rem 0;border-bottom:1px solid var(--line-soft)}
.ds-dr-field:last-child{border-bottom:none}
.ds-dr-field .ds-dfl{display:flex;align-items:center;gap:0.5625rem;font-size:0.8125rem;color:var(--muted);font-weight:500;flex:0 0 auto}
.ds-dr-field .ds-dfl svg{width:0.9375rem;height:0.9375rem;color:var(--faint)}
.ds-dr-field .ds-dfv{flex:1;min-width:0;max-width:60%;margin-left:auto;padding-left:0.75rem;font-size:0.8438rem;color:var(--ink);font-weight:600;text-align:left;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* editing: input sits in the value's place. Left-aligned text so password-manager
   fill icons (LastPass, 1Password) injected at the input's right edge land over
   empty space instead of shoving the value left. */
.ds-dr-field .ds-dfi{flex:1;min-width:0;max-width:60%;margin-left:auto;border:1px solid var(--line);border-radius:0.5rem;
  padding:0.5rem 0.6875rem;font-size:0.8438rem;color:var(--ink);font-weight:600;text-align:left;background:var(--field);
  outline:none;transition:.15s;font-family:inherit;-webkit-appearance:none;appearance:none}
.ds-dr-field .ds-dfi::placeholder{color:var(--faint);font-weight:500}
/* these are type=search (to dodge password-manager fill icons) — strip search chrome */
.ds-dr-field .ds-dfi::-webkit-search-decoration,
.ds-dr-field .ds-dfi::-webkit-search-cancel-button,
.ds-dr-field .ds-dfi::-webkit-search-results-button{-webkit-appearance:none;display:none}
.ds-dr-field .ds-dfi:focus{border-color:#A8D2F0;background:#fff;box-shadow:0 0 0 3px rgba(17,115,194,.10)}
/* ds_select sized to the drawer's compact label-left / control-right row */
.ds-dr-field .ds-lsel{flex:1;min-width:0;max-width:60%;margin-left:auto}
.ds-dr-field .ds-lsel-btn{height:1.9375rem;padding:0 0.6875rem;font-size:0.8438rem}
.ds-dr-field a.ds-dfv-link{color:var(--active-tx);text-decoration:none}
.ds-dr-field a.ds-dfv-link:hover{text-decoration:underline}
/* About textarea (edit) */
.ds-dr-textarea{width:100%;border:1px solid var(--line);border-radius:0.625rem;padding:0.625rem 0.8125rem;font-size:0.875rem;
  color:#4f5662;background:var(--field);outline:none;transition:.15s;font-family:inherit;resize:vertical;line-height:1.6}
.ds-dr-textarea::placeholder{color:var(--faint)}
.ds-dr-textarea:focus{border-color:#A8D2F0;background:#fff;box-shadow:0 0 0 4px rgba(17,115,194,.10)}

/* ---- Inline per-field editing (.ds-fld rows, field-edit controller) ---- */
.ds-fld.ds-dr-field{flex-wrap:wrap;padding:0.1875rem 0}
/* view state: the value is a click-to-edit button; hover tints it like a field */
.ds-fld-viewwrap{flex:1;min-width:0;max-width:60%;margin-left:auto;display:inline-flex;align-items:center;gap:0.375rem}
.ds-fld-viewwrap .ds-dfv{flex:1;min-width:0;max-width:none;margin-left:0}
button.ds-fld-view{cursor:pointer;border-radius:0.5rem;padding:0.3125rem 0.6875rem;transition:background .12s}
button.ds-fld-view:hover{background:var(--field)}
/* lazily-loaded searchable-select rows (country/timezone): the frame holds
   either the value link (flag + label) or, once loaded, the ds_select form.
   Same class in both states so the frame element keeps its layout on load. */
.ds-fld-selframe{flex:1;min-width:0;max-width:60%;margin-left:auto;display:flex;align-items:center}
.ds-fld-selframe .ds-fld-form,.ds-fld-selframe .ds-lsel{flex:1;min-width:0;max-width:none;margin-left:0}
a.ds-fld-view{display:flex;align-items:center;gap:0.5rem;flex:1;min-width:0;cursor:pointer;border-radius:0.5rem;padding:0.3125rem 0.6875rem;
  font-size:0.8438rem;font-weight:600;color:var(--ink);transition:background .12s}
a.ds-fld-view:hover{background:var(--field)}
a.ds-fld-view .ds-fld-selval{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-fld-empty{color:var(--faint);font-weight:400}
.ds-dr-field .ds-dfv.ds-fld-empty{color:var(--faint);font-weight:400}
a.ds-fld-view.ds-fld-empty .ds-fld-selval{color:var(--faint);font-weight:400}
.ds-fld-open{width:1.625rem;height:1.625rem;border-radius:0.4375rem;display:grid;place-items:center;color:var(--muted);flex:0 0 1.625rem}
.ds-fld-open:hover{background:var(--line-soft);color:var(--ink)}
.ds-fld-open svg{width:0.875rem;height:0.875rem}
/* edit state: the micro-form takes the value slot */
.ds-fld-form{flex:1;min-width:0;max-width:60%;margin-left:auto;display:flex}
.ds-fld-form .ds-dfi{flex:1;min-width:0;max-width:none;margin-left:0}
.ds-fld-form .ds-lsel{flex:1;min-width:0;max-width:none;margin-left:0}
/* selects are always live — flat until hovered/opened so they read as values */
.ds-fld .ds-lsel-btn{border-color:transparent;background:transparent}
.ds-fld .ds-lsel-btn:hover{background:var(--field)}
.ds-fld .ds-lsel.ds-open .ds-lsel-btn{border-color:#A8D2F0;background:#fff;box-shadow:0 0 0 4px rgba(17,115,194,.10)}
.ds-fld .ds-lsel-btn .ds-lsel-chev{opacity:0;transition:opacity .12s}
.ds-fld .ds-lsel-btn:hover .ds-lsel-chev,.ds-fld .ds-lsel.ds-open .ds-lsel-chev{opacity:1}
/* clearer subsection headers in the contact tab (Contact details / About) */
.ds-fld-sec{font-size:0.75rem;font-weight:600;letter-spacing:.09em;color:var(--muted)}
.ds-fld-sec-gdpr{display:flex;align-items:center}
.ds-fld-sec-gdpr .ds-hint{vertical-align:0}
/* Client-communication section sits after the About/notes block — give it a
   clear margin + a hairline so it reads as its own group, not part of notes. */
.ds-fld-sec-comms{margin-top:3.25rem;padding-top:1.875rem;border-top:1px solid var(--line-soft)}
/* About block variant — a divider separates it from the field list above */
.ds-fld-block .ds-fld-sub{display:flex;align-items:center;gap:0.375rem;margin-top:1.5rem;padding-top:1.25rem;border-top:1px solid var(--line)}
.ds-fld-block button.ds-fld-view{display:block;width:100%;text-align:left;padding:0.5rem 0.6875rem;margin:0 -0.6875rem;cursor:pointer}
.ds-fld-block .ds-fld-form{max-width:none;display:block}
/* saving / saved / error states */
.ds-fld-busy{opacity:.55;pointer-events:none}
.ds-fld-check{display:inline-grid;place-items:center;color:var(--green-tx);opacity:0}
.ds-fld-check svg{width:0.75rem;height:0.75rem}
.ds-fld-saved .ds-fld-check{animation:fldSaved 1.6s ease forwards}
@keyframes fldSaved{0%{opacity:0}12%{opacity:1}70%{opacity:1}100%{opacity:0}}
.ds-fld-error .ds-dfi{border-color:#D66A5E;box-shadow:0 0 0 3px rgba(196,61,61,.08)}
.ds-fld-err{flex-basis:100%;text-align:right;font-size:0.75rem;font-weight:600;color:#C0392B;padding-top:0.125rem}
.ds-fld-gdpr{display:flex;align-items:center;gap:0.4375rem;font-size:0.75rem;color:var(--faint);margin-top:0.875rem}
.ds-fld-gdpr svg{width:0.75rem;height:0.75rem;flex:0 0 0.75rem}
/* tooltip trigger sits flush as the leading item (no trailing-icon margin) */
.ds-fld-gdpr .ds-hint{margin-left:0}
.ds-fld-gdpr .ds-hint svg{width:0.75rem;height:0.75rem}
/* Invoices tab — cards (legacy sessions recipe, still used by clients/_invoices_tab) */
.ds-sess-list{display:flex;flex-direction:column;gap:0.75rem}
.ds-sess-card{border:1px solid var(--line);border-radius:0.625rem;padding:0.875rem 1rem;background:#fff;transition:box-shadow .14s}
.ds-sess-card:hover{box-shadow:0 6px 18px -12px rgba(16,42,67,.3)}
.ds-sess-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:0.625rem}
.ds-sess-meta{display:flex;gap:1.125rem;flex-wrap:wrap;margin-bottom:0.5rem}
.ds-sess-meta span{display:inline-flex;align-items:center;gap:0.4375rem;font-size:0.8125rem;font-weight:600;color:var(--ink)}
.ds-sess-meta svg{width:0.875rem;height:0.875rem;color:var(--faint)}

/* Sessions tab — flat rows on white with hairline dividers (client drawer +
   profile page). Icon tile softly tinted by session type, real status chip
   right with the relative time beneath. Each row is an <a> to the session
   page; the book CTA lives in the sessions footer (.ds-ss-foot). */
/* group headers reuse the ledger's .ds-sgroup (collapsible) — normalize its
   ledger-panel margins to the tab width */
.ds-ss-list .ds-sgroup{width:100%;margin:1.25rem 0 0.25rem}
.ds-ss-list .ds-sgroup:first-child{margin-top:0.125rem}
.ds-ss-group{display:flex;flex-direction:column}
.ds-ss-hint{padding:0.125rem 0.25rem 0.25rem}
/* truncation note: clear air between the last row and the small print */
.ds-ss-group + .ds-ss-hint{margin-top:1rem}
/* Centered empty state shared by the drawer/profile tabs (notes, sessions,
   tasks): soft icon, small title, muted hint. */
.ds-tab-empty{display:flex;flex-direction:column;align-items:center;text-align:center;padding:2.875rem 1.25rem 2.5rem}
.ds-tab-empty > svg{width:2.5rem;height:2.5rem;color:var(--line);margin-bottom:0.75rem}
.ds-tab-empty .ds-te-t{font-size:0.9375rem;font-weight:600;color:var(--ink)}
.ds-tab-empty .ds-te-s{font-size:0.8438rem;color:var(--muted);margin-top:0.25rem}
.ds-ss-card{display:flex;align-items:center;gap:0.9375rem;padding:0.875rem 0.25rem;border-radius:0.75rem;color:inherit;text-decoration:none;cursor:pointer;transition:background .12s}
.ds-ss-card:hover{background:var(--field)}
.ds-ss-group .ds-ss-card + .ds-ss-card{border-top:1px solid var(--line-soft)}
.ds-ss-ic{width:2.375rem;height:2.375rem;border-radius:0.6875rem;background:var(--field);color:var(--muted);display:grid;place-items:center;flex:0 0 2.375rem}
.ds-ss-ic svg{width:1.0625rem;height:1.0625rem}
.ds-ss-body{flex:1;min-width:0}
.ds-ss-meta{display:flex;align-items:center;gap:0.875rem;flex-wrap:wrap;font-size:0.8125rem;font-weight:600;color:var(--ink)}
.ds-ss-meta span{display:inline-flex;align-items:center;gap:0.375rem}
.ds-ss-meta svg{width:0.875rem;height:0.875rem;color:var(--faint)}
.ds-ss-note{margin-top:0.25rem;font-size:0.8125rem;font-weight:400;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-ss-tasks{background:#fff;box-shadow:inset 0 0 0 1px var(--line-soft);border-radius:6.1875rem;padding:0.125rem 0.5rem;font-size:0.7188rem;font-weight:600;color:var(--muted)}
.ds-ss-tasks svg{width:0.8125rem;height:0.8125rem;color:var(--faint)}
.ds-ss-side{display:flex;flex-direction:column;align-items:flex-end;gap:0.4375rem;flex:0 0 auto}
/* minimalist status: icon + coloured text, no pill */
.ds-ss-st{display:inline-flex;align-items:center;gap:0.375rem;font-size:0.8125rem;font-weight:600;white-space:nowrap}
.ds-ss-st svg{width:0.875rem;height:0.875rem}
.ds-ss-st.ds-scheduled{color:var(--active-tx)}
.ds-ss-st.ds-completed{color:var(--green-tx)}
.ds-ss-st.ds-cancelled{color:#C43D3D}
.ds-ss-days{font-weight:500;font-size:0.8125rem;white-space:nowrap;color:var(--faint)}
/* sessions footer — lifetime summary left, book CTA right */
.ds-ss-foot{display:flex;align-items:center;justify-content:space-between;gap:0.875rem}
.ds-ss-foot .ds-dr-action{flex:0 0 auto;height:2.5rem;padding:0 1.125rem;font-size:0.8438rem}
.ds-ss-foot .ds-dr-action svg{width:0.9375rem;height:0.9375rem}
.ds-ss-total{display:inline-flex;align-items:center;gap:0.5rem;font-size:0.8125rem;font-weight:500;color:var(--muted);min-width:0}
.ds-ss-total svg{width:1rem;height:1rem;color:var(--green-tx);flex:0 0 1rem}
.ds-ss-foot.ds-pg{margin-top:1.25rem;padding-top:1rem;border-top:1px solid var(--line-soft)}
/* sessions toolbar: removable active client-filter chip */
.ds-client-flt{display:inline-flex;align-items:center;gap:0.5rem;height:2.375rem;padding:0 0.875rem;border-radius:0.625rem;background:var(--active);color:var(--active-tx);font-size:0.8125rem;font-weight:600;white-space:nowrap;transition:filter .12s}
.ds-client-flt:hover{filter:brightness(.96)}
.ds-client-flt svg{width:0.875rem;height:0.875rem}
.ds-client-flt svg:last-child{opacity:.6}
/* status chip is read-only here — neutralize inherited interactive affordances */
.ds-chip.ds-static{cursor:default}
.ds-chip.ds-static:hover{filter:none;box-shadow:none}

.ds-dr-compose{display:flex;align-items:center;gap:0.625rem;padding:0.875rem 1.125rem;border-top:1px solid var(--line);background:#fff}
.ds-dr-compose input{flex:1;height:2.875rem;border:1px solid var(--line);border-radius:0.625rem;padding:0 1rem;font-size:0.875rem;background:var(--field);outline:none;transition:.15s}
.ds-dr-compose input:focus{border-color:#A8D2F0;background:#fff;box-shadow:0 0 0 4px rgba(17,115,194,.10)}
.ds-dr-compose .ds-send{width:2.875rem;height:2.875rem;border-radius:0.625rem;background:var(--black);color:#fff;display:grid;place-items:center;flex:0 0 2.875rem}
.ds-dr-compose .ds-send:hover{background:var(--black-press)}
.ds-dr-compose .ds-send svg{width:1.125rem;height:1.125rem}
/* contextual tab actions (Sessions / Files) — real buttons, not fake composers */
.ds-dr-action{flex:1;height:var(--btn-h);border-radius:0.625rem;display:inline-flex;align-items:center;justify-content:center;gap:0.5625rem;
  background:var(--cta);color:#fff;font-weight:600;font-size:0.875rem;transition:.15s}
.ds-dr-action:hover{background:var(--cta-press)}
.ds-dr-action svg{width:1.0625rem;height:1.0625rem}
.ds-dr-action.ds-ghost{background:#fff;border:1px solid var(--line);color:var(--ink)}
.ds-dr-action.ds-ghost:hover{background:var(--line-soft)}
.ds-dr-action.ds-ghost svg{color:var(--muted)}

/* ---- Client profile page (full-page counterpart of the drawer) ---- */
.ds-profile-page{max-width:77.5rem;margin:0 auto;width:100%}
/* On desktop the white card fills the available viewport height and keeps that
   height constant across tabs — the active tab's content scrolls inside it
   rather than growing/shrinking the card. The full-height flex chain is scoped
   to the scroll column via :has() so no other ds- page is affected. Below the
   sidebar breakpoint the header alone would eat the whole card, so we fall back
   to natural (content) height and let the page scroll normally. */
@media(min-width:1024px){
  .ds-scroll:has(.ds-profile-page){overflow:hidden}
  .ds-scroll:has(.ds-profile-page) > .ds-page{height:100%}
  .ds-scroll:has(.ds-profile-page) > .ds-page > main{height:100%;display:flex;flex-direction:column}
  .ds-profile-page{flex:1;min-height:0;display:flex;flex-direction:column}
  /* the session page wraps its panel in the #session_page stream target — keep
     the full-height flex chain flowing through it */
  .ds-profile-page > #session_page{flex:1;min-height:0;display:flex;flex-direction:column}
  .ds-profile-page > .ds-profile,
  #session_page > .ds-profile{flex:1;min-height:0;display:flex;flex-direction:column}
  .ds-profile-page .ds-profile > #client_header,
  .ds-profile-page .ds-profile > #session_header{flex:0 0 auto}
  .ds-profile-page #client_profile_tabs,
  .ds-profile-page #session_profile_tabs{flex:1;min-height:0;display:flex;flex-direction:column}
  #session_page > .ds-bcrumb{flex:0 0 auto}
  .ds-profile-page .ds-dr-block{flex:1;min-height:0;display:flex;flex-direction:column;margin-bottom:0}
  .ds-profile-page .ds-dr-block > .ds-dr-tabs{flex:0 0 auto}
  .ds-profile-body{flex:1;min-height:0;overflow-y:auto;overflow-x:hidden;margin-right:-0.5rem;padding-right:0.5rem}
}
@media(min-width:1024px){
  /* Session page card height: fill the viewport so every tab is the same height
     (no short tab collapsing the card), but let a tab taller than the viewport
     grow the card and scroll the PAGE — never an internal sliver scrollbar (the
     tall session header would otherwise squeeze the body to a few lines). Client
     profiles keep the fixed pinned-tabs lock; this replaces it for #session_page.
     Only .ds-page carries the percentage floor — it resolves against the
     definite-height .ds-scroll; everything below just flex-grows to fill it. */
  .ds-scroll:has(#session_page){overflow-y:auto}
  .ds-scroll:has(#session_page) > .ds-page{min-height:100%;display:flex;flex-direction:column}
  .ds-scroll:has(#session_page) > .ds-page > main{flex:1 0 auto;display:flex;flex-direction:column}
  .ds-profile-page:has(#session_page),
  .ds-profile-page:has(#session_page) > #session_page,
  #session_page > .ds-profile,
  .ds-profile-page:has(#session_page) #session_profile_tabs,
  .ds-profile-page:has(#session_page) .ds-dr-block{flex:1 0 auto;display:flex;flex-direction:column}
  .ds-profile-page:has(#session_page) .ds-dr-block{margin-bottom:0}
  .ds-profile-page:has(#session_page) .ds-profile-body{flex:1 0 auto;overflow:visible;margin-right:0;padding-right:0}
}
.ds-bcrumb{display:flex;align-items:center;justify-content:space-between;gap:0.875rem;margin-bottom:1.125rem;flex-wrap:wrap}
.ds-bcrumb-actions{justify-content:flex-end}
.ds-bc-trail{display:flex;align-items:center;gap:0.5625rem;min-width:0}
.ds-bc-trail svg{width:1rem;height:1rem;color:var(--faint);flex:0 0 1rem}
.ds-bc-link{font-size:0.9375rem;font-weight:600;color:var(--muted)}
.ds-bc-link:hover{color:var(--ink)}
.ds-bc-here{font-size:0.9375rem;font-weight:700;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ds-bc-actions{display:flex;align-items:center;gap:0.5rem;flex-wrap:wrap;row-gap:0.5rem}
.ds-profile{padding:1.875rem 2.375rem 2.125rem}
/* header: avatar left of the identity block */
.ds-ph-top{display:flex;align-items:flex-start;gap:1.25rem;margin-bottom:1rem}
.ds-ph-id{min-width:0;flex:1}
.ds-ph-id .ds-dr-title{margin-bottom:0.5rem}
.ds-ph-id .ds-dr-goal{margin-bottom:0.625rem}
.ds-ph-meta{display:flex;align-items:center;gap:1rem;flex-wrap:wrap}
.ds-ph-since{display:inline-flex;align-items:center;gap:0.4375rem;font-size:0.7812rem;font-weight:500;color:var(--faint)}
.ds-ph-since svg{width:0.875rem;height:0.875rem}
.ds-ph-avatar-wrap{position:relative;flex:0 0 auto}
.ds-ph-avatar-img{width:4.5rem;height:4.5rem;border-radius:50%;object-fit:cover;display:grid;place-items:center;
  font-size:1.375rem;font-weight:700;font-family:var(--serif)}
.ds-ph-avatar-edit{position:absolute;bottom:0;right:0;width:1.5rem;height:1.5rem;border-radius:50%;
  background:var(--black);color:#fff;display:grid;place-items:center;box-shadow:0 1px 4px rgba(16,42,67,.35)}
.ds-ph-avatar-edit:hover{background:var(--black-press)}
.ds-ph-avatar-edit svg{width:0.75rem;height:0.75rem}
/* portal invitation status line (beta) */
.ds-portal{display:inline-flex;align-items:center;gap:0.375rem;font-size:0.7812rem;font-weight:600}
.ds-portal svg{width:0.875rem;height:0.875rem}
.ds-portal-active{color:var(--green-tx)}
.ds-portal-pending{color:var(--amber-tx)}
.ds-portal-off{color:var(--faint)}
.ds-portal-btn{background:none;border:none;padding:0;cursor:pointer}
/* invoices tab bits */
.ds-inv-num{font-size:0.8438rem;font-weight:700}
.ds-inv-amount{font-family:var(--serif);font-weight:800;font-size:0.9375rem}
.ds-chip.ds-inv-draft{background:var(--field);color:var(--muted)}
.ds-chip.ds-inv-sent{background:var(--blue-bg);color:var(--blue-tx)}
.ds-chip.ds-inv-paid{background:var(--green-bg);color:var(--green-tx)}
.ds-chip.ds-inv-overdue{background:#FBEBE9;color:#C0392B}
/* resources tab header */
.ds-res-head{display:flex;align-items:center;justify-content:space-between;gap:0.875rem;margin-bottom:1.125rem}
@media(max-width:640px){
  .ds-profile{padding:1.375rem 1.125rem 1.625rem}
  .ds-ph-top{gap:0.875rem}
  .ds-bc-actions{width:100%;justify-content:flex-end}
}

/* ---- Modal ---- */
.ds-modal{position:fixed;inset:0;z-index:100;display:grid;place-items:center;padding:1.5rem}
.ds-box{position:relative;background:#fff;width:min(32.5rem,100vw - 2rem);max-height:92vh;overflow:hidden;
  display:flex;flex-direction:column;border-radius:0.75rem;box-shadow:0 40px 90px -30px rgba(16,42,67,.5);
  transform:translateY(0.625rem) scale(.99);animation:pop .22s forwards}
@keyframes pop{to{transform:translateY(0) scale(1)}}
.ds-m-head{padding:1.625rem 1.75rem 0;position:relative}
.ds-m-badge{width:3.125rem;height:3.125rem;border-radius:0.875rem;background:var(--active);color:var(--active-tx);display:grid;place-items:center;margin-bottom:0.875rem}
.ds-m-badge svg{width:1.5rem;height:1.5rem}
.ds-m-title{font-size:1.3125rem;font-weight:700;letter-spacing:-.01em}
.ds-m-sub{color:var(--muted);font-size:0.8438rem;margin-top:0.3125rem}
.ds-m-close{position:absolute;top:1.25rem;right:1.375rem;width:2.125rem;height:2.125rem;border-radius:0.625rem;display:grid;place-items:center;color:var(--muted)}
.ds-m-close:hover{background:var(--line-soft);color:var(--ink)}
.ds-m-close svg{width:1.0625rem;height:1.0625rem}
.ds-m-form{flex:1;min-height:0;display:flex;flex-direction:column}
.ds-m-body{flex:1;min-height:0;padding:1.375rem 1.75rem 1rem;display:flex;flex-direction:column;gap:1rem;overflow-y:auto}
.ds-frow{display:grid;grid-template-columns:1fr 1fr;gap:0.875rem}
.ds-field label{display:block;font-size:0.7812rem;font-weight:600;color:var(--ink);margin-bottom:0.4375rem}
.ds-field label .ds-req{color:#C0392B}
/* per-field validation error (auth forms): red border on the control + message */
.ds-field-invalid :where(input, textarea){border-color:#D66A5E;box-shadow:0 0 0 3px rgba(196,61,61,.08)}
.ds-field-invalid .ds-lsel-btn,.ds-lsel-invalid .ds-lsel-btn{border-color:#D66A5E;box-shadow:0 0 0 3px rgba(196,61,61,.08)}
.ds-field-msg{margin:0.375rem 0 0;font-size:0.75rem;font-weight:600;color:#C0392B}
/* label carrying a trailing help icon — flex keeps the icon centred on the text */
.ds-field label.ds-lbl-help{display:flex;align-items:center;gap:0.25rem}
/* zero class-specificity (:where) so a composite control's single-class rule
   (.ds-phone-num, .ds-lsel-search input) cleanly overrides without a scoping
   arms race — see DESIGN_SYSTEM "element resets are zero-specificity". */
:where(.ds-field) input{width:100%;height:2.875rem;border:1px solid var(--line);border-radius:0.75rem;padding:0 0.875rem;font-size:0.875rem;
  color:var(--ink);background:var(--field);outline:none;transition:.15s}
:where(.ds-field) input::placeholder{color:var(--faint)}
:where(.ds-field) input:focus{border-color:#A8D2F0;background:#fff;box-shadow:0 0 0 4px rgba(17,115,194,.10)}
:where(.ds-field) select{width:100%;height:2.875rem;border:1px solid var(--line);border-radius:0.75rem;padding:0 0.75rem;font-size:0.875rem;
  color:var(--ink);background:var(--field);outline:none;transition:.15s;cursor:pointer}
:where(.ds-field) select:focus{border-color:#A8D2F0;background:#fff;box-shadow:0 0 0 4px rgba(17,115,194,.10)}
/* international phone input: dial-code picker + number */
.ds-phone{position:relative;display:flex;align-items:stretch;border:1px solid var(--line);border-radius:0.75rem;background:var(--field);transition:.15s}
.ds-phone:focus-within{border-color:#A8D2F0;background:#fff;box-shadow:0 0 0 4px rgba(17,115,194,.10)}
.ds-phone-cc{display:flex;align-items:center;gap:0.375rem;height:2.875rem;padding:0 0.75rem;background:transparent;border:none;cursor:pointer;font-size:0.875rem;color:var(--ink);border-radius:0.75rem 0 0 0.75rem}
.ds-phone-cc:hover{background:var(--line-soft)}
.ds-phone-flag{width:1.375rem;height:1rem;border-radius:0.125rem;object-fit:cover;box-shadow:0 0 0 1px rgba(16,42,67,.08)}
.ds-phone-dial{font-weight:600}
.ds-phone-chev{display:inline-flex}
.ds-phone-chev svg{width:0.875rem;height:0.875rem;color:var(--muted)}
.ds-phone-num{flex:1;min-width:0;width:auto;height:2.875rem;border:none;background:transparent;padding:0 0.875rem;font-size:0.875rem;color:var(--ink);outline:none;border-radius:0 0.75rem 0.75rem 0;box-shadow:none}
.ds-phone-num:focus{border:none;background:transparent;box-shadow:none}
.ds-phone-num::placeholder{color:var(--faint)}
/* Shared dropdown-menu shell for the phone / list / autocomplete pickers. */
.ds-phone-menu,.ds-lsel-menu,.ds-ac-menu{position:absolute;top:calc(100% + 0.375rem);left:0;right:0;z-index:20;background:#fff;border:1px solid var(--line);border-radius:0.75rem;box-shadow:0 18px 40px -18px rgba(16,42,67,.35)}
.ds-phone-menu{overflow:hidden}
.ds-phone.ds-up .ds-phone-menu{top:auto;bottom:calc(100% + 0.375rem)}
.ds-phone-search{display:flex;align-items:center;gap:0.5rem;padding:0.625rem 0.75rem;border-bottom:1px solid var(--line-soft)}
.ds-phone-search svg{width:1rem;height:1rem;color:var(--muted);flex:0 0 auto}
.ds-phone-search input{flex:1;border:none;outline:none;font-size:0.875rem;background:transparent;color:var(--ink)}
.ds-phone-list{max-height:15rem;overflow-y:auto;padding:0.375rem}
.ds-phone-opt{display:flex;align-items:center;gap:0.625rem;width:100%;padding:0.5625rem 0.625rem;border:none;background:transparent;cursor:pointer;border-radius:0.5rem;font-size:0.875rem;color:var(--ink);text-align:left}
.ds-phone-opt:hover{background:var(--line-soft)}
.ds-phone-opt-flag{width:1.375rem;height:1rem;border-radius:0.125rem;object-fit:cover;flex:0 0 auto;box-shadow:0 0 0 1px rgba(16,42,67,.08)}
.ds-phone-opt-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-phone-opt-dial{color:var(--muted);font-weight:600;flex:0 0 auto}
/* Reusable custom single-select styled like the phone picker (ds_select
   partial + list-select controller). The DS alternative to a native <select>. */
.ds-lsel{position:relative}
.ds-lsel-btn{display:flex;align-items:center;justify-content:space-between;gap:0.5rem;width:100%;height:2.875rem;padding:0 0.875rem;border:1px solid var(--line);border-radius:0.75rem;background:var(--field);cursor:pointer;font-size:0.875rem;font-weight:600;color:var(--ink);text-align:left;transition:.15s}
.ds-lsel-btn:hover{border-color:#E0DCE8}
.ds-lsel.ds-open .ds-lsel-btn{border-color:#A8D2F0;background:#fff;box-shadow:0 0 0 4px rgba(17,115,194,.10)}
.ds-lsel-btn.ds-placeholder{font-weight:400;color:var(--faint)}
.ds-lsel-val{display:flex;align-items:center;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-lsel-chev{display:inline-flex;color:var(--muted);flex:0 0 auto}
.ds-lsel-chev svg{width:1rem;height:1rem}
.ds-lsel-menu{overflow:hidden}
.ds-lsel.ds-up .ds-lsel-menu{top:auto;bottom:calc(100% + 0.375rem)}
.ds-lsel-search{display:flex;align-items:center;gap:0.5rem;padding:0.625rem 0.75rem;border-bottom:1px solid var(--line-soft)}
.ds-lsel-search svg{width:1rem;height:1rem;color:var(--muted);flex:0 0 auto}
.ds-lsel-search input{flex:1;min-width:0;border:none;outline:none;font-size:0.875rem;background:transparent;color:var(--ink)}
.ds-lsel-list{max-height:15rem;overflow-y:auto;padding:0.375rem}
.ds-lsel-opt{display:flex;align-items:center;justify-content:space-between;gap:0.625rem;width:100%;padding:0.625rem 0.75rem;border:none;background:transparent;cursor:pointer;border-radius:0.5rem;font-size:0.875rem;font-weight:600;color:var(--ink);text-align:left}
.ds-lsel-opt:hover{background:var(--line-soft)}
.ds-lsel-opt-main{display:flex;align-items:center;gap:0.625rem;min-width:0}
.ds-lsel-opt-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-lsel-flag{width:1.375rem;height:1rem;border-radius:0.125rem;object-fit:cover;flex:0 0 auto;box-shadow:0 0 0 1px rgba(16,42,67,.08)}
.ds-lsel-opt .ds-lsel-check{display:none;color:var(--active-tx);flex:0 0 auto}
.ds-lsel-opt.ds-on .ds-lsel-check{display:inline-flex}
.ds-lsel-opt .ds-lsel-check svg{width:1rem;height:1rem}
.ds-type-pick{display:flex;gap:0.5625rem}
.ds-type-opt{flex:1;border:1px solid var(--line);border-radius:0.75rem;padding:0.6875rem;text-align:center;font-size:0.8125rem;font-weight:600;
  color:var(--muted);background:var(--field);transition:.15s}
.ds-type-opt:hover{border-color:#E0DCE8}
.ds-type-opt.ds-on{border-color:var(--active-tx);background:var(--active);color:var(--active-tx)}
/* Reschedule modal: "original time" recap row + field hint */
.ds-resched-orig{display:flex;align-items:center;gap:0.625rem;background:var(--field);
  border-radius:0.625rem;padding:0.6875rem 0.875rem;font-size:0.8125rem;color:var(--muted)}
.ds-resched-orig b{color:var(--ink);font-weight:600}
.ds-m-hint{font-size:0.7188rem;color:var(--faint);margin-top:0.375rem}
.ds-m-foot{padding:1.125rem 1.75rem 1.625rem;display:flex;justify-content:flex-end;gap:0.625rem}
.ds-m-foot .ds-gbtn{height:var(--btn-h);padding:0 1.25rem;border-radius:var(--r-btn);font-weight:600;font-size:0.875rem;display:inline-flex;align-items:center;justify-content:center;gap:0.5rem;transition:.15s}
.ds-m-foot .ds-gbtn.ds-ghost{border:1px solid var(--line);background:#fff}
.ds-m-foot .ds-gbtn.ds-ghost:hover{background:var(--line-soft)}
.ds-m-foot .ds-gbtn.ds-dark{background:var(--cta);color:#fff}
.ds-m-foot .ds-gbtn.ds-dark:hover{background:var(--cta-press)}
.ds-m-foot .ds-gbtn svg{width:1rem;height:1rem}
/* Session modal: grouped rows keep the body gap inside one wrapper div */
.ds-m-group{display:flex;flex-direction:column;gap:1rem}
:where(.ds-field) textarea{width:100%;border:1px solid var(--line);border-radius:0.75rem;padding:0.75rem 0.875rem;font-size:0.875rem;font-family:inherit;
  color:var(--ink);background:var(--field);outline:none;resize:none;transition:.15s}
:where(.ds-field) textarea::placeholder{color:var(--faint)}
:where(.ds-field) textarea:focus{border-color:#A8D2F0;background:#fff;box-shadow:0 0 0 4px rgba(17,115,194,.10)}
.ds-f-hint{font-size:0.75rem;color:var(--muted);margin-top:0.375rem}
.ds-field label .ds-f-help{color:var(--faint);vertical-align:-3px;margin-left:0.125rem}
/* time field: input + chevron that opens the spinner popup */
.ds-timewrap{position:relative}
.ds-timewrap input{padding-right:2.625rem}
.ds-time-chev{position:absolute;right:0.375rem;top:0.4375rem;width:2rem;height:2rem;border-radius:0.5rem;display:grid;place-items:center;color:var(--muted);cursor:pointer}
.ds-time-chev:hover{background:var(--line-soft);color:var(--ink)}
.ds-time-chev svg{width:0.9375rem;height:0.9375rem}
/* date field: calendar glyph inside the input (decorative — clicks fall through
   to the input, which opens the picker) */
.ds-datewrap{position:relative}
.ds-datewrap input{padding-right:2.625rem;cursor:pointer}
.ds-date-ico{position:absolute;right:0.8125rem;top:50%;transform:translateY(-50%);display:grid;place-items:center;color:var(--muted);pointer-events:none}
.ds-date-ico svg{width:1rem;height:1rem}
/* client autocomplete (session modal): results menu, rows, chips, quick-create */
.ds-ac{position:relative}
.ds-ac-menu{max-height:16.5rem;overflow-y:auto;padding:0.375rem}
.ds-ac-row{display:flex;align-items:center;gap:0.625rem;width:100%;padding:0.5rem 0.625rem;border:none;background:transparent;cursor:pointer;border-radius:0.5rem;text-align:left}
.ds-ac-row:hover{background:var(--line-soft)}
.ds-ac-row .ds-av{width:2.125rem;height:2.125rem;flex:0 0 2.125rem;font-size:0.75rem;font-weight:700}
.ds-ac-row-name{font-size:0.875rem;font-weight:600;color:var(--ink)}
.ds-ac-row-sub{font-size:0.7812rem;color:var(--muted)}
.ds-ac-add-av{background:var(--active);color:var(--active-tx)}
.ds-ac-add-av svg{width:1.0625rem;height:1.0625rem}
.ds-ac-add .ds-ac-row-name{color:var(--active-tx)}
.ds-ac-empty{padding:0.625rem 0.75rem;font-size:0.8438rem;color:var(--muted)}
.ds-ac-chip{display:flex;align-items:center;gap:0.75rem;padding:0.625rem 0.875rem;border:1px solid var(--line);border-radius:0.75rem;background:var(--field)}
.ds-ac-chip .ds-av{width:2.375rem;height:2.375rem;flex:0 0 2.375rem;font-size:0.8125rem;font-weight:700}
.ds-ac-chip-info{flex:1;min-width:0}
.ds-ac-chip-name{font-size:0.875rem;font-weight:600;color:var(--ink)}
.ds-ac-chip-sub{font-size:0.7812rem;color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-ac-chip-ico{display:inline-flex;color:var(--muted)}
.ds-ac-chip-x{width:1.875rem;height:1.875rem;flex:0 0 1.875rem;border-radius:0.5rem;display:grid;place-items:center;border:none;background:transparent;color:var(--muted);cursor:pointer}
.ds-ac-chip-x:hover{background:#fff;color:var(--ink)}
.ds-ac-chip-x svg{width:0.9375rem;height:0.9375rem}
.ds-ac-new{border:1px solid var(--line);border-radius:0.75rem;padding:0.875rem;display:flex;flex-direction:column;gap:0.75rem}
.ds-ac-new-title{font-size:0.8125rem;font-weight:700;color:var(--ink)}
.ds-ac-new-errors{font-size:0.7812rem;color:#C0392B}
.ds-ac-new-actions{display:flex;justify-content:flex-end;gap:0.5rem}
/* multi-select variant of the list picker: checkbox rows */
.ds-lsel-opt.ds-ck{justify-content:flex-start;gap:0.625rem;cursor:pointer;font-weight:500}
.ds-lsel-opt.ds-ck input{width:0.9375rem;height:0.9375rem;flex:0 0 0.9375rem;padding:0;margin:0;accent-color:var(--cta);cursor:pointer}
/* inline danger callout (e.g. session-conflict warning between form rows) */
.ds-warnbox{display:flex;align-items:flex-start;gap:0.625rem;padding:0.6875rem 0.8125rem;border:1px solid #EFC2BB;background:#FCF0EE;border-radius:0.75rem;
  color:#A93226;font-size:0.8125rem;font-weight:500;line-height:1.5}
.ds-warnbox svg{width:1rem;height:1rem;flex:0 0 1rem;margin-top:0.125rem}
/* flatpickr calendar reskinned to the kit. The vendored flatpickr sheet is
   linked right after this one in the layout head, so each rule carries a `body`
   prefix to win on specificity (body + class beats the vendor's bare class)
   regardless of load order. */
body .flatpickr-calendar{border:1px solid var(--line);border-radius:0.75rem;box-shadow:0 18px 40px -18px rgba(16,42,67,.35);font-family:inherit;padding:0.375rem 0.375rem 0.5rem}
body .flatpickr-months{padding:0.25rem 0.125rem 0.125rem;align-items:center}
body .flatpickr-months .flatpickr-prev-month,body .flatpickr-months .flatpickr-next-month{top:0.5rem;padding:0.375rem;border-radius:0.5rem;fill:var(--muted)}
body .flatpickr-months .flatpickr-prev-month:hover,body .flatpickr-months .flatpickr-next-month:hover{background:var(--line-soft)}
body .flatpickr-months .flatpickr-prev-month:hover svg,body .flatpickr-months .flatpickr-next-month:hover svg{fill:var(--ink)}
body .flatpickr-current-month{font-size:0.9062rem;font-weight:700;color:var(--ink)}
body .flatpickr-current-month .flatpickr-monthDropdown-months{font-weight:700;border-radius:0.5rem}
body .flatpickr-current-month .flatpickr-monthDropdown-months:hover{background:var(--line-soft)}
body .flatpickr-current-month input.cur-year{font-weight:700}
body span.flatpickr-weekday{color:var(--faint);font-size:0.6875rem;font-weight:700;text-transform:uppercase;letter-spacing:.04em}
body .flatpickr-day{border:none;border-radius:0.5625rem;color:var(--ink);font-weight:500}
body .flatpickr-day:hover,body .flatpickr-day.prevMonthDay:hover,body .flatpickr-day.nextMonthDay:hover{background:var(--line-soft);border-color:transparent}
body .flatpickr-day.today{box-shadow:inset 0 0 0 1.5px var(--active-tx);color:var(--active-tx);font-weight:700}
body .flatpickr-day.today:hover{background:var(--active);color:var(--active-tx)}
body .flatpickr-day.selected,body .flatpickr-day.selected:hover,body .flatpickr-day.selected.today{background:var(--cta);border-color:var(--cta);color:#fff;font-weight:700;box-shadow:none}
body .flatpickr-day.prevMonthDay,body .flatpickr-day.nextMonthDay{color:var(--faint)}
body .flatpickr-day.flatpickr-disabled,body .flatpickr-day.flatpickr-disabled:hover{color:#D3DCE5;background:transparent}
/* Due-date field (due-picker): a trigger that opens a two-step popover — quick
   presets + current/today date, then the calendar on demand. */
.ds-due-trigger{display:flex;align-items:center;width:100%;text-align:left;height:2.25rem;
  border:1px solid var(--line-soft);border-radius:0.5625rem;padding:0 2.125rem 0 0.75rem;
  font-size:0.8125rem;font-weight:600;color:var(--ink);background:#fff;cursor:pointer;transition:border-color .14s}
.ds-due-trigger:hover{border-color:var(--active-tx)}
.ds-due-trigger.ds-due-empty{color:var(--muted)}
.ds-due-src{display:none}
.ds-due-pop{width:20.25rem;padding:0.5rem;top:2.625rem}
.ds-due-presets{display:flex;flex-direction:column;gap:0.0625rem}
.ds-due-preset{display:flex;align-items:center;justify-content:space-between;width:100%;padding:0.5rem 0.625rem;border-radius:0.5rem;
  font-size:0.8125rem;font-weight:600;color:var(--ink);cursor:pointer;transition:background .12s}
.ds-due-preset:hover{background:var(--line-soft)}
.ds-due-preset-wd{color:var(--faint);font-size:0.75rem;font-weight:600}
.ds-due-daterow{display:flex;align-items:center;gap:0.5rem;width:100%;padding:0.5rem 0.625rem;border-radius:0.5rem;margin-top:0.125rem;
  font-size:0.8125rem;font-weight:600;color:var(--ink);cursor:pointer;border-top:1px solid var(--line-soft);transition:background .12s}
.ds-due-daterow:hover{background:var(--line-soft)}
.ds-due-daterow svg{color:var(--muted)}
.ds-due-daterow svg:last-child{margin-left:auto}
.ds-due-cal{margin-top:0.25rem;padding-top:0.25rem;border-top:1px solid var(--line-soft)}
.ds-due-cal .flatpickr-calendar.inline{border:none;box-shadow:none;margin:0 auto;padding:0.125rem 0 0}
.ds-due-clear{width:100%;text-align:left;padding:0.5rem 0.625rem;border-radius:0.5rem;margin-top:0.125rem;
  font-size:0.8125rem;font-weight:600;color:var(--muted);cursor:pointer}
.ds-due-clear:hover{background:var(--line-soft);color:var(--ink)}

@media(max-width:1560px){ /* hide next session -> 8 cols */
  .ds-crow{grid-template-columns:minmax(13.125rem,1.5fr) 8.25rem 9.25rem minmax(6.5rem,0.9fr) 6.5rem 7.375rem minmax(4.375rem,1fr) 1.875rem 2rem}
  .ds-next-cell,.ds-h-next{display:none}
}
@media(max-width:1440px){ /* numbers crowd the bar — keep just the bar (tooltip has the detail) */
  .ds-prog .ds-pct{display:none}
}
@media(max-width:1360px){ /* drop the package column -> 7 cols */
  .ds-crow{grid-template-columns:minmax(13.125rem,1.5fr) 8.25rem 9.25rem minmax(6.5rem,0.9fr) 6.5rem 7.375rem 1.875rem 2rem}
  .ds-prog,.ds-h-prog{display:none}
}
/* Package/pacing column hidden (packages+contracts betas both off): drop the
   progress track but keep the remaining columns evenly distributed by mirroring
   the beta layout's own distribution model at each width, minus that one track.
   Bounded to >=1361px so the plain <=1360px rules (which already lack the track)
   stay in charge. The >=1600px tier must match the space-between rule below it,
   otherwise the freed width piles into the flexible client/company columns. */
@media(min-width:1600px){ /* fixed widths + space-between -> even edge-to-edge gaps */
  /* Company widened 128->152 and shifted left by shrinking client 256->232; the
     total is unchanged so the even gaps (and every column from type onward) hold. */
  .ds-no-pkg .ds-crow{grid-template-columns:14.5rem 8.25rem 9.25rem 9.5rem 6.25rem 7.375rem 7rem 1.875rem 2rem;justify-content:space-between}
}
@media(min-width:1561px) and (max-width:1599px){ /* fr-fill, 8 cols */
  .ds-no-pkg .ds-crow{grid-template-columns:minmax(13.125rem,1.5fr) 8.25rem 9.25rem minmax(7rem,0.9fr) 6.5rem 7.375rem 7rem 1.875rem 2rem}
}
@media(min-width:1361px) and (max-width:1560px){ /* fr-fill, 7 cols (next already hidden) */
  .ds-no-pkg .ds-crow{grid-template-columns:minmax(13.125rem,1.5fr) 8.25rem 9.25rem minmax(6.5rem,0.9fr) 6.5rem 7.375rem 1.875rem 2rem}
}
@media(max-width:1180px){ /* hide status -> 8 cols */
  .ds-crow{grid-template-columns:minmax(12.5rem,1.5fr) 8.25rem minmax(6.5rem,0.9fr) 6.5rem 7.375rem 1.875rem 2rem}
  .ds-stchip,.ds-h-status{display:none}
}
@media(max-width:1080px){.ds-stats{grid-template-columns:repeat(2,1fr)}}
@media(max-width:1040px){ /* hide session/notes counts + email chip -> 6 cols */
  .ds-crow{grid-template-columns:minmax(11.875rem,1.5fr) minmax(6.5rem,0.9fr) 6.5rem 7.375rem 2rem}
  .ds-cnts,.ds-eml-cell,.ds-h-eml{display:none}
}
@media(max-width:940px){ /* hide company -> 5 cols */
  .ds-crow{grid-template-columns:minmax(10.625rem,1.5fr) 6.5rem 7.375rem 2rem}
  .ds-company-cell,.ds-h-company{display:none}
}
@media(max-width:1023px){.ds-side{display:none}}

/* Wide screens: fixed column widths + space-between so the leftover width is
   distributed as even gaps and columns span edge-to-edge. Header re-uses .ds-crow
   so it stays aligned. */
@media(min-width:1600px){
  .ds-crow{grid-template-columns:16rem 8.25rem 9.25rem 8rem 6.25rem 7.375rem 7rem 9.375rem 1.875rem 2rem;justify-content:space-between}
}

/* ---- Sidebar collapse ---- */
.ds-shell.ds-mini{--side-w:4.75rem}
.ds-side{transition:flex-basis .24s ease,width .24s ease}
.ds-side-head{display:flex;align-items:center;gap:0.625rem;padding:0 0.125rem 0 0.5rem;height:3.25rem}
.ds-side-head .ds-brand{flex:1;padding:0;display:flex;align-items:center;min-width:0;margin-top:-0.1875rem}
.ds-bmark{display:none;width:2.125rem;height:2.125rem;border-radius:0.625rem;background:var(--active);color:var(--active-tx);
  font-family:'Newsreader',Georgia,serif;font-weight:700;font-size:1.1875rem;align-items:center;justify-content:center;flex:0 0 2.125rem}
.ds-bname{white-space:nowrap;overflow:hidden}
/* logo images reuse the collapse show/hide of .ds-bmark/.ds-bname; strip the text-chip styling */
img.ds-bmark{width:2.75rem;height:2.75rem;flex:0 0 2.75rem;background:none;border-radius:0;object-fit:contain}
img.ds-bname{width:100%;height:auto;max-height:100%;display:block;object-fit:contain}
.ds-collapse{width:2rem;height:2rem;border-radius:0.5625rem;display:grid;place-items:center;color:var(--muted);flex:0 0 2rem}
.ds-collapse:hover{background:var(--line-soft);color:var(--ink)}
.ds-collapse svg{width:1.1875rem;height:1.1875rem}
.ds-nav-item{position:relative}
.ds-upsell-mini{display:none}

.ds-shell.ds-mini .ds-side-head{display:grid;place-items:center;gap:0;padding:0}
.ds-shell.ds-mini .ds-side-head > *{grid-area:1/1}
.ds-shell.ds-mini .ds-bname{display:none}
.ds-shell.ds-mini .ds-bmark{display:flex}
/* mini: show the logo-mark by default; reveal the expand icon in its place on sidebar hover */
.ds-shell.ds-mini .ds-brand,
.ds-shell.ds-mini .ds-collapse{transition:opacity .15s ease}
.ds-shell.ds-mini .ds-collapse{opacity:0;pointer-events:none}
.ds-shell.ds-mini .ds-side:hover .ds-brand{opacity:0;pointer-events:none}
.ds-shell.ds-mini .ds-side:hover .ds-collapse{opacity:1;pointer-events:auto}
.ds-shell.ds-mini .ds-menu-label{visibility:hidden;white-space:nowrap;overflow:hidden}
.ds-shell.ds-mini .ds-nav-item{justify-content:center;padding:0.6875rem 0}
.ds-shell.ds-mini .ds-nav-item .ds-lbl{display:none}
.ds-shell.ds-mini .ds-nav-item.ds-on{background:var(--active-grad)}
.ds-shell.ds-mini .ds-nav-badge{position:absolute;top:0.375rem;right:0.75rem;width:0.5625rem;height:0.5625rem;min-width:0;padding:0;font-size:0;border:2px solid var(--panel)}
.ds-shell.ds-mini .ds-upsell{display:none}
.ds-shell.ds-mini .ds-upsell-mini{display:grid;place-items:center;width:2.875rem;height:2.875rem;margin:0 auto 1rem;border-radius:0.8125rem;background:var(--active);color:var(--active-tx)}
.ds-shell.ds-mini .ds-upsell-mini svg{width:1.25rem;height:1.25rem}
.ds-shell.ds-mini .ds-foot-item{justify-content:center;padding:0.6875rem 0}
.ds-shell.ds-mini .ds-foot-item .ds-lbl{display:none}

/* ---- Dashboard ---- */
.ds-dash-head{display:flex;align-items:flex-start;gap:1.25rem;margin-bottom:1.375rem}
.ds-dash-head-l{flex:1;min-width:0}
.ds-dash-date{display:inline-flex;align-items:center;gap:0.5rem;font-size:0.8125rem;font-weight:600;color:var(--muted);margin-bottom:0.625rem}
.ds-dash-date svg{width:0.9375rem;height:0.9375rem;color:var(--active-tx)}
/* the welcome line is the one serif display moment on this page */
.ds-dash-welcome{font-family:'Newsreader',Georgia,serif;font-weight:700;font-size:1.9375rem;line-height:1.1;letter-spacing:-.01em;color:var(--ink);margin:0 0 0.5rem}
.ds-dash-welcome span{color:var(--active-tx)}
.ds-dash-sub{font-size:0.875rem;color:var(--muted)}
.ds-dash-head .ds-btn-new{flex:0 0 auto;margin-top:1.625rem}
/* paired header CTAs (ghost secondary + dark primary) share one aligned row */
.ds-dash-actions{display:flex;gap:0.625rem;flex:0 0 auto;margin-top:1.625rem}
.ds-dash-actions .ds-btn-new{margin-top:0}
.ds-dash-stats{gap:1.125rem;margin-bottom:1.125rem}
.ds-stat.ds-static{cursor:default}
.ds-stat.ds-static:hover{box-shadow:0 2px 6px -2px rgba(16,42,67,.08)}

.ds-dash-grid{display:grid;grid-template-columns:1fr 1fr;gap:1.125rem;align-items:stretch}   /* 50/50 so the center gutter aligns with the 4-card stat row above */
.ds-dash-card{background:#fff;border-radius:0.75rem;box-shadow:0 2px 10px -2px rgba(16,42,67,.10);padding:1.125rem 1.25rem;display:flex;flex-direction:column;min-width:0}
.ds-dc-head{display:flex;align-items:center;gap:0.6875rem;margin-bottom:1rem}
.ds-dc-ic{width:2rem;height:2rem;border-radius:0.5625rem;background:var(--active);color:var(--active-tx);display:grid;place-items:center;flex:0 0 2rem}
.ds-dc-ic svg{width:1rem;height:1rem}
.ds-dc-head h3{font-size:0.9375rem;font-weight:700;color:var(--ink);margin:0}
.ds-dc-head .ds-sp{flex:1}
.ds-dc-n{font-size:0.7812rem;font-weight:600;color:var(--muted);white-space:nowrap}

/* next-session hero: full-bleed photo under a navy gradient */
.ds-dash-hero{position:relative;border-radius:0.75rem;padding:1.375rem 1.5rem;color:#fff;overflow:hidden;display:flex;flex-direction:column;
  box-shadow:0 6px 20px -6px rgba(10,26,44,.45);
  background:linear-gradient(96deg,rgba(10,26,44,.92) 0%,rgba(10,26,44,.66) 46%,rgba(10,26,44,.22) 100%),url("/design/clients/session-photo.ds-jpg") center/cover}
.ds-dh-top{display:flex;align-items:flex-start;justify-content:space-between;gap:0.75rem}
.ds-dh-top-r{display:flex;flex-direction:column;align-items:flex-end;gap:0.5rem}
.ds-dh-eyebrow{display:inline-flex;align-items:center;gap:0.5rem;font-size:0.7188rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:rgba(255,255,255,.85)}
.ds-dh-eyebrow svg{width:0.9375rem;height:0.9375rem}
.ds-dh-soon{display:inline-flex;align-items:center;gap:0.375rem;font-size:0.7812rem;font-weight:700;color:#8A5A00;background:rgba(253,243,224,.95);padding:0.375rem 0.75rem;border-radius:var(--pill);white-space:nowrap}
.ds-dh-soon svg{width:0.8125rem;height:0.8125rem}
.ds-dh-name{font-size:1.75rem;font-weight:800;letter-spacing:-.01em;margin:1.625rem 0 0.375rem}
.ds-dh-meta{font-size:0.875rem;color:rgba(255,255,255,.85);margin-bottom:1.25rem}
.ds-dh-actions{display:flex;gap:0.625rem;flex-wrap:wrap}
.ds-dh-mode{display:inline-flex;align-items:center;gap:0.375rem;padding-right:0.125rem;font-size:0.7812rem;font-weight:600;letter-spacing:.01em;color:#fff;white-space:nowrap}
.ds-dh-mode svg{width:0.875rem;height:0.875rem;opacity:.95}
.ds-dh-join{display:inline-flex;align-items:center;gap:0.5rem;height:2.625rem;padding:0 1.125rem;border-radius:0.625rem;background:#fff;color:var(--ink);font-weight:700;font-size:0.875rem;transition:.15s}
.ds-dh-join:hover{background:#EAF3FC}
.ds-dh-join svg{width:1rem;height:1rem}
.ds-dh-notes{display:inline-flex;align-items:center;gap:0.5rem;height:2.625rem;padding:0 1rem;border-radius:0.625rem;background:rgba(255,255,255,.06);
  border:1px solid rgba(255,255,255,.45);color:#fff;font-weight:600;font-size:0.875rem;transition:.15s}
.ds-dh-notes:hover{background:rgba(255,255,255,.16)}
.ds-dh-notes svg{width:0.9375rem;height:0.9375rem}
.ds-dh-foot{display:flex;align-items:center;gap:0.6875rem;margin-top:auto;padding-top:1.5rem;font-size:0.8125rem;font-weight:500;color:rgba(255,255,255,.82)}
.ds-dh-avs{display:flex;align-items:center}
.ds-dh-av{width:1.75rem;height:1.75rem;border-radius:50%;background:rgba(255,255,255,.22);border:2px solid rgba(255,255,255,.65);
  display:grid;place-items:center;font-size:0.625rem;font-weight:700;font-style:normal;color:#fff}
.ds-dh-av-img{width:1.75rem;height:1.75rem;border-radius:50%;border:2px solid rgba(255,255,255,.8);object-fit:cover;background:none}
/* shuffle-photo button — bottom-right corner of the hero, swaps the background */
.ds-dh-shuffle{position:absolute;right:0.875rem;bottom:0.875rem;z-index:2;width:2.125rem;height:2.125rem;display:grid;place-items:center;
  border-radius:50%;background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.34);color:#fff;
  -webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);cursor:pointer;opacity:.75;transition:.15s}
.ds-dh-shuffle:hover{background:rgba(255,255,255,.24);opacity:1}
.ds-dh-shuffle svg{width:1rem;height:1rem}
.ds-dh-shuffle.is-spin svg{animation:ds-dh-spin .5s ease}
@keyframes ds-dh-spin{from{transform:rotate(0)}to{transform:rotate(180deg)}}

/* ── Dashboard schedule card ────────────────────────────────────────────────
   Fixed height so the card never grows/shrinks with the day's session count.
   An explicit height defeats the grid's align-items:stretch (a definite-height
   item does not stretch), so the row-mate (Earnings) no longer drags it taller.
   NB: prefixed ds-dsch-* to stay clear of the session-form ds-sched-* popover. */
.ds-dsch-card{height:clamp(21.25rem,40vh,26.25rem)}
.ds-dc-titles{display:flex;flex-direction:column;min-width:0}
.ds-dsch-sub{font-size:0.7812rem;color:var(--muted);margin-top:0.1875rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ds-dsch-sub::first-letter{text-transform:uppercase}
.ds-dsch-today{height:1.875rem;padding:0 0.8125rem;border-radius:var(--pill);border:1px solid var(--line);background:#fff;
  color:var(--ink);font-size:0.7812rem;font-weight:600;flex:0 0 auto;transition:.14s}
.ds-dsch-today:hover{background:var(--field)}

/* week strip — a soft container; the selected day is a raised white chip,
   today carries a persistent accent outline (distinct from selection) */
.ds-week{position:relative;display:flex;gap:0.25rem;margin-bottom:0.75rem;background:var(--active);border-radius:0.75rem;padding:0.25rem}   /* blue strip */
/* the white selection is a single pill that slides between chips (JS positions it) */
.ds-wd-slider{position:absolute;top:0;left:0;width:0;height:0;background:#fff;border-radius:0.5625rem;z-index:0;opacity:0;
  box-shadow:0 1px 5px rgba(16,42,67,.16);
  transition:transform .32s cubic-bezier(.34,1.12,.4,1),width .32s cubic-bezier(.34,1.12,.4,1),height .2s,opacity .2s}
.ds-wday{position:relative;z-index:1;flex:1 1 0;min-width:0;display:flex;flex-direction:column;align-items:center;gap:0.125rem;
  padding:0.4375rem 0 0.375rem;border-radius:0.5625rem;border:1.5px solid transparent;transition:.14s;background:transparent}
.ds-wday:hover:not(.ds-on){background:rgba(255,255,255,.5)}
.ds-wday.ds-today{border-color:#EFC48A}   /* soft pastel-amber outline marks today */
.ds-wd-l{font-size:0.6562rem;font-weight:700;color:var(--muted);text-transform:uppercase;letter-spacing:.02em}
.ds-wd-n{font-size:1.0938rem;font-weight:800;color:var(--ink);line-height:1.05}
.ds-wd-dots{display:flex;gap:0.1562rem;height:0.375rem;margin-top:0.125rem;align-items:center;justify-content:center}
.ds-wd-dots i{width:0.3125rem;height:0.3125rem;border-radius:50%;flex:0 0 auto}   /* integer size = equal dots; up to 5 shown */
.ds-wday.ds-empty .ds-wd-n,.ds-wday.ds-empty .ds-wd-l{color:var(--faint)}

/* scroll body: only this region scrolls; a bottom fade appears when it overflows */
.ds-dsch-body{position:relative;flex:1;min-height:0;display:flex;width:100%}
.ds-dsch-body::after{content:"";position:absolute;left:0;right:0;bottom:0;height:1.625rem;pointer-events:none;
  background:linear-gradient(rgba(255,255,255,0),#fff);opacity:0;transition:opacity .15s}
.ds-dsch-body.ds-can-scroll::after{opacity:1}
.ds-dsch-scroll{flex:1;width:100%;min-width:0;overflow-y:auto;scrollbar-width:thin;scrollbar-gutter:stable}
/* The day list starts at the top (even a single session); a full day scrolls. */
.ds-dsch-scroll .ds-dc-list{min-height:100%;display:flex;flex-direction:column;flex:none}
.ds-dc-list{flex:1}

/* Empty day — a soft calendar glyph over the message, centered in the viewport */
.ds-dsch-empty{margin:auto;display:flex;flex-direction:column;align-items:center;gap:0.6875rem;color:var(--faint);font-size:0.8125rem}
.ds-dsch-empty-ic{width:2.875rem;height:2.875rem;border-radius:50%;background:var(--field);display:grid;place-items:center;color:var(--muted)}
.ds-dsch-empty-ic svg{width:1.3125rem;height:1.3125rem}

/* ── Agenda rows ────────────────────────────────────────────────────────────
   Fixed grid columns so every element lines up down the list: a session-type
   colour tile, the start time, the client avatar, the name (capped width), then
   the clock+duration+type meta at a consistent x, and a right slot. */
.ds-agenda{list-style:none;margin:0;padding:0;width:100%}
.ds-ap{position:relative}
.ds-ap-link{display:grid;width:100%;align-items:center;column-gap:0.6875rem;padding:0.5625rem 0.5rem;border-radius:0.75rem;transition:background .14s;
  grid-template-columns:1.625rem 3.125rem 2.5rem minmax(0,var(--nmw,8.75rem)) minmax(0,1fr) auto}
.ds-ap-link:hover{background:var(--field)}
/* today's finished sessions recede so the eye lands on what's still to come */
.ds-ap-done .ds-ap-link{opacity:.5}
.ds-ap-done .ds-ap-link:hover{opacity:.72}

/* session-type colour tile before the time (pastel fill, dark-ink glyph) */
.ds-ap-tag{width:1.625rem;height:1.625rem;border-radius:0.4375rem;display:grid;place-items:center;
  background:var(--node,var(--field));color:var(--nodeink,var(--muted))}
.ds-ap-tag svg{width:0.875rem;height:0.875rem}

/* time + name share font-size + line-height so their baselines line up */
.ds-ap-time{font-variant-numeric:tabular-nums;line-height:1.35}
.ds-ap-time b{font-size:0.875rem;font-weight:700;color:var(--ink)}
.ds-ap-avw{position:relative}
.ds-ap-avw .ds-av{width:2.5rem;height:2.5rem;font-size:0.8125rem}
/* delivery-mode badge: camera (video) vs people (in person), in the avatar corner */
.ds-ap-ch{position:absolute;z-index:2;right:-0.125rem;bottom:-0.125rem;width:1.125rem;height:1.125rem;border-radius:50%;
  background:var(--blue-bg);color:var(--blue-tx);border:2px solid #fff;display:grid;place-items:center}
.ds-ap-ch.ds-alt{background:var(--teal-bg);color:var(--teal-tx)}
.ds-ap-ch svg{width:0.625rem;height:0.625rem}
.ds-ap-nm{font-size:0.875rem;font-weight:700;color:var(--ink);line-height:1.35;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
/* meta is its own centred flex: [clock][duration · type], icon level with the text */
.ds-ap-t{display:flex;align-items:center;gap:0.25rem;min-width:0;font-size:0.7812rem;color:var(--muted);line-height:1.35}
.ds-ap-t svg{width:0.75rem;height:0.75rem;color:var(--faint);flex:0 0 auto}
.ds-ap-mt{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ds-ap-right{display:flex;align-items:center;justify-content:flex-end;gap:0.5rem;min-width:0}

/* next-up affordances: a quiet label, or the live countdown + Join when imminent */
.ds-ap-nextlbl{flex:0 0 auto;font-size:0.625rem;font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  color:var(--active-tx);background:var(--active);padding:0.25rem 0.5625rem;border-radius:6.1875rem;white-space:nowrap}
.ds-ap-in{flex:0 0 auto;font-size:0.75rem;font-weight:600;color:var(--muted);background:var(--field);
  padding:0.3125rem 0.625rem;border-radius:6.1875rem;white-space:nowrap}
.ds-ap-join{display:inline-flex;align-items:center;gap:0.375rem;flex:0 0 auto;height:1.875rem;padding:0 0.75rem;border-radius:0.5rem;
  background:var(--cta);color:#fff;font-size:0.7812rem;font-weight:700;transition:.14s}
.ds-ap-link:hover .ds-ap-join{background:var(--cta-press)}
.ds-ap-join svg{width:0.8125rem;height:0.8125rem}

/* schedule footer: left calendar link + right week-total count */
.ds-dc-foot{display:flex;align-items:center;justify-content:space-between;gap:0.625rem;margin-top:auto;
  padding-top:0.8125rem;border-top:1px solid var(--line-soft)}
.ds-dc-foot .ds-dc-link{width:auto;margin-top:0;border-top:none;padding:0;justify-content:flex-start}

/* follow-ups checklist */
/* top-anchored: with fewer derived items than the prototype's fixed four,
   centering floats the list into a strange mid-card gap */
.ds-fu-list{display:flex;flex-direction:column;flex:1;justify-content:flex-start}
.ds-dc-link{display:flex;align-items:center;justify-content:center;gap:0.375rem;width:100%;margin-top:auto;
  padding:0.8125rem 0 0.125rem;border-top:1px solid var(--line-soft);font-size:0.8125rem;font-weight:600;color:var(--active-tx);transition:.14s}
.ds-dc-link:hover{color:#0E5FA0}
.ds-dc-link svg{width:0.875rem;height:0.875rem}
.ds-fu{display:flex;align-items:center;gap:0.75rem;width:100%;text-align:left;padding:0.6875rem 0.125rem;border-bottom:1px solid var(--line-soft)}
.ds-fu:last-child{border-bottom:none;padding-bottom:0.25rem}
.ds-fu-box{width:1.375rem;height:1.375rem;border-radius:0.375rem;border:2px solid #B9CFE4;display:grid;place-items:center;color:#fff;flex:0 0 1.375rem;transition:.14s}
.ds-fu-box svg{width:0.8125rem;height:0.8125rem}
.ds-fu:hover .ds-fu-box{border-color:var(--active-tx)}
.ds-fu.ds-done .ds-fu-box{background:var(--active-tx);border-color:var(--active-tx)}
.ds-fu-body{flex:1;min-width:0;display:flex;flex-direction:column}
.ds-fu-t{flex:1;font-size:0.875rem;font-weight:600;color:var(--ink)}
.ds-fu-body .ds-fu-t{flex:none;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-fu-client{margin-left:auto;flex:0 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-size:0.75rem;font-weight:500;color:var(--faint)}
.ds-fu-client:hover{color:var(--active-tx)}
.ds-fu.ds-done .ds-fu-t{text-decoration:line-through;color:var(--muted);font-weight:500}
button.ds-fu-box{cursor:pointer}
.ds-fu-due{flex:0 0 auto;font-size:0.75rem;font-weight:600;color:var(--faint)}
/* client (if present) owns margin-left:auto and sits before the due date;
   when there is no client, the due date pushes itself right */
.ds-fu-body + .ds-fu-due{margin-left:auto}
.ds-fu-due.ds-over,.ds-due.ds-over{color:#C0392B}
/* derived nudge rows (dashboard Tasks card + /tasks "Needs attention" strip) */
.ds-nudge{display:flex;align-items:center;gap:0.75rem;width:100%;padding:0.6875rem 0.125rem;border-bottom:1px solid var(--line-soft)}
.ds-nudge:hover .ds-nudge-t{color:var(--active-tx)}
.ds-nudge-ic{width:1.875rem;height:1.875rem;border-radius:0.5625rem;background:var(--amber-bg);color:var(--amber-tx);display:grid;place-items:center;flex:0 0 1.875rem}
.ds-nudge-ic svg{width:0.9375rem;height:0.9375rem}
.ds-nudge-t{flex:1;min-width:0;font-size:0.8438rem;font-weight:600;color:var(--ink)}
.ds-nudge-go{display:grid;place-items:center;color:var(--faint);flex:0 0 auto}

/* earnings — single-series monthly bars; validated steps #6FA9E4 (past) / #1173C2 (current) */
.ds-earn-top{display:flex;align-items:flex-start;justify-content:space-between;gap:0.75rem;margin:0.125rem 0 1.125rem}
.ds-earn-big{font-size:1.875rem;font-weight:800;letter-spacing:-.01em;color:var(--ink)}
.ds-earn-sub{font-size:0.8125rem;color:var(--muted);margin-top:0.1875rem}
.ds-earn-delta{display:inline-flex;align-items:center;gap:0.375rem;background:var(--green-bg);color:var(--green-tx);
  font-size:0.7812rem;font-weight:700;padding:0.375rem 0.6875rem;border-radius:var(--pill);white-space:nowrap}
.ds-earn-delta svg{width:0.875rem;height:0.875rem}
.ds-earn-chart{display:flex;align-items:flex-end;gap:0.625rem;height:9.25rem;margin-bottom:1rem}
.ds-eb{flex:0 1 3.5rem;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;min-width:0}
.ds-eb-bar{display:block;width:100%;max-width:2.125rem;flex:0 0 auto;background:#6FA9E4;border-radius:0.25rem 0.25rem 0 0;transition:filter .14s}
.ds-eb.ds-cur .ds-eb-bar{background:var(--active-tx)}
.ds-eb.ds-ghost .ds-eb-bar{background:transparent;border:1.5px dashed #A9C6E4;border-bottom:none}
.ds-eb:hover .ds-eb-bar{filter:brightness(.9)}
.ds-eb-v{font-size:0.7188rem;font-weight:700;color:var(--ink);margin-bottom:0.375rem}
.ds-eb-l{font-size:0.7188rem;font-weight:600;color:var(--muted);margin-top:0.5rem}
.ds-earn-foot{display:flex;border-top:1px solid var(--line-soft);padding-top:0.875rem}
.ds-earn-foot>div{flex:1;display:flex;flex-direction:column;gap:0.125rem}
.ds-earn-foot>div+div{border-left:1px solid var(--line-soft);padding-left:1.125rem}
.ds-earn-foot b{font-size:0.9375rem;font-weight:800;color:var(--ink)}
.ds-earn-foot span{font-size:0.75rem;color:var(--muted)}

@media(max-width:1180px){
  .ds-dash-grid{grid-template-columns:1fr}
}
/* wide screens: the welcome block gets display scale */
@media(min-width:1600px){
  .ds-dash-date{font-size:0.8438rem;margin-bottom:0.75rem}
  .ds-dash-welcome{font-size:2.5rem;margin-bottom:0.625rem}
  .ds-dash-sub{font-size:0.9375rem}
  .ds-dash-head .ds-btn-new{margin-top:2.25rem}
  .ds-dash-actions{margin-top:2.25rem}
  .ds-dash-actions .ds-btn-new{margin-top:0}
}
/* ── Desktop viewports where the roomy layout would overflow (≤1300px tall) ──
   The dashboard FILLS the viewport (like .ds-profile-page): it becomes a flex
   column, the grid takes the leftover height, and the Schedule (grid row 2)
   flexes to fill it — its session list scrolls inside the card — so the whole
   dashboard fits with no page scroll.

   Per the design direction, ONLY the Next-session hero and the Tasks card are
   compacted. The Schedule, the page header and the stat row keep their full
   size; the Schedule simply GROWS into the room the compacted hero + Tasks free
   up (that is not squeezing it — its strip, rows and footer stay full size). The
   Tasks rules use :not(.ds-dsch-card) on shared classes so the Schedule card's
   own padding / header / footer are never touched. Scoped to the two-column
   desktop layout (min-width) so mobile/tablet 1-column scroll layouts stay. */
@media(min-width:1181px) and (max-height:1300px){
  /* fill-the-viewport height chain (definite heights let the card's list scroll;
     overflow-y:auto is a safety valve if the window gets extremely short) */
  .ds-scroll:has(.ds-dashboard-page){overflow-y:auto}
  .ds-scroll:has(.ds-dashboard-page) > .ds-page{height:100%}
  .ds-scroll:has(.ds-dashboard-page) > .ds-page > main{height:100%;display:flex;flex-direction:column;min-height:0;padding-bottom:0.375rem}
  .ds-dashboard-page{flex:1;min-height:0;display:flex;flex-direction:column}
  /* Two EQUAL rows: the Next-session hero (row 1) and the Schedule (row 2) get
     the same height, so the left column reads as a balanced pair. Capped so on a
     tall window the pair stays a natural height with empty canvas below (rather
     than stretching sparsely tall); on a shorter window it shrinks to fit. */
  .ds-dash-grid{flex:1;min-height:0;grid-template-rows:1fr 1fr;max-height:51.25rem}
  /* Schedule: NOT squeezed — drops its fixed cap and fills its (equal) row, its
     own list scrolling inside. Everything about it stays full size. */
  .ds-dashboard-page .ds-dsch-card{height:auto;min-height:0}
}
/* Shorter than the roomy equal pair can hold (≤1100px tall): stack instead —
   compact the Next-session hero + Tasks (only those) on top and let the
   untouched Schedule fill the rest, its list scrolling inside.

   The Schedule row is GUARANTEED enough height to show its chrome (header +
   week strip + footer ≈ 143px) plus at least one full session row (≈58px) —
   so the day's agenda is never clipped to zero. The hero row is capped (max
   its natural height) so a tall hero can't starve the Schedule; anything the
   two rows can't hold is absorbed by the hero shrinking, not the Schedule. */
@media(min-width:1181px) and (max-height:1100px){
  /* EQUAL rows: the Next-session hero (row 1) and the Schedule (row 2) split the
     column height evenly so the left pair reads as balanced — 1fr each rather
     than a content-sized hero above a Schedule that swallows all the surplus.
     minmax(14rem,1fr) keeps each row from collapsing below the Schedule's chrome
     + one session row on a short window. */
  .ds-dash-grid{grid-template-rows:minmax(14rem,1fr) minmax(14rem,1fr);max-height:none}

  /* ── Next-session hero — compact ── */
  .ds-dashboard-page .ds-dash-hero{padding:0.9375rem 1.375rem}
  .ds-dashboard-page .ds-dh-name{margin-top:0.625rem;font-size:1.5rem}
  .ds-dashboard-page .ds-dh-meta{margin-bottom:0.6875rem;font-size:0.8438rem}
  .ds-dashboard-page .ds-dh-join,
  .ds-dashboard-page .ds-dh-notes{height:2.375rem}
  .ds-dashboard-page .ds-dh-foot{padding-top:0.6875rem}

  /* ── Tasks — compact rows (scoped so the Schedule card is untouched) ── */
  .ds-dashboard-page .ds-dash-card:not(.ds-dsch-card){padding:0.875rem 1.125rem}
  .ds-dashboard-page .ds-dash-card:not(.ds-dsch-card) .ds-dc-head{margin-bottom:0.625rem}
  .ds-dashboard-page .ds-nudge{padding:0.375rem 0.125rem}
  .ds-dashboard-page .ds-nudge-ic{width:1.75rem;height:1.75rem;flex:0 0 1.75rem}
  .ds-dashboard-page .ds-fu{padding:0.375rem 0.125rem}
  .ds-dashboard-page .ds-dash-card:not(.ds-dsch-card) .ds-dc-link{padding-top:0.5625rem}

  /* ── Schedule — trim its chrome AND densify the agenda rows ──
     Two levers on this short viewport: (1) the card padding + week strip +
     header/footer spacing shrink; (2) the session ROWS themselves are made
     denser — smaller avatar, tighter padding and a notch smaller text — so
     more of the day's agenda fits, and the card needs less height per row. */
  .ds-dashboard-page .ds-dsch-card{padding:0.875rem 1.25rem}
  .ds-dashboard-page .ds-dsch-card .ds-dc-head{margin-bottom:0.625rem}
  .ds-dashboard-page .ds-week{margin-bottom:0.5625rem;padding:0.1875rem}
  .ds-dashboard-page .ds-wday{padding:0.3125rem 0 0.25rem}
  .ds-dashboard-page .ds-wd-n{font-size:1rem}
  .ds-dashboard-page .ds-dc-foot{padding-top:0.625rem}

  /* denser agenda rows (≈58px → ≈46px): smaller avatar + tag, tighter padding,
     text a notch down. Grid columns shrink to match the smaller avatar/tag. */
  .ds-dashboard-page .ds-ap-link{padding:0.375rem 0.5rem;column-gap:0.625rem;
    grid-template-columns:1.5rem 2.875rem 2.125rem minmax(0,var(--nmw,8.75rem)) minmax(0,1fr) auto}
  .ds-dashboard-page .ds-ap-tag{width:1.5rem;height:1.5rem;border-radius:0.375rem}
  .ds-dashboard-page .ds-ap-tag svg{width:0.8125rem;height:0.8125rem}
  .ds-dashboard-page .ds-ap-avw .ds-av{width:2.125rem;height:2.125rem;font-size:0.75rem}
  .ds-dashboard-page .ds-ap-ch{width:1rem;height:1rem}
  .ds-dashboard-page .ds-ap-time b{font-size:0.8125rem}
  .ds-dashboard-page .ds-ap-nm{font-size:0.8125rem}
  .ds-dashboard-page .ds-ap-t{font-size:0.75rem}
}
/* Shorter still (≤900px tall): the global −12.5% root shrink is now active on
   this whole band, so it does the uniform hero/Tasks/Schedule compaction that
   used to live here as per-card font/padding trims. Only the STRUCTURAL rules
   remain: relaxed grid-row floors (Schedule keeps its guaranteed share) and the
   foot-line drop that no rem scale could perform. */
@media(min-width:1181px) and (max-height:900px){
  /* STRUCTURAL: EQUAL rows (1fr each) with a shared floor so the Next-session
     hero and the Schedule stay the same height and neither collapses — the hero
     keeps enough for its name + meta + buttons, the Schedule for its chrome + one
     full session row. Floor relaxed to 8.75rem because the global −12.5% root
     shrink (active ≤900px tall) already frees the space it used to reserve. */
  .ds-dash-grid{grid-template-rows:minmax(8.75rem,1fr) minmax(8.75rem,1fr)}

  /* Structural drop, not a rem trim: hand the hero's room to the Schedule by
     dropping the low-priority foot line (client avatar + goal note) rather than
     clipping it — the global shrink can't do this, so it stays. */
  .ds-dashboard-page .ds-dh-foot{display:none}
}
/* ≤800px tall: the former per-card hero + Tasks micro-trims here were pure rem
   font/padding shrinks. They are now redundant — the global −12.5% root scale
   (active on every ≤900px-tall viewport) already compacts these uniformly, and
   the relaxed grid floors in the ≤900px band keep the Schedule its full row —
   so no page scroll returns. Removing them also avoids DOUBLE-shrinking the hero
   + Tasks (global scale × per-card trim) that stacking would have caused. */

/* ---- Calendar ---- */
.ds-cal-sub{margin-top:0.75rem}
.ds-cal-sub~.ds-btn-new,.ds-dash-head:has(.ds-cal-sub) .ds-btn-new{margin-top:0}
.ds-cal-layout{display:grid;grid-template-columns:1fr 18.75rem;gap:1.125rem;align-items:start}
.ds-cal-card{overflow-x:auto}
.ds-cal-toolbar{display:flex;align-items:center;gap:0.875rem;margin-bottom:1rem}
.ds-cal-nav{display:flex;align-items:center;gap:0.5rem}
.ds-cal-arrow{width:2.125rem;height:2.125rem;border-radius:0.5625rem;border:1px solid var(--line);display:grid;place-items:center;color:var(--muted);transition:.14s}
.ds-cal-arrow:hover{color:var(--ink);background:var(--field)}
.ds-cal-arrow svg{width:1rem;height:1rem}
.ds-cal-today{height:2.125rem;padding:0 0.875rem;border-radius:0.5625rem;border:1px solid var(--line);font-size:0.8125rem;font-weight:600;color:var(--muted);transition:.14s}
.ds-cal-today:hover{background:var(--field);color:var(--ink)}
.ds-cal-today.ds-on{background:var(--active);border-color:#A8D2F0;color:var(--active-tx)}
.ds-cal-range{flex:1;text-align:center;font-size:1.0312rem;font-weight:800;color:var(--ink);white-space:nowrap}
.ds-cal-views{display:inline-flex;border:1px solid var(--line);border-radius:0.5625rem;overflow:hidden}
.ds-cal-views button{height:2.125rem;padding:0 0.875rem;font-size:0.8125rem;font-weight:600;color:var(--muted);transition:.14s}
.ds-cal-views button+button{border-left:1px solid var(--line)}
.ds-cal-views button:hover{color:var(--ink);background:var(--field)}
.ds-cal-views button.ds-on{background:var(--active);color:var(--active-tx)}
/* Zoom (vertical time scale) — sits under the view filter */
.ds-cal-zoomrow{display:flex;justify-content:flex-end;margin:-0.25rem 0 0.75rem}
.ds-cal-zoom{display:flex;align-items:center;gap:0.625rem}
.ds-cz-btn{width:2.125rem;height:2.125rem;display:grid;place-items:center;background:#fff;border:1px solid var(--line);border-radius:0.625rem;color:var(--muted);transition:.14s}
.ds-cz-btn svg{width:1rem;height:1rem}
.ds-cz-btn:hover{color:var(--ink);background:var(--field)}
.ds-cz-btn:disabled{opacity:.45;pointer-events:none}
.ds-cz-range{-webkit-appearance:none;appearance:none;width:8.25rem;height:0.3125rem;border-radius:0.1875rem;background:var(--line);cursor:pointer}
.ds-cz-range::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:0.875rem;height:0.875rem;border-radius:50%;background:var(--ink);box-shadow:0 1px 3px rgba(18,38,63,.3)}
.ds-cz-range::-moz-range-thumb{width:0.875rem;height:0.875rem;border-radius:50%;background:var(--ink);border:none}

.ds-cal-grid{display:grid;grid-template-columns:3.5rem repeat(7,1fr);min-width:51.25rem}
.ds-cal-grid.ds-one{grid-template-columns:3.5rem 1fr;min-width:0}
.ds-cal-dayhead{display:flex;flex-direction:column;align-items:center;gap:0.375rem;padding:0.25rem 0 0.75rem}
.ds-cd-l{font-size:0.6562rem;font-weight:700;letter-spacing:.05em;color:var(--faint)}
.ds-cal-dayhead.ds-today .ds-cd-l{color:var(--active-tx)}
.ds-cd-n{font-size:1.5625rem;font-weight:600;letter-spacing:-.01em;color:var(--ink);width:2.875rem;height:2.875rem;display:grid;place-items:center;border-radius:50%}
.ds-cal-dayhead.ds-today .ds-cd-n{background:var(--active);border:2px solid var(--active-tx);font-weight:700}
.ds-cal-gutter{position:relative}
.ds-cal-gutter span{position:absolute;right:0.625rem;transform:translateY(-0.375rem);font-size:0.6875rem;font-weight:600;color:var(--faint)}
.ds-cal-col{position:relative;border-left:1px solid var(--line-soft);
  background-image:linear-gradient(to bottom,var(--line-soft) 0 1px,transparent 1px);background-size:100% 52px}
.ds-cal-col:last-child{border-right:1px solid var(--line-soft)}
.ds-cal-col.ds-today{background-color:#F2F8FE}
.ds-cal-col.ds-off{background-color:#F0F3F8}
/* Month view — same hairlines, chips and status tokens as the time grid */
.ds-cal-mhead{display:grid;grid-template-columns:repeat(7,1fr);min-width:51.25rem}
.ds-cal-mhead .ds-mh{text-align:center;padding:0.25rem 0 0.625rem;font-size:0.6562rem;font-weight:700;letter-spacing:.05em;color:var(--faint)}
.ds-cal-mgrid{display:grid;grid-template-columns:repeat(7,1fr);min-width:51.25rem;border-top:1px solid var(--line-soft)}
.ds-mc{min-height:6.75rem;padding:0.5rem;border-left:1px solid var(--line-soft);border-bottom:1px solid var(--line-soft);display:flex;flex-direction:column;gap:0.25rem;background:#fff}
.ds-mc:nth-child(7n){border-right:1px solid var(--line-soft)}
.ds-mc.ds-off{background:#F0F3F8}
.ds-mc.ds-today{background:#F2F8FE}
.ds-mc-n{width:1.625rem;height:1.625rem;display:grid;place-items:center;border-radius:50%;font-size:0.8125rem;font-weight:700;color:var(--ink);margin:-0.125rem 0 0.125rem -0.125rem;align-self:flex-start;transition:.14s}
.ds-mc-n:hover{background:var(--active)}
.ds-mc-n.ds-today{background:var(--active);border:2px solid var(--active-tx);font-weight:800}
.ds-mc-n.ds-today:hover{background:var(--active)}
.ds-mc.ds-dim .ds-mc-n{color:var(--faint);font-weight:600}
.ds-mev{position:relative;display:flex;align-items:center;gap:0.375rem;padding:0.1875rem 0.5rem 0.1875rem 0.375rem;border-radius:0.375rem;font-size:0.6875rem;border-left:3px solid transparent;white-space:nowrap}
.ds-mev-t{font-weight:700;flex:0 0 auto}
.ds-mev-n{font-weight:600;color:var(--ink);min-width:0;overflow:hidden;text-overflow:ellipsis}
.ds-mev.ds-scheduled{background:var(--blue-bg);border-color:var(--blue-tx)}
.ds-mev.ds-scheduled .ds-mev-t{color:var(--blue-tx)}
.ds-mev.ds-completed{background:var(--green-bg);border-color:var(--green-tx)}
.ds-mev.ds-completed .ds-mev-t{color:var(--green-tx)}
.ds-mev.ds-cancelled{background:#FBE9E7;border-color:#C43D3D}
.ds-mev.ds-cancelled .ds-mev-t{color:#C43D3D}
.ds-mev.ds-cancelled .ds-mev-n{text-decoration:line-through;color:#B26860}
.ds-mc-more{align-self:flex-start;font-size:0.6875rem;font-weight:700;color:var(--muted);padding:0.0625rem 0.375rem;border-radius:0.375rem;transition:.14s}
.ds-mc-more:hover{background:var(--field);color:var(--ink)}
/* Event hover card */
.ds-ev-tip{position:absolute;bottom:calc(100% + 0.5rem);left:-0.125rem;z-index:40;min-width:11.125rem;width:max-content;background:#fff;border-radius:0.875rem;
  box-shadow:0 12px 32px -8px rgba(16,42,67,.28),0 2px 8px rgba(16,42,67,.08);padding:0.8125rem 1rem 0.75rem;
  opacity:0;visibility:hidden;transition:opacity .12s ease .06s;pointer-events:none;white-space:normal;text-align:left}
.ds-ev:hover>.ds-ev-tip,.ds-mev:hover>.ds-ev-tip{opacity:1;visibility:visible}
.ds-tip-b>.ds-ev-tip{bottom:auto;top:calc(100% + 0.5rem)}
.ds-tip-r>.ds-ev-tip{left:auto;right:-0.125rem}
.ds-tip-name{font-size:1rem;font-weight:800;letter-spacing:-.01em;color:var(--ink)}
.ds-tip-st{display:inline-block;margin:0.4375rem 0 0.5rem;font-size:0.7188rem;font-weight:700;padding:0.1875rem 0.5625rem 0.1875rem 0.4375rem;border-radius:0.4375rem;border-left:3px solid transparent}
.ds-tip-st.ds-scheduled{background:var(--blue-bg);color:var(--blue-tx);border-color:var(--blue-tx)}
.ds-tip-st.ds-completed{background:var(--green-bg);color:var(--green-tx);border-color:var(--green-tx)}
.ds-tip-st.ds-cancelled{background:#FBE9E7;color:#C43D3D;border-color:#C43D3D}
.ds-tip-row{font-size:0.7812rem;font-weight:700;color:var(--muted);line-height:1.8;white-space:nowrap}
.ds-tip-row span{font-weight:600;color:var(--faint)}
.ds-cal-empty{text-align:center;font-size:0.8438rem;color:var(--faint);padding:0.875rem 0 0.125rem}

.ds-ev{position:absolute;border-radius:0.5rem;padding:0.3125rem 0.5625rem;border-left:3px solid transparent;
  box-shadow:0 1px 2px rgba(16,42,67,.10);cursor:default}
.ds-ev:hover{z-index:30}
.ds-ev-c{height:100%;overflow:hidden}
.ds-ev-t{font-size:0.6562rem;font-weight:700;white-space:nowrap}
.ds-ev-nm{font-size:0.75rem;font-weight:600;color:var(--ink);line-height:1.3;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ds-ev.ds-scheduled{background:var(--blue-bg);border-color:var(--blue-tx)}
.ds-ev.ds-scheduled .ds-ev-t{color:var(--blue-tx)}
.ds-ev.ds-completed{background:var(--green-bg);border-color:var(--green-tx)}
.ds-ev.ds-completed .ds-ev-t{color:var(--green-tx)}
.ds-ev.ds-cancelled{background:#FBE9E7;border-color:#C43D3D}
.ds-ev.ds-cancelled .ds-ev-t{color:#C43D3D}
.ds-ev.ds-cancelled .ds-ev-nm{text-decoration:line-through;color:#B26860}

.ds-now-line{position:absolute;left:0;right:0;border-top:2px dashed var(--amber-tx);z-index:5}
.ds-now-line::before{content:"";position:absolute;left:-0.25rem;top:-0.3125rem;width:0.5rem;height:0.5rem;border-radius:50%;background:var(--amber-tx)}

.ds-cal-legend{display:flex;align-items:center;gap:1.125rem;margin-top:0.875rem;padding-top:0.75rem;border-top:1px solid var(--line-soft);min-width:51.25rem}
.ds-cl-lab{font-size:0.6875rem;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--faint)}
.ds-cl-item{display:inline-flex;align-items:center;gap:0.4375rem;font-size:0.7812rem;font-weight:600;color:var(--muted)}
.ds-cl-item i{width:0.1875rem;height:0.875rem;border-radius:0.125rem}
.ds-cl-item .ds-sch,.ds-cl-item i.ds-sch{background:var(--blue-tx)}
.ds-cl-item i.ds-cmp{background:var(--green-tx)}
.ds-cl-item i.ds-cnl{background:#C43D3D}

.ds-cal-side{display:flex;flex-direction:column;gap:1.125rem}
.ds-cal-mini{flex-direction:row;align-items:center;gap:0.8125rem}
.ds-cm-t{font-size:0.9062rem;font-weight:600;color:var(--muted)}
.ds-cm-t b{font-size:1.375rem;font-weight:800;color:var(--ink);margin-right:0.125rem}
.ds-cm-s{display:flex;align-items:center;gap:0.375rem;font-size:0.7812rem;color:var(--muted);margin-top:0.25rem}
.ds-cm-s svg{width:0.875rem;height:0.875rem;color:var(--faint)}
.ds-av-list{display:flex;flex-direction:column}
.ds-avl{display:flex;align-items:center;gap:0.625rem;padding:0.5rem 0;border-bottom:1px solid var(--line-soft)}
.ds-avl:last-child{border-bottom:none;padding-bottom:0.125rem}
.ds-av-dot{width:0.5rem;height:0.5rem;border-radius:50%;background:#C6D2DF;flex:0 0 0.5rem}
.ds-avl.ds-on .ds-av-dot{background:var(--green-tx)}
.ds-av-d{width:2.25rem;font-size:0.8125rem;font-weight:700;color:var(--ink)}
.ds-av-h{flex:1;font-size:0.8125rem;font-weight:500;color:var(--faint);white-space:nowrap}
.ds-avl.ds-on .ds-av-h{color:var(--ink);font-weight:600}
.ds-av-x{font-size:0.6562rem;font-weight:700;background:var(--active);color:var(--active-tx);padding:0.125rem 0.4375rem;border-radius:var(--pill)}
.ds-sync-list{display:flex;flex-direction:column}
.ds-sync{display:flex;align-items:center;gap:0.6875rem;padding:0.5625rem 0;border-bottom:1px solid var(--line-soft)}
.ds-sync:last-child{border-bottom:none;padding-bottom:0.125rem}
.ds-sy-ic{width:2.125rem;height:2.125rem;border-radius:0.5625rem;background:var(--field);display:grid;place-items:center;font-weight:800;font-size:0.9375rem;flex:0 0 2.125rem}
.ds-sy-ic.ds-g{color:#1173C2}
.ds-sy-ic.ds-o{color:#0E5FA0}
.ds-sy-n{flex:1;font-size:0.875rem;font-weight:600;color:var(--ink)}
.ds-sy-soon{font-size:0.6875rem;font-weight:700;background:var(--field);color:var(--muted);padding:0.25rem 0.5625rem;border-radius:var(--pill)}

@media(max-width:1180px){
  .ds-cal-layout{grid-template-columns:1fr}
}

/* ---- Sessions page ---- */
.ds-seg-n{font-size:0.6875rem;font-weight:700;background:var(--field);color:var(--muted);padding:0.125rem 0.4375rem;border-radius:6.1875rem;min-width:1.625rem;text-align:center}
.ds-seg.ds-on .ds-seg-n{background:var(--active);color:var(--active-tx)}
.ds-sess-layout{display:grid;grid-template-columns:minmax(0,1fr) 18.75rem;gap:1.125rem;align-items:start}
.ds-sgroup{display:flex;align-items:center;gap:0.625rem;width:calc(100% - 0.5rem);padding:0.5625rem 1rem 0.5625rem 0.875rem;margin:1.125rem 0.25rem 0.5rem;background:var(--field);border-radius:0.625rem;cursor:pointer;text-align:left;transition:background .12s}
.ds-sgroup:hover{background:var(--line-soft)}
.ds-srow-head + .ds-sgroup{margin-top:0.375rem}
.ds-sg-caret{display:grid;place-items:center;flex:0 0 auto;color:var(--faint);transition:transform .15s}
.ds-sg-caret svg{width:0.9375rem;height:0.9375rem}
.ds-sgroup.ds-col .ds-sg-caret{transform:rotate(-90deg)}
.ds-sgroup.ds-today:hover{background:#D3E8F9}
.ds-sgroup.ds-today .ds-sg-caret{color:var(--active-tx)}
.ds-sgroup.ds-today{background:var(--active)}
.ds-sgroup.ds-today .ds-sg-d{color:var(--active-tx)}
.ds-sgroup.ds-today .ds-sg-today{background:#fff}
.ds-sgroup.ds-today .ds-sg-meta{color:var(--active-tx);opacity:.7}
/* deterministic client avatar tints — same client, same colour everywhere */
.ds-av.ds-c1{background:var(--blue-bg);color:var(--blue-tx)}
.ds-av.ds-c2{background:var(--mint-bg);color:var(--mint-tx)}
.ds-av.ds-c3{background:var(--laven-bg);color:var(--laven-tx)}
.ds-av.ds-c4{background:var(--amber-bg);color:var(--amber-tx)}
.ds-av.ds-c5{background:var(--green-bg);color:var(--green-tx)}
.ds-av.ds-c6{background:var(--teal-bg);color:var(--teal-tx)}
.ds-sgroup .ds-sg-d{font-size:0.7812rem;font-weight:700;color:var(--ink)}
.ds-sgroup .ds-sg-today{font-size:0.6562rem;font-weight:700;letter-spacing:.03em;background:var(--active);color:var(--active-tx);padding:0.125rem 0.5rem;border-radius:6.1875rem}
.ds-sgroup .ds-sg-meta{font-size:0.7188rem;font-weight:500;color:var(--faint);margin-left:auto}
.ds-tsearch{display:flex;align-items:center;gap:0.5625rem;height:2.75rem;padding:0 0.875rem;background:var(--panel);border:1px solid var(--line);border-radius:0.6875rem;width:18.125rem}
.ds-tsearch svg{width:0.9375rem;height:0.9375rem;color:var(--faint);flex:0 0 0.9375rem}
.ds-tsearch input{border:none;outline:none;background:none;font:inherit;font-size:0.8438rem;font-weight:500;color:var(--ink);width:100%}
.ds-tsearch input::placeholder{color:var(--faint)}
.ds-tsearch input::-webkit-search-cancel-button{-webkit-appearance:none}
.ds-tsearch:focus-within{border-color:var(--active-tx);box-shadow:0 0 0 3px var(--active)}
.ds-ts-x{width:1.375rem;height:1.375rem;border:none;padding:0;border-radius:50%;display:grid;place-items:center;
  color:var(--faint);background:none;cursor:pointer;flex:0 0 1.375rem;transition:.12s}
.ds-ts-x:hover{background:var(--field);color:var(--ink)}
.ds-ts-x svg{width:0.75rem;height:0.75rem;color:inherit}
.ds-srow{display:grid;grid-template-columns:6.875rem minmax(11.875rem,14.6875rem) minmax(6.875rem,9.375rem) 7.375rem 7.375rem minmax(15.625rem,1fr) 2rem;
  gap:0.875rem;align-items:center;padding:0.75rem 0.875rem 0.75rem 1.125rem;border-radius:0.75rem;cursor:pointer;position:relative;transition:background .12s}
.ds-srow>.ds-sd{margin-right:1.375rem}
.ds-srow-head>.ds-h-sdate{margin-right:1.375rem}
.ds-srow .ds-chip{justify-self:start}
.ds-s-sub{display:flex;align-items:center;gap:0.3125rem;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-s-sub svg{width:0.75rem;height:0.75rem;color:var(--faint);flex:0 0 0.75rem}
.ds-sn-cell{display:flex;align-items:center;gap:0.6875rem;min-width:0;font-size:0.7812rem;font-weight:500;color:var(--muted)}
.ds-sn-cell .ds-cnt{flex:0 0 auto;min-width:0}
/* zero-count chips stay visible but recede */
.ds-cnt.ds-zero{color:var(--faint)}
.ds-cnt.ds-zero svg{opacity:.55}
.ds-sn-sep{flex:0 0 auto;width:0.25rem;height:0.25rem;border-radius:50%;background:var(--line)}
.ds-srow-go{position:absolute;right:2.75rem;top:50%;transform:translateY(-50%);display:grid;place-items:center;color:var(--faint);opacity:0;pointer-events:none;transition:opacity .12s}
.ds-srow-go svg{width:1rem;height:1rem}
.ds-srow:not(.ds-srow-head):hover .ds-srow-go{opacity:1}
.ds-per-btn{display:inline-flex;align-items:center;gap:0.3125rem;font-size:0.75rem;font-weight:600;color:var(--muted);padding:0.25rem 0.5rem;border-radius:0.5rem;transition:.12s;white-space:nowrap}
.ds-per-btn svg{width:0.75rem;height:0.75rem;color:var(--faint)}
.ds-per-btn:hover{background:var(--field);color:var(--ink)}
.ds-sn-prev{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:0.75rem}
.ds-sn-none{color:var(--faint)}
.ds-rows-panel .ds-srow:has(+ .ds-srow)::after{content:"";position:absolute;left:1.125rem;right:0.875rem;bottom:0;height:1px;background:var(--line-soft)}
.ds-rows-panel .ds-srow-head::after{content:"";position:absolute;left:0.875rem;right:0.875rem;bottom:0;height:1px;background:var(--line-soft)}
.ds-srow:not(.ds-srow-head):hover{background:#EAF4FC}
.ds-srow:hover::after{opacity:0}
.ds-srow-head{cursor:default;padding-top:0.25rem;padding-bottom:0.5625rem}
.ds-srow-head:hover{background:transparent}
.ds-srow-head>*{font-size:0.6562rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ds-sd-d{font-size:0.8438rem;font-weight:700;color:var(--ink);white-space:nowrap}
.ds-sd-t{display:flex;align-items:center;gap:0.3125rem;font-size:0.75rem;font-weight:400;color:var(--muted);white-space:nowrap;margin-top:0.125rem}
.ds-sd-t svg{width:0.8125rem;height:0.8125rem;color:var(--faint)}
.ds-crow .ds-av,.ds-srow .ds-av{width:2.125rem;height:2.125rem;flex:0 0 2.125rem;font-size:0.7188rem}
.ds-srow .ds-cl{gap:0.625rem}
/* type & status chips share the client-page chip geometry: tinted fill, ink text */
.ds-chip.ds-typill,.ds-chip.ds-sstchip{color:var(--ink)}
.ds-t-coaching{background:var(--mint-bg);color:var(--mint-tx)}
.ds-t-strategy{background:var(--laven-bg);color:var(--laven-tx)}
.ds-t-checkin{background:var(--blue-bg);color:var(--blue-tx)}
.ds-t-discovery{background:var(--amber-bg);color:var(--amber-tx)}
.ds-t-followup{background:var(--green-bg);color:var(--green-tx)}
.ds-st-swatch.ds-t-coaching{background:var(--mint-tx)}
.ds-st-swatch.ds-t-strategy{background:var(--laven-tx)}
.ds-st-swatch.ds-t-checkin{background:var(--blue-tx)}
.ds-st-swatch.ds-t-discovery{background:var(--amber-tx)}
.ds-st-swatch.ds-t-followup{background:var(--green-tx)}
.ds-st-swatch.ds-sw-scheduled{background:var(--blue-tx)}
.ds-st-swatch.ds-sw-completed{background:var(--green-tx)}
.ds-st-swatch.ds-sw-cancelled{background:#C43D3D}
.ds-pop-r{display:inline-flex;align-items:center;gap:0.5rem;font-size:0.7188rem;font-weight:700;color:var(--faint)}
.ds-dur-cell{font-size:0.8125rem;font-weight:500;color:var(--muted);white-space:nowrap}
.ds-ms-list{display:flex;flex-direction:column}
.ds-msr{display:flex;align-items:center;gap:0.625rem;padding:0.5rem 0;font-size:0.8125rem}
.ds-msr .ds-msr-l{color:var(--muted);font-weight:500}
.ds-msr b{margin-left:auto;font-weight:700;color:var(--ink)}
.ds-msr.ds-total{border-top:1px solid var(--line-soft);margin-top:0.25rem;padding-top:0.75rem}
.ds-msr.ds-total b{font-size:0.7812rem}
.ds-lh-big{font-size:1.25rem;font-weight:800;letter-spacing:-.01em;color:var(--ink);margin:0.125rem 0 0.625rem}
.ds-lh-big span{font-size:0.7812rem;font-weight:500;color:var(--muted);letter-spacing:0}
.ds-lh-track{height:0.375rem;border-radius:0.1875rem;background:var(--line-soft);overflow:hidden}
.ds-lh-track i{display:block;height:100%;border-radius:0.1875rem;background:var(--active-tx)}
.ds-lh-note{margin-top:0.625rem;font-size:0.75rem;font-weight:600;color:var(--amber-tx)}
@media (max-width:1680px){
  .ds-srow{grid-template-columns:6.875rem minmax(11.875rem,14.6875rem) minmax(6.875rem,9.375rem) 7.375rem 7.375rem 2rem}
  .ds-srow .ds-sn-cell,.ds-srow-head .ds-h-snotes{display:none}
}
@media (max-width:1470px){
  .ds-srow{grid-template-columns:6.875rem minmax(11.875rem,14.6875rem) minmax(6.875rem,9.375rem) 7.375rem 2rem}
  .ds-srow .ds-st-wrap:has(.ds-typill),.ds-srow-head .ds-h-stype{display:none}
}
@media (max-width:1350px){
  .ds-srow{grid-template-columns:6.875rem minmax(11.875rem,17.5rem) 7.375rem 2rem}
  .ds-srow .ds-company-cell,.ds-srow-head .ds-h-company{display:none}
}
@media (max-width:1180px){
  .ds-sess-layout{grid-template-columns:1fr}
}
@media (max-width:940px){
  .ds-srow{grid-template-columns:7rem minmax(10.625rem,1fr) 2rem}
  .ds-srow .ds-st-wrap:has(.ds-sstchip),.ds-srow-head .ds-h-sstatus{display:none}
}

/* ---- Session drawer ---- */
.ds-dr-sub-date{display:flex;align-items:center;gap:0.5rem;font-size:0.8438rem;font-weight:600;color:var(--muted);margin:-0.25rem 0 0.875rem}
.ds-dr-sub-date svg{width:0.9375rem;height:0.9375rem;color:var(--faint)}
.ds-sstchip.ds-scheduled{background:var(--blue-bg)}
.ds-sstchip.ds-completed{background:var(--green-bg)}
.ds-sstchip.ds-cancelled{background:#FBE9E7}
.ds-dr-banner.ds-click{cursor:pointer;transition:filter .12s}
.ds-dr-banner.ds-click:hover{filter:brightness(.97)}
.ds-dr-banner.ds-upcoming{background:var(--blue-bg)}
.ds-dr-banner .ds-bn-s.ds-upcoming{color:var(--blue-tx);font-weight:600}
.ds-dr-banner.ds-upcoming .ds-bn-pct{font-size:1.0625rem;color:var(--blue-tx)}
/* Session detail rows share the client drawer's field-column layout: the label
   takes a fixed left column and every value/picker left-aligns immediately after
   it — landing at the same x (40%) as the client contact fields — instead of
   each control hugging the far-right edge. Value wrappers keep their natural
   width so each popover stays anchored to its own chip. Applies to the session
   drawer AND the session page (both render `ds-sess-f`). */
.ds-sess-f .ds-dr-field{justify-content:flex-start;gap:0;padding:0.25rem 0}
.ds-sess-f .ds-dr-field .ds-dfl{flex:0 0 40%;max-width:40%}
.ds-sess-f .ds-dfv{max-width:none;text-align:left;margin-left:0}
.ds-sess-f .ds-set-chip{margin-left:0}
.ds-sess-f .ds-logged-toggles{flex-wrap:wrap}
.ds-sess-f .ds-lbl-chips{justify-content:flex-start}
.ds-sess-f .ds-linked-parent{justify-content:flex-start}
/* Agenda point number — the task check circle carrying its running number;
   ticking marks it covered (filled, check) like a completed task. The digit
   is a CSS counter over DOM order, so drag reorders renumber live. */
.ds-agenda-num{width:1.375rem;height:1.375rem;border-radius:50%;flex:0 0 1.375rem;border:2px solid #B9CFE4;
  display:grid;place-items:center;font-size:0.6562rem;font-weight:700;color:var(--muted);transition:.12s}
.ds-task-main:hover .ds-agenda-num,.ds-agenda-num:hover{border-color:var(--active-tx);color:var(--active-tx)}
.ds-task.ds-done .ds-agenda-num{background:var(--active-tx);border-color:var(--active-tx);color:#fff}
/* agenda rows sit tighter than task rows — they're one-line talking points */
#session_agenda_list .ds-task-main{padding:0.4375rem 0.25rem}
#session_agenda_list .ds-task-group{counter-reset:agenda-point}
.ds-agenda-item{counter-increment:agenda-point}
.ds-agenda-item .ds-agenda-num::before{content:counter(agenda-point)}
.ds-agenda-item.ds-done .ds-agenda-num::before{content:none}
/* the body-appended drag ghost sits outside the counter scope — blank circle */
.ds-drag-ghost .ds-agenda-num::before{content:""}
/* Schedule popover picker — charter style: inline calendar (same as the tasks
   due-picker) beside a tinted rail of 15-min slots; the footer pairs a live
   date · start–end preview with a compact Save. */
/* Fixed-size layout — 252px calendar + 124px slot-rail zone + 14px padding;
   explicit pixels so no shrink-to-fit/browser quirk can ever let the
   absolutely-pinned rail overlap the calendar. */
.ds-sched-pop{padding:0.875rem 0.875rem 0.75rem;width:25.25rem;max-width:none}
/* the calendar sets the height; the slot rail is pinned to span exactly it */
.ds-sched-body{position:relative;margin-top:0.125rem;width:23.5rem;padding-right:7.75rem}
.ds-sched-cal{width:15.75rem}
.ds-sched-cal .ds-due-src{position:absolute;opacity:0;pointer-events:none;height:0;width:0;border:0;padding:0}
.ds-sched-cal .flatpickr-calendar.inline{box-shadow:none;border:none;border-radius:0.625rem;width:15.75rem}
/* compact calendar: 7 × 36px grid, 32px day pills, smaller type */
.ds-sched-cal .flatpickr-days,
.ds-sched-cal .dayContainer{width:15.75rem;min-width:15.75rem;max-width:15.75rem}
/* zoom-proof grid: at fractional display scaling (Windows 125% etc.) the
   vendor's 14.2857% cells round past the row and get cut by overflow:hidden
   (on .flatpickr-innerContainer as well as the rows). Fixed 36px cells
   (7 × 36 = 252 exactly) are deterministic at any zoom; unclip every wrapper. */
.ds-sched-cal .flatpickr-innerContainer,
.ds-sched-cal .flatpickr-days,
.ds-sched-cal .flatpickr-weekdays{overflow:visible}
.ds-sched-cal .flatpickr-day{width:2.25rem;flex-basis:2.25rem;max-width:2.25rem;height:2rem;line-height:2rem;font-size:0.7812rem;margin:0.125rem 0}
.ds-sched-cal span.flatpickr-weekday{width:2.25rem;flex:0 0 2.25rem;max-width:2.25rem;font-size:0.625rem}
.ds-sched-cal .flatpickr-current-month,
.ds-sched-cal .flatpickr-current-month .flatpickr-monthDropdown-months,
.ds-sched-cal .flatpickr-current-month input.cur-year{font-size:0.8438rem}
.ds-sched-times{position:absolute;top:0;right:0;bottom:0;width:6.625rem;overflow-y:auto;scrollbar-width:thin;
  background:var(--field);border-radius:0.75rem;padding:0.3125rem}
/* reset the generic .ds-pop button chrome for the slot rail + Save */
.ds-sched-times .ds-time-opt{display:block;width:100%;text-align:center;justify-content:center;
  padding:0.375rem 0.25rem;border-radius:0.5rem;font-size:0.7812rem;font-weight:600;color:var(--muted)}
.ds-sched-times .ds-time-opt:hover{background:#fff;color:var(--ink)}
.ds-sched-times .ds-time-opt.ds-on{background:var(--cta);color:#fff;font-weight:700}
/* optional "notify client" block in the reschedule popover */
.ds-sched-notify{margin-top:0.75rem;padding-top:0.6875rem;border-top:1px solid var(--line)}
.ds-sched-notify-tog{display:flex;align-items:center;gap:0.5rem;font-size:0.8125rem;font-weight:600;color:var(--ink);cursor:pointer}
.ds-sched-msg{width:100%;margin-top:0.5rem;border:1px solid var(--line);border-radius:0.625rem;padding:0.5rem 0.625rem;font-size:0.8125rem;resize:vertical;min-height:2.75rem}
.ds-sched-foot{display:flex;align-items:center;justify-content:space-between;gap:0.75rem;
  margin-top:0.75rem;padding-top:0.6875rem;border-top:1px solid var(--line)}
.ds-sched-preview{font-size:0.7812rem;font-weight:600;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ds-sched-foot .ds-gbtn{display:inline-flex;width:auto;justify-content:center;flex:0 0 auto;padding:0 1rem}
@media(max-width:640px){
  .ds-sched-pop{width:18rem}
  .ds-sched-body{width:auto;padding-right:0}
  .ds-sched-cal{margin:0 auto}
  .ds-sched-times{position:static;width:100%;max-height:9.375rem;margin-top:0.625rem}
  /* Dashboard header: stack the greeting above the action buttons instead of
     sharing a flex row (which squeezed the title to 0 and clipped "New session"
     off the right edge on phones). */
  .ds-dash-head{flex-direction:column;gap:0.875rem}
  .ds-dash-actions{margin-top:0;width:100%}
  .ds-dash-actions .ds-btn-split{flex:1 1 0;min-width:0}
  .ds-dash-actions .ds-btn-split .ds-bs-main{flex:1 1 auto;min-width:0}
  .ds-dash-head .ds-btn-new,.ds-dash-actions .ds-btn-new{margin-top:0}
}
/* Linked contract/package row — name link + position meter. */
.ds-linked-parent{display:inline-flex;align-items:center;gap:0.625rem;justify-content:flex-end}
.ds-plink{color:var(--active-tx);font-weight:700}
.ds-plink:hover{text-decoration:underline}
.ds-mini-meter{display:inline-flex;align-items:center;gap:0.4375rem}
.ds-mini-meter b{font-size:0.75rem;color:var(--muted);font-weight:700}
.ds-mm-track{width:4rem;height:0.3125rem;border-radius:6.1875rem;background:var(--field);overflow:hidden;display:inline-block}
.ds-mm-fill{display:block;height:100%;border-radius:6.1875rem;background:var(--active-tx)}
.ds-sc-client{display:flex;align-items:flex-start;gap:0.875rem;background:var(--field);border-radius:0.875rem;padding:0.875rem 1rem;margin:0.125rem 0 1.125rem}
.ds-sc-info{min-width:0}
.ds-sc-name{font-size:0.9375rem;font-weight:700;color:var(--ink)}
.ds-sc-sub{display:flex;align-items:center;gap:0.4375rem;font-size:0.7812rem;font-weight:600;color:var(--muted);margin-top:0.1875rem;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ds-sc-sub svg{width:0.8125rem;height:0.8125rem;color:var(--faint);flex:0 0 0.8125rem}
.ds-sc-view{margin-left:auto;display:inline-flex;align-items:center;gap:0.3125rem;font-size:0.7812rem;font-weight:700;color:var(--active-tx);padding:0.4375rem 0.625rem;border-radius:0.5625rem;white-space:nowrap;align-self:center}
.ds-sc-view:hover{background:var(--active)}
.ds-sc-view svg{width:0.875rem;height:0.875rem}
/* Client-swap editor on the session page — hidden until the ⋮ menu's
   "Change client…" reveals it under the header pills. */
.ds-sc-swap-editor{display:flex;align-items:center;gap:0.625rem;min-width:0;margin:0.125rem 0 1.125rem;max-width:28.75rem}
.ds-sc-swap-editor > [data-controller="client-autocomplete"]{flex:1;min-width:0}
.ds-set-chip{display:inline-flex;align-items:center;gap:0.4375rem;font-size:0.7812rem;font-weight:600;color:var(--faint);background:#fff;border:1px dashed var(--line);padding:0.375rem 0.6875rem;border-radius:0.5625rem;transition:.12s;margin-left:auto;white-space:nowrap}
.ds-set-chip svg{width:0.75rem;height:0.75rem}
.ds-set-chip:hover{border-color:#C9D6E4;color:var(--muted)}
.ds-set-chip.ds-set{border:1px solid transparent;color:var(--ink);background:var(--field)}
.ds-set-chip.ds-set:hover{background:var(--line-soft)}

/* ============================================================
   App-shell adaptations (not in the prototype)
   ============================================================ */

/* The topbar search box is a button that opens the command palette. */
button.ds-cmd{cursor:pointer}
.ds-cmd .ds-cmd-text{flex:1;text-align:left;font-size:0.875rem;color:var(--faint)}
.ds-kbd{font-size:0.6875rem;font-weight:600;color:var(--faint);background:var(--field);
  border:1px solid var(--line-soft);border-radius:0.375rem;padding:0.1875rem 0.4375rem}

/* Avatar button hosts the turbo-framed avatar partial. */
.ds-me turbo-frame{display:contents}
.ds-me img{width:100%;height:100%;object-fit:cover;border-radius:50%}
.ds-me div{width:100%;height:100%;border-radius:50%;display:flex;align-items:center;justify-content:center;background:transparent}
/* Avatar + chevron: the chevron signals the dropdown; hover ring moves to the wrapper. */
.ds-me-btn{display:inline-flex;align-items:center;gap:0.25rem;padding:0;flex:0 0 auto;cursor:pointer}
/* Tailwind v4's .rotate-180 sets the standalone `rotate` property — transition that, not transform. */
.ds-me-btn .ds-me-chev{display:inline-flex;color:var(--muted);transition:color .15s, rotate .2s ease}
.ds-me-btn .ds-me-chev svg{width:0.875rem;height:0.875rem}
.ds-me-btn:hover .ds-me-chev{color:var(--ink)}
.ds-me-btn:hover .ds-me{box-shadow:0 0 0 2px #fff, 0 2px 8px rgba(16,42,67,.32)}

/* Topbar user menu (ds-pop variant) — name header, language flyout, actions.
   Fades + scales from the avatar; the user-dropdown controller toggles the
   opacity/scale utilities (Tailwind v4 sets the standalone `scale` prop). */
.ds-user-pop{top:calc(100% + 0.625rem);width:14.75rem;transform-origin:top right;transition:opacity .12s ease, scale .12s ease}
.ds-user-head{padding:0.5625rem 0.6875rem 0.4375rem}
.ds-user-name{font-size:0.8438rem;font-weight:700;color:var(--ink)}
.ds-user-mail{font-size:0.75rem;color:var(--muted);margin-top:0.0625rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-pop-sep{height:1px;background:var(--line);margin:0.375rem 0.25rem}
.ds-user-pop .ds-menu-item{display:flex;align-items:center;justify-content:flex-start;gap:0.6875rem;width:100%;padding:0.5625rem 0.6875rem;border-radius:0.5625rem;
  font-size:0.8438rem;font-weight:500;color:var(--ink);text-align:left;text-decoration:none;cursor:pointer;transition:background .12s}
.ds-user-pop .ds-menu-item:hover{background:var(--line-soft)}
.ds-user-pop .ds-menu-item svg{width:1rem;height:1rem;flex:0 0 1rem;color:var(--muted)}
.ds-user-pop .ds-mi-lbl{flex:1;min-width:0}
.ds-user-pop .ds-menu-item svg.ds-lang-chev{width:0.8125rem;height:0.8125rem;color:var(--faint)}
.ds-user-pop .ds-danger-item{color:#C0392B}
.ds-user-pop .ds-danger-item svg{color:#C0392B}
.ds-user-pop .ds-danger-item:hover{background:#FBEAE7}
.ds-lang{position:relative}
.ds-lang-cur{font-size:0.6562rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--muted)}
.ds-lang-wrap{position:absolute;right:100%;top:-0.375rem;padding-right:0.5rem;opacity:0;visibility:hidden;transition:opacity .12s ease .05s;z-index:5}
.ds-lang:hover .ds-lang-wrap,
.ds-lang.ds-open .ds-lang-wrap{opacity:1;visibility:visible}
/* Restore after a locale switch: re-open with no entrance/flyout animation so
   alternating languages doesn't flash the menu on every reload. */
.ds-dd-instant .ds-user-pop,
.ds-dd-instant .ds-lang-wrap{transition:none}
.ds-lang-sub{width:10.25rem;background:#fff;border:1px solid var(--line);border-radius:0.625rem;
  box-shadow:0 18px 40px -18px rgba(16,42,67,.35);padding:0.375rem}
.ds-lang-sub .ds-menu-item.ds-on{cursor:default}
.ds-lang-sub .ds-menu-item.ds-on:hover{background:none}
.ds-lang-sub .ds-menu-item.ds-on svg{color:var(--active-tx)}

/* Messages stub: visible but not clickable yet. */
.ds-nav-item.ds-disabled{cursor:default;opacity:.55}
.ds-nav-item.ds-disabled:hover{background:none;color:var(--muted)}
.ds-nav-soon{margin-left:auto;font-size:0.625rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;
  background:var(--field);color:var(--faint);padding:0.125rem 0.4375rem;border-radius:6.1875rem}
.ds-shell.ds-mini .ds-nav-soon{display:none}

/* Small screens: icon-only command button, title gets the room. */
@media(max-width:767px){
  .ds-topbar{display:flex;padding:0.875rem 1rem;gap:0.625rem}
  .ds-cmd{flex:0 0 auto;width:2.75rem;height:2.75rem;padding:0;justify-content:center;margin-left:auto}
  .ds-cmd .ds-cmd-text,.ds-cmd .ds-kbd{display:none}
}

/* Stat card that is informational only (Total) — not a filter. */
.ds-stat.ds-static{cursor:default}
.ds-stat.ds-static:hover{transform:none;box-shadow:0 2px 10px -2px rgba(16,42,67,.10)}

/* Drawer adaptations for server-rendered forms. */
form.ds-inline-form{display:inline-flex}
.ds-dr-ic.ds-star-on{color:#E8A93C}
/* ---- Notes composer (chat-style bar, pinned in the drawer footer) ---- */
/* Drawer footer: a tinted "compose zone" below the scroll area so the white
   input clearly pops. Holds the GDPR line + compose bar. */
/* One footer chrome for every drawer tab (notes / sessions / tasks): white,
   inset top hairline, same rhythm — only the content differs. */
.ds-dr-footer{flex:0 0 auto;background:#fff;position:relative;padding:0.8125rem 1.875rem 1rem}
.ds-dr-footer::before{content:"";position:absolute;top:0;left:1.875rem;right:1.875rem;height:1px;background:var(--line)}
/* Inline variant at the bottom of the full-page notes tab — same tinted panel. */
.ds-note-dock{background:var(--field);border:1px solid var(--line);border-radius:0.75rem;margin-top:1.125rem;padding:0.75rem 0.875rem}
/* GDPR reminder — small print above the bar. */
.ds-note-gdpr{display:flex;align-items:center;gap:0.375rem;font-size:0.7188rem;color:var(--faint);margin:0 0 0.625rem;padding:0 0.125rem}
/* notes drawer footer: GDPR sits ABOVE the divider — its border-bottom IS the
   footer divider, so the footer's own top hairline is dropped */
.ds-dr-footer-notes{padding-top:0.5rem}
.ds-dr-footer-notes::before{content:none}
.ds-dr-footer-notes .ds-note-gdpr{justify-content:center;margin:0 0 0.8125rem;padding:0 0.125rem 0.5rem;border-bottom:1px solid var(--line)}
.ds-note-gdpr svg{width:0.75rem;height:0.75rem;flex:0 0 0.75rem}
.ds-note-gdpr .ds-hint{margin-left:0;display:inline-flex}
.ds-note-gdpr .ds-hint svg{width:0.75rem;height:0.75rem}
/* The bar itself — a white input floating on the tinted zone, with a soft lift. */
.ds-nc{border:1px solid #C7D5E4;border-radius:0.75rem;background:#fff;
  box-shadow:0 1px 2px rgba(16,42,67,.06);transition:border-color .15s,box-shadow .15s}
.ds-nc:focus-within{border-color:#8FC3EC;box-shadow:0 0 0 4px rgba(17,115,194,.12)}
.ds-nc-bar{display:flex;align-items:flex-end;gap:0.375rem;padding:0.3125rem 0.375rem}
.ds-nc-input{flex:1;min-width:0;border:none;background:transparent;padding:0.5rem 0.5rem;min-height:1.5rem;max-height:10.5rem;overflow-y:auto;
  font-size:0.875rem;line-height:1.5;color:var(--ink);outline:none}
trix-editor.ds-nc-input{min-height:1.5rem;border:none;border-radius:0}
.ds-nc-input:empty:not(:focus)::before,.ds-nc-input:placeholder-shown::before{color:var(--faint)}
.ds-nc-input ul{list-style:disc;padding-left:1.4rem;margin:.35rem 0}
.ds-nc-input ol{list-style:decimal;padding-left:1.4rem;margin:.35rem 0}
.ds-nc-input li{display:list-item;margin:.1rem 0}
.ds-nc-input blockquote{border-left:3px solid var(--line);padding-left:.7rem;margin:.35rem 0;color:var(--muted)}
.ds-nc-actions{display:flex;align-items:center;gap:0.1875rem;flex:0 0 auto;padding-bottom:0.125rem}
.ds-nc-ic{width:2.375rem;height:2.375rem;border-radius:0.625rem;display:grid;place-items:center;color:var(--muted);transition:background .14s,color .14s}
.ds-nc-ic:hover{background:var(--line-soft);color:var(--ink)}
.ds-nc-ic.ds-on{background:var(--active);color:var(--active-tx)}
.ds-nc-ic svg{width:1.125rem;height:1.125rem}
.ds-nc-send{background:var(--cta);color:#fff}
.ds-nc-send:hover{background:var(--cta-press);color:#fff}
/* disabled (empty field) keeps the full black look — it just doesn't fire */
.ds-nc-send:disabled{background:var(--cta);color:#fff;pointer-events:none}
/* compact visibility select (client-portal beta) */
.ds-nc-vis{align-self:center;height:2.125rem;border:1px solid var(--line);border-radius:0.5625rem;background:#fff;color:var(--ink);
  font-size:0.7812rem;font-weight:600;padding:0 0.5rem;outline:none}
/* the rich-text toolbar, revealed above the bar by the format toggle */
.ds-nc-tools{margin-bottom:0.5rem}
.ds-nc-tools .notes-trix{border:1px solid var(--line);border-radius:0.625rem;background:#fff;overflow:hidden}
.ds-nc-tools trix-toolbar{border:none;background:var(--field);border-bottom:1px solid var(--line)}
.ds-nc-err{font-size:0.75rem;color:#C0392B;margin:0.5rem 0.125rem 0}
.ds-dr-bar-r form{display:inline-flex}
.ds-pop form{display:block}
.ds-pop form button{width:100%}

/* Hidden radio inputs behind segmented pickers. */
.ds-visually-hidden{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}

/* Clients page adaptations (server-rendered specifics). */
.ds-clients-page{display:flex;flex-direction:column;gap:0}
.ds-clients-page .ds-toolbar{margin:1.125rem 0 1rem;display:flex;align-items:center;gap:0.75rem}
.ds-clients-page .ds-tsearch{margin-left:0.125rem}
.ds-archived-banner{display:flex;align-items:center;justify-content:space-between;gap:0.75rem;
  background:var(--field);border:1px solid var(--line-soft);border-radius:0.75rem;padding:0.75rem 1rem;margin-bottom:1rem}
.ds-archived-banner span{display:inline-flex;align-items:center;gap:0.5rem;color:var(--muted);font-weight:600}
.ds-archived-banner svg{width:1.0625rem;height:1.0625rem}
.ds-archived-row{display:flex;align-items:center;gap:0.75rem}
.ds-archived-link{margin-top:1.125rem}
.ds-archived-link .ds-lnk{display:inline-flex;align-items:center;gap:0.4375rem;color:var(--faint);font-size:0.8125rem}
.ds-archived-link .ds-lnk:hover{color:var(--muted)}
.ds-empty-state h3{font-family:var(--serif);font-weight:700;font-size:1.375rem;letter-spacing:-.01em;margin:0 0 0.5rem}
.ds-empty-state p{color:var(--muted);margin:0 0 1.125rem;max-width:25rem}

/* Tailwind's .hidden must always win over ds- display rules (this sheet
   loads after tailwind.css, so same-specificity ds rules would override it). */
.ds-shell .hidden{display:none!important}

/* Inside the modal's stacking context the fixed scrim (z80) would paint
   above the z-auto box — keep the box on top (latent prototype bug). */
.ds-modal .ds-scrim{z-index:1}
.ds-modal .ds-box{z-index:2}

/* Sessions page adaptations. */
.ds-sessions-page .ds-toolbar{margin:0.875rem 0 1rem;display:flex;align-items:center;gap:0.75rem}
.ds-dash-head .ds-dash-sub{color:var(--muted)}
.ds-banner-btn{width:100%;border:none;font:inherit;cursor:pointer}
.ds-logged-toggles{display:flex;gap:0.5rem;align-items:center}
.ds-log-chip{background:var(--field);color:var(--muted)}
.ds-log-chip.ds-on{background:var(--green-bg);color:var(--green-tx)}
.ds-pos-chip{font-size:0.7188rem;font-weight:600;color:var(--faint);background:var(--field);
  border-radius:0.5rem;padding:0.1875rem 0.5rem;white-space:nowrap}

/* Session labels — free-text chips + picker popover (label-picker controller).
   Chip tint is deterministic from the label name: ds-lc1..8 map to the eight
   design-system chip pairs, so a given label always renders the same colour. */
.ds-lbl-field{align-items:flex-start}
.ds-lbl-field .ds-dfl{padding-top:0.375rem}
.ds-lbl-wrap{flex:1;min-width:0;margin-left:auto;max-width:72%}
.ds-lbl-chips{display:flex;flex-wrap:wrap;gap:0.375rem;justify-content:flex-end;align-items:center}
.ds-lbl-chip{padding:0.3125rem 0.4375rem 0.3125rem 0.6875rem;gap:0.1875rem;font-weight:600;color:var(--ink)}
.ds-lbl-x{display:inline-grid;place-items:center;width:1.125rem;height:1.125rem;padding:0;border:none;border-radius:0.3125rem;
  background:transparent;color:inherit;opacity:.5;cursor:pointer}
.ds-lbl-x:hover{opacity:1;background:rgba(16,42,67,.10)}
.ds-lbl-x svg{width:0.8125rem;height:0.8125rem}
.ds-lbl-add{margin-left:0}

.ds-lbl-pop{width:15.625rem;padding:0;top:2.25rem}
.ds-lbl-list{max-height:14.75rem}
.ds-lbl-opt-form{margin:0}
.ds-lbl-opt{display:flex;align-items:center;gap:0.5625rem;width:100%;padding:0.5rem 0.625rem;border-radius:0.5rem;
  font-size:0.8438rem;color:var(--ink);font-weight:500;text-align:left}
.ds-lbl-opt:hover{background:var(--line-soft)}
.ds-lbl-opt.ds-on{font-weight:600}
.ds-lbl-opt-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-lbl-opt svg{width:1rem;height:1rem;color:var(--active-tx);flex:0 0 1rem}
.ds-lbl-dot{width:0.625rem;height:0.625rem;border-radius:50%;flex:0 0 0.625rem;box-shadow:inset 0 0 0 1px rgba(16,42,67,.12)}
.ds-lbl-create-btn{display:flex;align-items:center;gap:0.625rem;width:100%;padding:0.5rem 0.625rem;border-radius:0.5rem;
  font-size:0.8438rem;color:var(--active-tx);font-weight:600;text-align:left}
.ds-lbl-create-btn:hover{background:var(--line-soft)}
.ds-lbl-create-av{display:grid;place-items:center;width:1.625rem;height:1.625rem;flex:0 0 1.625rem;border-radius:0.4375rem;
  background:var(--active);color:var(--active-tx)}
.ds-lbl-create-av svg{width:0.9375rem;height:0.9375rem}
.ds-lbl-create-txt{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-lbl-hint,.ds-lbl-cap{padding:0.6875rem 0.75rem;font-size:0.7812rem;color:var(--faint);line-height:1.4}

.ds-lc1{background:var(--green-bg);color:var(--green-tx)}
.ds-lc2{background:var(--laven-bg);color:var(--laven-tx)}
.ds-lc3{background:var(--peach-bg);color:var(--peach-tx)}
.ds-lc4{background:var(--blue-bg);color:var(--blue-tx)}
.ds-lc5{background:var(--pink-bg);color:var(--pink-tx)}
.ds-lc6{background:var(--amber-bg);color:var(--amber-tx)}
.ds-lc7{background:var(--teal-bg);color:var(--teal-tx)}
.ds-lc8{background:var(--mint-bg);color:var(--mint-tx)}

/* Sessions "Labels" filter dropdown — tinted checkbox rows + a clear action. */
.ds-lbl-flt-pop{width:15.625rem;padding:0.375rem}
.ds-lbl-flt-pop .ds-lsel-list{max-height:16.5rem}
.ds-lbl-flt-pop .ds-lsel-opt.ds-ck{gap:0.5625rem;padding:0.5rem 0.625rem;border-radius:0.5rem;font-size:0.8438rem;color:var(--ink);cursor:pointer}
.ds-lbl-flt-pop .ds-lsel-opt.ds-ck:hover{background:var(--line-soft)}
.ds-lbl-flt-pop .ds-pop-r{margin-left:auto;font-size:0.75rem;font-weight:600;color:var(--faint)}
.ds-lbl-flt-pop .ds-lbl-flt-clear{display:flex;align-items:center;gap:0.5625rem;width:100%;padding:0.5625rem 0.6875rem;border-radius:0.5625rem;
  font-size:0.8125rem;font-weight:500;color:var(--muted)}
.ds-lbl-flt-pop .ds-lbl-flt-clear:hover{background:var(--line-soft);color:var(--ink)}
.ds-lbl-flt-pop .ds-lbl-flt-clear svg{width:0.9375rem;height:0.9375rem;color:var(--faint)}

/* ============================================================
   ds FullCalendar theme — replaces the old inline calendar CSS.
   Event status classes (cw-event-*) are applied by the
   fullcalendar Stimulus controller; themed here with ds tokens.
   ============================================================ */
.ds-shell .fc{--fc-border-color:var(--line);--fc-today-bg-color:#FCF7EC;font-family:var(--sans)}
.ds-shell .fc-toolbar-title{font-size:1.1875rem;font-weight:800;letter-spacing:-.01em;color:var(--ink);line-height:2.125rem}
.ds-shell .fc-button{background:var(--card)!important;border:1px solid var(--line)!important;color:var(--muted)!important;
  font-size:0.8125rem!important;font-weight:600!important;padding:0.4375rem 0.8125rem!important;border-radius:0.5rem!important;
  box-shadow:none!important;text-transform:capitalize!important;transition:.12s}
.ds-shell .fc-button:hover{color:var(--ink)!important;background:var(--field)!important}
.ds-shell .fc-button-active{background:var(--active)!important;border-color:#A8D2F0!important;color:var(--active-tx)!important}
.ds-shell .fc-today-button{color:var(--ink)!important}
/* FC disables "Today" while you're on it — restyle that as a lit "you are
   here" state instead of a dead control. */
.ds-shell .fc-today-button:disabled{background:var(--active)!important;border-color:#A8D2F0!important;color:var(--active-tx)!important;opacity:1!important}
.ds-shell .fc-button-group{gap:0}
.ds-shell .fc-button-group>.fc-button{border-radius:0!important}
.ds-shell .fc-button-group>.fc-button:first-child{border-radius:0.5rem 0 0 0.5rem!important}
.ds-shell .fc-button-group>.fc-button:last-child{border-radius:0 0.5rem 0.5rem 0!important}
.ds-shell .fc-prev-button,.ds-shell .fc-next-button{padding:0.4375rem 0.625rem!important}
/* Breathing room up top: the whole toolbar sits on one row (nav · title ·
   zoom + view switcher), with the zoom control inline to the LEFT of the
   Month/Week/Day switcher. */
.ds-shell .fc .fc-header-toolbar{align-items:center;margin-bottom:1.125rem}
.ds-shell .fc-toolbar-chunk:last-child{display:flex;align-items:center;gap:1rem}

/* Day headers (stacked name + big number, prototype .cal-dayhead) — no frame
   around the grid and no vertical dividers between weekday cells; only the
   hairline under the header row stays. FullCalendar draws an outer border on
   .fc-scrollgrid (top + left) and per-cell borders in the header table wrapper;
   clear both so the header sits open on the panel. */
.ds-shell .fc-scrollgrid,.ds-shell table.fc-scrollgrid{border:0!important}
.ds-shell .fc-col-header-cell{border-left:0;border-right:0}
.ds-shell .fc .fc-scrollgrid-section-header > *{border-left:0;border-right:0}
.ds-shell .fc-theme-standard .fc-scrollgrid td:last-of-type,
.ds-shell .fc-theme-standard .fc-scrollgrid th:last-of-type{border-right:0}
/* The empty top-left corner cell (above the time gutter) carries side borders
   that show as a stray vertical stub in the header row — clear them. */
.ds-shell .fc-scrollgrid-section-header .fc-timegrid-axis{border-left:0;border-right:0}
.ds-shell .gc-day-header{display:flex;flex-direction:column;align-items:center;gap:0.375rem;padding:0.25rem 0 0.75rem}
.ds-shell .gc-day-name{font-size:0.6562rem;font-weight:600;letter-spacing:.06em;text-transform:uppercase;color:var(--faint)}
.ds-shell .gc-day-number{font-size:1.5625rem;font-weight:600;letter-spacing:-.01em;color:var(--ink);width:2.875rem;height:2.875rem;
  display:grid;place-items:center;border-radius:50%;cursor:pointer;transition:background .12s}
.ds-shell .gc-day-number:hover{background:var(--field)}
/* Today's date: blue-outlined circle (prototype); the amber system stays on
   the column wash + now-line. */
.ds-shell .gc-day-number.gc-day-today{background:var(--active);border:2px solid var(--active-tx);font-weight:700}
.ds-shell .fc-col-header-cell.fc-day-today .gc-day-name{color:var(--active-tx)}
.ds-shell .fc-daygrid-day-number{color:var(--muted);font-weight:600;font-size:0.7812rem;padding:0.375rem 0.5rem}
/* Month view: today's number gets the same blue-ringed circle as the headers */
.ds-shell .fc-daygrid-day.fc-day-today .fc-daygrid-day-number{width:1.625rem;height:1.625rem;padding:0;margin:0.25rem;
  display:grid;place-items:center;border-radius:50%;background:var(--active);border:2px solid var(--active-tx);
  color:var(--ink);font-weight:800}

/* Events — the coach's session-type pastel (per-event --ev-bg/--ev-tn custom
   props set by the fullcalendar controller; blue fallback when a session has
   no type). Chip anatomy per charter: time wears the tone, the NAME wears dark
   ink, details are muted. Status only modifies: ✓ + dim = completed, strike =
   cancelled. */
.ds-shell .fc-event{border:none;border-radius:0.4375rem;padding:0.125rem 0.375rem;font-size:0.75rem;cursor:pointer;
  box-shadow:0 1px 2px rgba(16,42,67,.06);transition:filter .12s}
.ds-shell .fc-event:hover{filter:brightness(.97)}
.ds-shell .cw-event-scheduled,.ds-shell .cw-event-completed,.ds-shell .cw-event-cancelled,
.ds-shell .cw-event-blocked{background:var(--ev-bg,var(--blue-bg))!important;
  border-left:3px solid var(--ev-tn,var(--blue-tx))!important}
.ds-shell .cw-event-blocked{--ev-bg:var(--laven-bg);--ev-tn:var(--laven-tx)}
.ds-shell .fc-event .fc-event-time,.ds-shell .fc-event .cw-event-inline-time{
  color:var(--ev-tn,var(--blue-tx))!important;font-weight:700;font-variant-numeric:tabular-nums}
.ds-shell .fc-event .fc-event-title,.ds-shell .fc-event .cw-event-inline-title{
  color:var(--ink)!important;font-weight:600}
.ds-shell .cw-event-completed{opacity:.72}
.ds-shell .cw-event-cancelled{opacity:.6}
.ds-shell .cw-event-cancelled .fc-event-title,.ds-shell .cw-event-cancelled .cw-event-inline-title{
  text-decoration:line-through;color:var(--muted)!important}
.ds-shell .cw-event-inline{display:flex;gap:0.3125rem;align-items:baseline;min-width:0;line-height:1.25}
.ds-shell .cw-event-inline-time{font-weight:700;font-size:0.6875rem;flex:0 0 auto}
.ds-shell .cw-event-inline-title{font-weight:600;font-size:0.7188rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-shell .cw-event-detail{font-size:0.6562rem;color:var(--muted);margin-top:0.0625rem;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* Drag-to-create ghost (selectMirror over empty slots) + the range highlight:
   FullCalendar defaults them to a solid blue (#3788d8) that clashes with the
   soft kit. Give the ghost the scheduled-event pastel and the highlight a
   faint active tint, so placing a new session reads as "a session going here". */
.ds-shell .fc-event-mirror{background:var(--blue-bg)!important;border:none!important;
  border-left:3px solid var(--blue-tx)!important;box-shadow:0 4px 12px -4px rgba(16,42,67,.28)!important}
.ds-shell .fc-event-mirror .fc-event-time{color:var(--blue-tx)!important;font-weight:700}
.ds-shell .fc-event-mirror .fc-event-title{color:var(--ink)!important;font-weight:600}
.ds-shell .fc-highlight{background:var(--active)!important}

/* Time grid */
/* Breathing room around stacked events: pull each event's top & bottom edges in
   a touch so consecutive sessions don't butt up against each other / the grid line */
.ds-shell .fc-timegrid-event-harness>.fc-timegrid-event{top:0.1875rem;bottom:0.1875rem}
/* Calmer grid: ONLY full-hour lines. FullCalendar draws a border on every slot
   lane; we keep the top-of-the-hour ones and drop everything else. Matching on
   data-time (…:00:00 = the hour) covers every zoom level — 30-, 15- and 10-min
   slots alike — instead of relying on the major/minor split, which shifts as
   slotLabelInterval changes. */
.ds-shell .fc-timegrid-slot-minor{border-top-style:none}
.ds-shell .fc-timegrid-slot-lane:not([data-time$="00:00"]){border-top-style:none}
/* Keep only hour labels crisp; any sub-hour label that still renders is muted. */
.ds-shell .fc-timegrid-slot-label:not([data-time$="00:00"]) .fc-timegrid-slot-label-cushion{
  color:var(--faint);opacity:.6}
.ds-shell .fc-timegrid-slot-label-cushion{font-size:0.6875rem;color:var(--faint);font-weight:600;font-variant-numeric:tabular-nums}
/* Soft-blue dashed now-line spanning the WHOLE week. Real CSS dashes can't
   control the gap, so paint the dashes with a repeating-linear-gradient (8px
   dash · 7px gap) in a faint blue. The line lives in an overlay host that
   spans the day columns; a small left inset keeps it clear of the axis pill. */
.ds-shell .fc-timegrid-now-indicator-line{border:0!important;height:0!important;
  left:0!important;right:0!important}
.ds-shell .fc-timegrid-now-indicator-arrow{display:none}
/* Overlay host for the reparented, week-spanning now-line */
.ds-shell .cw-nowline-host{position:absolute;inset:0;pointer-events:none;z-index:5}
.ds-shell .cw-nowline-host .fc-timegrid-now-indicator-line{position:absolute;left:0;right:0;
  height:0!important;border:0!important}
.ds-shell .cw-nowline-host .fc-timegrid-now-indicator-line::after{content:"";position:absolute;
  left:0.125rem;right:0;top:-0.0625rem;height:0.125rem;
  background:repeating-linear-gradient(to right,#5B9BD5 0 8px,transparent 8px 15px)}
/* Time pill in the axis gutter. Lives on the calendar wrapper (outside the
   scroll container) so it can extend into the panel padding without clipping;
   the controller keeps it glued to the line on scroll/resize/minute ticks. */
.ds-shell .cw-now-pill{position:absolute;transform:translateY(-50%);z-index:6;pointer-events:none;
  background:#5B9BD5;color:#fff;font-size:0.6562rem;font-weight:700;line-height:1;
  padding:0.1875rem 0.4375rem;border-radius:0.375rem;white-space:nowrap;font-variant-numeric:tabular-nums;
  box-shadow:0 1px 3px rgba(16,42,67,.28)}
/* Hours outside availability shade grey, so white = open for booking */
.ds-shell .fc-non-business{background:#F5F7FA}
.ds-shell .fc-daygrid-more-link{color:var(--active-tx);font-weight:600;font-size:0.7188rem}

/* FullCalendar reserves a vertical scroll gutter beside the day headers
   (overflow-y:scroll) so they stay aligned with the scrolling body; on
   classic-scrollbar systems that shows as a dead, empty scrollbar. Give every
   scroller the same thin width (so columns stay aligned) but make the track and
   thumb transparent — that hides the empty header scrollbar... */
.ds-shell .fc-scroller{scrollbar-width:thin;scrollbar-color:transparent transparent}
.ds-shell .fc-scroller::-webkit-scrollbar{width:0.5rem;height:0.5rem}
.ds-shell .fc-scroller::-webkit-scrollbar-button{display:none;width:0;height:0}
.ds-shell .fc-scroller::-webkit-scrollbar-track{background:transparent}
.ds-shell .fc-scroller::-webkit-scrollbar-thumb{background:transparent}
/* ...while keeping a real, visible scrollbar on the scrolling time-grid body. */
.ds-shell .fc-scroller-liquid-absolute{scrollbar-color:var(--line) transparent}
.ds-shell .fc-scroller-liquid-absolute::-webkit-scrollbar-thumb{background:var(--line);
  border-radius:6.1875rem;border:2px solid transparent;background-clip:padding-box}
.ds-shell .fc-scroller-liquid-absolute::-webkit-scrollbar-thumb:hover{background:var(--faint)}

/* Zoom control (built by the controller) — prototype .cal-zoom chrome */
.ds-shell .cw-zoom-control{display:flex;align-items:center;gap:0.625rem}
.ds-shell .cw-zoom-btn{width:2.125rem;height:2.125rem;display:grid;place-items:center;background:#fff;
  border:1px solid var(--line);border-radius:0.625rem;color:var(--muted);cursor:pointer;transition:.14s}
.ds-shell .cw-zoom-btn:hover{color:var(--ink);background:var(--field)}
.ds-shell .cw-zoom-btn-disabled{opacity:.45;pointer-events:none}
.ds-shell .cw-zoom-track{display:flex;align-items:center}
.ds-shell .cw-zoom-slider{-webkit-appearance:none;appearance:none;width:8.25rem;height:0.3125rem;border-radius:0.1875rem;
  background:var(--line);outline:none;cursor:pointer}
.ds-shell .cw-zoom-slider::-webkit-slider-thumb{-webkit-appearance:none;appearance:none;width:0.875rem;height:0.875rem;
  border-radius:50%;background:var(--ink);cursor:pointer;box-shadow:0 1px 3px rgba(18,38,63,.3)}
.ds-shell .cw-zoom-slider::-moz-range-thumb{width:0.875rem;height:0.875rem;border-radius:50%;background:var(--ink);
  cursor:pointer;border:none;box-shadow:0 1px 3px rgba(18,38,63,.3)}

/* Hover tooltip */
.ds-shell .calendar-tooltip{position:fixed;z-index:120;background:#fff;border-radius:0.625rem;padding:0.625rem 0.8125rem;max-width:16.25rem;
  box-shadow:0 18px 40px -18px rgba(16,42,67,.35);border:1px solid var(--line-soft);font-size:0.75rem;color:var(--ink);pointer-events:none}

/* Rail bits reused on the calendar page */
.ds-avail-dot{width:0.5rem;height:0.5rem;border-radius:50%;flex:0 0 0.5rem}
.ds-avail-dot.ds-on{background:var(--green-tx)}
.ds-avail-dot.ds-off{background:#C6D2DF}
.ds-int-card{display:flex;align-items:center;gap:0.625rem;padding:0.5625rem 0.625rem;border:1px solid var(--line-soft);border-radius:0.625rem}
.ds-int-icon{width:2.125rem;height:2.125rem;border-radius:0.5625rem;display:grid;place-items:center;background:#fff;border:1px solid var(--line-soft)}
.ds-booking-input{flex:1;min-width:0;background:var(--field);border:1px solid var(--line-soft);border-radius:0.5rem;
  padding:0.5rem 0.625rem;font-size:0.75rem;color:var(--muted)}
.ds-copy-btn{width:2.25rem;height:2.25rem;border-radius:0.5rem;border:1px solid var(--line);background:#fff;display:grid;
  place-items:center;color:var(--muted);cursor:pointer}
.ds-copy-btn:hover{background:var(--field)}

/* Calendar page adaptations. */
.ds-calendar-page .ds-dash-head{display:flex;align-items:center;margin-bottom:1rem}
.ds-cal-legend{display:flex;align-items:center;gap:1rem;margin-top:0.875rem;padding-top:0.75rem;
  border-top:1px solid var(--line-soft);flex-wrap:wrap}
.ds-legend-t{font-size:0.6875rem;font-weight:600;letter-spacing:.05em;text-transform:uppercase;color:var(--faint)}
.ds-legend-i{display:inline-flex;align-items:center;gap:0.4375rem;font-size:0.75rem;color:var(--muted)}
.ds-legend-i i{width:0.75rem;height:0.75rem;border-radius:0.1875rem;display:inline-block}
.ds-legend-div{width:1px;height:0.875rem;background:var(--line)}
.ds-legend-mod{font-size:0.75rem;color:var(--muted)}
.ds-legend-mod s{color:var(--faint)}
.ds-avl-list{display:flex;flex-direction:column}
.ds-avl-row{display:flex;align-items:center;gap:0.5625rem;font-size:0.7812rem;padding:0.4375rem 0;
  border-bottom:1px solid var(--line-soft)}
.ds-avl-row:last-child{border-bottom:none;padding-bottom:0.125rem}
.ds-avl-day{font-weight:600;color:var(--ink);width:2rem;flex:0 0 2rem}
.ds-avl-hours{color:var(--ink);font-weight:600;font-variant-numeric:tabular-nums}
.ds-avl-hours.ds-avl-off{color:var(--faint);font-weight:400}
.ds-avl-more{font-size:0.625rem;font-weight:600;color:var(--faint);background:var(--field);border-radius:6.1875rem;padding:0.0625rem 0.4375rem;cursor:default}
.ds-int-list{display:flex;flex-direction:column;gap:0.5rem}
.ds-int-meta{flex:1;min-width:0}
.ds-int-name{font-size:0.7812rem;font-weight:600;color:var(--ink)}
.ds-int-sub{font-size:0.6875rem;color:var(--faint)}

/* Generic flex spacer (the prototype scoped it per-context). */
.ds-sp{flex:1}

/* ============================================================
   Legacy-page harmonization: inside the ds shell, the previous
   cw-* components take on the Soft UI look so unported sections
   (packages, invoices, library, contracts, reports, deep pages)
   sit comfortably on the canvas until their full redesign.
   ============================================================ */
.ds-shell .cw-card{border:none;border-radius:0.75rem;box-shadow:0 2px 10px -2px rgba(16,42,67,.10);transform:translateZ(0)}
.ds-shell .cw-table thead th{font-size:0.6562rem;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--faint)}
.ds-shell .cw-badge{border-radius:0.5rem;font-weight:600}
.ds-shell .cw-topnav{display:none} /* safety: old topbar partial is never rendered, but just in case */
.ds-shell h1.text-2xl{font-family:var(--sans);letter-spacing:-.01em;color:var(--ink)}

/* Kaminari pagination, ds skin */
.ds-shell nav.pagination{display:flex;gap:0.375rem;align-items:center;justify-content:center;margin:1.125rem 0 0.375rem;font-size:0.8125rem}
.ds-shell nav.pagination span.page a,
.ds-shell nav.pagination span.page.gap,
.ds-shell nav.pagination span.first a,.ds-shell nav.pagination span.prev a,
.ds-shell nav.pagination span.next a,.ds-shell nav.pagination span.last a{
  display:inline-flex;align-items:center;justify-content:center;min-width:2rem;height:2rem;padding:0 0.5625rem;
  border-radius:0.5rem;background:var(--card);border:1px solid var(--line);color:var(--muted);text-decoration:none;font-weight:600}
.ds-shell nav.pagination span.page a:hover{background:var(--field);color:var(--ink)}
.ds-shell nav.pagination span.page.current{display:inline-flex;align-items:center;justify-content:center;min-width:2rem;height:2rem;
  padding:0 0.5625rem;border-radius:0.5rem;background:var(--cta);color:#fff;font-weight:700}

/* Drawers go full-width on small screens. */
@media(max-width:640px){
  .ds-drawer{width:100vw;max-width:100vw}
}

/* Below the old prototype floor (840px) the wide ledgers/lists collapse to
   essentials: name + status + menu for clients, time + client + menu for
   sessions. Net-new responsive tier the prototype never defined. */
@media(max-width:840px){
  .ds-crow{grid-template-columns:minmax(0,1fr) auto auto!important;gap:0.625rem}
  .ds-crow .ds-cnts,.ds-crow .ds-company-cell,.ds-crow .ds-st-wrap:has(.ds-tychip),
  .ds-crow .ds-ls-cell,.ds-crow .ds-next-cell,.ds-crow .ds-prog,
  .ds-crow-head .ds-h-cnts,.ds-crow-head .ds-h-company,.ds-crow-head .ds-h-type,
  .ds-crow-head .ds-h-last,.ds-crow-head .ds-h-next,.ds-crow-head .ds-h-prog{display:none!important}
  .ds-srow{grid-template-columns:auto minmax(0,1fr) auto auto!important;gap:0.625rem}
  .ds-srow .ds-company-cell,.ds-srow .ds-st-wrap:has(.ds-typill),.ds-srow .ds-sn-cell,.ds-srow .ds-srow-go,
  .ds-srow-head .ds-h-company,.ds-srow-head .ds-h-stype,.ds-srow-head .ds-h-snotes{display:none!important}
  .ds-sess-layout{grid-template-columns:1fr}
  .ds-stats{grid-template-columns:repeat(2,1fr)!important}
  .ds-dash-grid{grid-template-columns:1fr!important}
}

/* Phone-width stat tiles. */
@media(max-width:640px){
  .ds-stats{grid-template-columns:1fr 1fr!important;gap:0.625rem}
  .ds-stat{padding:0.75rem}
  .ds-stat .ds-lab{white-space:normal}
  /* Schedule card: tighten the 7-day strip and the row grid; drop the countdown
     + "Up next" label first (Join stays) so a phone row never overflows. */
  .ds-dsch-card{height:clamp(22.5rem,52vh,27.5rem)}
  .ds-week{gap:0.1875rem}
  .ds-wd-l{font-size:0.5938rem}
  .ds-wd-n{font-size:0.9375rem}
  /* Phone: drop the fixed grid — let the name size to content, keep the meta to
     just the duration (hide the type/channel), and flow it right after the name. */
  .ds-ap-link{display:flex;column-gap:0.5625rem;grid-template-columns:none}
  .ds-ap-tag,.ds-ap-time,.ds-ap-avw,.ds-ap-right{flex:0 0 auto}
  .ds-ap-nm{flex:1 1 auto;min-width:0}
  .ds-ap-t{display:none}   /* narrow card: keep the name, drop the duration/type */
  .ds-ap-tag{width:1.375rem;height:1.375rem;border-radius:0.375rem}
  .ds-ap-tag svg{width:0.75rem;height:0.75rem}
  .ds-ap-avw .ds-av{width:2.25rem;height:2.25rem}
  .ds-ap-in,.ds-ap-nextlbl{display:none}
}

/* ds-gbtn promoted to a standalone component (the prototype only styled it
   inside .dr-editbar; the app uses it in modal footers, empty states and
   banners too — the charter exposed the gap). */
.ds-gbtn{display:inline-flex;align-items:center;justify-content:center;gap:0.5rem;height:var(--btn-h);min-width:var(--btn-minw);padding:0 1.125rem;
  border-radius:var(--r-btn);font-weight:600;font-size:0.875rem;cursor:pointer;transition:background .14s;text-decoration:none}
.ds-gbtn svg{width:1rem;height:1rem}
.ds-gbtn.ds-ghost{border:1px solid var(--line);background:#fff;color:var(--ink)}
.ds-gbtn.ds-ghost:hover{background:var(--line-soft)}
.ds-gbtn.ds-dark{background:var(--cta);color:#fff}
.ds-gbtn.ds-dark:hover{background:var(--cta-press)}
.ds-gbtn.ds-danger{background:#C0392B;color:#fff}
.ds-gbtn.ds-danger:hover{background:#A93226}
/* Compact variant for inline row actions (Add time slot, Change photo, …).
   Footer/primary buttons keep the full 40px/150px geometry. */
.ds-gbtn.ds-sm{height:2rem;min-width:0;padding:0 0.75rem;font-size:0.7812rem;border-radius:0.5rem}
.ds-gbtn.ds-sm svg{width:0.875rem;height:0.875rem}

/* ============================================================
   Settings modal + settings components (net-new for the
   settings revamp; tokens only — no new colors).
   ============================================================ */

/* ---- Toggle switch ---- */
.ds-switch{display:inline-flex;align-items:center;cursor:pointer;flex:0 0 auto}
.ds-switch input{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
.ds-switch-track{position:relative;width:2.5rem;height:1.375rem;border-radius:6.1875rem;background:var(--line);transition:background .18s;flex:0 0 2.5rem}
.ds-switch-track::after{content:"";position:absolute;top:0.125rem;left:0.125rem;width:1.125rem;height:1.125rem;border-radius:50%;background:#fff;
  box-shadow:0 1px 3px rgba(16,42,67,.25);transition:transform .18s}
.ds-switch input:checked+.ds-switch-track{background:var(--active-tx)}
.ds-switch input:checked+.ds-switch-track::after{transform:translateX(1.125rem)}
.ds-switch input:focus-visible+.ds-switch-track{box-shadow:0 0 0 4px rgba(17,115,194,.10)}
.ds-switch:hover .ds-switch-track{filter:brightness(.96)}
.ds-switch input:disabled+.ds-switch-track{opacity:.45;cursor:default}
.ds-switch.ds-sm .ds-switch-track{width:2rem;height:1.125rem;flex:0 0 2rem}
.ds-switch.ds-sm .ds-switch-track::after{width:0.875rem;height:0.875rem}
.ds-switch.ds-sm input:checked+.ds-switch-track::after{transform:translateX(0.875rem)}

/* ---- Icon button (row actions: edit/delete/close) ---- */
.ds-ibtn{width:2rem;height:2rem;border-radius:0.5rem;display:grid;place-items:center;color:var(--muted);transition:.14s;flex:0 0 2rem}
.ds-ibtn:hover{background:var(--line-soft);color:var(--ink)}
.ds-ibtn svg{width:1rem;height:1rem}
.ds-ibtn.ds-danger:hover{background:#FBEAE7;color:#C0392B}

/* ---- Wide modal shell with a vertical tab rail ----
   .ds-set-tab is deliberately NOT .ds-nav-item: the sidebar's .ds-mini mode
   restyles .ds-nav-item globally and would collapse the modal tabs. */
.ds-box.ds-set-box{width:min(62.5rem,100%);height:85vh;padding:0}
.ds-set-head{display:flex;align-items:center;gap:0.625rem;padding:0.875rem 1.5rem;border-bottom:1px solid var(--line);flex:0 0 auto}
.ds-set-head svg{width:1.25rem;height:1.25rem;color:var(--muted)}
.ds-set-head h2{font-size:1.0625rem;font-weight:700;letter-spacing:-.01em;margin:0}
.ds-set-body{flex:1;min-height:0;display:flex}
.ds-set-rail{flex:0 0 13.5rem;display:flex;flex-direction:column;gap:0.125rem;padding:0.75rem;border-right:1px solid var(--line);overflow-y:auto}
.ds-set-tab{display:flex;align-items:center;gap:0.6875rem;width:100%;text-align:left;padding:0.5625rem 0.75rem;border-radius:0.625rem;
  color:var(--muted);font-size:0.8438rem;font-weight:600;transition:.15s;white-space:nowrap;text-decoration:none}
.ds-set-tab svg{width:1.0625rem;height:1.0625rem;flex:0 0 1.0625rem}
.ds-set-tab:hover{background:var(--line-soft);color:var(--ink)}
.ds-set-tab.ds-on{background:var(--active-grad);color:var(--ink)}
.ds-set-content{flex:1;min-width:0;overflow-y:auto;padding:1.25rem 1.75rem 1.5rem}
@media(max-width:840px){
  .ds-box.ds-set-box{height:92vh}
  .ds-set-body{flex-direction:column}
  .ds-set-rail{flex:0 0 auto;flex-direction:row;overflow-x:auto;border-right:none;border-bottom:1px solid var(--line);padding:0.625rem 0.75rem}
  .ds-set-tab{width:auto}
}
/* Nested modal opened while a .ds-modal is already up (crop, block-time-off). */
.ds-modal.ds-above{z-index:120}
.ds-set-box .ds-m-foot{border-top:1px solid var(--line);padding:0.8125rem 1.5rem}

/* ---- Tab content: title + section headings + label/control rows ---- */
.ds-set-title{font-size:1.1875rem;font-weight:700;letter-spacing:-.01em;color:var(--ink)}
.ds-set-sub{font-size:0.8125rem;color:var(--muted);margin-top:0.25rem}
.ds-set-sec{margin:1.25rem 0 0.125rem}
.ds-set-sec .ds-bk-sub{margin-bottom:0.125rem}
.ds-set-desc{font-size:0.7812rem;color:var(--muted);margin:0.125rem 0 0}

/* Account & Security — danger zone (request account deletion) */
.ds-bk-sub.ds-set-danger{color:#C0392B}
.ds-set-danger-box{margin-top:0.75rem;padding:1rem 1.125rem;border:1px solid #F1D4CF;background:#FCF3F1;border-radius:0.75rem}
.ds-set-danger-lead{font-size:0.875rem;font-weight:600;color:var(--ink);margin:0 0 0.25rem}
.ds-set-danger-note{font-size:0.8125rem;color:var(--muted);line-height:1.5;margin:0 0 0.875rem}
/* Account tab fills the content height so the danger zone can be pinned to the
   bottom, with the spacer absorbing the slack. The frame chain (content →
   turbo-frame → account root) must stretch for the flex to reach the spacer. */
.ds-set-content > turbo-frame#settings_content:has(.ds-set-account){display:flex;flex-direction:column;min-height:100%}
.ds-set-account{display:flex;flex-direction:column;flex:1;min-height:100%}
.ds-set-account-spacer{flex:1 1 auto;min-height:1.5rem}
.ds-set-row{display:grid;grid-template-columns:12.5rem minmax(0,1fr);gap:0.5rem 1.5rem;align-items:center;padding:0.625rem 0;border-top:1px solid var(--line-soft)}
.ds-set-row.ds-top{align-items:start}
.ds-set-row.ds-top .ds-set-lblw{padding-top:0.625rem}
.ds-set-lbl{font-size:0.8438rem;font-weight:600;color:var(--ink)}
.ds-set-hint{font-size:0.75rem;color:var(--faint);margin-top:0.1875rem;line-height:1.45}
.ds-set-ctl{max-width:24rem;min-width:0}
.ds-pair{display:flex;gap:0.625rem}
.ds-pair>*{flex:1;min-width:0}
.ds-pair .ds-dash{align-self:center;color:var(--faint);flex:0 0 auto}
.ds-set-stack{display:flex;flex-direction:column;gap:0.625rem}
.ds-f-hint-row{display:flex;align-items:center;gap:0.3125rem}
.ds-set-lbl svg{color:var(--faint);flex:0 0 auto}
/* indented dependent rows (per-feature beta toggles) */
.ds-set-subrows{margin-left:0.375rem;padding-left:1rem;border-left:2px solid var(--line-soft)}
@media(max-width:640px){.ds-set-row{grid-template-columns:1fr}}
/* Dense settings lists: 40px controls (the 46px modal default reads airy here) */
.ds-set-row .ds-field input{height:2.5rem;border-radius:0.625rem}
.ds-set-row .ds-lsel-btn{height:2.5rem;border-radius:0.625rem}
.ds-slot .ds-field input{height:2.5rem;border-radius:0.625rem}
.ds-slot .ds-time-chev{top:0.25rem}
:where(.ds-field) input:disabled{color:var(--faint);background:var(--line-soft);cursor:not-allowed}

/* ---- Lazy-frame loading state ---- */
.ds-set-loading{display:flex;flex-direction:column;align-items:center;gap:0.75rem;padding:4.375rem 0;color:var(--muted);font-size:0.8438rem}
.ds-spin{width:1.75rem;height:1.75rem;border-radius:50%;border:3px solid var(--line-soft);border-top-color:var(--active-tx);animation:dsspin .8s linear infinite}
@keyframes dsspin{to{transform:rotate(360deg)}}

/* ---- In-frame flash + empty state ---- */
.ds-flash{border-radius:0.625rem;padding:0.75rem 1rem;font-size:0.8438rem;font-weight:600;margin-bottom:1rem}
.ds-flash.ds-ok{background:var(--green-bg);color:var(--green-tx)}
.ds-flash.ds-err{background:#FBEAE7;color:#C0392B}
.ds-set-empty{display:flex;flex-direction:column;align-items:center;text-align:center;padding:2.75rem 1.25rem}
.ds-set-empty>svg{width:2.375rem;height:2.375rem;color:var(--faint);opacity:.6;margin-bottom:0.75rem}
.ds-set-empty .ds-t{font-size:0.875rem;font-weight:700;color:var(--ink)}
.ds-set-empty .ds-s{font-size:0.7812rem;color:var(--muted);margin:0.25rem 0 1rem}

/* ---- Profile: avatar block + crop sub-modal ---- */
.ds-set-avatar{display:flex;align-items:center;gap:1rem;padding-bottom:0.875rem}
.ds-set-av{width:3.5rem;height:3.5rem;border-radius:50%;object-fit:cover;flex:0 0 3.5rem}
.ds-set-av-fallback{width:3.5rem;height:3.5rem;border-radius:50%;flex:0 0 3.5rem;display:grid;place-items:center;
  background:linear-gradient(140deg,#5FA8DC,#1173C2);color:#fff;font-weight:700;font-size:1.125rem}
.ds-crop-wrap{max-height:50vh;overflow:hidden;background:#17181C}
.ds-crop-wrap img{display:block;max-width:100%}
.ds-crop-tools{display:flex;align-items:center;justify-content:center;gap:0.25rem;padding:0.625rem 1rem;border-top:1px solid var(--line-soft)}
.ds-crop-div{width:1px;height:1.25rem;background:var(--line);margin:0 0.375rem}

/* ---- Availability: day rows, slot cards, time-picker popup ---- */
.ds-day{padding:0.6875rem 0;border-top:1px solid var(--line-soft)}
.ds-day-head{display:flex;align-items:center;justify-content:space-between;gap:0.625rem;margin-bottom:0.625rem}
.ds-day-name{font-size:0.8438rem;font-weight:700;color:var(--ink)}
.ds-day-acts{display:flex;align-items:center;gap:0.375rem}
.ds-slots{display:flex;flex-direction:column;gap:0.5rem}
.ds-slot{display:flex;align-items:center;gap:0.75rem;padding:0.625rem 0.75rem;background:var(--field);border:1px solid var(--line-soft);border-radius:0.75rem}
.ds-slot-grid{flex:1;display:grid;grid-template-columns:1fr 1fr;gap:0.75rem;min-width:0}
.ds-slot .ds-field input{background:#fff}
/* ds skin for the 15-min time dropdown (time-picker / datetime-split popups) */
.ds-tp-pop{position:absolute;z-index:50;top:calc(100% + 0.375rem);left:0;width:8.25rem;max-height:13.5rem;overflow-y:auto;background:#fff;
  border:1px solid var(--line);border-radius:0.625rem;box-shadow:0 18px 40px -18px rgba(16,42,67,.35);padding:0.3125rem}
.ds-tp-opt{display:block;width:100%;text-align:left;padding:0.5rem 0.6875rem;border-radius:0.4375rem;font-size:0.8125rem;font-weight:500;color:var(--ink);cursor:pointer}
.ds-tp-opt:hover{background:var(--line-soft)}
.ds-tp-opt.ds-on{background:var(--active);color:var(--active-tx);font-weight:600}
.ds-exc{display:flex;align-items:center;justify-content:space-between;gap:0.75rem;padding:0.6875rem 0;border-top:1px solid var(--line-soft)}
.ds-exc-t{font-size:0.8438rem;font-weight:600;color:var(--ink)}
.ds-exc-r{font-size:0.75rem;color:var(--faint);margin-top:0.125rem}

/* ---- Popover extras (header + checkbox rows for copy-times) ---- */
.ds-pop.ds-copy-pop{top:2.375rem;width:14rem}
.ds-pop-h{font-size:0.6562rem;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--faint);padding:0.4375rem 0.625rem 0.375rem}
.ds-pop label.ds-pop-check{display:flex;align-items:center;gap:0.5625rem;padding:0.5rem 0.625rem;border-radius:0.5rem;font-size:0.8438rem;
  color:var(--ink);font-weight:500;cursor:pointer;justify-content:flex-start}
.ds-pop label.ds-pop-check:hover{background:var(--line-soft)}
.ds-pop-check input{accent-color:var(--active-tx);width:0.9375rem;height:0.9375rem;cursor:pointer;flex:0 0 0.9375rem}
.ds-pop-foot{padding:0.375rem 0.25rem 0.125rem}
.ds-pop-foot .ds-gbtn{width:100%}

/* ---- Categories: cards, color swatches, default pill, inline add ---- */
.ds-cat{margin-bottom:1.375rem}
.ds-cat-head{display:flex;align-items:center;justify-content:space-between;gap:0.625rem;padding-bottom:0.5rem;border-bottom:1px solid var(--line)}
.ds-cat-title{display:flex;align-items:center;gap:0.5rem;font-size:0.8125rem;font-weight:700;color:var(--ink)}
.ds-cat-title svg{width:1rem;height:1rem;color:var(--muted)}
.ds-cat-n{font-size:0.75rem;color:var(--faint);white-space:nowrap}
.ds-cat-row{display:flex;align-items:center;gap:0.75rem;padding:0.375rem 0.25rem;border-bottom:1px solid var(--line-soft)}
.ds-cat-name{flex:1;min-width:0;font-size:0.8438rem;color:var(--ink)}
.ds-cat-lock{width:2rem;display:grid;place-items:center;color:var(--faint);flex:0 0 2rem}
.ds-cat-lock svg{width:0.9375rem;height:0.9375rem}
.ds-swatch{width:1.25rem;height:1.25rem;border-radius:50%;flex:0 0 1.25rem;border:1px solid rgba(16,42,67,.12);cursor:pointer;transition:transform .12s;padding:0}
.ds-swatch:hover{transform:scale(1.12)}
.ds-swatch-pop{position:absolute;z-index:40;top:calc(100% + 0.375rem);left:0;background:#fff;border:1px solid var(--line);border-radius:0.625rem;
  box-shadow:0 18px 40px -18px rgba(16,42,67,.35);padding:0.625rem;display:flex;flex-wrap:wrap;gap:0.4375rem;width:11rem}
.ds-swatch-pop form{display:contents}
.ds-swatch-opt{width:1.25rem;height:1.25rem;border-radius:50%;cursor:pointer;padding:0;transition:transform .12s}
.ds-swatch-opt:hover{transform:scale(1.2)}
.ds-swatch-opt.ds-on{box-shadow:0 0 0 2px #fff,0 0 0 3px var(--active-tx)}
.ds-defpill{font-size:0.6875rem;font-weight:700;padding:0.1875rem 0.5625rem;border-radius:6.1875rem;white-space:nowrap;text-decoration:none;transition:.12s}
.ds-defpill.ds-on{background:var(--active);color:var(--active-tx)}
.ds-defpill.ds-on:hover{background:#D3E8F9}
.ds-defpill.ds-off{background:var(--field);color:var(--faint)}
.ds-defpill.ds-off:hover{background:var(--line-soft);color:var(--muted)}
.ds-cat-add{display:flex;align-items:center;gap:0.5625rem;padding:0.625rem 0.25rem 0}
.ds-cat-add>svg{width:0.9375rem;height:0.9375rem;color:var(--faint);flex:0 0 0.9375rem}
.ds-cat-add input[type=text]{flex:1;min-width:0;border:none;background:none;outline:none;font-size:0.8438rem;color:var(--ink);padding:0.375rem 0;font-family:inherit}
.ds-cat-add input[type=text]::placeholder{color:var(--faint)}

/* ---- Templates: list rows ---- */
.ds-tpl{display:flex;align-items:flex-start;justify-content:space-between;gap:0.875rem;padding:0.75rem 0.125rem;border-bottom:1px solid var(--line-soft)}
.ds-tpl-body{flex:1;min-width:0}
.ds-tpl-name{font-size:0.875rem;font-weight:700;color:var(--ink)}
.ds-tpl-meta{font-size:0.75rem;color:var(--faint);margin-top:0.125rem}
.ds-tpl-prev{font-size:0.7812rem;color:var(--muted);margin-top:0.5rem;line-height:1.5;white-space:pre-wrap;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.ds-tpl-acts{display:flex;gap:0.25rem;flex:0 0 auto;opacity:0;transition:opacity .14s}
.ds-tpl:hover .ds-tpl-acts{opacity:1}

/* ---- Inline "?" help with hover tooltip (ds_hint helper) ----
   Replaces explanatory sub-text next to labels so dense lists stay compact.
   The bubble itself is rendered by the global `tooltip` controller (.ds-tooltip
   below); .ds-hint only styles the trigger icon. */
.ds-hint{position:relative;display:inline-flex;align-items:center;margin-left:0.375rem;vertical-align:-2px;color:var(--faint);cursor:help}
.ds-hint svg{width:0.875rem;height:0.875rem;color:inherit;flex:0 0 0.875rem}
.ds-hint:hover{color:var(--muted)}

/* ---- Global DS tooltip bubble (tooltip_controller.js) ----
   One reusable position:fixed node, so it never clips inside overflow
   containers. Driven by any [data-tip] or migrated native [title]. */
.ds-tooltip{position:fixed;z-index:9999;pointer-events:none;max-width:16.25rem;
  background:linear-gradient(180deg,#2E4A66 0%,var(--ink) 100%);color:#fff;
  font-size:0.75rem;font-weight:500;line-height:1.5;padding:0.5625rem 0.75rem;border-radius:0.625rem;
  border:1px solid rgba(255,255,255,.06);
  box-shadow:0 14px 34px -10px rgba(16,42,67,.5),0 2px 6px -2px rgba(16,42,67,.3);
  opacity:0;transform:translateY(0.25rem) scale(.97);transform-origin:center bottom;
  transition:opacity .16s ease,transform .16s cubic-bezier(.16,1,.3,1);
  white-space:normal;text-align:left;text-transform:none;letter-spacing:normal}
.ds-tooltip.ds-tooltip-on{opacity:1;transform:translateY(0) scale(1)}
.ds-tooltip::after{content:"";position:absolute;left:var(--ds-tip-caret,50%);width:0.5625rem;height:0.5625rem;
  transform:translateX(-50%) rotate(45deg);border-radius:0.125rem}
.ds-tooltip[data-pos="above"]::after{top:100%;margin-top:-0.3125rem;background:var(--ink)}
.ds-tooltip[data-pos="below"]::after{bottom:100%;margin-bottom:-0.3125rem;background:#2E4A66}

/* ============================================================
   TASKS PAGE (/tasks) — quick-add composer,
   due buckets with drag reorder, collapsible Completed section.
   Compact (.ds-tk-compact) rows reused in drawers + session page.
   ============================================================ */
.ds-pop a{display:flex;align-items:center;justify-content:space-between;width:100%;padding:0.5625rem 0.6875rem;border-radius:0.5625rem;
  font-size:0.8438rem;color:var(--ink);font-weight:500}
.ds-pop a:hover{background:var(--line-soft)}
.ds-pop a.ds-sel{color:var(--active-tx);font-weight:600}
.ds-pop a svg{width:1rem;height:1rem}
.ds-pop-scroll{max-height:20rem;overflow-y:auto}

.ds-tasks-open{font-weight:600;color:var(--ink)}
.ds-tasks-clear{font-size:0.8125rem;font-weight:600;color:var(--active-tx);white-space:nowrap}
.ds-tasks-clear:hover{color:#0E5FA0}

/* needs-attention strip */
.ds-task-strip{margin-bottom:1rem;padding:0.875rem 1.25rem 0.375rem}
.ds-task-strip-h{display:flex;align-items:center;gap:0.5rem;font-size:0.7188rem;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:var(--amber-tx);margin-bottom:0.125rem}
.ds-task-strip .ds-nudge:last-child{border-bottom:none}

.ds-tasks-panel{padding:1rem 1.25rem 1.125rem}
.ds-tasks-empty{margin-top:1.125rem}

/* quick-add composer */
.ds-task-compose{display:flex;align-items:center;flex-wrap:wrap;gap:0.625rem;padding:0.3125rem 0.75rem;
  border:1.5px dashed #B9CFE4;border-radius:0.75rem;transition:border-color .14s}
.ds-task-compose:focus-within{border-color:var(--active-tx)}
.ds-tc-err{width:100%;font-size:0.7812rem;color:#C0392B;padding:0.25rem 0.125rem 0}
.ds-tc-plus{display:grid;place-items:center;color:var(--active-tx);flex:0 0 auto}
.ds-tc-input{flex:1;min-width:8.75rem;border:none;background:transparent;height:2.375rem;
  font-size:0.875rem;font-weight:500;color:var(--ink);outline:none}
.ds-tc-input::placeholder{color:var(--faint)}
/* Composer due-date trigger (shared due-picker field), sized for the one-line composer. */
.ds-tc-datewrap{flex:0 0 auto;width:9.25rem}
.ds-tc-datewrap .ds-due-trigger{height:2rem}
.ds-tc-datewrap .ds-date-ico{right:0.6875rem}
.ds-tc-datewrap .ds-date-ico svg{width:0.9375rem;height:0.9375rem}
.ds-tc-star{display:grid;place-items:center;width:2rem;height:2rem;border-radius:0.5rem;color:#B9CFE4;transition:.14s;cursor:pointer}
.ds-tc-star:hover{color:#E8A93C;background:var(--field)}
.ds-tc-star .ds-tcs-fill{display:none}
.ds-tc-star.ds-on .ds-tcs-fill{display:block;color:#E8A93C}
.ds-tc-star.ds-on .ds-tcs-line{display:none}
.ds-task-compose .ds-lsel{width:10.625rem}
.ds-tc-add{height:2.125rem;padding:0 1rem;border-radius:0.5625rem;background:#17181C;color:#fff;font-size:0.8125rem;font-weight:600;transition:.15s}
.ds-tc-add:hover{background:#000}
/* compact composer (drawers + session page) — same bar recipe as the notes
   composer (.ds-nc): solid border, white, soft lift, icon send button */
.ds-task-compose.ds-tc-compact{padding:0.3125rem 0.375rem 0.3125rem 0.75rem;gap:0.5rem;border:1px solid #C7D5E4;background:#fff;
  box-shadow:0 1px 2px rgba(16,42,67,.06);transition:border-color .15s,box-shadow .15s}
.ds-task-compose.ds-tc-compact:focus-within{border-color:#8FC3EC;box-shadow:0 0 0 4px rgba(17,115,194,.12)}
.ds-tc-compact .ds-tc-input{height:2.125rem;font-size:0.8438rem}
.ds-tc-compact .ds-due-trigger{border-color:transparent;background:transparent}
.ds-tc-compact .ds-due-trigger:hover{background:var(--field)}
.ds-tc-send{width:2.375rem;height:2.375rem;border-radius:0.625rem;background:var(--cta);color:#fff;display:grid;place-items:center;flex:0 0 auto;transition:background .12s}
.ds-tc-send:hover{background:var(--cta-press)}
.ds-tc-send svg{width:1.125rem;height:1.125rem}

/* bucket headers */
.ds-task-group{margin-top:1.125rem}
.ds-task-bh{display:flex;align-items:center;gap:0.5rem;font-size:0.7188rem;font-weight:700;letter-spacing:.06em;
  text-transform:uppercase;color:var(--faint);padding:0 0.25rem 0.4375rem;border-bottom:1px solid var(--line-soft)}
.ds-task-bh.ds-overdue{color:#C0392B}
.ds-task-bh-n{font-size:0.6875rem;font-weight:700;color:var(--muted);background:var(--field);border-radius:var(--pill);padding:0.0625rem 0.4375rem}

/* task rows */
.ds-task{display:flex;flex-direction:column;border-bottom:1px solid var(--line-soft)}
.ds-task:last-child{border-bottom:none}
.ds-task-main{display:flex;align-items:center;gap:0.75rem;padding:0.625rem 0.375rem;border-radius:0.625rem}
.ds-task-main:hover{background:var(--field)}
/* drag grip — reserved slot on the far left of a draggable row, revealed on row
   hover (opacity only, so the title never shifts); the grip is the grab handle */
.ds-task-grip{flex:0 0 1rem;display:grid;place-items:center;color:var(--faint);
  opacity:0;cursor:grab;transition:opacity .14s,color .14s}
.ds-task-grip svg{width:0.9375rem;height:0.9375rem}
.ds-task-main:hover .ds-task-grip{opacity:.55}
.ds-task-grip:hover{opacity:1;color:var(--muted)}
.ds-task-grip:active{cursor:grabbing}
/* while dragging, the cursor carries a solid clone of the row (.ds-drag-ghost,
   set as the drag image) and the in-list row collapses into the empty drop
   slot the other rows shift around — the row itself never fades or "moves" */
.ds-task.ds-dragging{background:var(--field);border-radius:0.625rem;border-bottom-color:transparent;
  outline:1.5px dashed #B9CFE4;outline-offset:-1.5px}
.ds-task.ds-dragging>*{visibility:hidden}
.ds-drag-ghost{position:absolute;top:-62.5rem;left:-62.5rem;z-index:999;pointer-events:none;
  background:var(--active);border-radius:0.625rem;border-bottom:none;
  box-shadow:0 14px 30px -10px rgba(16,42,67,.55),0 0 0 1.5px var(--active-tx)}
.ds-drag-ghost .ds-task-main{background:transparent}
/* keep the grip visible in the off-screen drag-image clone (never hovered) */
.ds-drag-ghost .ds-task-grip{opacity:.7}
.ds-task-check{width:1.375rem;height:1.375rem;border-radius:50%;border:2px solid #B9CFE4;display:grid;place-items:center;
  color:#fff;flex:0 0 1.375rem;transition:.14s;cursor:pointer}
.ds-task-check svg{width:0.75rem;height:0.75rem}
.ds-task-main:hover .ds-task-check,.ds-task-check:hover{border-color:var(--active-tx)}
.ds-task.ds-done .ds-task-check{background:var(--active-tx);border-color:var(--active-tx)}
.ds-task-body{flex:1;min-width:0}
.ds-task-t{font-size:0.875rem;font-weight:600;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-task.ds-done .ds-task-t{text-decoration:line-through;color:var(--muted);font-weight:500}
.ds-task-meta{display:flex;align-items:center;gap:0.375rem;font-size:0.75rem;color:var(--muted);margin-top:0.125rem;min-width:0}
.ds-task-mlink{color:var(--muted);font-weight:600}
.ds-task-mlink:hover{color:var(--active-tx)}
.ds-task-msep{color:var(--faint)}
.ds-task-mnote{display:inline-flex;align-items:center;gap:0.1875rem;color:var(--faint)}
.ds-due{font-weight:600}

/* row actions: star always visible, ⋮ menu revealed on hover */
.ds-task-actions{display:flex;align-items:center;gap:0.125rem;flex:0 0 auto}
.ds-task-actions .ds-rel{opacity:0;transition:opacity .14s}
.ds-task-main:hover .ds-task-actions .ds-rel,
.ds-tk-compact:hover .ds-task-actions .ds-rel{opacity:1}
.ds-task-actions .ds-rel:has(.ds-pop:not(.hidden)){opacity:1}
.ds-task-star{display:grid;place-items:center;width:1.875rem;height:1.875rem;border-radius:0.5rem;color:#B9CFE4;cursor:pointer;transition:.14s}
.ds-task-star:hover{color:#E8A93C;background:#fff}
.ds-task-star.ds-on{color:#E8A93C}
/* compact-row edit + delete icons — revealed on row hover, star stays visible */
.ds-task-ed,.ds-task-del{display:grid;place-items:center;width:1.875rem;height:1.875rem;border-radius:0.5rem;
  color:var(--faint);cursor:pointer;opacity:0;transition:opacity .14s,color .14s,background .14s}
.ds-task-main:hover .ds-task-ed,.ds-task-main:hover .ds-task-del{opacity:1}
.ds-task-ed:hover{color:var(--active-tx);background:#fff}
.ds-task-del:hover{color:#C0392B;background:#fff}

/* inline edit form */
.ds-task-edit{padding:0.625rem 0.375rem 0.875rem}
.ds-task-edit-form{display:flex;flex-direction:column;gap:0.5rem}
.ds-te-title{height:2.375rem;border:1px solid var(--line-soft);border-radius:0.5625rem;padding:0 0.75rem;
  font-size:0.875rem;font-weight:600;color:var(--ink);background:#fff}
.ds-te-notes{border:1px solid var(--line-soft);border-radius:0.5625rem;padding:0.5rem 0.75rem;font-size:0.8125rem;
  color:var(--ink);resize:vertical;background:#fff}
.ds-te-row{display:flex;align-items:center;gap:0.625rem;flex-wrap:wrap}
.ds-te-row .ds-sp{flex:1}
.ds-te-row .ds-lsel{width:11.875rem}
/* tighter action buttons in the task editor (both compact + page rows) */
.ds-task-edit-form .ds-gbtn{height:2.125rem;min-width:0;padding:0 0.875rem;font-size:0.8125rem}

/* collapsible Completed section */
.ds-task-donewrap{margin-top:1.25rem}
.ds-task-done-h{display:flex;align-items:center;gap:0.5625rem;width:100%;text-align:left;padding:0.5625rem 0.75rem;border-radius:0.625rem;
  background:var(--field);font-size:0.7812rem;font-weight:700;color:var(--muted);cursor:pointer;transition:.14s}
.ds-task-done-h:hover{color:var(--ink)}
.ds-task-done-h .ds-sg-caret{display:grid;place-items:center;transition:transform .15s}
.ds-task-done-h .ds-sg-caret svg{width:0.875rem;height:0.875rem}
.ds-task-done.ds-col .ds-task-done-h .ds-sg-caret{transform:rotate(-90deg)}
.ds-task-done .ds-task-list{padding-top:0.25rem}
.ds-task-done-more{font-size:0.75rem;color:var(--faint);padding:0.625rem 0.375rem 0}

/* pagination — shared across sessions / clients / contracts / invoices.
   Square-ish tokenised controls that sit on the design-system palette. */
.ds-pag{margin-top:1.25rem;display:flex;align-items:center;justify-content:space-between;gap:1rem;flex-wrap:wrap}
.ds-pag-count{font-size:0.8125rem;color:var(--muted)}
.ds-pag-count b{font-weight:700;color:var(--ink)}
.ds-pag-nav{display:flex;align-items:center;gap:0.375rem;flex-wrap:wrap}
.ds-pag-item{display:inline-flex;align-items:center;justify-content:center;height:2.25rem;min-width:2.25rem;padding:0 0.6875rem;
  border-radius:var(--r-btn);border:1px solid var(--line);background:#fff;
  font-size:0.8125rem;font-weight:600;color:var(--ink);text-decoration:none;transition:.14s;
  font-variant-numeric:tabular-nums}
.ds-pag-item:hover{background:var(--field);border-color:var(--faint)}
.ds-pag-item.ds-on{background:var(--cta);border-color:var(--cta);color:#fff;cursor:default}
.ds-pag-item.ds-on:hover{background:var(--cta)}
.ds-pag-gap{display:inline-flex;align-items:flex-end;justify-content:center;height:2.25rem;min-width:1.25rem;
  color:var(--faint);font-weight:600;font-size:0.8125rem}

/* compact rows (session/client drawers + session page) — the /tasks page row
   anatomy (main row + inline edit panel), tighter, hover pencil to edit. */
.ds-tk-compact .ds-task-main{gap:0.75rem;padding:0.8125rem 0.25rem}
.ds-tk-compact .ds-task-t{white-space:normal;font-size:0.8438rem}
.ds-tk-compact .ds-task-edit{padding:0.375rem 0.5rem 0.75rem}
.ds-tk-compact .ds-te-row{flex-wrap:nowrap}
/* scoped list: OPEN / COMPLETED groups with hairline dividers between rows */
.ds-task-scoped-list .ds-section-head{margin:1.25rem 0.125rem 0.125rem}
.ds-task-scoped-list .ds-section-head:first-child{margin-top:0.125rem}
.ds-task-group .ds-task + .ds-task{border-top:1px solid var(--line-soft)}
/* star stays visible; the edit pencil hides until row hover (delete lives in
   the row menu on the /tasks page — here the drawer keeps it hover-only too) */
.ds-tk-compact .ds-task-star{opacity:1}
/* compact-row due date: calendar icon + amber text (red when overdue) */
/* due date: neutral by default (icon follows currentColor); amber once due
   today or past (.ds-due-soon), red when overdue/strictly past (.ds-over) */
.ds-tk-compact .ds-tk-due{display:inline-flex;align-items:center;gap:0.3125rem;color:var(--muted);font-weight:600}
.ds-tk-compact .ds-tk-due svg{width:0.8125rem;height:0.8125rem}
.ds-tk-compact .ds-tk-due.ds-due-soon{color:var(--amber-tx)}
.ds-tk-compact .ds-tk-due.ds-over{color:#C0392B}
.ds-tk-compact .ds-task-meta{margin-top:0.1875rem;font-size:0.7812rem}
/* edit-panel date field — the shared flatpickr field (same calendar as the
   session scheduler), opening only when clicked. */
.ds-te-datewrap{flex:0 0 auto;width:9.875rem}
.ds-te-datewrap .ds-date-ico{right:0.75rem}

.ds-task-scoped-compose{margin-top:0.75rem}

/* Quick-add docked in the client drawer footer — roomier input than the
   inline compact composer, pinned above a long task list. */
.ds-dr-footer-task .ds-tc-compact .ds-tc-input{height:2.75rem;font-size:0.875rem}
.ds-dr-footer-task .ds-tc-datewrap .ds-due-trigger{height:2.375rem}
.ds-dr-footer-task .ds-tc-star{width:2.375rem;height:2.375rem}

/* ============================== Bulk import wizard ==============================
   Full-page 4-step flow (upload → map → review → results). All colors come
   from existing tokens; the error chip reuses the .ds-inv-overdue pair. */

.ds-imports-page{display:flex;flex-direction:column;gap:1.125rem;max-width:65rem;margin:0 auto}

/* Stepper */
.ds-wiz-steps{display:flex;align-items:center;gap:0.625rem;padding:0.25rem 0.125rem;flex-wrap:wrap}
.ds-wiz-step{display:inline-flex;align-items:center;gap:0.5rem}
.ds-wiz-dot{display:inline-flex;align-items:center;justify-content:center;width:1.625rem;height:1.625rem;border-radius:50%;
  font-size:0.7812rem;font-weight:700;color:var(--muted);background:var(--panel);border:1.5px solid var(--line)}
.ds-wiz-lbl{font-size:0.8125rem;font-weight:600;color:var(--muted)}
.ds-wiz-step.ds-on .ds-wiz-dot{background:var(--cta);border-color:var(--cta);color:#fff}
.ds-wiz-step.ds-on .ds-wiz-lbl{color:var(--ink)}
.ds-wiz-step.ds-done .ds-wiz-dot{background:var(--green-bg);border-color:var(--green-bg);color:var(--green-tx)}
.ds-wiz-step.ds-done .ds-wiz-lbl{color:var(--ink)}
.ds-wiz-line{flex:0 0 1.625rem;height:1.5px;background:var(--line);border-radius:0.0625rem}
.ds-wiz-line.ds-done{background:var(--green-tx)}

/* Layout */
.ds-import-grid{display:grid;grid-template-columns:minmax(0,1fr) 18.75rem;gap:1.125rem;align-items:start}
.ds-import-main{padding:1.625rem 1.75rem}
.ds-import-wide{grid-column:1/-1}
.ds-import-side{display:flex;flex-direction:column;gap:1.125rem}
.ds-imp-title{font-size:1.1875rem;font-weight:700;color:var(--ink)}
.ds-imp-sub{font-size:0.8438rem;color:var(--muted);margin:0.25rem 0 1.125rem}
.ds-imp-hint{font-size:0.7812rem;color:var(--muted);background:var(--field);border-radius:0.5625rem;padding:0.5625rem 0.75rem;margin-bottom:1rem}
.ds-imp-foot{display:flex;justify-content:flex-end;gap:0.625rem;margin-top:1.375rem}
.ds-imp-foot .ds-sp{flex:1}

/* Kind cards */
.ds-kind-cards{display:grid;grid-template-columns:1fr 1fr;gap:0.75rem;margin-bottom:1rem}
.ds-kind-card{display:flex;align-items:center;gap:0.75rem;padding:0.875rem 1rem;border:1.5px solid var(--line);
  border-radius:var(--r-card);cursor:pointer;transition:.15s;background:var(--panel)}
.ds-kind-card:hover{border-color:var(--muted)}
.ds-kind-card:has(input:checked){border-color:var(--cta);box-shadow:0 0 0 1px var(--cta)}
.ds-kind-card input{position:absolute;opacity:0;pointer-events:none}
.ds-kind-ic{display:inline-flex;align-items:center;justify-content:center;width:2.375rem;height:2.375rem;
  border-radius:0.5625rem;background:var(--field);color:var(--ink);flex:none}
.ds-kind-tx{display:flex;flex-direction:column;gap:0.0625rem;min-width:0}
.ds-kind-tx b{font-size:0.875rem;font-weight:700;color:var(--ink)}
.ds-kind-tx small{font-size:0.75rem;color:var(--muted)}

/* Upload zone */
.ds-upload-zone{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:0.4375rem;
  min-height:11.875rem;padding:1.625rem;border:1.5px dashed var(--line);border-radius:var(--r-card);
  background:var(--field);cursor:pointer;text-align:center;transition:.15s}
.ds-upload-zone:hover,.ds-upload-zone.ds-drag{border-color:var(--cta);background:var(--panel)}
.ds-uz-ic{color:var(--muted)}
.ds-uz-main{font-size:0.9062rem;font-weight:600;color:var(--ink)}
.ds-uz-sub{font-size:0.7812rem;color:var(--muted)}
.ds-uz-file{display:inline-flex;align-items:center;gap:0.4375rem;margin-top:0.5rem;padding:0.4375rem 0.75rem;
  background:var(--panel);border:1px solid var(--line);border-radius:0.5rem;font-size:0.8125rem;font-weight:600;color:var(--ink)}

/* Side panels */
.ds-imp-tips,.ds-imp-recent{padding:1.25rem 1.375rem}
.ds-imp-tips h3,.ds-imp-recent h3{font-size:0.875rem;font-weight:700;color:var(--ink);margin-bottom:0.625rem}
.ds-imp-tips ul{display:flex;flex-direction:column;gap:0.5rem;font-size:0.7812rem;color:var(--muted);padding-left:1rem;list-style:disc}
.ds-imp-samples{display:flex;flex-direction:column;gap:0.375rem;margin-top:0.875rem}
.ds-imp-samples .ds-lnk,.ds-imp-report{display:inline-flex;align-items:center;gap:0.375rem;font-size:0.8125rem;font-weight:600;color:var(--active-tx)}
.ds-imp-recent-row{display:flex;align-items:center;gap:0.625rem;padding:0.5rem 0.375rem;border-radius:0.5625rem;color:var(--muted)}
.ds-imp-recent-row:hover{background:var(--field)}
.ds-imp-recent-tx{display:flex;flex-direction:column;min-width:0}
.ds-imp-recent-name{font-size:0.8125rem;font-weight:600;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ds-imp-recent-meta{font-size:0.7188rem;color:var(--muted)}

/* Mapping rows */
.ds-map-rows{display:flex;flex-direction:column}
.ds-map-row{display:grid;grid-template-columns:12.5rem minmax(0,18.75rem) minmax(0,1fr);gap:0.875rem;align-items:center;
  padding:0.5625rem 0;border-bottom:1px solid var(--line)}
.ds-map-row:last-child{border-bottom:0}
.ds-map-lbl{font-size:0.8438rem;font-weight:600;color:var(--ink)}
.ds-map-sample{font-size:0.75rem;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ds-map-datefmt{margin-top:0.5rem;border-top:1px solid var(--line)}

/* Progress */
.ds-imp-progress{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:0.625rem;
  min-height:18.75rem;text-align:center;grid-column:1/-1}
.ds-imp-progress h3{font-size:1.0625rem;font-weight:700;color:var(--ink)}
.ds-progress{width:min(26.25rem,100%);height:0.5rem;border-radius:6.1875rem;background:var(--field);overflow:hidden;margin-top:0.5rem}
.ds-progress-fill{height:100%;border-radius:6.1875rem;background:var(--cta);transition:width .4s ease}
.ds-imp-prog-count{font-size:0.7812rem;font-weight:600;color:var(--muted)}

/* Review */
.ds-imp-summary{display:flex;gap:0.5rem;flex-wrap:wrap;margin-bottom:0.875rem}
.ds-imp-chip{padding:0.4375rem 0.75rem;font-weight:600;font-size:0.7812rem;border-radius:0.4375rem}
.ds-imp-create{background:var(--green-bg);color:var(--green-tx)}
.ds-imp-update{background:var(--blue-bg);color:var(--blue-tx)}
.ds-imp-skip-duplicate,.ds-imp-skip-unmatched,.ds-imp-skip-excluded{background:var(--field);color:var(--muted)}
.ds-imp-error{background:#FBEBE9;color:#C0392B}
.ds-imp-options{display:flex;align-items:center;gap:1rem;flex-wrap:wrap;padding:0.75rem 0.875rem;
  background:var(--field);border-radius:var(--r-card);margin-bottom:1rem}
.ds-imp-opt-lbl{font-size:0.8125rem;font-weight:700;color:var(--ink)}
.ds-imp-opt{display:inline-flex;align-items:center;gap:0.4375rem;font-size:0.8125rem;font-weight:600;color:var(--ink);cursor:pointer}
.ds-imp-opt input{accent-color:var(--cta);width:0.9375rem;height:0.9375rem}

/* Preview tables */
.ds-prev-group{margin-bottom:1.125rem}
.ds-prev-gtitle{font-size:0.8438rem;font-weight:700;color:var(--ink);margin-bottom:0.5rem;display:flex;align-items:center;gap:0.5rem}
.ds-prev-gcount{font-size:0.7188rem;font-weight:700;color:var(--faint);background:var(--field);border-radius:var(--pill);padding:0.0625rem 0.5rem}
.ds-prev-scroll{overflow-x:auto;border:1px solid var(--line);border-radius:var(--r-card)}
.ds-prev-table{width:100%;border-collapse:collapse;font-size:0.7812rem}
.ds-prev-table th{font-size:0.6875rem;font-weight:700;text-transform:uppercase;letter-spacing:.4px;color:var(--muted);
  background:var(--field);padding:0.5rem 0.625rem;text-align:left;white-space:nowrap}
.ds-prev-table td{padding:0.5rem 0.625rem;border-top:1px solid var(--line);color:var(--ink);white-space:nowrap;max-width:13.75rem;
  overflow:hidden;text-overflow:ellipsis}
.ds-prev-num{color:var(--faint);width:2.5rem}
.ds-prev-check{width:2.125rem}
.ds-prev-check input{accent-color:var(--cta);width:0.9375rem;height:0.9375rem}
.ds-prev-reason{color:var(--muted);max-width:17.5rem}
.ds-prev-more{font-size:0.7812rem;color:var(--muted);margin-top:0.375rem}
.ds-imp-results-foot{align-items:center}

@media (max-width:900px){
  .ds-import-grid{grid-template-columns:1fr}
  .ds-kind-cards{grid-template-columns:1fr}
  .ds-map-row{grid-template-columns:1fr;gap:0.375rem;align-items:start}
  .ds-map-sample{display:none}
  .ds-imp-foot{flex-wrap:wrap}
}

/* Split button: primary action + attached chevron opening a small menu
   (used for New client / New session with their "Import from a file" entry).
   The main half mirrors .ds-btn-new exactly; only the radius is split. */
.ds-btn-split{display:inline-flex;position:relative}
.ds-bs-main{display:inline-flex;align-items:center;justify-content:center;gap:0.5rem;height:var(--btn-h);
  min-width:calc(var(--btn-minw) - 2.125rem);padding:0 1.125rem;background:var(--cta);color:#fff;font-weight:600;
  font-size:0.875rem;border-radius:var(--r-btn) 0 0 var(--r-btn);transition:.15s}
.ds-bs-main:hover{background:var(--cta-press)}
.ds-bs-main svg{width:1rem;height:1rem}
.ds-bs-more{display:inline-flex;align-items:center;justify-content:center;width:2.125rem;height:var(--btn-h);
  background:var(--cta);color:#fff;border-left:1px solid rgba(255,255,255,.25);
  border-radius:0 var(--r-btn) var(--r-btn) 0;transition:.15s}
.ds-bs-more:hover{background:var(--cta-press)}
.ds-bs-more svg{width:0.875rem;height:0.875rem}
.ds-btn-split.ds-ghost .ds-bs-main,
.ds-btn-split.ds-ghost .ds-bs-more{background:#fff;color:var(--ink);border:1px solid var(--line)}
.ds-btn-split.ds-ghost .ds-bs-main{border-right:0}
.ds-btn-split.ds-ghost .ds-bs-main:hover,
.ds-btn-split.ds-ghost .ds-bs-more:hover{background:var(--line-soft)}
.ds-bs-pop{top:calc(var(--btn-h) + 0.375rem);min-width:16.25rem;padding:0.375rem}
.ds-bs-pop a{display:flex;align-items:center;justify-content:flex-start;gap:0.625rem;width:100%;padding:0.5625rem 0.6875rem;
  border-radius:0.5625rem;font-size:0.8438rem;font-weight:500;color:var(--ink)}
.ds-bs-pop a:hover{background:var(--line-soft)}
.ds-bs-pop a svg{width:1rem;height:1rem;flex:0 0 1rem;color:var(--muted)}
.ds-empty-state .ds-es-import{margin-top:0.625rem}

/* ============ Auth pages (beta request / public forms) ============
   The authentication layout opts a page in with `content_for :ds_auth` —
   the body then wears .ds-shell (tokens) + .ds-auth, which swaps the
   dashboard shell's fixed flex layout for a scrollable centered column. */
.ds-shell.ds-auth{display:block;height:auto;min-height:100vh;overflow:auto}
.ds-auth-wrap{min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;padding:2.75rem 1rem 3.5rem}
.ds-auth-logo{display:block;margin-bottom:1.625rem}
.ds-auth-logo img{height:2.75rem;width:auto;display:block}
.ds-auth-card{width:100%;max-width:35rem;background:var(--panel);border-radius:1rem;
  box-shadow:0 2px 10px -2px rgba(16,42,67,.10);padding:2rem 2.5rem 1.75rem}
.ds-auth-head{display:flex;flex-direction:column;align-items:center;text-align:center;margin-bottom:1.25rem}
.ds-auth-hero{width:3.25rem;height:3.25rem;border-radius:0.9375rem;background:var(--active);color:var(--active-tx);
  display:grid;place-items:center;margin-bottom:0.875rem}
.ds-auth-hero svg{width:1.5rem;height:1.5rem}
.ds-auth-hero.ds-green{background:var(--green-bg);color:var(--green-tx)}
.ds-auth-badge{display:inline-flex;align-items:center;gap:0.4375rem;background:var(--amber-bg);color:var(--amber-tx);
  font-size:0.7188rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;border-radius:0.5rem;padding:0.25rem 0.625rem;margin-bottom:0.625rem}
.ds-auth-badge i{width:0.375rem;height:0.375rem;border-radius:50%;background:currentColor}
.ds-auth-head h1{font-size:1.5rem;font-weight:700;letter-spacing:-.01em;color:var(--ink);margin:0 0 0.375rem}
.ds-auth-sub{font-size:0.875rem;color:var(--muted);line-height:1.6;margin:0;max-width:26.25rem}
.ds-auth-form{display:flex;flex-direction:column;gap:0.75rem}
.ds-auth-form .ds-field label{margin-bottom:0.3125rem}
.ds-auth-form .ds-field input,.ds-auth-form .ds-lsel-btn{height:2.75rem}
.ds-auth-2col{display:grid;grid-template-columns:1fr 1fr;gap:0.75rem}
.ds-auth-alert{display:flex;align-items:center;gap:0.625rem;background:#FBEBE9;color:#C43D3D;
  border-radius:0.625rem;padding:0.75rem 0.875rem;font-size:0.8438rem;font-weight:600;line-height:1.45}
.ds-auth-alert svg{width:1.125rem;height:1.125rem;flex:0 0 1.125rem}
/* multi-message variant (devise error lists) */
.ds-auth-alert ul{margin:0;padding-left:1.0625rem;display:flex;flex-direction:column;gap:0.1875rem}
.ds-auth-alert:has(ul){align-items:flex-start}
.ds-auth-alert:has(ul) svg{margin-top:0.0625rem}
.ds-auth-form .ds-btn-dark{margin-top:0.375rem}
.ds-auth-fine{font-size:0.7812rem;color:var(--faint);text-align:center;line-height:1.55;margin:0}
.ds-auth-body{display:flex;flex-direction:column;gap:0.875rem;font-size:0.875rem;color:var(--muted);line-height:1.65;text-align:center}
.ds-auth-body b{color:var(--ink);font-weight:700}
.ds-auth-note{background:var(--field);border-radius:0.625rem;padding:0.75rem 1rem;font-size:0.8125rem}
.ds-auth-alt{margin-top:1.25rem;padding-top:1rem;border-top:1px solid var(--line-soft);
  text-align:center;font-size:0.875rem;color:var(--muted)}
.ds-auth-alt a{color:var(--active-tx);font-weight:700;text-decoration:none;margin-left:0.25rem}
.ds-auth-alt a:hover{text-decoration:underline}
/* sign-in extras: social buttons, divider, role segments, remember-me row, eye */
.ds-auth-social{display:flex;justify-content:center;gap:0.75rem;margin-bottom:1.25rem}
.ds-auth-social button{width:3rem;height:3rem;border:1px solid var(--line);border-radius:0.75rem;background:#fff;
  display:grid;place-items:center;color:var(--muted);transition:.15s}
.ds-auth-social button:hover{background:var(--line-soft);color:var(--ink)}
.ds-auth-social svg{width:1.25rem;height:1.25rem}
.ds-auth-div{display:flex;align-items:center;gap:0.875rem;margin-bottom:1.25rem;
  font-size:0.75rem;font-weight:600;color:var(--faint)}
.ds-auth-div::before,.ds-auth-div::after{content:"";flex:1;height:1px;background:var(--line-soft)}
/* role segments mirror the dashboard week strip: blue --active container,
   white selected pill on a soft navy shadow, blue accent on the rest */
.ds-auth-roles{display:flex;gap:0.25rem;background:var(--active);border-radius:0.75rem;padding:0.25rem}
.ds-auth-roles label{flex:1;cursor:pointer}
.ds-auth-roles input{display:none}
.ds-auth-roles span{display:flex;align-items:center;justify-content:center;gap:0.5rem;height:2.375rem;border-radius:0.5625rem;
  font-size:0.8438rem;font-weight:700;color:var(--active-tx);transition:.14s}
.ds-auth-roles span:hover{background:rgba(255,255,255,.5)}
.ds-auth-roles span svg{width:1rem;height:1rem}
.ds-auth-roles input:checked+span{background:#fff;color:var(--ink);box-shadow:0 1px 5px rgba(16,42,67,.16)}
.ds-auth-row{display:flex;align-items:center;justify-content:space-between;font-size:0.8438rem}
.ds-auth-row label{display:flex;align-items:center;gap:0.5rem;cursor:pointer;color:var(--muted)}
.ds-auth-row input[type=checkbox]{accent-color:var(--cta);width:0.9375rem;height:0.9375rem}
.ds-auth-row a{color:var(--active-tx);font-weight:600;text-decoration:none}
.ds-auth-row a:hover{text-decoration:underline}
.ds-auth-pw{position:relative}
.ds-auth-pw input{padding-right:2.75rem}
.ds-auth-eye{position:absolute;right:0.25rem;bottom:0.125rem;width:2.5rem;height:2.5rem;display:grid;place-items:center;
  color:var(--faint);transition:.15s}
.ds-auth-eye:hover{color:var(--ink)}
.ds-auth-eye svg{width:1.1875rem;height:1.1875rem}
.ds-auth-pw .ds-eye-open,.ds-auth-pw.ds-pw-shown .ds-eye-closed{display:none}
.ds-auth-pw.ds-pw-shown .ds-eye-open{display:block}
@media (max-width:480px){
  .ds-auth-card{padding:1.875rem 1.375rem 1.625rem}
  .ds-auth-2col{grid-template-columns:1fr}
}

/* ============ Onboarding wizard (own layout) ============
   Two panes: a stepper rail + a form canvas. The layout opts the body into
   .ds-shell.ds-onb (tokens + block layout, overriding the shell's fixed flex).
   Reuses the ds-auth-* card family for the form; adds ds-onb-* chrome. */
.ds-shell.ds-onb{display:block;height:auto;min-height:100vh;overflow:auto}
.ds-onb-wrap{display:flex;min-height:100vh}
/* ---- Stepper rail ---- */
.ds-onb-rail{width:21.25rem;flex:0 0 21.25rem;background:#fff;border-right:1px solid var(--line);
  padding:2.25rem 2rem;display:flex;flex-direction:column}
.ds-onb-brand{display:flex;align-items:center;gap:0.625rem;margin-bottom:2.75rem}
.ds-onb-brand img{height:2.125rem;width:auto}
.ds-onb-steps{display:flex;flex-direction:column;gap:0}
.ds-onb-step{display:flex;align-items:center;gap:0.875rem;position:relative}
.ds-onb-step+.ds-onb-step{margin-top:1.5rem}
.ds-onb-dot{width:2.125rem;height:2.125rem;border-radius:50%;flex:0 0 2.125rem;display:grid;place-items:center;
  font-size:0.8438rem;font-weight:700;transition:.15s;border:1.5px solid var(--line);color:var(--faint);background:#fff}
.ds-onb-dot svg{width:1.0625rem;height:1.0625rem}
.ds-onb-step.ds-done .ds-onb-dot{background:var(--green-bg);border-color:transparent;color:var(--green-tx)}
.ds-onb-step.ds-on .ds-onb-dot{background:var(--active-grad);border-color:transparent;color:var(--ink)}
.ds-onb-lbl{font-size:0.875rem;font-weight:600;color:var(--faint);transition:.15s}
.ds-onb-step.ds-done .ds-onb-lbl{color:var(--muted)}
.ds-onb-step.ds-on .ds-onb-lbl{color:var(--ink)}
/* connector between dots */
.ds-onb-step:not(:last-child)::before{content:"";position:absolute;left:1.0312rem;top:2.125rem;width:1.5px;height:calc(100% + 1.5rem - 2.125rem);
  background:var(--line)}
.ds-onb-step.ds-done:not(:last-child)::before{background:var(--green-tx);opacity:.35}
.ds-onb-foot{margin-top:auto;padding-top:1.75rem;border-top:1px solid var(--line-soft)}
.ds-onb-signout{display:inline-flex;align-items:center;gap:0.5625rem;font-size:0.8438rem;font-weight:600;color:var(--muted);transition:.15s}
.ds-onb-signout:hover{color:var(--ink)}
.ds-onb-signout svg{width:1.0625rem;height:1.0625rem}
/* ---- Form canvas ---- */
.ds-onb-main{flex:1;min-width:0;display:flex;align-items:center;justify-content:center;padding:3rem 1.5rem;background:var(--canvas)}
.ds-onb-panel{width:100%;max-width:33.75rem}
.ds-onb-panel .ds-auth-head{margin-bottom:1.5rem}
/* label-on-top field rows reuse .ds-field; two-up rows share .ds-auth-2col */
.ds-onb-hint{font-size:0.7812rem;color:var(--faint);margin:0.375rem 0 0;display:flex;align-items:center;gap:0.3125rem;line-height:1.45}
.ds-onb-hint svg{width:0.8125rem;height:0.8125rem;flex:0 0 0.8125rem}
/* native select gets a chevron affordance (long lists keep native select for
   the timezone detector; short ones use ds_select) */
.ds-onb-panel .ds-field select{appearance:none;-webkit-appearance:none;padding-right:2.375rem;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%238CA0B3' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 0.75rem center;background-size:1rem}
/* step footer: back + continue buttons */
.ds-onb-actions{display:flex;gap:0.75rem;margin-top:1.375rem}
.ds-onb-actions .ds-btn-dark{margin-top:0}
.ds-onb-back{display:inline-flex;align-items:center;justify-content:center;gap:0.5rem;flex:0 0 auto;
  height:2.5rem;padding:0 1.25rem;border:1px solid var(--line);border-radius:var(--r-btn);background:#fff;
  font-size:0.875rem;font-weight:600;color:var(--ink);transition:.15s}
.ds-onb-back:hover{background:var(--line-soft)}
.ds-onb-back svg{width:0.9375rem;height:0.9375rem}
.ds-onb-continue{flex:1}
.ds-onb-count{text-align:center;font-size:0.7812rem;color:var(--faint);margin:1rem 0 0}
/* ---- Step 4 summary card ---- */
.ds-onb-summary{background:var(--field);border-radius:0.75rem;padding:1.125rem 1.25rem;margin-bottom:1rem}
.ds-onb-summary h3{font-size:0.6562rem;font-weight:700;letter-spacing:.07em;text-transform:uppercase;color:var(--faint);margin:0 0 0.875rem}
.ds-onb-sgrid{display:grid;grid-template-columns:1fr 1fr;gap:0.875rem 1.5rem}
.ds-onb-sk{font-size:0.7188rem;color:var(--faint);margin:0 0 0.125rem}
.ds-onb-sv{font-size:0.875rem;font-weight:600;color:var(--ink);margin:0}
/* ---- TOS checkbox row ---- */
.ds-onb-tos{display:flex;align-items:flex-start;gap:0.6875rem;padding:0.875rem 1rem;border:1px solid var(--line);
  border-radius:0.75rem;background:#fff;cursor:pointer;font-size:0.8438rem;color:var(--muted);line-height:1.5}
.ds-onb-tos:hover{border-color:#A8D2F0}
.ds-onb-tos input{margin-top:0.0625rem;width:1.0625rem;height:1.0625rem;flex:0 0 1.0625rem;accent-color:var(--cta);cursor:pointer}
.ds-onb-tos a{color:var(--active-tx);font-weight:600;text-decoration:underline;text-underline-offset:2px}
.ds-btn-dark:disabled{opacity:.4;cursor:not-allowed}
.ds-btn-dark:disabled:hover{background:var(--cta)}
/* ---- Confirmation-pending screen ---- */
.ds-onb-hero-lg{position:relative;width:4.75rem;height:4.75rem;border-radius:1.375rem;background:var(--active);color:var(--active-tx);
  display:grid;place-items:center;margin:0 auto 1.25rem}
.ds-onb-hero-lg svg{width:2.125rem;height:2.125rem}
.ds-onb-hero-badge{position:absolute;bottom:-0.25rem;right:-0.25rem;width:1.625rem;height:1.625rem;border-radius:50%;
  background:var(--green-tx);color:#fff;display:grid;place-items:center;border:3px solid var(--canvas)}
.ds-onb-hero-badge svg{width:0.8125rem;height:0.8125rem}
.ds-onb-email{font-size:0.9375rem;font-weight:700;color:var(--ink);margin:0.125rem 0 1.375rem}
.ds-onb-checklist{background:#fff;border-radius:0.75rem;box-shadow:0 2px 10px -2px rgba(16,42,67,.10);
  padding:1.25rem 1.375rem;margin-bottom:1.375rem;text-align:left;display:flex;flex-direction:column;gap:1rem}
.ds-onb-cl-item{display:flex;align-items:flex-start;gap:0.75rem}
.ds-onb-cl-num{flex:0 0 1.625rem;width:1.625rem;height:1.625rem;border-radius:50%;background:var(--active);color:var(--active-tx);
  display:grid;place-items:center;font-size:0.7812rem;font-weight:700}
.ds-onb-cl-t{font-size:0.875rem;font-weight:600;color:var(--ink);margin:0.125rem 0 0}
.ds-onb-cl-s{font-size:0.7812rem;color:var(--faint);margin:0.125rem 0 0}
.ds-onb-resend-lbl{font-size:0.8438rem;color:var(--faint);margin:0 0 0.625rem}
.ds-onb-panel form.button_to{margin:0}
.ds-onb-signin{display:inline-flex;align-items:center;gap:0.5rem;margin-top:1rem;font-size:0.8438rem;font-weight:600;
  color:var(--muted);transition:.15s}
.ds-onb-signin:hover{color:var(--ink)}
.ds-onb-signin svg{width:1rem;height:1rem}
/* ---- Responsive: rail collapses to a horizontal top strip ---- */
@media (max-width:900px){
  .ds-onb-wrap{flex-direction:column}
  .ds-onb-rail{width:auto;flex:none;flex-direction:row;align-items:center;gap:1.25rem;
    padding:1rem 1.25rem;overflow-x:auto}
  .ds-onb-brand{margin-bottom:0;flex:0 0 auto}
  .ds-onb-steps{flex-direction:row;gap:0;flex:1;min-width:0}
  .ds-onb-step+.ds-onb-step{margin-top:0;margin-left:0.375rem}
  .ds-onb-lbl{display:none}
  .ds-onb-step:not(:last-child)::before{left:2.125rem;top:1.0312rem;width:1rem;height:1.5px}
  .ds-onb-foot{display:none}
  .ds-onb-main{padding:2rem 1.125rem}
}
@media (max-width:480px){
  .ds-onb-sgrid{grid-template-columns:1fr}
}

/* ============================================================
   PROFESSIONAL HOURS (/hours) — development journal + totals
   ============================================================ */
.ds-hours-page .ds-dash-head{display:flex;align-items:center;gap:0.75rem}
.ds-hours-page .ds-dash-head .ds-sp{flex:1}
/* Tiles: 3 kinds + coaching given (4), or 5 once "Other" holds hours. */
.ds-hours-stats{grid-template-columns:repeat(auto-fit,minmax(11.25rem,1fr))}
.ds-hours-given .ds-lab{white-space:normal}
.ds-hg-sub{color:var(--faint);font-size:0.6875rem;font-weight:600;margin-top:0.25rem;line-height:1.35}

/* ---- Quick-add composer (same dashed recipe as the tasks composer) ---- */
.ds-hours-compose{display:grid;grid-template-columns:auto 9.25rem 9rem minmax(8.75rem,1fr) minmax(7.5rem,11.25rem) 7.5rem 7rem auto;
  gap:0.625rem;align-items:center;padding:0.4375rem 0.75rem;margin:0.375rem 0.25rem 1.375rem;
  border:1.5px dashed #B9CFE4;border-radius:0.75rem;transition:border-color .14s}
.ds-hours-compose:focus-within{border-color:var(--active-tx)}
.ds-hours-compose .ds-tc-err{grid-column:1/-1}
.ds-hours-compose .ds-hc-provider{height:2.375rem;border:none;background:transparent;
  font-size:0.875rem;font-weight:500;color:var(--ink);outline:none;min-width:0}
.ds-hours-compose .ds-hc-provider::placeholder{color:var(--faint)}
/* DS date field sized to the composer row (mirrors .ds-tc-datewrap) */
.ds-hc-datewrap .ds-due-trigger{height:2.375rem}
.ds-hc-datewrap .ds-date-ico{right:0.6875rem}
.ds-hc-datewrap .ds-date-ico svg{width:0.9375rem;height:0.9375rem}
/* a required date has no "clear" state to offer */
.ds-due-clear.ds-due-noclear{display:none}
.ds-hours-compose .ds-lsel-btn{height:2.375rem}
.ds-hc-dur{display:flex;align-items:center;gap:0.25rem}
.ds-hc-dur input{width:4.375rem;height:2.375rem;border:1px solid var(--line);border-radius:0.5rem;padding:0 0.5rem;
  font-size:0.875rem;font-weight:600;color:var(--ink);background:#fff;outline:none;transition:.15s}
.ds-hc-dur input:focus{border-color:#A8D2F0;box-shadow:0 0 0 3px rgba(17,115,194,.10)}
.ds-hc-unit{font-size:0.75rem;font-weight:600;color:var(--faint)}

/* ---- Journal rows ---- */
.ds-hrow{display:grid;grid-template-columns:6.875rem 7.5rem minmax(11.25rem,1fr) 5.625rem 5.625rem minmax(9.375rem,1fr) 2rem;gap:0.875rem;align-items:center;
  padding:0.75rem 0.875rem 0.75rem 1.125rem;border-radius:0.75rem;position:relative;transition:background .12s}
/* every row opens a drawer — its own for entries, the session's for coaching */
.ds-hrow:not(.ds-hrow-head){cursor:pointer}
.ds-hr-fmt .ds-none{color:var(--faint)}
.ds-hrow:hover{background:var(--line-soft)}
.ds-rows-panel .ds-hrow:has(+ .ds-hrow)::after{content:"";position:absolute;left:1.125rem;right:0.875rem;bottom:0;height:1px;background:var(--line-soft)}
.ds-hrow-head{font-size:0.6875rem;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--faint);padding-top:0.5rem;padding-bottom:0.5rem}
.ds-hrow-head:hover{background:transparent}
.ds-hr-date{font-size:0.8125rem;font-weight:600;color:var(--muted)}
.ds-hr-desc{min-width:0}
.ds-hr-desc .ds-nm{font-size:0.875rem;font-weight:600;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-hr-prov{display:flex;align-items:center;gap:0.3125rem;font-size:0.75rem;color:var(--faint);margin-top:0.125rem}
.ds-hr-prov svg{flex:0 0 auto}
.ds-hr-dur{text-align:right;font-size:0.875rem;font-weight:700;color:var(--ink)}
.ds-hrow-head .ds-hr-dur{font-weight:700;color:var(--faint)}

/* Kind chips — dark ink on a light tint, as every other badge. */
.ds-kchip.ds-k-training{background:var(--blue-bg);color:var(--blue-tx)}
.ds-kchip.ds-k-mentoring{background:var(--laven-bg);color:var(--laven-tx)}
.ds-kchip.ds-k-supervision{background:var(--peach-bg);color:var(--peach-tx)}
.ds-kchip.ds-k-other{background:var(--green-bg);color:var(--green-tx)}
.ds-kchip.ds-k-coaching{background:#FCEAD8;color:#D9670A}

/* ---- Custom-range form inside the period popover ---- */
.ds-hp-custom{padding:0.5rem 0.5rem 0.375rem;display:flex;flex-direction:column;gap:0.5rem}
.ds-hp-custom label{display:flex;flex-direction:column;gap:0.25rem;font-size:0.6875rem;font-weight:600;color:var(--muted)}
.ds-hp-custom input{height:2.125rem;border:1px solid var(--line);border-radius:0.5rem;padding:0 0.5rem;font-size:0.8125rem;
  color:var(--ink);background:#fff;outline:none}
.ds-hp-custom input:focus{border-color:#A8D2F0;box-shadow:0 0 0 3px rgba(17,115,194,.10)}
.ds-hp-custom .ds-tc-add{width:100%}

/* ---- Custom range bar (period=custom) ---- */
.ds-hours-range{display:flex;align-items:center;gap:0.625rem;padding:0.75rem 0.875rem;margin-bottom:1.25rem}
.ds-hr-lbl{font-size:0.75rem;font-weight:600;color:var(--muted)}
.ds-hrange-date{width:10rem}
.ds-hrange-date .ds-due-trigger{height:2.375rem}
.ds-hours-range .ds-gbtn{min-width:0;padding:0 1.125rem;height:2.375rem}
.ds-hr-clear{font-size:0.8125rem;font-weight:600;color:var(--muted);margin-left:auto}
.ds-hr-clear:hover{color:var(--ink)}
/* Reset-filters control — a quiet secondary action beside the seg-group, not a
   filled button (a reset shouldn't out-shout the primary CTA). Mirrors
   .ds-hr-clear: muted text + small undo icon, darkening to ink on hover. */
.ds-hours-clear{display:inline-flex;align-items:center;gap:0.375rem;height:var(--btn-h);
  padding:0 0.375rem;font-size:0.8125rem;font-weight:600;color:var(--muted);transition:color .15s}
.ds-hours-clear svg{width:0.875rem;height:0.875rem;color:var(--muted)}
.ds-hours-clear:hover,.ds-hours-clear:hover svg{color:var(--ink)}

/* ---- Export modal — the document composer ---- */
.ds-export-box{width:min(34rem,92vw)}
/* head variant: badge beside the title, not stacked above it */
.ds-m-head-row{display:flex;align-items:center;gap:0.875rem;padding-right:3.5rem}
.ds-m-head-row .ds-m-badge{margin-bottom:0;flex:0 0 3.125rem}
.ds-m-head-row .ds-m-headtx{min-width:0}
.ds-m-head-row .ds-m-sub{margin-top:0.125rem}
.ds-export-all{font-size:0.75rem;font-weight:600;color:var(--active-tx);margin-left:auto;padding:0.125rem 0.375rem;border-radius:0.375rem}
.ds-export-all:hover{background:var(--active)}
.ds-m-foot .ds-gbtn[disabled]{opacity:.45;pointer-events:none}

/* Type rack: the ledger's kind chips, toggleable. Off = the outline chip;
   on = the same pastel the rows wear. The check slides in as it engages. */
.ds-export-rack{display:flex;flex-wrap:wrap;gap:0.5rem}
.ds-export-chip{display:inline-flex;align-items:center;gap:0.4375rem;padding:0.5rem 0.875rem;border-radius:var(--pill);
  font-size:0.8125rem;font-weight:600;cursor:pointer;user-select:none;
  background:#fff;border:1px solid var(--line);color:var(--muted);
  transition:background .15s,color .15s,border-color .15s,transform .12s;
  animation:dsExpChip .26s backwards}
.ds-export-chip:hover{border-color:var(--active-tx);transform:translateY(-1px)}
.ds-export-chip:active{transform:translateY(0)}
.ds-export-chip input{position:absolute;opacity:0;pointer-events:none}
.ds-export-chip .ds-ec-check{display:grid;place-items:center;width:0;overflow:hidden;transition:width .15s}
.ds-export-chip .ds-ec-check svg{width:0.8125rem;height:0.8125rem}
.ds-export-chip .ds-ec-min{font-size:0.6875rem;font-weight:600;opacity:.62}
.ds-export-chip:has(input:checked){border-color:transparent}
.ds-export-chip:has(input:checked) .ds-ec-check{width:0.8125rem}
.ds-export-chip.ds-k-training:has(input:checked){background:var(--blue-bg);color:var(--blue-tx)}
.ds-export-chip.ds-k-mentoring:has(input:checked){background:var(--laven-bg);color:var(--laven-tx)}
.ds-export-chip.ds-k-supervision:has(input:checked){background:var(--peach-bg);color:var(--peach-tx)}
.ds-export-chip.ds-k-other:has(input:checked){background:var(--green-bg);color:var(--green-tx)}
.ds-export-chip.ds-k-coaching:has(input:checked){background:#FCEAD8;color:#D9670A}
.ds-export-chip:nth-child(2){animation-delay:.03s}
.ds-export-chip:nth-child(3){animation-delay:.06s}
.ds-export-chip:nth-child(4){animation-delay:.09s}
.ds-export-chip:nth-child(5){animation-delay:.12s}
@keyframes dsExpChip{from{opacity:0;transform:translateY(0.375rem) scale(.96)}}

/* Document cards: pick the artifact, not the file extension. Selected wears
   the ds-stat.ds-on ring; the icon takes the active tint. */
.ds-export-docs{display:grid;grid-template-columns:1fr 1fr;gap:0.625rem}
.ds-export-doc{display:flex;align-items:center;gap:0.75rem;padding:0.8125rem 0.9375rem;border-radius:0.75rem;cursor:pointer;
  background:#fff;border:1px solid var(--line);transition:box-shadow .15s,border-color .15s}
.ds-export-doc:hover{border-color:var(--active-tx)}
.ds-export-doc input{position:absolute;opacity:0;pointer-events:none}
.ds-export-doc .ds-ed-ic{width:2.25rem;height:2.25rem;border-radius:0.625rem;display:grid;place-items:center;flex:0 0 2.25rem;
  background:var(--field);color:var(--muted);transition:background .15s,color .15s}
.ds-export-doc .ds-ed-ic svg{width:1.0625rem;height:1.0625rem}
.ds-export-doc .ds-ed-tx{display:flex;flex-direction:column;gap:0.125rem;min-width:0}
.ds-export-doc .ds-ed-t{font-size:0.875rem;font-weight:700;color:var(--ink)}
.ds-export-doc .ds-ed-s{font-size:0.7188rem;color:var(--faint);line-height:1.3}
.ds-export-doc:has(input:checked){border-color:transparent;
  box-shadow:0 0 0 2px var(--active-tx),0 8px 20px -14px rgba(16,42,67,.4)}
.ds-export-doc:has(input:checked) .ds-ed-ic{background:var(--active);color:var(--active-tx)}

/* Foot recap: what the document will cover, updated live. */
.ds-export-recap{margin-right:auto;font-size:0.8125rem;font-weight:600;color:var(--muted)}
.ds-export-err{margin:0 auto 0 0}
.ds-export-box .ds-m-foot .ds-gbtn{flex:0 0 auto;white-space:nowrap}

@media (prefers-reduced-motion:reduce){
  .ds-export-chip{animation:none}
}
@media (max-width:560px){
  .ds-export-docs{grid-template-columns:1fr}
}

/* ---- Edit page ---- */
.ds-hours-form{padding:1.5rem;max-width:34rem}
.ds-hours-form .ds-field+.ds-field{margin-top:1rem}
.ds-hours-form textarea{width:100%;border:1px solid var(--line);border-radius:0.75rem;padding:0.625rem 0.875rem;font-size:0.875rem;
  color:var(--ink);background:var(--field);outline:none;font-family:inherit;resize:vertical;transition:.15s}
.ds-hours-form textarea:focus{border-color:#A8D2F0;background:#fff;box-shadow:0 0 0 4px rgba(17,115,194,.10)}
.ds-hours-form-foot{display:flex;justify-content:flex-end;gap:0.625rem;margin-top:1.5rem}
.ds-hours-empty{padding:2.5rem 1.25rem}

@media (max-width:1100px){
  .ds-hours-compose{grid-template-columns:auto 9.25rem 9rem 1fr 7.5rem 7rem auto}
  .ds-hours-compose .ds-hc-provider{display:none}
  .ds-hrow{grid-template-columns:6.25rem 7rem 1fr 5rem 5rem 2rem;gap:0.625rem}
  .ds-hrow .ds-sn-cell{display:none}
}
@media (max-width:840px){
  .ds-hours-compose{grid-template-columns:1fr 1fr;padding:0.75rem}
  .ds-hours-compose .ds-tc-plus{display:none}
  .ds-hours-compose .ds-tc-input,.ds-hours-compose .ds-tc-add{grid-column:1/-1}
  .ds-hrow{grid-template-columns:1fr auto 2rem;row-gap:0.375rem}
  .ds-hrow .ds-hr-date{grid-column:1}
  .ds-hrow .ds-hr-fmt{display:none}
  .ds-hrow-head{display:none}
}
