/* Resto design system — shared CSS (tokens, components). Linked by index.html and the standalone pages. */
:root{
  --ink:#182018; --ink-soft:#4B564D; --ink-faint:#7C8678;
  --paper:#EEF0EA; --surface:#FFFFFF; --surface-2:#F5F6F1;
  --border:#DBDED4; --border-strong:#C4C9BB;
  --brand:#2F4F3E; --brand-ink:#FFFFFF; --brand-soft:#E3EBE4;
  --accent:#A97F2E; --accent-ink:#241C08; --accent-soft:#F3E7CC;
  --success:#316B41; --success-bg:#E1F0E4;
  --warning:#A97F2E; --warning-bg:#F5EBD3;
  --danger:#A34430; --danger-bg:#F6E1DA;
  --focus:#2F4F3E;
  --neutral:#4B564D; --neutral-bg:#E8EBE2;
  --toast-bg:#20261F; --toast-ink:#F2F4EE; --toast-error-bg:#7A2E1E; --toast-ok-bg:#22492F;
  --toast-line:rgba(242,244,238,.5); --toast-hover:rgba(242,244,238,.14);
  --on-brand-line:rgba(255,255,255,.55);
  --scrim:rgba(10,14,10,.35); --scrim-strong:rgba(10,14,10,.55); --scrim-media:rgba(10,14,10,.85);
  --print-paper:#FFFFFF; --print-ink:#000000;
  --font-display:'Fraunces', Georgia, 'Times New Roman', serif;
  --font-ui:'Archivo', 'Helvetica Neue', Arial, sans-serif;
  --font-mono:'IBM Plex Mono', 'SFMono-Regular', Consolas, monospace;
  /* ---- type scale: five steps. Phone (<=820px) lifts body text to 15px and fields to 16px ---- */
  --fs-xs:13px;   /* captions, hints, grid cells */
  --fs-base:14px; /* body text, buttons, inputs */
  --fs-md:17px;   /* card subheadings */
  --fs-lg:22px;   /* section headings */
  --fs-xl:30px;   /* page titles */
  /* ---- spacing: 4px step ---- */
  --sp-1:4px; --sp-2:8px; --sp-3:12px; --sp-4:16px; --sp-5:20px; --sp-6:24px; --sp-7:28px; --sp-8:32px;
  /* ---- radii ---- */
  --r-sm:8px;   /* inputs, buttons */
  --r-md:12px;  /* cards, panels */
  --r-pill:99px;
  /* ---- controls ---- */
  --h-btn:40px; --h-btn-sm:32px; --h-touch:44px;
  --shadow-1: 0 1px 2px rgba(24,32,24,0.06), 0 1px 1px rgba(24,32,24,0.04);
  --shadow-2: 0 10px 28px rgba(24,32,24,0.16), 0 2px 6px rgba(24,32,24,0.08);
  --shadow-toast: 0 10px 28px rgba(24,32,24,0.28);
  color-scheme: light;
}
@media (prefers-color-scheme: dark){
  :root:not([data-theme="light"]){
    --ink:#E7EAE1; --ink-soft:#AAB3A4; --ink-faint:#78826F;
    --paper:#12160F; --surface:#1A201A; --surface-2:#20261F;
    --border:#2C342A; --border-strong:#3B4536;
    --brand:#82B896; --brand-ink:#0E1710; --brand-soft:#223229;
    --accent:#D9B36B; --accent-ink:#241C08; --accent-soft:#332911;
    --success:#6FBE85; --success-bg:#1E3324;
    --warning:#D9B36B; --warning-bg:#332911;
    --danger:#E08669; --danger-bg:#3A241C;
    --focus:#82B896;
    --neutral:#AAB3A4; --neutral-bg:#2A3228;
    --toast-bg:#2F382D; --toast-ok-bg:#25502F; --toast-error-bg:#8A3322;
    color-scheme: dark;
  }
}
:root[data-theme="dark"]{
  --ink:#E7EAE1; --ink-soft:#AAB3A4; --ink-faint:#78826F;
  --paper:#12160F; --surface:#1A201A; --surface-2:#20261F;
  --border:#2C342A; --border-strong:#3B4536;
  --brand:#82B896; --brand-ink:#0E1710; --brand-soft:#223229;
  --accent:#D9B36B; --accent-ink:#241C08; --accent-soft:#332911;
  --success:#6FBE85; --success-bg:#1E3324;
  --warning:#D9B36B; --warning-bg:#332911;
  --danger:#E08669; --danger-bg:#3A241C;
  --focus:#82B896;
  --neutral:#AAB3A4; --neutral-bg:#2A3228;
  --toast-bg:#2F382D; --toast-ok-bg:#25502F; --toast-error-bg:#8A3322;
  color-scheme: dark;
}

*{ box-sizing:border-box; }
body{ margin:0; background:var(--paper); color:var(--ink); font-family:var(--font-ui); font-size:var(--fs-base); line-height:1.5; }
h1,h2,h3{ font-family:var(--font-display); font-weight:600; margin:0; text-wrap:balance; }
button, input, select, textarea{ font-family:inherit; font-size:inherit; color:inherit; }
table{ border-collapse:collapse; }
::selection{ background:var(--brand-soft); }
:focus-visible{ outline:2px solid var(--focus); outline-offset:2px; border-radius:4px; }

.eyebrow{ font-family:var(--font-ui); font-size:var(--fs-xs); font-weight:600; letter-spacing:.08em; text-transform:uppercase; color:var(--ink-faint); }
.num{ font-variant-numeric:tabular-nums; font-feature-settings:"tnum" 1; }

/* ---------- layout ---------- */
.app{ display:grid; grid-template-columns:236px 1fr; min-height:100vh; }
.sidebar{ background:var(--surface); border-right:1px solid var(--border); display:flex; flex-direction:column; padding:20px 14px; gap:18px; }
.brand{ display:flex; align-items:baseline; gap:2px; padding:2px 8px 4px; }
.brand-mark{ font-family:var(--font-display); font-weight:700; font-size:var(--fs-lg); color:var(--ink); }
.brand-mark-2{ font-family:var(--font-display); font-weight:400; font-style:italic; font-size:var(--fs-lg); color:var(--brand); }
.venue-box{ padding:10px 12px; background:var(--surface-2); border:1px solid var(--border); border-radius:var(--r-md); }
.venue-box .eyebrow{ margin-bottom:3px; }
#venueName{ font-weight:600; font-size:var(--fs-base); }
.nav{ display:flex; flex-direction:column; gap:2px; }
.nav-item{ display:flex; align-items:center; gap:10px; justify-content:flex-start; text-align:left; padding:9px 10px; border-radius:var(--r-sm); border:none; background:transparent; cursor:pointer; color:var(--ink-soft); font-weight:500; font-size:var(--fs-base); }
.nav-item:hover{ background:var(--surface-2); color:var(--ink); }
.nav-item.active{ background:var(--brand-soft); color:var(--brand); font-weight:600; }
.nav-item .ic{ width:18px; text-align:center; opacity:.85; }
.nav-item .badge{ margin-left:auto; }
.sidebar-foot{ margin-top:auto; padding:8px; font-size:var(--fs-xs); color:var(--ink-faint); }
/* Wraps venue-box/staffWhoBox/nav so the mobile dropdown (below) can show
   or hide all three as one block without touching the `hidden` attribute
   JS already manages on #staffWhoBox independently. At desktop widths
   this is just a plain flex column mirroring the parent .sidebar's own
   layout, so it's visually a no-op there. */
.sidebar-menu{ display:flex; flex-direction:column; gap:18px; }
.mobile-menu-toggle{ display:none; }

.main{ display:flex; flex-direction:column; min-width:0; }
/* Page header pattern: title (Fraunces, --fs-xl), one-line hint, main action on the right.
   On phone the action drops under the title at full width. .topbar / .topbar-actions are the same thing under their older names. */
.page-head, .topbar{ display:flex; align-items:center; justify-content:space-between; gap:var(--sp-4); padding:var(--sp-5) var(--sp-8) var(--sp-4); border-bottom:1px solid var(--border); }
.page-head h1, .topbar h1{ font-size:var(--fs-xl); line-height:1.15; }
.page-head-actions, .topbar-actions{ display:flex; gap:var(--sp-2); align-items:center; }
.content{ padding:26px 32px 60px; display:flex; flex-direction:column; gap:22px; }
.panel{ display:flex; flex-direction:column; gap:22px; }
.page-hint, .panel-lead{ color:var(--ink-soft); font-size:var(--fs-base); max-width:72ch; margin:calc(-1 * var(--sp-2)) 0 0; }

/* ---------- buttons ----------
   .btn (normal) · .btn-primary (the main action) · .btn-danger (destructive) · .btn-ghost (quiet text button).
   40px tall on desktop, 44px on phone. .btn-sm (32px) is for tables and grids only. */
.btn{ display:inline-flex; align-items:center; justify-content:center; gap:var(--sp-2); min-height:var(--h-btn); padding:0 var(--sp-4); border-radius:var(--r-sm); border:1px solid var(--border-strong); background:var(--surface); color:var(--ink); cursor:pointer; font-weight:600; font-size:var(--fs-base); line-height:1.2; white-space:nowrap; text-decoration:none; }
.btn:hover{ border-color:var(--ink-faint); }
.btn-primary, .btn-success{ background:var(--brand); border-color:var(--brand); color:var(--brand-ink); }
.btn-primary:hover, .btn-success:hover{ border-color:var(--brand); filter:brightness(1.07); }
.btn-ghost{ border-color:transparent; background:transparent; }
.btn-ghost:hover{ background:var(--surface-2); border-color:transparent; }
.btn-danger{ color:var(--danger); }
.btn-danger:hover{ background:var(--danger-bg); border-color:var(--danger); }
.btn-sm{ min-height:var(--h-btn-sm); padding:0 var(--sp-3); font-size:var(--fs-xs); }
.btn:disabled{ opacity:.45; cursor:not-allowed; }
.btn .icon, .icon-btn .icon{ flex:none; }
.icon-btn{ width:var(--h-btn); height:var(--h-btn); display:inline-flex; align-items:center; justify-content:center; border-radius:var(--r-sm); border:1px solid transparent; background:transparent; cursor:pointer; color:var(--ink-soft); font-size:var(--fs-md); }
.icon-btn:hover{ background:var(--surface-2); color:var(--ink); }

/* ---------- icons (see icon() in index.html) ---------- */
.icon{ width:1.15em; height:1.15em; flex:none; fill:none; stroke:currentColor; stroke-width:2; stroke-linecap:round; stroke-linejoin:round; vertical-align:-.2em; }
.icon-btn .icon{ width:18px; height:18px; }
.icon-btn-danger{ color:var(--danger); }
.icon-btn-danger:hover{ background:var(--danger-bg); color:var(--danger); }

/* ---------- cards / stats ---------- */
.stat-row{ display:grid; grid-template-columns:repeat(4,1fr); gap:14px; }
.stat-row.cols-2{ grid-template-columns:repeat(2,minmax(120px,220px)); }
.stat-tile{ background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:16px 18px; display:flex; flex-direction:column; gap:6px; box-shadow:var(--shadow-1); }
.stat-tile .stat-value{ font-family:var(--font-display); font-size:var(--fs-xl); font-weight:600; }
.stat-tile .stat-label{ font-size:var(--fs-xs); color:var(--ink-soft); }

.card{ background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); box-shadow:var(--shadow-1); }
.card-head{ display:flex; align-items:center; justify-content:space-between; padding:16px 18px 12px; border-bottom:1px solid var(--border); }
.card-head h3{ font-size:var(--fs-md); }
.card-body{ padding:16px 18px; display:flex; flex-direction:column; gap:12px; }
.card-body.tight{ gap:0; padding:6px 0; }

.grid-cards{ display:grid; grid-template-columns:repeat(auto-fill,minmax(260px,1fr)); gap:14px; }
.entity-card{ background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:14px 16px; display:flex; flex-direction:column; gap:8px; box-shadow:var(--shadow-1); }
.entity-card .row-top{ display:flex; align-items:flex-start; justify-content:space-between; gap:8px; }
.entity-card .name{ font-weight:600; font-size:var(--fs-base); }
.entity-card .meta{ font-size:var(--fs-xs); color:var(--ink-soft); display:flex; flex-direction:column; gap:3px; }
.entity-card .tags{ display:flex; flex-wrap:wrap; gap:5px; }
.entity-card .actions{ display:flex; gap:6px; margin-top:2px; }

/* ===== forced first-run onboarding gate (new venues + the three stuck
   pilot testers via migration backfill) — body.onboarding-active hides
   the sidebar and collapses .app to one column, so .onboarding-bar
   (fixed above <main>) is the only way forward. See
   renderOnboardingGate()/onboardingActive() in the script below. */
body.onboarding-active .sidebar{ display:none; }
body.onboarding-active .app{ grid-template-columns:1fr; }
.onboarding-bar{ display:none; }
body.onboarding-active .onboarding-bar{
  display:flex; align-items:center; justify-content:space-between; gap:16px; flex-wrap:wrap;
  padding:14px 24px; background:var(--surface); border-bottom:1px solid var(--border); box-shadow:var(--shadow-1);
}
.onboarding-steps{ display:flex; align-items:center; gap:6px; flex:none; }
.onboarding-step-dot{ width:26px; height:26px; border-radius:50%; display:flex; align-items:center; justify-content:center; font-size:var(--fs-xs); font-weight:700; background:var(--surface-2); color:var(--ink-faint); border:1px solid var(--border-strong); }
.onboarding-step-dot.active{ background:var(--brand); color:var(--brand-ink); border-color:var(--brand); }
.onboarding-step-dot.done{ background:var(--brand-soft); color:var(--brand); border-color:var(--brand-soft); }
.onboarding-step-sep{ width:16px; height:2px; background:var(--border-strong); }
.onboarding-text{ flex:1 1 220px; min-width:180px; }
.onboarding-text h3{ margin:0 0 2px; font-size:var(--fs-md); }
.onboarding-text p{ margin:0; font-size:var(--fs-xs); color:var(--ink-soft); }
.onboarding-actions{ display:flex; align-items:center; gap:10px; flex:none; }
@media (max-width:820px){
  body.onboarding-active .onboarding-bar{ padding:10px 14px; }
  .onboarding-text{ order:3; flex-basis:100%; }
}

/* ---------- badge: one component, four tones ----------
   New markup: <span class="badge badge-ok|badge-warn|badge-bad|badge-neutral">. The older class names are aliases so existing markup keeps working. */
.badge, .tag, .pill{ display:inline-flex; align-items:center; font-size:var(--fs-xs); font-weight:600; line-height:1.3; padding:var(--sp-1) 10px; border-radius:var(--r-pill); letter-spacing:.01em; border:1px solid transparent; white-space:nowrap; }
.badge-neutral, .pill-neutral, .tag{ background:var(--neutral-bg); color:var(--neutral); border-color:var(--border); }
.badge-ok, .pill-ok, .pill-approved{ background:var(--success-bg); color:var(--success); border-color:transparent; }
.badge-warn, .pill-warn, .pill-pending, .tag-warn, .tag-left{ background:var(--warning-bg); color:var(--warning); border-color:transparent; }
.badge-bad, .pill-bad, .pill-denied{ background:var(--danger-bg); color:var(--danger); border-color:transparent; }
.tag-role{ background:var(--brand-soft); color:var(--brand); border-color:transparent; }   /* a person's role: brand chip, not a status */
.pill{ font-weight:700; }
.badge .icon{ width:1em; height:1em; margin-right:var(--sp-1); vertical-align:-.15em; }

.list-row{ display:flex; align-items:center; gap:12px; padding:11px 4px; border-bottom:1px solid var(--border); }
.list-row:last-child{ border-bottom:none; }
.list-row .grow{ flex:1; min-width:0; }
.list-row .title{ font-weight:600; font-size:var(--fs-base); }
.list-row .sub{ font-size:var(--fs-xs); color:var(--ink-soft); margin-top:1px; }
/* 27.09.2026 — candidates in openCoverageModal's collapsed "show more" section
   (soft-preference misses only: blocked weekday, availability window, weekly
   shift/hour cap, min/max shift length) get the reason(s) in the warning
   colour instead of the neutral ink-soft used for the main list's "N/N
   shifts so far" line — a visual cue for the manager, not a block. */
.list-row .sub-warn{ color:var(--warning); }
.soft-fail-toggle{ margin-top:10px; border-top:1px dashed var(--border); padding-top:8px; }
.soft-fail-toggle summary{ cursor:pointer; font-size:var(--fs-xs); color:var(--ink-soft); user-select:none; }
.soft-fail-toggle summary:hover{ color:var(--ink); }

/* ---------- shared states: loading (.skeleton, below), empty, error ----------
   .empty-state: one line, optionally one button.  .error-state: what went wrong + a "Try again" button. */
.empty-state, .error-state{ text-align:center; padding:var(--sp-8) var(--sp-5); color:var(--ink-soft); font-size:var(--fs-base); border:1px dashed var(--border-strong); border-radius:var(--r-md); }
.empty-state strong, .error-state strong{ display:block; color:var(--ink); font-family:var(--font-display); font-size:var(--fs-md); font-weight:600; margin-bottom:var(--sp-1); }
.empty-state .btn, .error-state .btn{ margin-top:var(--sp-3); }
.error-state{ border-style:solid; border-color:var(--danger); background:var(--danger-bg); color:var(--danger); }
.error-state strong{ color:var(--danger); }
.loading-state{ color:var(--ink-faint); font-size:var(--fs-base); padding:var(--sp-4) 0; }

/* ---------- forms ---------- */
label.field{ display:flex; flex-direction:column; gap:5px; font-size:var(--fs-xs); font-weight:600; color:var(--ink-soft); }
label.field .hint{ font-weight:400; font-size:var(--fs-xs); color:var(--ink-faint); }
input[type=text], input[type=email], input[type=number], input[type=date], input[type=time], input[type=password], input[type=search], input[type=tel], select, textarea{
  font-size:var(--fs-base); padding:8px 10px; border-radius:var(--r-sm); border:1px solid var(--border-strong); background:var(--surface); color:var(--ink); width:100%;
}
input:not([type=checkbox]):not([type=radio]):not([type=file]), select{ min-height:var(--h-btn); }
textarea{ resize:vertical; min-height:60px; }
input[type=checkbox]{ accent-color:var(--brand); width:15px; height:15px; }
/* Custom time combo box: a plain text input (so any value can be typed
   and saved, never restricted to the list) with a JS-rendered suggestion
   list. Shows the FULL list on focus — unlike a native <input list>
   datalist, which filters to only entries matching whatever is already
   typed, hiding most of the list the moment a field is pre-filled. */
.combo-wrap{ position:relative; }
.combo-list{ position:absolute; left:0; right:0; top:calc(100% + 4px); background:var(--surface); border:1px solid var(--border-strong); border-radius:var(--r-sm); box-shadow:var(--shadow-2); max-height:180px; overflow-y:auto; z-index:60; display:none; }
.combo-item{ padding:7px 10px; font-size:var(--fs-xs); font-weight:400; color:var(--ink); cursor:pointer; }
.combo-item:hover{ background:var(--surface-2); }
.combo-empty{ padding:7px 10px; font-size:var(--fs-xs); color:var(--ink-faint); }
.form-grid{ display:grid; grid-template-columns:1fr 1fr; gap:12px; }
.form-grid.cols-3{ grid-template-columns:1fr 1fr 1fr; }
.form-grid.cols-4{ grid-template-columns:auto 1fr 1fr auto; }
.checks{ display:flex; flex-wrap:wrap; gap:10px; }
.check-chip{ display:flex; align-items:center; gap:6px; font-size:var(--fs-xs); font-weight:500; padding:6px 9px; border:1px solid var(--border-strong); border-radius:var(--r-sm); background:var(--surface); }
fieldset{ border:1px solid var(--border); border-radius:var(--r-md); padding:12px; margin:0; }
legend{ font-size:var(--fs-xs); font-weight:700; text-transform:uppercase; letter-spacing:.06em; color:var(--ink-faint); padding:0 5px; }

/* ---------- drawer ---------- */
.drawer-backdrop{ position:fixed; inset:0; background:var(--scrim); z-index:40; }
.drawer{ position:fixed; top:0; right:0; bottom:0; width:min(460px,92vw); background:var(--surface); border-left:1px solid var(--border); box-shadow:var(--shadow-2); z-index:41; display:flex; flex-direction:column; transition:width .15s ease; }
.drawer.drawer-wide{ width:min(1760px,98vw); }
.drawer.drawer-mid{ width:min(760px,96vw); }
.drawer-head{ display:flex; align-items:center; justify-content:space-between; padding:18px 20px; border-bottom:1px solid var(--border); }
.drawer-head h2{ font-size:var(--fs-md); }
.drawer-body{ padding:18px 20px 26px; overflow-y:auto; flex:1; display:flex; flex-direction:column; gap:14px; }
.drawer-foot{ display:flex; justify-content:flex-end; gap:8px; padding-top:6px; }
/* Weekday strip inside the template drawer — Mon..Sun as equal columns
   that share whatever width the (now very wide) drawer has, so on a
   normal desktop window all 7 fit at once with nothing to scroll. Each
   column has a 150px floor: below that (a narrow window) the grid can't
   shrink further and overflow-x takes over as a fallback instead of
   squashing the fields unreadably. */
.tpl-days-scroll{ display:grid; grid-template-columns:repeat(7,minmax(150px,1fr)); align-items:start; gap:14px; overflow-x:auto; padding-bottom:10px; -webkit-overflow-scrolling:touch; }
.tpl-day-col{ min-width:0; }
/* Inside a day column there isn't room for Time/People/Zone side by side
   (that 3-across grid is fine at full drawer width elsewhere) — put Time
   on its own row so the text isn't clipped, People+Zone share the row below. */
.tpl-day-col .form-grid.cols-3{ grid-template-columns:1fr 1fr; gap:6px; }
.tpl-day-col .form-grid.cols-3>:first-child{ grid-column:1 / -1; }
.tpl-min-staff{ border:1px solid var(--border); border-radius:var(--r-md); padding:12px; background:var(--surface-2); display:flex; flex-direction:column; gap:6px; }
.tpl-min-staff-row{ font-size:var(--fs-xs); color:var(--ink-soft); display:flex; align-items:center; gap:6px; flex-wrap:wrap; }
.tpl-min-staff-row input{ width:56px; padding:4px 6px; min-height:var(--h-btn-sm); }
.tpl-min-staff-result{ font-size:var(--fs-xs); color:var(--ink); }
.tpl-min-staff-result strong{ font-size:var(--fs-md); color:var(--brand); }
.tpl-staff-row{ display:flex; align-items:flex-end; justify-content:space-between; gap:10px; }
.tpl-staff-caption{ margin-bottom:3px; }
.tpl-staff-nums{ display:flex; align-items:flex-end; gap:16px; }
.tpl-staff-num{ display:flex; flex-direction:column; align-items:flex-start; }
.tpl-staff-num .figure{ font-family:var(--font-display); font-size:var(--fs-md); font-weight:700; line-height:1; color:var(--ink); }
.tpl-staff-num .figure.optimal{ color:var(--success); }
.tpl-staff-num .lbl{ font-size:var(--fs-xs); color:var(--ink-faint); margin-top:2px; }
.tpl-staff-buffer-note{ font-size:var(--fs-xs); color:var(--ink-faint); text-align:right; max-width:130px; }
.entity-card .tpl-staff-row{ padding-top:9px; margin-top:2px; border-top:1px solid var(--border); }

/* small modal (cell editor) */
.modal{ position:fixed; z-index:51; background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); box-shadow:var(--shadow-2); padding:16px; width:270px; }
.modal h3{ font-size:var(--fs-base); margin-bottom:10px; }
.modal-foot{ display:flex; justify-content:space-between; gap:8px; margin-top:12px; }
/* confirm/alert dialog — a centred variant of the same modal, used instead
   of window.confirm()/alert(): a sandboxed artifact iframe blocks native
   browser dialogs outright, so those calls silently do nothing and leave
   a button looking unresponsive. This is plain DOM, so it always works. */
.modal-overlay{ position:fixed; inset:0; background:var(--scrim); z-index:50; }
.modal-center{ top:50%; left:50%; transform:translate(-50%,-50%); width:min(340px,86vw); }
.modal-center p{ margin:0 0 14px; font-size:var(--fs-base); line-height:1.5; color:var(--ink); }

/* ---------- schedule grid ---------- */
.week-nav{ display:flex; align-items:center; gap:10px; }
.week-label{ font-family:var(--font-display); font-size:var(--fs-md); font-weight:600; min-width:210px; }
.view-toggle{ display:flex; margin-left:auto; border:1px solid var(--border-strong); border-radius:var(--r-sm); overflow:hidden; }
.view-toggle-btn{ min-height:var(--h-btn-sm); padding:0 var(--sp-3); font-size:var(--fs-xs); font-weight:600; border:none; background:var(--surface); color:var(--ink-soft); cursor:pointer; }
.view-toggle-btn+.view-toggle-btn{ border-left:1px solid var(--border-strong); }
.view-toggle-btn.active{ background:var(--brand); color:var(--brand-ink); }
.grid-scroll{ overflow-x:auto; border:1px solid var(--border); border-radius:var(--r-md); background:var(--surface); }
/* 02.10.2026 — Nikita's fix for "the schedule grid is unusable on a
   phone": keep the same table (the name column is already
   position:sticky below — this was never broken, just not proven), just
   make the horizontal scroll itself discoverable and pleasant. The fade
   lives in a non-scrolling wrapper SIBLING to .grid-scroll (not inside
   it) specifically so it stays pinned to the right edge while the table
   underneath scrolls — a fade placed inside the scrolling element would
   just scroll away with everything else. wireScrollFade() in the main
   script toggles .scroll-fade-hidden once there's nothing left to
   scroll to, so it never sits there as a dead hint on a table that
   already fits, or on a desktop screen wide enough to show the whole
   week at once. */
.grid-scroll-wrap{ position:relative; }
.scroll-fade{ position:absolute; top:0; right:0; bottom:0; width:28px; pointer-events:none;
  background:linear-gradient(to right, transparent, var(--surface)); border-radius:0 12px 12px 0;
  opacity:1; transition:opacity .15s ease; }
.scroll-fade.scroll-fade-hidden{ opacity:0; }
table.rota{ width:100%; border-collapse:separate; border-spacing:0; font-size:var(--fs-xs); }
table.rota th, table.rota td{ border-bottom:1px solid var(--border); border-right:1px solid var(--border); padding:0; }
table.rota th{ background:var(--surface-2); font-weight:600; padding:8px 6px; text-align:center; }
table.rota td.rowhead, table.rota th.corner{ position:sticky; left:0; z-index:3; background:var(--surface-2); text-align:left; padding:8px 10px; min-width:170px; }
.rowhead-name{ font-weight:600; }
.rowhead-role{ font-weight:500; font-size:var(--fs-xs); color:var(--brand); margin-top:1px; }
.role-filter{ display:flex; flex-wrap:wrap; gap:6px; margin:10px 0 2px; }
.role-chip{ padding:4px 11px; font-size:var(--fs-xs); font-weight:600; border:1px solid var(--border-strong); border-radius:99px; background:var(--surface); color:var(--ink-soft); cursor:pointer; }
.role-chip.active{ background:var(--brand); color:var(--brand-ink); border-color:var(--brand); }
.role-filter .sf-chips{ display:flex; flex-wrap:wrap; gap:6px; }
.role-filter{ align-items:center; }
.role-filter .sf-tools{ display:flex; gap:6px; margin-left:auto; }
.sf-pub{ display:inline-block; width:7px; height:7px; border-radius:50%; background:var(--success); margin-right:6px; vertical-align:middle; }
.role-chip.active .sf-pub{ background:var(--brand-ink); }
.sf-menu{ position:relative; }
.sf-menu > summary{ list-style:none; }
.sf-menu > summary::-webkit-details-marker{ display:none; }
.sf-menu > summary::after{ content:'▾'; font-size:var(--fs-xs); margin-left:4px; opacity:.7; }
.sf-count{ margin-left:var(--sp-1); padding:0 6px; }
.sf-pop{ position:absolute; top:calc(100% + 4px); right:0; z-index:30; background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); box-shadow:var(--shadow-2); padding:var(--sp-2) var(--sp-3); min-width:240px; max-height:60vh; overflow:auto; }
.sf-sec + .sf-sec{ border-top:1px solid var(--border); margin-top:var(--sp-2); padding-top:var(--sp-2); }
.sf-sec-h{ font-size:var(--fs-xs); font-weight:700; color:var(--ink-soft); text-transform:uppercase; letter-spacing:.04em; margin-bottom:var(--sp-1); }
.sf-opt{ display:flex; align-items:flex-start; gap:var(--sp-2); padding:6px 2px; font-size:var(--fs-base); cursor:pointer; }
.sf-opt input{ margin-top:3px; accent-color:var(--brand); }
.sf-hint{ display:block; font-size:var(--fs-xs); color:var(--ink-faint); }
.sf-foot{ border-top:1px solid var(--border); margin-top:var(--sp-2); padding-top:var(--sp-2); display:flex; justify-content:flex-end; gap:var(--sp-2); }
.sf-showing{ flex-basis:100%; font-size:var(--fs-xs); color:var(--ink-soft); }
.sf-link{ background:none; border:none; padding:0; font:inherit; color:var(--brand); text-decoration:underline; cursor:pointer; }
table.rota td.sf-empty{ padding:var(--sp-5) var(--sp-3); text-align:center; color:var(--ink-soft); }
@media (max-width:820px){
  .role-filter .sf-tools{ margin-left:0; flex-basis:100%; }
  .sf-menu > summary{ min-height:44px; }
  .sf-pop{ position:fixed; left:0; right:0; bottom:0; top:auto; max-height:70vh; border-radius:var(--r-md) var(--r-md) 0 0; padding-bottom:var(--sp-5); }
  .sf-opt{ min-height:44px; align-items:center; }
  .sf-opt input{ margin-top:0; width:20px; height:20px; }
  .sf-link{ min-height:44px; }
}
table.rota td.dept-head{ background:var(--brand-soft); color:var(--brand); font-weight:700; font-size:var(--fs-xs); letter-spacing:.04em; text-transform:uppercase; padding:5px 10px; text-align:left; position:sticky; left:0; }
.rowhead-zones{ font-weight:400; font-size:var(--fs-xs); color:var(--ink-faint); margin-top:2px; white-space:normal; }
table.rota.month-view .cell{ width:52px; font-size:var(--fs-xs); padding:2px; }
table.rota.month-view th{ padding:6px 2px; font-size:var(--fs-xs); }
table.rota.month-view td.needs{ padding:6px 2px; font-size:var(--fs-xs); }
table.rota th.corner{ z-index:4; }
table.rota td.needs{ background:var(--surface-2); text-align:center; font-family:var(--font-mono); color:var(--ink-soft); padding:6px 4px; font-size:var(--fs-xs); }
table.rota td.needs-missing{ background:var(--danger-bg); color:var(--danger); font-weight:700; }
.needs-missing-list{ font-family:var(--font-ui); font-weight:500; font-size:var(--fs-xs); line-height:1.35; margin-top:3px; opacity:.9; white-space:normal; }
/* 27.09.2026 — each missing slot is its own clickable line (see
   openShortfallFinder), so a manager can jump straight to "who could fill
   this" instead of hunting down a matching empty cell by hand. */
.needs-missing-item{ cursor:pointer; text-decoration:underline; text-decoration-style:dotted; text-underline-offset:2px; }
.needs-missing-item:hover{ opacity:1; filter:brightness(1.2); }
.needs-missing-item.needs-missing-ro{ cursor:default; text-decoration:none; opacity:.75; }
.rowhead-ro{ font-weight:500; font-size:var(--fs-xs); color:var(--ink-faint); margin-top:2px; font-style:italic; }
table.rota .cell.cell-ro{ cursor:default; }
body.staff-mode .needs-missing-item{ cursor:default; text-decoration:none; }
body.staff-mode .needs-missing-item:hover{ filter:none; }
table.rota .cell{ width:104px; min-height:46px; text-align:center; font-family:var(--font-mono); font-size:var(--fs-xs); cursor:pointer; padding:4px; white-space:nowrap; }
table.rota .cell:hover{ filter:brightness(0.97); }
body.staff-mode table.rota .cell{ cursor:default; }
body.staff-mode table.rota .cell:hover{ filter:none; }
/* While picking shifts to swap, cells are clickable again (staff-mode's
   default cursor:default above is for the ordinary view-only case) and
   the requester's own chosen shift gets a visible outline so it's clear
   what's already picked while they go find the colleague's shift. */
body.staff-mode.swap-picking table.rota .cell{ cursor:pointer; }
table.rota .cell.cell-swap-picked{ outline:2px solid var(--brand); outline-offset:-2px; }
/* ---- moving a shift: drag (mouse / pen) and pick mode (touch). Green = allowed, amber = asks first, grey = blocked. ---- */
table.rota .cell.cell-draggable{ cursor:grab; }
body.dnd-active, body.dnd-active table.rota .cell, body.dnd-active table.rota .cell.cell-draggable{ cursor:grabbing !important; user-select:none; }
table.rota .cell.dnd-source{ opacity:.5; outline:2px dashed var(--brand); outline-offset:-2px; }
table.rota .cell.dnd-ok, table.rota .cell.dnd-warn, table.rota .cell.dnd-block{ position:relative; outline-offset:-2px; }
table.rota .cell.dnd-ok{ outline:2px solid var(--success); }
table.rota .cell.dnd-warn{ outline:2px solid var(--warning); }
table.rota .cell.dnd-block{ outline:2px dashed var(--ink-soft); }
@media (max-width:820px){ table.rota .cell.dnd-ok, table.rota .cell.dnd-warn, table.rota .cell.dnd-block{ outline-width:1px; } }
table.rota .cell.dnd-ok::after, table.rota .cell.dnd-warn::after, table.rota .cell.dnd-block::after{ content:''; position:absolute; inset:0; pointer-events:none; }
table.rota .cell.dnd-ok::after{ background:var(--success); opacity:.16; }
table.rota .cell.dnd-warn::after{ background:var(--warning); opacity:.26; }
table.rota .cell.dnd-block::after{ background:var(--ink-faint); opacity:.32; }
body.dnd-active table.rota .cell.dnd-block, body.dnd-active table.rota .cell.dnd-block.cell-draggable{ cursor:not-allowed !important; }
.dnd-ghost{ position:fixed; z-index:70; pointer-events:none; display:flex; align-items:center; gap:8px; padding:6px 10px; border-radius:var(--r-sm); background:var(--surface); color:var(--ink); border:1px solid var(--brand); box-shadow:var(--shadow-2); font-family:var(--font-mono); font-size:var(--fs-xs); font-weight:600; transform:rotate(-2deg); white-space:nowrap; }
.dnd-ghost-name{ font-family:var(--font-ui); color:var(--brand); }
.dnd-ghost-badge{ background:var(--brand); color:var(--brand-ink); border-radius:99px; padding:1px 7px; font-size:var(--fs-xs); font-family:var(--font-ui); }
.dnd-hint{ position:fixed; z-index:71; pointer-events:none; max-width:260px; padding:6px 10px; border-radius:var(--r-sm); font-size:var(--fs-xs); line-height:1.35; font-weight:600; box-shadow:var(--shadow-2); border:1px solid transparent; }
.dnd-hint[hidden]{ display:none; }
.dnd-hint-ok{ background:var(--success-bg); color:var(--success); border-color:var(--success); }
.dnd-hint-warn{ background:var(--warning-bg); color:var(--warning); border-color:var(--warning); }
.dnd-hint-block{ background:var(--surface-2); color:var(--ink-soft); border-color:var(--border-strong); }
.modal-move{ display:flex; flex-wrap:wrap; gap:6px; margin-top:12px; }
.modal-move .btn{ flex:1 1 auto; justify-content:center; }
.move-pick-bar{ position:fixed; left:12px; right:12px; bottom:12px; z-index:55; display:flex; align-items:center; gap:12px; padding:10px 12px 10px 14px; background:var(--brand); color:var(--brand-ink); border-radius:var(--r-md); box-shadow:var(--shadow-2); font-size:var(--fs-xs); line-height:1.4; }
.move-pick-bar[hidden]{ display:none; }
.move-pick-bar > span{ flex:1; }
.move-pick-bar .btn{ flex:none; background:transparent; color:var(--brand-ink); border-color:var(--on-brand-line); }
body.move-picking table.rota .cell{ cursor:pointer; }
body.move-picking .content{ padding-bottom:96px; }
.cell-role{ font-size:var(--fs-xs); font-weight:700; letter-spacing:.01em; opacity:.85; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; margin-top:1px; }
.month-view .cell-role{ display:none; }
.cell-zone{ font-size:var(--fs-xs); font-weight:600; opacity:.72; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; margin-top:1px; }
.cell-event{ font-size:var(--fs-xs); font-weight:700; color:var(--brand); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; margin-top:1px; }
.cell-empty{ color:var(--ink-faint); }
.cell-baseline{ background:var(--surface-2); color:var(--ink); }
.cell-protected{ background:var(--danger-bg); color:var(--danger); font-weight:600; }
.cell-timeoff{ background:var(--border-strong); color:var(--ink); font-weight:600; }
.cell-approved{ background:var(--success-bg); color:var(--success); font-weight:600; }
.cell-draft{ background:var(--accent-soft); color:var(--accent); font-weight:600; box-shadow:inset 0 0 0 1px var(--accent); }
.cell-left{ background:repeating-linear-gradient(45deg, var(--surface-2), var(--surface-2) 5px, var(--border) 5px, var(--border) 9px); color:var(--ink-faint); cursor:not-allowed; }
.cell-unpublished{ background:var(--surface-2); color:var(--ink-faint); font-style:italic; }
/* Closed days (Settings → Closed days): the header says so, an empty cell is hatched, a shift that was already saved stays and is outlined in red */
table.rota th.th-closed{ background:var(--danger-bg); color:var(--danger); }
.closed-tag{ display:block; font-size:var(--fs-xs); font-weight:700; letter-spacing:.02em; text-transform:uppercase; margin-top:2px; line-height:1.2; white-space:normal; }
table.rota.month-view .closed-tag{ font-size:var(--fs-xs); }
.cell-closed-day{ background:repeating-linear-gradient(45deg, var(--surface-2), var(--surface-2) 5px, var(--border) 5px, var(--border) 9px); color:var(--ink-faint); font-weight:600; }
.cell-closed-conflict{ box-shadow:inset 0 0 0 2px var(--danger); }
table.rota td.needs.needs-closed{ background:repeating-linear-gradient(45deg, var(--surface-2), var(--surface-2) 5px, var(--border) 5px, var(--border) 9px); color:var(--ink-faint); font-weight:600; }
.closed-note{ background:var(--danger-bg); color:var(--danger); border-radius:var(--r-sm); padding:8px 10px; font-size:var(--fs-xs); line-height:1.35; margin:8px 0 2px; }
th.hours-col, td.hours-col{ background:var(--surface-2); text-align:center; font-family:var(--font-mono); }
th.hours-col{ font-weight:600; }
td.hours-col{ font-weight:700; color:var(--ink-soft); font-size:var(--fs-xs); }
tr.events-row td.event-cell{ background:var(--brand-soft); color:var(--brand); font-weight:600; text-align:center; font-size:var(--fs-xs); padding:5px 6px; line-height:1.25; }
table.rota.month-view td.event-cell{ padding:3px 2px; font-size:var(--fs-xs); white-space:nowrap; overflow:hidden; text-overflow:ellipsis; max-width:52px; }
.legend{ display:flex; gap:14px; flex-wrap:wrap; font-size:var(--fs-xs); color:var(--ink-soft); align-items:center; }
.legend .sw{ display:inline-block; width:11px; height:11px; border-radius:3px; margin-right:5px; vertical-align:-1px; }

/* Timesheets (manager-only, task #64) — scheduled-vs-actual grid, reuses
   .week-nav for its date navigation but gets its own lighter table style
   since it has none of the rota's draft/approved/zone colour coding. */
table.timesheet{ width:100%; border-collapse:separate; border-spacing:0; font-size:var(--fs-xs); }
table.timesheet th, table.timesheet td{ border-bottom:1px solid var(--border); border-right:1px solid var(--border); padding:0; }
table.timesheet th{ background:var(--surface-2); font-weight:600; padding:8px 6px; text-align:center; }
table.timesheet td.rowhead, table.timesheet th.corner{ position:sticky; left:0; z-index:3; background:var(--surface-2); text-align:left; padding:8px 10px; min-width:170px; }
table.timesheet th.corner{ z-index:4; }
table.timesheet td.total-col, table.timesheet th.total-col{ font-family:var(--font-mono); font-weight:700; }
table.timesheet .ts-cell{ width:112px; min-height:46px; text-align:center; font-family:var(--font-mono); font-size:var(--fs-xs); cursor:pointer; padding:5px 4px; vertical-align:top; }
table.timesheet .ts-cell:hover{ filter:brightness(0.97); }
table.timesheet .ts-scheduled{ color:var(--ink-faint); }
table.timesheet .ts-actual{ margin-top:2px; font-weight:600; }
table.timesheet .ts-cell.ts-status-ok{ background:var(--success-bg); }
table.timesheet .ts-cell.ts-status-open{ background:var(--accent-soft); }
table.timesheet .ts-cell.ts-status-missing{ background:var(--danger-bg); }
table.timesheet .ts-cell.ts-status-stale{ background:var(--warning-bg); box-shadow:inset 0 0 0 2px var(--warning); }
table.timesheet .ts-open-warn{ margin-top:3px; color:var(--warning); font-weight:700; font-family:var(--font-ui); font-size:var(--fs-xs); line-height:1.25; }
table.timesheet .ts-cell.ts-future{ background:var(--surface-2); }
table.timesheet .ts-cell.ts-future .ts-scheduled{ color:var(--ink-faint); }
table.timesheet .ts-upcoming{ margin-top:var(--sp-1); font-family:var(--font-ui); }
table.timesheet td.ts-none{ padding:var(--sp-4); text-align:left; color:var(--ink-soft); font-family:var(--font-ui); font-size:var(--fs-base); cursor:default; }
/* Timesheets: the summary of the week's problems and the "Problems only" switch */
.ts-problems{ display:flex; align-items:center; flex-wrap:wrap; gap:var(--sp-3); }
.ts-problems .badge{ white-space:normal; border-radius:var(--r-md); font-size:var(--fs-base); padding:var(--sp-2) var(--sp-3); }
#tsOpenNotice{ margin:10px 0 0; }
.tp-row{ border:1px solid var(--border); border-radius:var(--r-md); padding:10px 12px; display:flex; flex-direction:column; gap:10px; background:var(--surface-2); }
.tp-row[hidden]{ display:none; }
.tp-row-head{ display:flex; justify-content:space-between; align-items:center; }

/* ---------- Team list (index.html renderEmployeesList): a table on a desktop, stacked rows on a phone ---------- */
.team-tools{ display:flex; flex-wrap:wrap; align-items:flex-end; gap:var(--sp-3); margin-bottom:var(--sp-4); }
.team-tools .field{ flex:0 1 200px; }
.team-tools .team-search{ flex:1 1 260px; max-width:360px; }
.team-tools .team-sort-field{ display:none; }
.team-tools[hidden]{ display:none; }
.team-count{ margin-left:auto; align-self:center; white-space:nowrap; }
.team-table{ width:100%; border-collapse:separate; border-spacing:0; background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); overflow:hidden; }
.team-table th{ background:var(--surface-2); text-align:left; font-size:var(--fs-xs); font-weight:600; color:var(--ink-soft); padding:var(--sp-1) var(--sp-3); border-bottom:1px solid var(--border); white-space:nowrap; }
.team-table td{ padding:var(--sp-3); border-bottom:1px solid var(--border); vertical-align:top; font-size:var(--fs-base); }
.team-table tbody tr:last-child td{ border-bottom:none; }
.team-table tbody tr{ cursor:pointer; }
.team-table tbody tr:hover td{ background:var(--surface-2); }
.team-th{ border:none; background:transparent; color:inherit; font:inherit; cursor:pointer; padding:var(--sp-2) 0; min-height:var(--h-btn-sm); }
.team-th:hover{ color:var(--ink); }
.team-name{ border:none; background:transparent; padding:0; font:inherit; font-weight:600; color:var(--ink); cursor:pointer; text-align:left; }
.team-name:hover{ color:var(--brand); text-decoration:underline; }
.team-sub{ font-size:var(--fs-xs); color:var(--ink-soft); margin-top:2px; overflow-wrap:anywhere; }
.team-tags{ display:flex; flex-wrap:wrap; gap:var(--sp-1); }
.team-c-act{ width:1%; white-space:nowrap; }
.team-c-act .actions{ display:flex; gap:var(--sp-1); justify-content:flex-end; }
.team-table .sr-only{ position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; }
@media (max-width:820px){
  .team-tools .field{ flex:1 1 calc(50% - var(--sp-2)); min-width:0; }
  .team-tools .team-search{ flex:1 1 100%; max-width:none; }
  .team-tools .team-sort-field{ display:flex; }
  .team-count{ margin-left:0; flex:1 1 calc(50% - var(--sp-2)); }
  .team-table, .team-table tbody{ display:block; background:transparent; border:none; border-radius:0; }
  .team-table thead{ display:none; }
  .team-table tbody tr{ display:grid; grid-template-columns:minmax(0,1fr) auto; align-items:start; column-gap:var(--sp-2); padding:var(--sp-3); margin-bottom:var(--sp-3); background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); }
  .team-table td{ display:block; padding:0; border-bottom:none; }
  .team-table tbody tr:hover td{ background:transparent; }
  .team-c-name{ grid-column:1; grid-row:1; }
  .team-c-act{ grid-column:2; grid-row:1; width:auto; }
  .team-c-role, .team-c-dept, .team-c-status{ grid-column:1 / -1; margin-top:var(--sp-2); }
  .team-c-dept{ font-size:var(--fs-xs); color:var(--ink-soft); }
  .team-c-role:empty, .team-c-status:empty{ display:none; }
  .team-name{ min-height:var(--h-touch); display:inline-flex; align-items:center; }
}

.report-box{ display:flex; flex-wrap:wrap; gap:18px; padding:14px 16px; background:var(--surface-2); border:1px solid var(--border); border-radius:var(--r-md); font-size:var(--fs-xs); }
.report-box .metric b{ font-family:var(--font-mono); font-size:var(--fs-base); }
.report-list{ font-size:var(--fs-xs); color:var(--ink-soft); }

.toast-host{ position:fixed; bottom:18px; right:18px; z-index:60; display:flex; flex-direction:column; gap:8px; max-width:340px; }

/* "Add to home screen" nudge — JS (isMobileViewport/maybeShowInstallBanner)
   is what actually restricts this to phones/tablets; the CSS here just
   positions it. Sits above the toast host (60) so a toast never hides it,
   but well below the tour overlay (9000) — the tour deliberately takes
   priority, see endTour()/maybeShowInstallBanner(). env(safe-area-inset-*)
   keeps it clear of the home-indicator bar on notched iPhones. */
.install-banner{ position:fixed; left:12px; right:12px; bottom:calc(12px + env(safe-area-inset-bottom,0px)); z-index:65; background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); box-shadow:var(--shadow-2); padding:12px 14px; display:flex; align-items:center; gap:10px; }
.install-banner-text{ flex:1 1 auto; min-width:0; display:flex; flex-direction:column; gap:2px; }
.install-banner-text strong{ font-family:var(--font-display); font-size:var(--fs-base); font-weight:600; color:var(--ink); }
.install-banner-text span{ font-size:var(--fs-xs); color:var(--ink-soft); line-height:1.4; }
.install-banner-actions{ display:flex; align-items:center; gap:4px; flex:0 0 auto; }

.topbar-title{ display:flex; align-items:center; gap:10px; }

/* Onboarding tour — a short, role-specific walkthrough that highlights one
   real nav item or button at a time. Deliberately sits well above every
   other overlay in the app (drawers/modals/toasts top out around z-index
   60) since it's meant to be the only thing a person can interact with
   while it's running. */
.tour-overlay{ position:fixed; inset:0; z-index:9000; background:var(--scrim); }
.tour-spot{ position:fixed; z-index:9001; border-radius:var(--r-md); box-shadow:0 0 0 9999px var(--scrim-strong), 0 0 0 3px var(--brand); pointer-events:none; display:none; }
.tour-card{ position:fixed; z-index:9002; width:300px; max-width:calc(100vw - 24px); background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); box-shadow:var(--shadow-2); padding:16px; }
.tour-card.tour-center{ left:50%; top:50%; transform:translate(-50%,-50%); width:320px; text-align:center; }
.tour-card h4{ margin:0 0 6px; font-family:var(--font-display); font-size:var(--fs-md); color:var(--ink); }
.tour-card p{ margin:0 0 14px; font-size:var(--fs-base); line-height:1.5; color:var(--ink-soft); }
.tour-foot{ display:flex; align-items:center; justify-content:space-between; gap:8px; }
.tour-card.tour-center .tour-foot{ justify-content:center; }
.tour-progress{ font-size:var(--fs-xs); color:var(--ink-faint); font-family:var(--font-mono); }
.tour-card.tour-center .tour-progress{ display:none; }
.tour-actions{ display:flex; gap:8px; }
.toast{ background:var(--toast-bg); color:var(--toast-ink); padding:var(--sp-3) 14px; border-radius:var(--r-md); font-size:var(--fs-xs); line-height:1.4; box-shadow:var(--shadow-toast); }
.toast-error{ background:var(--toast-error-bg); }
.toast-ok{ background:var(--toast-ok-bg); }
.toast-has-action{ display:flex; align-items:center; gap:var(--sp-3); }
.toast-has-action > span{ flex:1; }
.toast-action{ flex:none; border:1px solid var(--toast-line); background:transparent; color:var(--toast-ink); font:inherit; font-weight:700; padding:6px var(--sp-3); border-radius:var(--r-sm); cursor:pointer; min-height:var(--h-btn-sm); }
.toast-action:hover{ background:var(--toast-hover); }

[hidden]{ display:none !important; }

/* ---------- UX audit 20.10.2026 ---------- */
/* Schedule: main actions right under the week navigation, status as a sentence */
.schedule-actions{ display:flex; flex-wrap:wrap; gap:8px; align-items:center; }
.export-menu{ position:relative; }
.export-menu > summary{ list-style:none; }
.export-menu > summary::-webkit-details-marker{ display:none; }
.export-menu > summary::after{ content:'▾'; font-size:var(--fs-xs); margin-left:2px; opacity:.7; }
.export-menu-list{ position:absolute; top:calc(100% + 4px); left:0; z-index:30; background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); box-shadow:var(--shadow-2); padding:6px; display:flex; flex-direction:column; min-width:170px; }
.export-menu-list .btn{ justify-content:flex-start; }
.week-status{ display:flex; align-items:center; gap:8px; font-size:var(--fs-base); color:var(--ink-soft); margin-top:-10px; }
.week-status strong{ color:var(--ink); }
.week-status-dot{ width:9px; height:9px; border-radius:50%; flex:none; margin-top:1px; }
.week-status-ok .week-status-dot{ background:var(--success); }
.week-status-warn .week-status-dot{ background:var(--warning); }
.legend .sw-outline-danger{ background:transparent; box-shadow:inset 0 0 0 2px var(--danger); }
/* "6 open" instead of "15 / 6"; the list of open slots shows on tap */
table.rota td.needs{ font-family:var(--font-ui); }
.needs-toggle{ border:none; background:transparent; color:inherit; font:inherit; font-weight:700; cursor:pointer; padding:2px 4px; text-decoration:underline; text-decoration-style:dotted; text-underline-offset:3px; }
.needs-full{ color:var(--ink-faint); font-weight:500; }
table.rota td.needs .needs-missing-list{ display:none; }
table.rota td.needs.needs-expanded .needs-missing-list{ display:block; font-size:var(--fs-xs); }

/* ---------- Schedule, "Week summary" panel above the grid (scheduleweek.js). Desktop, manager. Hidden on a phone, which has its own Day view. ---------- */
.wk-sum{ border:1px solid var(--border); border-radius:var(--r-md); background:var(--surface); }
.wk-sum[hidden]{ display:none; }
.wk-sum-head{ display:flex; align-items:center; gap:var(--sp-3); width:100%; min-height:var(--h-btn); padding:var(--sp-2) var(--sp-4); border:none; background:transparent; color:var(--ink); font:inherit; font-weight:700; text-align:left; cursor:pointer; }
.wk-sum-head::after{ content:'▾'; margin-left:auto; color:var(--ink-soft); }
.wk-sum-head[aria-expanded="false"]::after{ transform:rotate(-90deg); }
.wk-sum-body{ display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:var(--sp-4); padding:var(--sp-3) var(--sp-4) var(--sp-4); border-top:1px solid var(--border); }
.wk-sum-body[hidden]{ display:none; }
.wk-sum-ok{ grid-column:1 / -1; margin:0; color:var(--success); font-weight:600; }
.wk-sum-block{ display:flex; flex-direction:column; align-items:flex-start; gap:var(--sp-2); min-width:0; }
.wk-sum-h{ margin:0; font-size:var(--fs-xs); font-weight:700; letter-spacing:.04em; text-transform:uppercase; color:var(--ink-soft); }
.wk-sum-line, .wk-sum-none, .wk-sum-sub{ margin:0; }
.wk-sum-none, .wk-sum-sub{ color:var(--ink-soft); font-size:var(--fs-xs); }
.wk-sum-line strong{ font-size:var(--fs-md); }
.wk-sum-list{ list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:var(--sp-2); width:100%; }
.wk-sum-day{ display:flex; flex-direction:column; align-items:flex-start; gap:2px; }
.wk-sum-past{ opacity:.7; }
.wk-sum-link, .wk-sum-slot{ border:none; background:transparent; padding:0; color:var(--danger); font:inherit; text-align:left; cursor:pointer; text-decoration:underline; text-decoration-style:dotted; text-underline-offset:3px; }
.wk-sum-link{ font-weight:700; }
.wk-sum-slots{ display:flex; flex-wrap:wrap; gap:0 var(--sp-3); font-size:var(--fs-xs); }
.wk-sum-slot-ro{ cursor:default; text-decoration:none; opacity:.75; }
.wk-sum-daytoggle::before{ content:'▸'; display:inline-block; width:1em; text-decoration:none; }
.wk-sum-daytoggle[aria-expanded="true"]::before{ content:'▾'; }
.wk-sum-day .wk-sum-slots{ padding-left:1em; }
.wk-sum-jump{ border:none; background:transparent; padding:0; font:inherit; color:var(--ink-soft); text-decoration:underline; cursor:pointer; }
.wk-sum-hours li{ display:flex; justify-content:space-between; gap:var(--sp-3); font-size:var(--fs-xs); color:var(--ink-soft); }
table.rota th.wk-flash, table.rota td.wk-flash{ outline:2px solid var(--brand); outline-offset:-2px; }
@media (max-width:820px){ .wk-sum{ display:none; } }

/* ---------- Overview, "Needs attention" (overviewattention.js). One row per thing to deal with; the row opens the screen where it is dealt with. ---------- */
.ov-attn[hidden]{ display:none; }
.ov-list{ display:flex; flex-direction:column; gap:var(--sp-2); }
.ov-item{ display:flex; align-items:center; gap:var(--sp-3); width:100%; min-height:var(--h-touch); padding:var(--sp-2) var(--sp-3); border:1px solid var(--border); border-radius:var(--r-md); background:var(--surface); color:var(--ink); font:inherit; text-align:left; cursor:pointer; }
.ov-item:hover{ background:var(--surface-2); }
.ov-count{ min-width:var(--sp-8); justify-content:center; font-size:var(--fs-md); }
.ov-text{ display:flex; flex-direction:column; gap:2px; min-width:0; flex:1; }
.ov-title{ font-weight:600; overflow-wrap:anywhere; }
.ov-detail{ color:var(--ink-soft); font-size:var(--fs-xs); overflow-wrap:anywhere; }
.ov-go{ color:var(--ink-soft); font-size:var(--fs-xs); font-weight:600; white-space:nowrap; }
.ov-go::after{ content:' \203A'; }
.ov-ok{ display:flex; align-items:center; gap:var(--sp-3); margin:0; color:var(--success); font-weight:600; }
.ov-loading{ margin:0; color:var(--ink-soft); }
@media (max-width:820px){ .ov-go{ display:none; } }

/* ---------- Schedule, phone "Day" view (scheduleday.js). Shown only at <=820px, for the manager; the week grid is hidden while it is on. ---------- */
.sched-mode{ margin-bottom:var(--sp-3); }
.sched-day .grid-scroll-wrap{ display:none; }
.day-view{ display:flex; flex-direction:column; gap:var(--sp-3); }
.day-view[hidden]{ display:none; }
.day-strip{ display:grid; grid-template-columns:repeat(7,minmax(0,1fr)); gap:var(--sp-1); }
.day-chip{ display:flex; flex-direction:column; align-items:center; justify-content:center; gap:2px; min-height:var(--h-touch); min-width:0; padding:var(--sp-1) 0; border:1px solid var(--border); border-radius:var(--r-sm); background:var(--surface); color:var(--ink); font:inherit; cursor:pointer; }
.day-chip-w{ font-size:var(--fs-xs); font-weight:600; color:var(--ink-soft); line-height:1.1; }
.day-chip-n{ font-size:var(--fs-base); font-weight:700; line-height:1.1; }
.day-chip-dot{ width:6px; height:6px; border-radius:50%; background:transparent; }
.day-chip-dot.on{ background:var(--warning); }
.day-chip.today .day-chip-n{ color:var(--brand); }
.day-chip.closed{ background:var(--danger-bg); }
.day-chip.active{ background:var(--brand); border-color:var(--brand); color:var(--brand-ink); }
.day-chip.active .day-chip-w, .day-chip.active .day-chip-n{ color:var(--brand-ink); }
.day-chip.active .day-chip-dot.on{ background:var(--brand-ink); }
.day-nav{ display:flex; align-items:center; gap:var(--sp-2); }
.day-title{ flex:1; min-width:0; text-align:center; font-weight:700; font-size:var(--fs-md); }
.day-events, .day-open{ background:var(--surface-2); border:1px solid var(--border); border-radius:var(--r-md); padding:var(--sp-3); font-size:var(--fs-base); }
.day-open{ background:var(--danger-bg); border-color:transparent; color:var(--danger); }
.day-block-head{ font-size:var(--fs-xs); font-weight:700; letter-spacing:.04em; text-transform:uppercase; margin-bottom:var(--sp-1); }
.day-event-times{ color:var(--ink-soft); font-size:var(--fs-xs); }
.day-open-item{ display:block; width:100%; min-height:var(--h-touch); padding:0; border:none; background:transparent; color:inherit; font:inherit; font-weight:600; text-align:left; text-decoration:underline; text-decoration-style:dotted; text-underline-offset:3px; cursor:pointer; }
.day-open-item.day-open-ro{ cursor:default; text-decoration:none; opacity:.75; }
.day-summary{ margin:0; font-size:var(--fs-xs); color:var(--ink-soft); }
.day-empty{ padding:var(--sp-5) var(--sp-3); text-align:center; color:var(--ink-soft); border:1px dashed var(--border-strong); border-radius:var(--r-md); }
.day-group{ display:flex; flex-direction:column; gap:var(--sp-2); }
.day-group-head{ display:flex; align-items:center; gap:var(--sp-2); margin:var(--sp-2) 0 0; font-size:var(--fs-xs); font-weight:700; letter-spacing:.04em; text-transform:uppercase; color:var(--brand); }
.day-group-count{ background:var(--brand-soft); color:var(--brand); border-radius:var(--r-pill); padding:0 var(--sp-2); font-size:var(--fs-xs); }
.day-row{ display:flex; align-items:center; justify-content:space-between; gap:var(--sp-3); width:100%; min-height:var(--h-touch); padding:var(--sp-3); border:1px solid var(--border); border-radius:var(--r-md); background:var(--surface); color:var(--ink); font:inherit; text-align:left; cursor:pointer; position:relative; }
.day-row-main{ display:flex; flex-direction:column; gap:2px; min-width:0; flex:1 1 auto; }
.day-row-name{ font-weight:700; font-size:var(--fs-base); overflow:hidden; text-overflow:ellipsis; }
.day-row-sub{ font-size:var(--fs-xs); color:var(--ink-soft); overflow:hidden; text-overflow:ellipsis; }
.day-row-badges{ display:flex; flex-wrap:wrap; gap:var(--sp-1); margin-top:2px; }
.day-row-when{ display:flex; flex-direction:column; align-items:center; justify-content:center; flex:none; min-width:96px; padding:var(--sp-2); border-radius:var(--r-sm); font-family:var(--font-mono); font-size:var(--fs-xs); text-align:center; }
.day-row-time{ white-space:nowrap; }
.day-row-hours{ font-size:var(--fs-xs); opacity:.8; }
.day-row-ro, .day-row-left{ cursor:default; }
.day-row-left{ color:var(--ink-faint); }
.day-row.dnd-source{ opacity:.5; outline:2px dashed var(--brand); outline-offset:-2px; }
.day-row.dnd-ok{ outline:2px solid var(--success); outline-offset:-2px; }
.day-row.dnd-warn{ outline:2px solid var(--warning); outline-offset:-2px; }
.day-row.dnd-block{ outline:2px dashed var(--ink-soft); outline-offset:-2px; }
body.move-picking .day-row{ cursor:pointer; }

/* Staff: "My shifts" / "Team" */
.seg-tabs{ display:flex; gap:4px; padding:4px; background:var(--surface-2); border:1px solid var(--border); border-radius:var(--r-md); max-width:520px; }
/* the install banner floats over the bottom of the page: leave room so it never hides the last rows */
body.install-banner-on .content{ padding-bottom:140px; }
.seg-tab{ flex:1; min-height:40px; border:none; border-radius:var(--r-sm); background:transparent; color:var(--ink-soft); font-weight:600; font-size:var(--fs-base); cursor:pointer; }
.seg-tab.active{ background:var(--surface); color:var(--ink); box-shadow:var(--shadow-1); }
.next-shift{ background:var(--success-bg); color:var(--success); border-radius:var(--r-md); padding:16px 18px; max-width:520px; }
.next-shift-empty{ background:var(--surface-2); color:var(--ink-soft); border:1px solid var(--border); }
.next-shift-label{ font-size:var(--fs-xs); font-weight:600; }
.next-shift-time{ font-family:var(--font-display); font-size:var(--fs-lg); font-weight:600; line-height:1.25; margin:2px 0; color:var(--ink); }
.next-shift-sub{ font-size:var(--fs-base); }
.calfeed-row{ max-width:520px; }
.calfeed-row .btn{ width:100%; }
.calfeed-sheet .actions{ display:flex; flex-wrap:wrap; gap:var(--sp-2); }
.calfeed-sheet input[readonly]{ width:100%; box-sizing:border-box; }
.calfeed-sec{ display:flex; flex-direction:column; align-items:flex-start; gap:var(--sp-2); padding-top:var(--sp-3); border-top:1px solid var(--border); }
.calfeed-sec .alert{ align-self:stretch; }
.calfeed-h{ font-size:var(--fs-md); font-weight:600; margin:0; }
.calfeed-steps{ margin:0; padding-left:var(--sp-5); display:flex; flex-direction:column; gap:var(--sp-1); font-size:var(--fs-base); }
.calfeed-emp{ display:flex; align-items:center; justify-content:space-between; gap:var(--sp-3); flex-wrap:wrap; font-size:var(--fs-base); }
.calfeed-emp[hidden]{ display:none; }
.my-week{ background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); max-width:520px; }
.my-week-row{ display:flex; justify-content:space-between; align-items:flex-start; gap:12px; padding:12px 16px; border-bottom:1px solid var(--border); font-size:var(--fs-base); }
.my-week-row:last-child{ border-bottom:none; }
.my-week-day{ white-space:nowrap; color:var(--ink-soft); }
.my-week-what{ text-align:right; display:flex; flex-direction:column; align-items:flex-end; }
.my-week-shift .my-week-what{ font-weight:600; color:var(--ink); }
.my-week-off .my-week-what{ color:var(--danger); font-weight:600; }
.my-week-timeoff .my-week-what, .my-week-sick .my-week-what{ color:var(--ink-soft); }
.my-week-none .my-week-what{ color:var(--ink-faint); }
.my-week-event{ font-size:var(--fs-xs); font-weight:600; color:var(--brand); }
.my-week-today{ background:var(--brand-soft); }
.my-week-today .my-week-day{ color:var(--ink); font-weight:600; }
.my-week-tag{ font-size:var(--fs-xs); font-weight:700; color:var(--brand); text-transform:uppercase; letter-spacing:.05em; margin-left:4px; }
.my-week-past{ opacity:.6; }
#panel-schedule.staff-tab-mine .grid-scroll-wrap,
#panel-schedule.staff-tab-mine .legend,
#panel-schedule.staff-tab-mine #roleFilter{ display:none !important; }

/* Clock in / out */
.clock-card{ max-width:420px; gap:6px; }
.clock-label{ font-size:var(--fs-xs); font-weight:600; color:var(--ink-soft); }
.clock-when{ font-family:var(--font-display); font-size:var(--fs-lg); font-weight:600; }
.clock-warn{ background:var(--warning-bg); color:var(--warning); border-radius:var(--r-sm); padding:10px 12px; font-weight:600; font-size:var(--fs-base); margin-top:4px; }
.clock-btn{ width:100%; justify-content:center; min-height:48px; font-size:var(--fs-md); margin-top:8px; }

/* Header: Tour and Feedback are the same quiet buttons */
.topbar-help{ display:flex; gap:6px; align-items:center; }
.topbar-help .btn{ color:var(--ink-soft); font-weight:500; text-decoration:none; }
.topbar-help .btn:hover{ color:var(--ink); }

/* Menu icons (inline SVG, one line set) */
.nav-item .ic{ display:inline-flex; align-items:center; justify-content:center; }
.nav-item .ic svg{ width:18px; height:18px; stroke:currentColor; fill:none; stroke-width:1.8; stroke-linecap:round; stroke-linejoin:round; }

/* Delete inside an editor, away from the edit button */
.drawer-danger-zone{ border-top:1px solid var(--border); padding-top:14px; margin-top:4px; display:flex; justify-content:flex-start; }

/* Overview while data is still loading: grey placeholders, not "0" */
.skeleton{ display:inline-block; min-width:2.2em; height:.9em; border-radius:var(--r-sm); background:var(--surface-2); background:linear-gradient(90deg,var(--surface-2),var(--border),var(--surface-2)); background-size:200% 100%; animation:skeleton 1.2s ease-in-out infinite; vertical-align:middle; }
@keyframes skeleton{ 0%{ background-position:100% 0; } 100%{ background-position:-100% 0; } }
@media (prefers-reduced-motion: reduce){ .skeleton{ animation:none; } }

@media (max-width: 820px){
  /* One mobile breakpoint. Body text 15px, fields 16px (iPhone stops zooming the page on every tap), touch targets 44px.
     Payroll and the Wage tracker are covered too (design system PR 3). */
  :root{ --fs-base:15px; }
  .btn,
  .icon-btn,
  .view-toggle-btn,
  .nav-item{ min-height:var(--h-touch); }
  .icon-btn{ min-width:var(--h-touch); }
  .btn-sm{ padding:0 var(--sp-3); }
  input[type=text], input[type=email],
  input[type=number], input[type=date],
  input[type=time], input[type=search],
  input[type=password],
  select, textarea{ font-size:16px; }
  input:not([type=checkbox]):not([type=radio]):not([type=file]), select, textarea{ font-size:16px; min-height:var(--h-touch); }   /* same selector as the base rule (40px on desktop), so it wins */
  input[type=checkbox]{ width:22px; height:22px; }
  .check-chip{ min-height:var(--h-touch); }   /* tick-box chips: the whole chip is the target */
  .toast-action{ min-height:var(--h-touch); padding:0 var(--sp-4); }
  .mobile-menu-toggle{ width:var(--h-touch); height:var(--h-touch); }
  /* Header in two rows: title (+ Tour, Feedback), then the screen's main button at full width — "+ New request" no longer runs off the edge */
  .page-head, .topbar{ flex-wrap:wrap; padding:var(--sp-4) var(--sp-4) var(--sp-3); gap:var(--sp-3); }
  .topbar-title{ flex-wrap:wrap; row-gap:4px; min-width:0; flex:1 1 100%; justify-content:space-between; }
  .page-head-actions:not(:empty), .topbar-actions:not(:empty){ flex:1 1 100%; flex-wrap:wrap; }
  .page-head-actions .btn-primary, .topbar-actions .btn-primary{ flex:1 1 auto; justify-content:center; }
  .content{ padding:18px 16px 60px; }
  .schedule-actions .btn-primary, .schedule-actions .btn-success{ flex:1 1 auto; justify-content:center; }
  .seg-tabs{ max-width:none; }
  .seg-tab{ min-height:var(--h-touch); }
}

@media (max-width: 820px){
  /* align-content:start matters as soon as .app drops to a single column:
     .app{min-height:100vh} plus two auto-sized grid rows (sidebar, main)
     means the browser's default row-stretch behaviour splits any leftover
     vertical space BETWEEN the two rows whenever their combined natural
     content is shorter than the viewport (e.g. the short Clock in/out
     panel) — inflating the sidebar into a tall blank bar instead of the
     slim strip it actually renders as. Pinning both rows to the top and
     letting any leftover space sit below .main (normal, unremarkable)
     fixes it without touching either row's own sizing. */
  .app{ grid-template-columns:1fr; align-content:start; }
  /* Was a horizontally-scrolling strip (the venue box, "signed in as"
     box and every nav item in one scrolling row) — items past the first
     screenful were just clipped off-screen with no visible hint there
     was more, which is what made it feel broken. Now a slim bar with a
     dropdown instead: nothing is ever off-screen or scroll-only. */
  .sidebar{ position:relative; flex-direction:row; align-items:center; justify-content:space-between; padding:10px 14px; gap:10px; border-right:none; border-bottom:1px solid var(--border); }
  .sidebar-foot{ display:none; }
  .mobile-menu-toggle{ display:inline-flex; align-items:center; justify-content:center; width:var(--h-touch); height:var(--h-touch); flex:none; border-radius:var(--r-sm); border:1px solid var(--border); background:var(--surface-2); color:var(--ink); cursor:pointer; }
  .sidebar-menu{ display:none; position:absolute; top:100%; left:0; right:0; flex-direction:column; gap:14px; padding:14px; background:var(--surface); border:1px solid var(--border); border-top:none; box-shadow:var(--shadow-2); max-height:calc(100vh - 58px); overflow-y:auto; z-index:40; }
  .sidebar.menu-open .sidebar-menu{ display:flex; }
  .nav{ flex-direction:column; }
  /* .week-nav (Schedule/Timesheets date row: ← label → Today, plus on
     Schedule an "Approved" pill and two view-toggle groups) is a single
     nowrap flex row — on a 375px screen its items add up to well past
     the viewport, which doesn't clip, it pushes the whole PAGE wider and
     makes it scroll sideways, with the tail end (the Approved pill) cut
     off at the fold. Wrapping it is enough: nothing is hidden, nothing
     needs its own extra scrollbar. */
  .week-nav{ flex-wrap:wrap; row-gap:8px; }
  .week-label{ min-width:0; }
  .view-toggle{ margin-left:0; }
  .stat-row{ grid-template-columns:repeat(2,1fr); }
  .form-grid, .form-grid.cols-3, .form-grid.cols-4{ grid-template-columns:1fr; }
  /* Narrower (still legible) name column and day-cell width means more
     days are visible before a swipe is needed — at 375px this goes from
     "2.5 of 7 days visible" to roughly 3 full days. scroll-snap makes
     each swipe land cleanly on a day boundary instead of stopping
     mid-column. */
  table.rota td.rowhead, table.rota th.corner,
  table.timesheet td.rowhead, table.timesheet th.corner{ min-width:118px; padding:8px 6px; }
  table.rota .cell{ width:98px; }
  table.rota.month-view .cell{ width:42px; }
  table.timesheet .ts-cell{ width:100px; }
  .grid-scroll{ scroll-snap-type:x proximity; }
  table.rota .cell, table.rota th:not(.corner),
  table.timesheet .ts-cell, table.timesheet th:not(.corner){ scroll-snap-align:start; }
}

@media print{
  .sidebar, .topbar-actions, .btn, .week-nav .icon-btn, .legend, .report-box, .panel-lead, .page-hint, .scroll-fade{ display:none !important; }
  body{ background:var(--print-paper); color:var(--print-ink); }
  .content{ padding:0; }
  .grid-scroll{ border:none; }
}

/* ==================================================================================================================
   Events and Learn (design system PR 2). One section per module, same prefixes as before; the modules no longer inject <style>.
   Type: --fs-* only. Colours: tokens only. One breakpoint: 820px. ================================================================================================================== */

/* ---------- Events: event cards (events/ui-events.js). evc- = card editor and viewer, evs- = the staff list. Status chips are .badge variants. ---------- */
#eventsBadge{ background:var(--danger); color:var(--surface) }
.ev-link{ cursor:pointer; text-decoration:underline; text-decoration-style:dotted; text-underline-offset:2px }
body.staff-mode table.rota .cell .ev-link{ cursor:pointer }
body.staff-mode.swap-picking table.rota .cell .ev-link{ cursor:pointer }
.evc-tag-btn{ margin-top:var(--sp-1) }
.evc-root{ display:flex; flex-direction:column; gap:var(--sp-3); min-width:0 }
.evc-status{ display:flex; flex-wrap:wrap; gap:var(--sp-2) var(--sp-3); align-items:center; border:1px solid var(--border); border-radius:var(--r-md); background:var(--surface-2); padding:var(--sp-2) var(--sp-3); font-size:var(--fs-xs) }
.evc-status .evc-who{ flex-basis:100%; color:var(--ink-soft); line-height:1.5 }
.evc-msg{ border-radius:var(--r-md); padding:var(--sp-3) var(--sp-3); font-size:var(--fs-xs); line-height:1.5; border:1px solid var(--border); background:var(--surface-2) }
.evc-msg.warn{ background:var(--warning-bg); border-color:transparent }
.evc-msg.bad{ background:var(--danger-bg); border-color:transparent; color:var(--ink) }
.evc-msg.ok{ background:var(--success-bg); border-color:transparent }
.evc-msg .evc-row{ display:flex; flex-wrap:wrap; gap:var(--sp-2); margin-top:var(--sp-2) }
.evc-sec{ border:1px solid var(--border); border-radius:var(--r-md); background:var(--surface) }
.evc-sec>summary{ cursor:pointer; font-weight:600; font-size:var(--fs-base); padding:var(--sp-3) var(--sp-4); list-style:none; display:flex; align-items:center; gap:var(--sp-2) }
.evc-sec>summary::-webkit-details-marker{ display:none }
.evc-sec>summary::before{ content:""; flex:none; width:7px; height:7px; border-right:2px solid var(--ink-faint); border-bottom:2px solid var(--ink-faint); transform:rotate(-45deg); transition:transform .12s }
.evc-sec[open]>summary::before{ transform:rotate(45deg) }
.evc-sec .evc-body{ padding:2px var(--sp-4) var(--sp-4); display:flex; flex-direction:column; gap:var(--sp-3) }
.evc-sec.priv{ border-color:var(--brand) }
.evc-sec .evc-sub{ font-size:var(--fs-xs); color:var(--ink-faint); font-weight:400 }
.evc-grid{ display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr)); gap:var(--sp-3) }
.evc-field{ display:flex; flex-direction:column; gap:var(--sp-1); font-size:var(--fs-xs); font-weight:600; color:var(--ink-soft); min-width:0 }
.evc-field input[type=text],.evc-field input[type=number],.evc-field input[type=date],.evc-field select,.evc-field textarea,.evc-in{ width:100%; box-sizing:border-box; padding:var(--sp-2) var(--sp-2); border:1px solid var(--border-strong); border-radius:var(--r-sm); background:var(--surface); color:var(--ink); font:inherit; font-size:var(--fs-base); font-weight:400 }
.evc-field textarea{ min-height:64px; resize:vertical }
.evc-field .hint,.evc-hint{ font-weight:400; font-size:var(--fs-xs); color:var(--ink-faint); line-height:1.45 }
.evc-field .evc-warn,.evc-warn{ font-weight:400; font-size:var(--fs-xs); color:var(--warning); background:var(--warning-bg); border-radius:var(--r-sm); padding:var(--sp-1) var(--sp-2) }
.evc-field .evc-err,.evc-err{ font-weight:400; font-size:var(--fs-xs); color:var(--danger) }
.evc-in.bad,.evc-field input.bad{ border-color:var(--danger); background:var(--danger-bg) }
.evc-rows{ display:flex; flex-direction:column; gap:var(--sp-2) }
.evc-r{ display:grid; gap:var(--sp-2); align-items:center }
.evc-r.run{ grid-template-columns:minmax(70px,.7fr) minmax(0,2.4fr) minmax(70px,.8fr) auto }
.evc-r.diet{ grid-template-columns:minmax(110px,1.3fr) minmax(60px,.5fr) minmax(0,2fr) auto }
.evc-r .evc-wrn{ grid-column:1/-1 }
.evc-checks{ display:flex; flex-wrap:wrap; gap:var(--sp-2) }
.evc-check{ display:flex; align-items:center; gap:var(--sp-2); font-size:var(--fs-xs); font-weight:500; padding:var(--sp-2) var(--sp-2); border:1px solid var(--border-strong); border-radius:var(--r-sm); background:var(--surface); color:var(--ink) }
.evc-tbl{ width:100%; border-collapse:collapse; font-size:var(--fs-xs) }
.evc-tbl th,.evc-tbl td{ padding:var(--sp-2) var(--sp-2); border-bottom:1px solid var(--border); text-align:left; vertical-align:top }
.evc-tbl thead th{ font-size:var(--fs-xs); text-transform:uppercase; letter-spacing:.05em; color:var(--ink-faint); white-space:nowrap }
.evc-wrap{ overflow-x:auto }
.evc-foot{ position:sticky; bottom:-26px; z-index:2; display:flex; flex-wrap:wrap; gap:var(--sp-2); justify-content:flex-end; align-items:center; padding:var(--sp-3) 0 var(--sp-7); background:var(--surface); border-top:1px solid var(--border) }
.evc-foot .spacer{ flex:1 }
.evc-pre{ white-space:pre-wrap; word-break:break-word; line-height:1.5; font-size:var(--fs-xs) }
.evc-kv{ display:grid; grid-template-columns:minmax(90px,150px) 1fr; gap:var(--sp-1) var(--sp-3); font-size:var(--fs-xs) }
.evc-kv dt{ color:var(--ink-soft); font-weight:600; font-size:var(--fs-xs) }
.evc-kv dd{ margin:0; min-width:0; word-break:break-word }
.evc-tight{ display:flex; gap:2px }
.modal[data-evc-modal]{ max-height:90vh; overflow:auto }
.evs-list{ display:flex; flex-direction:column; gap:var(--sp-3) }
.evs-item{ display:flex; flex-direction:column; gap:var(--sp-2); text-align:left; width:100%; border:1px solid var(--border); border-radius:var(--r-md); background:var(--surface); padding:var(--sp-3) var(--sp-4); cursor:pointer; color:var(--ink); font:inherit }
.evs-item:hover{ border-color:var(--brand) }
.evs-item .evs-top{ display:flex; flex-wrap:wrap; gap:var(--sp-2) var(--sp-3); align-items:center; justify-content:space-between }
.evs-item .evs-name{ font-weight:600; font-size:var(--fs-base) }
.evs-item .evs-meta{ font-size:var(--fs-xs); color:var(--ink-soft) }
.evs-confirm{ border:1px solid var(--border); border-radius:var(--r-md); padding:var(--sp-3) var(--sp-4); background:var(--surface-2); display:flex; flex-direction:column; gap:var(--sp-2) }
@media (max-width:820px){ .evc-r.run{ grid-template-columns:1fr 1fr auto } .evc-r.run .what{ grid-column:1/-1; order:3 } .evc-r.diet{ grid-template-columns:1fr 80px auto } .evc-r.diet .note{ grid-column:1/-1; order:3 } .evc-kv{ grid-template-columns:1fr } }

/* ---------- Learn: library, articles, search, editor (learn/ui.js). lrn- prefix. Status pills are .badge variants. ---------- */
.lrn-bar{ display:flex; flex-wrap:wrap; gap:var(--sp-3); align-items:center; margin-bottom:var(--sp-4) }
.lrn-search{ flex:1 1 280px; display:flex; align-items:center; gap:var(--sp-2); background:var(--surface); border:1px solid var(--border-strong); border-radius:var(--r-md); padding:2px var(--sp-3); max-width:640px }
.lrn-search:focus-within{ border-color:var(--brand); box-shadow:0 0 0 2px var(--brand-soft) }
.lrn-search input{ border:0; background:transparent; outline:0; padding:var(--sp-2) 0; width:100%; font-size:var(--fs-base) }
.lrn-chips{ display:flex; flex-wrap:wrap; gap:var(--sp-2); align-items:center; margin:0 0 var(--sp-4) }
.lrn-chip,.lrn-tab{ display:inline-flex; align-items:center; border:1px solid var(--border-strong); background:var(--surface); border-radius:var(--r-pill); padding:var(--sp-1) var(--sp-3); font-size:var(--fs-xs); font-weight:600; cursor:pointer; color:var(--ink-soft) }
.lrn-chip.on,.lrn-tab.on{ background:var(--brand); border-color:var(--brand); color:var(--brand-ink) }
.lrn-chip .n,.lrn-tab .n{ opacity:.75; margin-left:var(--sp-1); font-weight:500 }
.lrn-group{ margin:0 0 var(--sp-6) }
.lrn-group>h3{ font-size:var(--fs-base); margin:0 0 var(--sp-3); color:var(--ink-soft); font-family:var(--font-ui); font-weight:700; letter-spacing:.02em }
.lrn-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(250px,1fr)); gap:var(--sp-3) }
.lrn-card{ text-align:left; background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:var(--sp-3) var(--sp-4); display:flex; flex-direction:column; gap:var(--sp-2); cursor:pointer; box-shadow:var(--shadow-1); width:100% }
.lrn-card:hover{ border-color:var(--brand) }
.lrn-card-title{ font-weight:600; font-size:var(--fs-base); color:var(--ink) }
.lrn-meta{ display:flex; flex-wrap:wrap; gap:var(--sp-1); align-items:center; font-size:var(--fs-xs); color:var(--ink-faint) }
.lrn-todo{ background:var(--warning-bg); border:1px solid transparent; border-radius:var(--r-md); padding:var(--sp-3) var(--sp-4); margin:0 0 var(--sp-4) }
.lrn-todo h3{ font-family:var(--font-ui); font-size:var(--fs-base); margin:0 0 var(--sp-2) }
.lrn-todo button{ display:flex; gap:var(--sp-2); align-items:center; justify-content:space-between; width:100%; text-align:left; background:var(--surface); border:1px solid var(--border); border-radius:var(--r-sm); padding:var(--sp-2) var(--sp-3); margin-top:var(--sp-2); cursor:pointer; font-weight:600 }
.lrn-res{ display:block; width:100%; text-align:left; background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:var(--sp-3) var(--sp-4); margin-bottom:var(--sp-2); cursor:pointer }
.lrn-res:hover{ border-color:var(--brand) }
.lrn-res .t{ font-weight:600; font-size:var(--fs-base) }
.lrn-res .s{ font-size:var(--fs-xs); color:var(--ink-soft); margin-top:3px }
.lrn-res mark,.lrn-article mark{ background:var(--accent-soft); color:inherit; border-radius:3px; padding:0 1px }
.lrn-readbar{ display:flex; flex-wrap:wrap; gap:var(--sp-2); align-items:center; margin-bottom:var(--sp-4) }
.lrn-spacer{ flex:1 }
.lrn-article{ background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:var(--sp-6) var(--sp-6); max-width:780px; box-shadow:var(--shadow-1) }
.lrn-kicker{ font-size:var(--fs-xs); font-weight:700; letter-spacing:.08em; text-transform:uppercase; color:var(--ink-faint) }
.lrn-article .lrn-h{ font-size:var(--fs-md); margin:var(--sp-6) 0 var(--sp-2) }
.lrn-article p{ margin:0 0 var(--sp-3); font-size:var(--fs-base); line-height:1.6 }
.lrn-article ul,.lrn-article ol{ margin:0 0 var(--sp-4); padding-left:var(--sp-6); font-size:var(--fs-base); line-height:1.6 }
.lrn-warn{ display:flex; gap:var(--sp-3); background:var(--danger-bg); border-left:4px solid var(--danger); border-radius:var(--r-sm); padding:var(--sp-3) var(--sp-4); margin:0 0 var(--sp-4); font-size:var(--fs-base); line-height:1.55 }
.lrn-fig{ margin:0 0 var(--sp-4) }
.lrn-fig img{ max-width:100%; border-radius:var(--r-md); border:1px solid var(--border); cursor:zoom-in; display:block; background:var(--surface-2); min-height:60px }
.lrn-fig figcaption{ font-size:var(--fs-xs); color:var(--ink-soft); margin-top:var(--sp-1) }
.lrn-link{ color:var(--brand); font-weight:600 }
.lrn-confirm{ max-width:780px; margin-top:var(--sp-4); border-radius:var(--r-md); padding:var(--sp-4) var(--sp-4); border:1px solid var(--border); background:var(--surface) }
.lrn-confirm.todo{ background:var(--warning-bg); border-color:transparent }
.lrn-confirm.done{ background:var(--success-bg); border-color:transparent; color:var(--success); font-weight:600 }
.lrn-prog{ max-width:780px; margin-top:var(--sp-4) }
.lrn-bar-track{ height:8px; background:var(--surface-2); border-radius:var(--r-pill); overflow:hidden; border:1px solid var(--border) }
.lrn-bar-fill{ height:100%; background:var(--success) }
.lrn-names{ font-size:var(--fs-xs); color:var(--ink-soft); margin:var(--sp-1) 0 0 }
.lrn-names b{ color:var(--ink) }
.lrn-edit{ max-width:820px; display:flex; flex-direction:column; gap:var(--sp-4) }
.lrn-errors{ background:var(--danger-bg); border:1px solid transparent; border-left:4px solid var(--danger); border-radius:var(--r-sm); padding:var(--sp-3) var(--sp-4); color:var(--danger); font-size:var(--fs-xs) }
.lrn-errors ul{ margin:var(--sp-1) 0 0; padding-left:var(--sp-5) }
.lrn-blk{ border:1px solid var(--border); border-radius:var(--r-md); background:var(--surface); padding:var(--sp-3) var(--sp-3); display:flex; flex-direction:column; gap:var(--sp-2) }
.lrn-blk-head{ display:flex; align-items:center; gap:var(--sp-1) }
.lrn-blk-type{ font-size:var(--fs-xs); font-weight:700; text-transform:uppercase; letter-spacing:.06em; color:var(--ink-faint) }
.lrn-add{ display:flex; flex-wrap:wrap; gap:var(--sp-2) }
.lrn-prev{ max-width:240px; max-height:160px; border-radius:var(--r-sm); border:1px solid var(--border); background:var(--surface-2); min-height:48px }
.lrn-aud-grid{ display:flex; flex-wrap:wrap; gap:var(--sp-2); margin-top:var(--sp-2) }
.lrn-aud-group{ flex:1 1 220px }
.lrn-aud-group .eyebrow{ margin:var(--sp-2) 0 var(--sp-1) }
.lrn-rev{ background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:var(--sp-3) var(--sp-4); margin-bottom:var(--sp-3); display:flex; flex-direction:column; gap:var(--sp-2) }
.lrn-rev.off{ opacity:.55 }
.lrn-rev-head{ display:flex; gap:var(--sp-3); align-items:center }
.lrn-rev pre{ white-space:pre-wrap; font-family:var(--font-ui); font-size:var(--fs-xs); color:var(--ink-soft); margin:0; max-height:120px; overflow:auto; background:var(--surface-2); border-radius:var(--r-sm); padding:var(--sp-2) var(--sp-3) }
.lrn-note{ background:var(--accent-soft); border-radius:var(--r-md); padding:var(--sp-3) var(--sp-4); font-size:var(--fs-xs); margin:0 0 var(--sp-3) }
.lrn-busy{ display:flex; align-items:center; gap:var(--sp-3); background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:var(--sp-5); max-width:520px }
.lrn-spin{ width:18px; height:18px; border-radius:50%; border:3px solid var(--border); border-top-color:var(--brand); animation:lrn-s 0.9s linear infinite }
@keyframes lrn-s{to{transform:rotate(360deg)}}
.lrn-tabs{ display:flex; flex-wrap:wrap; gap:var(--sp-2); margin:0 0 var(--sp-4) }
.lrn-lightbox{ position:fixed; inset:0; background:var(--scrim-media); z-index:80; display:flex; align-items:center; justify-content:center; cursor:zoom-out }
.lrn-lightbox img{ max-width:94vw; max-height:92vh; border-radius:var(--r-sm) }
@media (max-width:820px){ .lrn-article{ padding:var(--sp-4) var(--sp-3) } }

/* ---------- Learn / Courses and tests (learn/ui-courses.js). crs- prefix. ---------- */
.crs-head{ max-width:780px; margin:0 0 var(--sp-4) }
.crs-desc{ font-size:var(--fs-base); line-height:1.6; color:var(--ink-soft); margin:0 0 var(--sp-3); white-space:pre-line }
.crs-box{ background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:var(--sp-4) var(--sp-4); max-width:780px; margin:0 0 var(--sp-4) }
.crs-box h3{ font-family:var(--font-ui); font-size:var(--fs-base); margin:0 0 var(--sp-2) }
.crs-box.ok{ background:var(--success-bg); border-color:transparent }
.crs-box.todo{ background:var(--warning-bg); border-color:transparent }
.crs-box.bad{ background:var(--danger-bg); border-color:transparent }
.crs-lessons{ display:flex; flex-direction:column; gap:var(--sp-2); max-width:780px; margin:0 0 var(--sp-4) }
.crs-lesson{ display:flex; gap:var(--sp-3); align-items:center; width:100%; text-align:left; background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:var(--sp-3) var(--sp-4); cursor:pointer; font-weight:600; font-size:var(--fs-base) }
.crs-lesson:hover{ border-color:var(--brand) }
.crs-tick{ width:22px; height:22px; border-radius:50%; border:2px solid var(--border-strong); display:inline-flex; align-items:center; justify-content:center; font-size:var(--fs-xs); flex:none; color:transparent }
.crs-tick.on{ background:var(--success); border-color:var(--success); color:var(--brand-ink) }
.crs-q{ background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:var(--sp-4) var(--sp-4); margin:0 0 var(--sp-3); max-width:780px }
.crs-q .crs-qn{ font-size:var(--fs-xs); font-weight:700; letter-spacing:.06em; text-transform:uppercase; color:var(--ink-faint) }
.crs-q .crs-qt{ font-size:var(--fs-base); font-weight:600; margin:var(--sp-1) 0 var(--sp-3); line-height:1.45; white-space:pre-line }
.crs-opt{ display:flex; gap:var(--sp-3); align-items:flex-start; padding:var(--sp-2) var(--sp-3); border:1px solid var(--border); border-radius:var(--r-md); margin:0 0 var(--sp-2); cursor:pointer; font-size:var(--fs-base); line-height:1.4 }
.crs-opt:hover{ border-color:var(--brand) }
.crs-opt input{ margin-top:3px; flex:none }
.crs-opt.right{ background:var(--success-bg); border-color:var(--success) }
.crs-opt.wrong{ background:var(--danger-bg); border-color:var(--danger) }
.crs-opt.plain{ cursor:default }
.crs-why{ font-size:var(--fs-xs); color:var(--ink-soft); margin:var(--sp-2) 0 0; line-height:1.5 }
.crs-score{ font-size:var(--fs-xl); font-weight:700; line-height:1.1 }
.crs-bank{ max-width:780px }
.crs-qcard{ background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:var(--sp-3) var(--sp-4); margin:0 0 var(--sp-3); display:flex; flex-direction:column; gap:var(--sp-2) }
.crs-qcard.off{ opacity:.6 }
.crs-qcard ul{ margin:0; padding-left:var(--sp-5); font-size:var(--fs-xs); line-height:1.5 }
.crs-qcard li.c{ font-weight:700; color:var(--success) }
.crs-actions{ display:flex; flex-wrap:wrap; gap:var(--sp-2); align-items:center }
.crs-lesson-ed{ border:1px solid var(--border); border-radius:var(--r-md); background:var(--surface-2); padding:var(--sp-3); display:flex; flex-direction:column; gap:var(--sp-3) }
.crs-num{ width:92px }
.crs-rules{ display:grid; grid-template-columns:repeat(auto-fill,minmax(190px,1fr)); gap:var(--sp-3) }
.crs-person{ display:flex; justify-content:space-between; gap:var(--sp-3); align-items:center; padding:var(--sp-2) 0; border-top:1px solid var(--border); font-size:var(--fs-xs) }
.crs-person:first-child{ border-top:0 }
.crs-sel{ width:auto; padding:var(--sp-1) var(--sp-3); border-radius:var(--r-pill) }
.crs-lesson .sr-only{ position:absolute; width:1px; height:1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap }
@media (max-width:820px){ .crs-box{ padding:var(--sp-3) } }

/* ---------- Learn / Menu: dish cards, allergen block, dish editor (learn/ui-menu.js). mnu- prefix. Allergens are .badge-bad (danger), "may contain" .badge-warn, diet .badge-ok: the allergen block must stay unmistakable. ---------- */
.mnu-card{ padding:0; overflow:hidden; gap:0 }
.mnu-card .mnu-thumb{ width:100%; aspect-ratio:16/10; object-fit:cover; display:block; background:var(--surface-2); border-bottom:1px solid var(--border) }
.mnu-card .mnu-body{ padding:var(--sp-3) var(--sp-4) var(--sp-3); display:flex; flex-direction:column; gap:var(--sp-2) }
.mnu-hook{ font-size:var(--fs-xs); color:var(--ink-soft); line-height:1.4 }
.mnu-filters{ border:1px solid var(--border); border-radius:var(--r-md); background:var(--surface); padding:var(--sp-2) var(--sp-3); margin:0 0 var(--sp-4) }
.mnu-filters summary{ cursor:pointer; font-weight:600; font-size:var(--fs-xs); display:flex; gap:var(--sp-2); align-items:center }
.mnu-filters .checks{ display:flex; flex-wrap:wrap; gap:var(--sp-2); margin:var(--sp-2) 0 var(--sp-3) }
.mnu-hero{ display:grid; grid-template-columns:minmax(0,300px) minmax(0,1fr); gap:var(--sp-5); align-items:start; margin:0 0 var(--sp-4) }
.mnu-hero .lrn-fig{ margin:0 }
.mnu-hero h2{ margin:2px 0 var(--sp-2) }
.mnu-hookline{ font-size:var(--fs-base); color:var(--ink-soft); line-height:1.45; margin:0 0 var(--sp-3) }
.mnu-allergy{ border-radius:var(--r-md); padding:var(--sp-3) var(--sp-4); margin:0 0 var(--sp-4); border:1px solid var(--border); background:var(--surface-2) }
.mnu-allergy.bad{ background:var(--danger-bg); border-color:transparent; border-left:4px solid var(--danger) }
.mnu-allergy .row{ display:flex; flex-wrap:wrap; gap:var(--sp-2); align-items:center; margin:0 0 var(--sp-2) }
.mnu-allergy .row>b{ min-width:90px }
.mnu-allergy .by{ font-size:var(--fs-xs); color:var(--ink-soft); margin:var(--sp-2) 0 0 }
.mnu-allergy .foot{ font-size:var(--fs-xs); color:var(--ink-faint); margin:var(--sp-2) 0 0; line-height:1.4 }
.mnu-cols{ display:grid; grid-template-columns:minmax(0,1fr) minmax(0,1fr); gap:var(--sp-1) var(--sp-7) }
.mnu-cols h3{ font-size:var(--fs-base); margin:var(--sp-4) 0 var(--sp-2); font-family:var(--font-ui) }
.mnu-ing{ font-size:var(--fs-base); line-height:1.6; margin:0 0 var(--sp-2) }
.mnu-legend{ font-size:var(--fs-xs); color:var(--ink-faint); margin:0 0 var(--sp-3) }
.mnu-tags{ display:flex; flex-wrap:wrap; gap:var(--sp-2) }
.mnu-up{ background:var(--surface-2); border-radius:var(--r-md); padding:var(--sp-2) var(--sp-3); margin:0 0 var(--sp-2); font-size:var(--fs-base) }
.mnu-up b{ display:block; font-size:var(--fs-xs); letter-spacing:.06em; text-transform:uppercase; color:var(--ink-faint); margin:0 0 3px }
.mnu-note{ background:var(--accent-soft); border-radius:var(--r-md); padding:var(--sp-3) var(--sp-4); font-size:var(--fs-xs); margin:0 0 var(--sp-3); white-space:pre-wrap }
.mnu-sec{ border:1px solid var(--border); border-radius:var(--r-md); background:var(--surface); padding:var(--sp-3) var(--sp-4); display:flex; flex-direction:column; gap:var(--sp-3) }
.mnu-sec>h3{ margin:0; font-size:var(--fs-base); font-family:var(--font-ui) }
.mnu-ings{ display:flex; flex-direction:column; gap:var(--sp-2) }
.mnu-irow{ border:1px solid var(--border); border-radius:var(--r-md); padding:var(--sp-2) var(--sp-3); background:var(--surface-2); display:flex; flex-direction:column; gap:var(--sp-2) }
.mnu-irow.sub{ margin-left:var(--sp-6); background:var(--surface) }
.mnu-imain{ display:flex; flex-wrap:wrap; gap:var(--sp-2); align-items:center }
.mnu-imain input[type=text]{ flex:1 1 180px; min-width:0 }
.mnu-isel{ display:flex; flex-wrap:wrap; gap:var(--sp-1) }
.mnu-hint{ font-size:var(--fs-xs); color:var(--ink-soft); display:flex; flex-wrap:wrap; gap:var(--sp-1); align-items:center }
.mnu-panel{ display:flex; flex-wrap:wrap; gap:var(--sp-1) }
.mnu-panel .check-chip{ font-size:var(--fs-xs); padding:var(--sp-1) var(--sp-2) }
.mnu-check{ border-radius:var(--r-md); padding:var(--sp-3) var(--sp-4); border:1px solid var(--border); background:var(--surface-2) }
.mnu-check.ok{ background:var(--success-bg); border-color:transparent }
.mnu-check ul{ margin:var(--sp-1) 0 var(--sp-3); padding-left:var(--sp-5); font-size:var(--fs-base) }
.mnu-check .bad{ color:var(--danger); font-size:var(--fs-xs); margin:0 0 var(--sp-2) }
.mnu-photo{ display:flex; flex-wrap:wrap; gap:var(--sp-3); align-items:flex-start }
.mnu-photo img{ max-width:220px; max-height:150px; border-radius:var(--r-sm); border:1px solid var(--border); background:var(--surface-2); min-height:48px }
@media (max-width:820px){ .mnu-hero{ grid-template-columns:1fr } .mnu-cols{ grid-template-columns:1fr } .mnu-irow.sub{ margin-left:var(--sp-3) } }

/* Phone: every control Events and Learn draw themselves is a 44px target (the shared .btn / .icon-btn / fields are covered above) */
@media (max-width:820px){
  .lrn-chip, .lrn-tab, .crs-lesson, .crs-opt, .evc-check, .evs-item, .lrn-todo button, .lrn-res, .lrn-card, .evc-sec > summary, .mnu-filters summary{ min-height:var(--h-touch); }
  .mnu-filters summary, .evc-sec > summary{ display:flex; align-items:center; }
}


/* ---------- utilities (replace one-off inline style="") ---------- */
.m-0{ margin:0; } .mt-0{ margin-top:0; }
.mt-1{ margin-top:var(--sp-1); } .mt-2{ margin-top:var(--sp-2); } .mt-3{ margin-top:var(--sp-3); } .mt-4{ margin-top:var(--sp-4); }
.mb-1{ margin-bottom:var(--sp-1); } .mb-2{ margin-bottom:var(--sp-2); } .mb-3{ margin-bottom:var(--sp-3); }
.stack{ display:flex; flex-direction:column; gap:var(--sp-3); }
.stack-sm{ display:flex; flex-direction:column; gap:var(--sp-2); }
.flex-row{ display:flex; gap:var(--sp-2); }
.items-center{ align-items:center; } .items-end{ align-items:flex-end; }
.flex-wrap{ flex-wrap:wrap; } .between{ justify-content:space-between; } .end{ justify-content:flex-end; } .start{ justify-content:flex-start; }
.grow{ flex:1; min-width:0; }
.fit{ width:fit-content; } .col-all{ grid-column:1 / -1; }
.fw-5{ font-weight:500; } .fw-6{ font-weight:600; } .pointer{ cursor:pointer; }
.text-soft{ color:var(--ink-soft); } .text-faint{ color:var(--ink-faint); } .text-warn{ color:var(--warning); } .text-bad{ color:var(--danger); }
.well{ background:var(--surface-2); border-radius:var(--r-sm); padding:var(--sp-3); }
.mw-card{ max-width:560px; }
.card-lead{ margin:0; padding:var(--sp-3) 18px 0; }
.form-grid.cols-1a{ grid-template-columns:1fr auto; }
.form-grid.cols-role{ grid-template-columns:1fr 150px auto; }
.sw-neutral{ background:var(--surface-2); border:1px solid var(--border); }
.sw-danger{ background:var(--danger-bg); }
.sw-border{ background:var(--border-strong); }
.sw-success{ background:var(--success-bg); }
.sw-warning{ background:var(--warning-bg); }
.sw-accent{ background:var(--accent-soft); }
.sw-draft{ background:var(--accent-soft); box-shadow:inset 0 0 0 1px var(--accent); }
.scroll-list{ max-height:340px; overflow-y:auto; }
.tight-top{ margin:calc(-1 * var(--sp-2)) 0 0; }
.staff-who{ padding:0 var(--sp-2); }
.staff-who .btn-ghost{ padding-left:0; }
.my-3{ margin:var(--sp-3) 0; }
.fs-xs{ font-size:var(--fs-xs); }
.self-center{ align-self:center; }
.box{ border:1px solid var(--border); border-radius:var(--r-sm); padding:var(--sp-2) 10px; }
.box-soft{ background:var(--surface-2); padding:var(--sp-3); }
.hint-pull{ margin:calc(-1 * var(--sp-1)) 0 2px; }
.my-2{ margin:var(--sp-2) 0; } .pt-1{ padding-top:var(--sp-1); } .ml-2{ margin-left:var(--sp-2); } .mw-160{ max-width:160px; }
.form-grid.cols-140{ grid-template-columns:1fr 140px; gap:var(--sp-2); }

/* ---------- alerts (messages inside forms and cards) ---------- */
.alert{ padding:var(--sp-2) var(--sp-3); border-radius:var(--r-sm); font-size:var(--fs-xs); line-height:1.45; }
.alert-bad{ background:var(--danger-bg); color:var(--danger); }
.alert-ok{ background:var(--success-bg); color:var(--success); }
.alert-warn{ background:var(--warning-bg); color:var(--ink); }
.alert-info{ background:var(--surface-2); border:1px solid var(--border-strong); color:var(--ink); }
.alert strong{ font-weight:700; }
.btn-block{ width:100%; }

/* ---------- standalone pages (login, set-password): one centred card ---------- */
body.auth{ min-height:100vh; display:flex; align-items:center; justify-content:center; padding:var(--sp-5); }
.auth-card{ width:100%; max-width:380px; padding:var(--sp-6); box-shadow:var(--shadow-2); }
.auth-card h1{ font-size:var(--fs-lg); text-align:center; margin:0 0 var(--sp-1); }
.auth-card .lead{ margin:0 0 var(--sp-5); font-size:var(--fs-xs); color:var(--ink-soft); text-align:center; }
.auth-card .alert{ display:none; margin-bottom:var(--sp-4); }
.auth-card .seg-tabs{ margin-bottom:var(--sp-5); max-width:none; }
.auth-card .btn-primary{ margin-top:var(--sp-1); }
.auth-card label.agree{ display:flex; align-items:flex-start; gap:var(--sp-2); font-size:var(--fs-xs); font-weight:400; line-height:1.45; color:var(--ink-soft); }
.auth-card label.agree input[type=checkbox]{ margin:2px 0 0; flex:0 0 auto; }
.auth-card label.agree span{ flex:1 1 auto; min-width:0; }
.auth-card a{ color:var(--brand); font-weight:600; text-decoration:none; }
.auth-card a:hover{ text-decoration:underline; }
.auth-foot{ margin:var(--sp-4) 0 0; text-align:center; font-size:var(--fs-xs); }
.auth-card .auth-foot a{ color:var(--ink-soft); font-weight:500; }
.auth-note{ margin:0 0 var(--sp-4); font-size:var(--fs-xs); color:var(--ink-soft); }

/* extra utilities (Events / Learn) */
.mb-4{ margin-bottom:var(--sp-4); } .mb-8{ margin-bottom:var(--sp-8); }
.items-start{ align-items:flex-start; } .self-start{ align-self:flex-start; }
.text-ok{ color:var(--success); }
.pre-line{ white-space:pre-line; } .ta-right{ text-align:right; } .w-full{ width:100%; }
.lrn-flex{ display:flex; }
.lrn-h2{ font-size:var(--fs-lg); } .lrn-h3{ font-size:var(--fs-md); }
.lrn-text{ font-size:var(--fs-base); line-height:1.5; } .lrn-ui{ font-family:var(--font-ui); }
.lrn-list{ padding-left:var(--sp-5); font-size:var(--fs-base); line-height:1.55; }
.lrn-list-sm{ padding-left:var(--sp-5); font-size:var(--fs-xs); line-height:1.5; }
.lrn-pad{ padding:var(--sp-4); }
.lrn-line{ padding:2px 0; font-size:var(--fs-xs); }
.lrn-back{ padding-left:0; }
.lrn-bordered{ border:1px solid var(--border); }
.lrn-measure{ max-width:70ch; }
.lrn-grow220{ flex:1 1 220px; }
.lrn-w240{ max-width:240px; }
.crs-narrow{ max-width:780px; } .mnu-wide{ max-width:980px; }


/* =====================================================================================================================
   Payroll (pr-) and Wage tracker (wt-)  — design system PR 3. Visual only: these used to be <style> blocks injected by
   payroll/ui.js (#prStyles) and wage/ui-wage.js (#wt-css). Tabs are .seg-tab, buttons are .btn, status chips are .badge,
   messages are .alert / .empty-state / .error-state / .loading-state; what is left here is layout that only these two have.
   ===================================================================================================================== */
.pr-hide{ display:none !important; }   /* parts of a form that do not apply right now (the condition is in payroll/ui.js) */
.pr-stack{ display:flex; flex-direction:column; gap:var(--sp-5); }
.pr-bar{ display:flex; flex-wrap:wrap; gap:var(--sp-3); align-items:flex-end; }
.pr-bar label.field{ min-width:160px; }

/* tabs: a wrapping .seg-tabs, so all twelve are visible at 375px without a sideways scroll */
.pr-tabs{ max-width:none; flex-wrap:wrap; }
.pr-tabs .seg-tab{ flex:0 1 auto; padding:0 var(--sp-3); display:inline-flex; align-items:center; justify-content:center; gap:var(--sp-2); white-space:nowrap; }
.pr-groupbar{ margin-bottom:var(--sp-3); }

/* messages inside the screens: .alert (shared) with lists; the warning icon of a line */
.pr-banner ul{ margin:var(--sp-2) 0 0; padding-left:var(--sp-5); } .pr-banner li{ margin:var(--sp-1) 0; }
.pr-banner .btn{ margin-left:var(--sp-1); }
.pr-warn{ color:var(--warning); margin-left:var(--sp-1); }
.pr-bad{ color:var(--danger); font-weight:600; }
.pr-err{ color:var(--danger); font-size:var(--fs-xs); font-weight:500; }
.pr-invalid input, .pr-invalid select, .pr-invalid .check-chip{ border-color:var(--danger); }
.pr-errsum{ background:var(--danger-bg); border-radius:var(--r-md); padding:var(--sp-3) var(--sp-4); font-size:var(--fs-xs); } .pr-errsum ul{ margin:var(--sp-2) 0 0; padding-left:var(--sp-5); }
.pr-modal-err{ background:var(--danger-bg); border-radius:var(--r-sm); padding:var(--sp-2) var(--sp-3); margin-top:var(--sp-3); font-size:var(--fs-xs); }

/* tables: wide ones scroll inside their own wrapper, never the page */
.pr-table-wrap, .wt-wrap{ overflow-x:auto; max-width:100%; }
.pr-table{ width:100%; border-collapse:collapse; font-size:var(--fs-xs); }
.pr-table th{ text-align:left; font-size:var(--fs-xs); text-transform:uppercase; letter-spacing:.05em; color:var(--ink-faint); padding:var(--sp-2) var(--sp-3); border-bottom:1px solid var(--border); white-space:nowrap; }
.pr-table td{ padding:var(--sp-2) var(--sp-3); border-bottom:1px solid var(--border); vertical-align:top; }
.pr-table .num{ text-align:right; font-variant-numeric:tabular-nums; white-space:nowrap; }
.pr-table tr.pr-detail td{ background:var(--surface-2); }
.pr-daycell{ font-variant-numeric:tabular-nums; text-align:center; white-space:nowrap; }
.pr-weeksep{ border-left:2px solid var(--border-strong); }
.pr-tight th, .pr-tight td{ padding-left:var(--sp-1); padding-right:var(--sp-1); }
.pr-hours-h{ font-size:var(--fs-xs); margin:var(--sp-4) 0 var(--sp-2); font-weight:600; }
.pr-money{ width:130px; text-align:right; font-variant-numeric:tabular-nums; }

/* totals tiles, run cards, blocked people */
.pr-tiles{ display:grid; grid-template-columns:repeat(auto-fit,minmax(150px,1fr)); gap:var(--sp-3); }
.pr-tile{ background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:var(--sp-3) var(--sp-4); }
.pr-tile .v{ font-family:var(--font-display); font-size:var(--fs-lg); font-weight:600; } .pr-tile .l{ font-size:var(--fs-xs); color:var(--ink-soft); }
.pr-blocked{ border:1px solid var(--border-strong); border-left:4px solid var(--danger); border-radius:var(--r-md); padding:var(--sp-3) var(--sp-4); background:var(--surface); display:flex; flex-direction:column; gap:var(--sp-2); }
.pr-blocked ul{ margin:0; padding-left:var(--sp-5); } .pr-blocked li{ margin:var(--sp-1) 0; }
.pr-owed{ background:var(--warning-bg); border-radius:var(--r-sm); padding:var(--sp-2) var(--sp-3); font-size:var(--fs-xs); }
.pr-runcard{ display:flex; flex-direction:column; gap:var(--sp-3); }
.pr-runhead{ display:flex; flex-wrap:wrap; gap:var(--sp-3); align-items:center; justify-content:space-between; }
.pr-section-gap{ margin-top:var(--sp-2); }
.pr-actions{ display:flex; flex-wrap:wrap; gap:var(--sp-2); }
.pr-decision{ display:grid; grid-template-columns:minmax(200px,260px) 1fr; gap:var(--sp-3); align-items:start; }
.pr-kv{ display:grid; grid-template-columns:max-content 1fr; gap:var(--sp-1) var(--sp-4); font-size:var(--fs-xs); } .pr-kv dt{ color:var(--ink-soft); } .pr-kv dd{ margin:0; }
.pr-detail-grid{ display:grid; grid-template-columns:repeat(auto-fit,minmax(240px,1fr)); gap:var(--sp-4); padding:var(--sp-2) var(--sp-1); }
.pr-detail-grid h4{ margin:0 0 var(--sp-2); font-size:var(--fs-xs); text-transform:uppercase; letter-spacing:.06em; color:var(--ink-faint); }
.pr-detail-grid ul{ margin:var(--sp-1) 0 0; padding-left:var(--sp-4); } .pr-detail-grid li{ margin:var(--sp-1) 0; font-size:var(--fs-xs); }

/* forms and dialogs */
.pr-help{ margin:var(--sp-1) 0 0; line-height:1.45; }
.pr-if-hourly{ display:contents; }
.pr-formgrid{ display:grid; grid-template-columns:repeat(auto-fit,minmax(200px,1fr)); gap:var(--sp-3); }
.pr-drawer-form{ display:flex; flex-direction:column; gap:var(--sp-4); }
.pr-days{ display:flex; flex-wrap:wrap; gap:var(--sp-2); }
.pr-sub{ margin:0; font-size:var(--fs-xs); color:var(--ink-soft); }
.pr-rulerow{ border:1px solid var(--border); border-radius:var(--r-md); padding:var(--sp-3); margin-bottom:var(--sp-3); background:var(--surface-2); } .pr-rulechecks{ display:flex; flex-direction:column; gap:var(--sp-2); } .pr-ak{ margin-top:var(--sp-3); }
.pr-importrow{ display:grid; grid-template-columns:24px 1.4fr 1.6fr 110px; gap:var(--sp-2); align-items:center; padding:var(--sp-2) 0; border-bottom:1px solid var(--border); font-size:var(--fs-xs); }
.pr-modal{ width:min(560px,94vw) !important; max-height:86vh; overflow:auto; } .pr-modal-body{ font-size:var(--fs-xs); line-height:1.5; }
/* small helpers that replaced one-off inline styles in the payroll screens */
.pr-mt2-0{ margin:var(--sp-2) 0 0; } .pr-mb2-0{ margin:0 0 var(--sp-2); } .pr-sec-gap{ margin:var(--sp-4) 0 var(--sp-1); }
.pr-eyebrow{ margin:var(--sp-3) 0 var(--sp-2); font-size:var(--fs-xs); text-transform:uppercase; letter-spacing:.06em; color:var(--ink-faint); }
.pr-ul{ margin:var(--sp-2) 0 0; padding-left:var(--sp-5); } .pr-ul-b{ margin:0 0 var(--sp-2); padding-left:var(--sp-5); } .pr-ul-pad{ padding-left:var(--sp-5); }
.pr-ul-sm{ margin:var(--sp-1) 0 0; padding-left:var(--sp-4); } .pr-ul-flush{ margin:0; padding-left:var(--sp-4); }
.pr-summary{ cursor:pointer; padding:var(--sp-4) var(--sp-5); font-weight:600; }
.pr-flex{ display:flex; } .pr-col{ flex-direction:column; } .pr-gap-3{ gap:var(--sp-3); } .pr-pad-0{ padding:0; } .pr-dim{ opacity:.6; } .pr-prewrap{ white-space:pre-wrap; margin:var(--sp-2) 0 0; }
.pr-h3-gap{ font-size:var(--fs-md); margin-bottom:var(--sp-2); }
.pr-fieldset-plain{ border:0; padding:0; margin:var(--sp-2) 0; }
.pr-checkrow{ display:flex; flex-wrap:wrap; gap:var(--sp-2) var(--sp-4); margin-top:var(--sp-1); }
.pr-inline{ display:inline-flex; align-items:center; gap:var(--sp-2); }
.pr-w64{ width:64px; } .pr-mw-140{ max-width:140px; } .pr-mw-260{ max-width:260px; } .pr-mw-320{ max-width:320px; }
@media (max-width:820px){ .pr-decision{ grid-template-columns:1fr; } .pr-importrow{ grid-template-columns:24px 1fr; } }

/* ---------- Wage tracker ---------- */
.wt-bar{ display:flex; flex-wrap:wrap; gap:var(--sp-3); align-items:center; margin:0 0 var(--sp-4); }
.wt-bar .wt-week{ font-family:var(--font-display); font-weight:600; font-size:var(--fs-md); min-width:230px; text-align:center; }
.wt-bar .spacer{ flex:1; }
.wt-bar input[type=date], .wt-view select{ width:auto; flex:0 0 auto; }
.wt-est{ font-size:var(--fs-xs); color:var(--ink-soft); margin:0 0 var(--sp-3); line-height:1.45; }
.wt-est b{ color:var(--ink); }
.wt-card{ margin:0 0 var(--sp-4); }
.wt-msg{ margin:0 0 var(--sp-4); }
.wt-tbl{ width:100%; border-collapse:collapse; font-size:var(--fs-xs); }
.wt-tbl th, .wt-tbl td{ padding:var(--sp-2) var(--sp-3); border-bottom:1px solid var(--border); text-align:left; vertical-align:middle; }
.wt-tbl thead th{ font-size:var(--fs-xs); text-transform:uppercase; letter-spacing:.05em; color:var(--ink-faint); white-space:nowrap; }
.wt-tbl .num{ text-align:right; font-variant-numeric:tabular-nums; white-space:nowrap; }
.wt-tbl tbody th{ font-weight:600; }
.wt-tbl tr.wt-tot th, .wt-tbl tr.wt-tot td{ border-top:2px solid var(--border-strong); font-weight:700; }
.wt-sub{ color:var(--ink-faint); font-weight:400; font-size:var(--fs-xs); }
.wt-pill, .wt-flag{ margin-left:var(--sp-2); vertical-align:middle; }
.wt-flag{ margin:var(--sp-1) var(--sp-1) var(--sp-1) 0; cursor:help; }
.wt-left.neg{ color:var(--danger); font-weight:700; }
.wt-twist{ width:var(--h-btn-sm); height:var(--h-btn-sm); color:var(--ink-soft); vertical-align:middle; }
.wt-days td{ background:var(--surface-2); padding:var(--sp-2) var(--sp-3) var(--sp-3); }
.wt-daygrid{ display:grid; grid-template-columns:repeat(7,minmax(70px,1fr)); gap:var(--sp-2); font-size:var(--fs-xs); }
.wt-daygrid > div{ background:var(--surface); border:1px solid var(--border); border-radius:var(--r-sm); padding:var(--sp-2); }
.wt-daygrid .d{ font-weight:700; color:var(--ink-soft); margin:0 0 var(--sp-1); }
.wt-daygrid .l{ color:var(--ink-faint); }
.wt-daygrid .today{ border-color:var(--brand); }
.wt-list{ margin:0; padding:0 0 0 var(--sp-5); font-size:var(--fs-xs); line-height:1.5; }
.wt-list li{ margin:0 0 var(--sp-1); }
.wt-foot{ font-size:var(--fs-xs); color:var(--ink-soft); line-height:1.5; }
.wt-foot summary{ cursor:pointer; font-weight:600; }
.wt-foot ul{ margin:var(--sp-2) 0 0; padding-left:var(--sp-5); }
.wt-note{ margin:var(--sp-2) var(--sp-3) var(--sp-3); } .wt-note-tight{ margin:var(--sp-2) var(--sp-3) var(--sp-1); }
.wt-form{ display:flex; flex-direction:column; gap:var(--sp-4); }
.wt-form h4{ margin:var(--sp-2) 0 0; font-size:var(--fs-base); }
.wt-form .hint{ font-size:var(--fs-xs); color:var(--ink-faint); font-weight:400; }
.wt-grid{ width:100%; border-collapse:collapse; font-size:var(--fs-xs); }
.wt-grid th, .wt-grid td{ padding:var(--sp-1) var(--sp-2); text-align:left; vertical-align:middle; }
.wt-grid thead th{ font-size:var(--fs-xs); text-transform:uppercase; letter-spacing:.05em; color:var(--ink-faint); }
.wt-form input.wt-bad{ border-color:var(--danger); background:var(--danger-bg); }
.wt-r{ display:grid; gap:var(--sp-2); align-items:center; margin:0 0 var(--sp-2); }
.wt-r.lines{ grid-template-columns:minmax(0,1.6fr) minmax(0,1fr) minmax(0,1fr) auto; }
.wt-r.lines-w{ grid-template-columns:minmax(0,1.4fr) repeat(3,minmax(0,1fr)) auto; }
.wt-r.extra{ grid-template-columns:minmax(0,1.4fr) minmax(0,1fr) minmax(0,.8fr) auto; }
.wt-r.xcost{ grid-template-columns:minmax(0,1.6fr) minmax(0,.8fr) auto minmax(0,1fr) auto; }
.wt-tbl tr.wt-old th, .wt-tbl tr.wt-old td{ color:var(--ink-faint); }
.wt-person{ display:flex; flex-direction:column; gap:var(--sp-2); border:1px solid var(--border); border-radius:var(--r-md); padding:var(--sp-3); }
.wt-person-head{ display:flex; flex-wrap:wrap; gap:var(--sp-1) var(--sp-3); align-items:baseline; justify-content:space-between; }
.wt-person-ctl{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:var(--sp-3); align-items:end; }
.wt-person [hidden]{ display:none; }
.wt-old-note{ color:var(--ink-faint); margin:0; }
.wt-errsum{ border-radius:var(--r-md); background:var(--danger-bg); color:var(--danger); padding:var(--sp-3); font-size:var(--fs-xs); }
.wt-errsum ul{ margin:var(--sp-1) 0 0; padding-left:var(--sp-5); }
.wt-checks{ display:flex; flex-direction:column; gap:var(--sp-2); }
.wt-check{ display:grid; grid-template-columns:auto minmax(0,1fr) minmax(0,150px); gap:var(--sp-3); align-items:center; font-size:var(--fs-xs); }
.wt-view{ display:inline-flex; gap:var(--sp-2); align-items:center; font-size:var(--fs-xs); color:var(--ink-soft); }
.wt-rep th:first-child, .wt-rep td:first-child{ position:sticky; left:0; background:var(--surface); z-index:1; }
.wt-rep thead th{ white-space:normal; min-width:84px; vertical-align:bottom; }
.wt-rep thead th:first-child{ min-width:150px; }
.wt-rep tr.wt-gap td{ padding:var(--sp-1); border-bottom:0; }
.wt-rep tr.wt-extra th, .wt-rep tr.wt-extra td{ font-style:italic; }
.wt-rep td.wt-over{ color:var(--danger); font-weight:600; }
.wt-rep tr.wt-subrow th, .wt-rep tr.wt-subrow td{ color:var(--ink-soft); font-weight:400; }
.wt-cutd{ margin:0 0 var(--sp-5); }
.wt-cutd h4{ margin:0 0 var(--sp-1); font-size:var(--fs-md); }
.wt-cutd .wt-goal{ font-size:var(--fs-xs); margin:var(--sp-1) 0 var(--sp-2); line-height:1.5; }
.wt-cutd .wt-plan{ font-size:var(--fs-xs); background:var(--surface-2); border-radius:var(--r-md); padding:var(--sp-2) var(--sp-3); margin:0 0 var(--sp-2); line-height:1.5; }
.wt-cutd .wt-plan.short{ background:var(--warning-bg); }
.wt-cutt{ width:100%; border-collapse:collapse; font-size:var(--fs-xs); }
.wt-cutt th, .wt-cutt td{ padding:var(--sp-2); border-bottom:1px solid var(--border); text-align:left; vertical-align:top; }
.wt-cutt thead th{ font-size:var(--fs-xs); text-transform:uppercase; letter-spacing:.05em; color:var(--ink-faint); white-space:nowrap; }
.wt-cutt td.num{ text-align:right; white-space:nowrap; font-variant-numeric:tabular-nums; }
.wt-cutt tr.inplan td{ background:var(--surface-2); }
.wt-cutt tr.gap td{ opacity:.75; }
.wt-logrow{ border-bottom:1px solid var(--border); padding:var(--sp-3) 0; }
.wt-logrow .top{ display:flex; flex-wrap:wrap; gap:var(--sp-2) var(--sp-3); align-items:baseline; font-size:var(--fs-xs); }
.wt-logrow ul{ margin:var(--sp-2) 0 0; padding-left:var(--sp-5); font-size:var(--fs-xs); line-height:1.5; }
.wt-opts{ display:flex; flex-direction:column; gap:var(--sp-2); }
.wt-opt{ display:flex; gap:var(--sp-2); align-items:center; font-size:var(--fs-xs); cursor:pointer; }
.wt-opt input{ width:auto; flex:0 0 auto; }
@media (max-width:820px){ .wt-bar .wt-week{ min-width:0; flex:1 1 100%; order:-1; } .wt-daygrid{ grid-template-columns:repeat(2,1fr); } .wt-r.lines, .wt-r.lines-w, .wt-r.extra, .wt-r.xcost{ grid-template-columns:1fr 1fr; } .wt-person-ctl{ grid-template-columns:1fr; } .wt-check{ grid-template-columns:auto 1fr; } .wt-check input[type=text]{ grid-column:2; } }

/* Phone: every control of Payroll and the Wage tracker is a 44px target (.btn, .icon-btn, .seg-tab and the fields are covered in the phone block above) */
@media (max-width:820px){
  .wt-opt, .wt-check,
  #panel-payroll summary, #panel-wage summary, .pr-modal summary, .pr-drawer-form summary, .wt-form summary{ min-height:var(--h-touch); }
  #panel-payroll summary, #panel-wage summary, .pr-modal summary, .pr-drawer-form summary, .wt-form summary{ display:list-item; padding-block:var(--sp-3); }   /* list-item keeps the disclosure triangle */
  .wt-twist{ width:var(--h-touch); height:var(--h-touch); }
  #panel-payroll .btn, #panel-wage .btn, .pr-modal .btn, .pr-drawer-form .btn{ white-space:normal; max-width:100%; }   /* a long button label wraps instead of widening the page */
}


/* ---------- Tasks from managers (tasks/ui-tasks.js). tsk- prefix. Tokens only; the 44px phone rules are in the single 820px block at the end. ---------- */
.tsk-body, .tsk-pane, .tsk-list, .tsk-edit, #tasksRoot, #myTasksRoot{ min-width:0; }
.tsk-tabs{ margin-bottom:var(--sp-4); max-width:360px; }
.tsk-lead{ margin:0 0 var(--sp-3); color:var(--ink-soft); font-size:var(--fs-base); line-height:1.5; }
.tsk-h{ margin:0; font-size:var(--fs-md); font-family:var(--font-display); font-weight:600; display:flex; align-items:center; gap:var(--sp-2); flex-wrap:wrap; }
.tsk-sec{ margin-bottom:var(--sp-6); display:flex; flex-direction:column; gap:var(--sp-3); }
.tsk-state{ max-width:560px; }
.tsk-chips{ display:flex; flex-wrap:wrap; gap:var(--sp-2); margin-bottom:var(--sp-3); }
.tsk-chip{ display:inline-flex; align-items:center; gap:6px; min-height:36px; padding:0 var(--sp-3); border:1px solid var(--border-strong); border-radius:var(--r-pill); background:var(--surface); color:var(--ink-soft); font:inherit; font-size:var(--fs-base); font-weight:600; cursor:pointer; }
.tsk-chip.on{ background:var(--brand); color:var(--brand-ink); border-color:var(--brand); }
.tsk-chip .n{ font-size:var(--fs-xs); font-weight:600; opacity:.85; }
.tsk-days .tsk-chip{ min-width:48px; justify-content:center; }
.tsk-bar{ display:flex; flex-wrap:wrap; gap:var(--sp-2); margin-bottom:var(--sp-4); }
.tsk-sel, .tsk-search, .tsk-in, .tsk-ta{ font:inherit; font-size:var(--fs-base); color:var(--ink); background:var(--surface); border:1px solid var(--border-strong); border-radius:var(--r-sm); padding:var(--sp-2) var(--sp-3); min-height:var(--h-btn); max-width:100%; box-sizing:border-box; }
.tsk-search{ flex:1 1 200px; min-width:0; }
.tsk-sel{ flex:0 1 220px; min-width:0; }
.tsk-ta{ width:100%; resize:vertical; }
.tsk-in{ width:100%; }
.tsk-list{ display:flex; flex-direction:column; gap:var(--sp-3); }
.tsk-day{ margin:var(--sp-3) 0 0; font-size:var(--fs-xs); font-weight:600; color:var(--ink-soft); text-transform:uppercase; letter-spacing:.04em; }
.tsk-more{ text-align:center; padding:var(--sp-2) 0; }
.tsk-card{ background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); box-shadow:var(--shadow-1); padding:var(--sp-4); min-width:0; }
.tsk-card.tsk-busy{ opacity:.6; }
.tsk-top{ display:flex; justify-content:space-between; align-items:flex-start; gap:var(--sp-3); flex-wrap:wrap; }
.tsk-title{ margin:0; font-size:var(--fs-md); font-weight:600; flex:1 1 200px; min-width:0; overflow-wrap:anywhere; }
.tsk-pills{ display:flex; flex-wrap:wrap; gap:var(--sp-1); }
.tsk-meta{ margin-top:var(--sp-2); display:flex; flex-direction:column; gap:2px; font-size:var(--fs-base); }
.tsk-meta-line{ overflow-wrap:anywhere; }
.tsk-k{ color:var(--ink-faint); font-size:var(--fs-xs); font-weight:600; text-transform:uppercase; letter-spacing:.03em; }
.tsk-desc{ margin:var(--sp-2) 0 0; white-space:pre-line; overflow-wrap:anywhere; color:var(--ink-soft); font-size:var(--fs-base); line-height:1.5; }
.tsk-returned{ margin-top:var(--sp-2); background:var(--warning-bg); color:var(--ink); overflow-wrap:anywhere; }
.tsk-comment{ margin-top:var(--sp-2); padding:var(--sp-2) var(--sp-3); background:var(--surface-2); border-radius:var(--r-sm); font-size:var(--fs-base); overflow-wrap:anywhere; white-space:pre-line; }
.tsk-when, .tsk-hint{ font-size:var(--fs-xs); color:var(--ink-soft); margin-top:var(--sp-1); }
.tsk-actions{ display:flex; flex-wrap:wrap; gap:var(--sp-2); margin-top:var(--sp-3); align-items:center; }
.tsk-report{ background:var(--surface); border:1px solid var(--border); border-radius:var(--r-md); padding:var(--sp-4); margin-bottom:var(--sp-4); }
.tsk-report-head{ display:flex; justify-content:space-between; align-items:center; gap:var(--sp-3); flex-wrap:wrap; margin-bottom:var(--sp-2); }
.tsk-rep-row{ border-top:1px solid var(--border); padding:var(--sp-2) 0; }
.tsk-rep-row summary{ display:flex; justify-content:space-between; align-items:center; gap:var(--sp-3); cursor:pointer; min-height:36px; }
.tsk-rep-name{ font-weight:600; overflow-wrap:anywhere; }
.tsk-rep-list{ margin:var(--sp-2) 0 0; padding-left:var(--sp-5); font-size:var(--fs-base); line-height:1.5; }
.tsk-rep-list li{ overflow-wrap:anywhere; margin-bottom:var(--sp-1); }
.tsk-shiftnames{ color:var(--ink-soft); font-size:var(--fs-xs); }
/* staff home card */
.tsk-home{ max-width:520px; margin-top:var(--sp-3); }
.tsk-home[hidden]{ display:none; }
#panel-schedule.staff-tab-team #tasksHomeCard{ display:none; }
.tsk-home-btn{ display:flex; flex-direction:column; align-items:flex-start; gap:2px; width:100%; text-align:left; font:inherit; cursor:pointer; background:var(--surface); color:var(--ink); border:1px solid var(--border); border-radius:var(--r-md); padding:var(--sp-4); min-height:var(--h-touch); }
.tsk-home-btn .next-shift-label{ color:var(--ink-soft); }
.tsk-home-text{ font-family:var(--font-display); font-size:var(--fs-md); font-weight:600; }
.tsk-home-sub{ font-size:var(--fs-base); color:var(--ink-soft); overflow-wrap:anywhere; }
.tsk-home-urgent .tsk-home-btn{ background:var(--danger-bg); border-color:var(--danger); }
.tsk-home-urgent .tsk-home-text{ color:var(--danger); }
/* editor (side drawer) */
.tsk-edit{ display:flex; flex-direction:column; gap:var(--sp-3); }
.tsk-box{ border:1px solid var(--border); border-radius:var(--r-md); padding:var(--sp-3); display:flex; flex-direction:column; gap:var(--sp-3); min-width:0; }
.tsk-field{ display:flex; flex-direction:column; gap:var(--sp-1); min-width:0; }
.tsk-label{ display:flex; flex-direction:column; gap:var(--sp-1); font-size:var(--fs-base); font-weight:600; }
.tsk-label-t{ font-size:var(--fs-base); font-weight:600; }
.tsk-two{ display:grid; grid-template-columns:1fr 1fr; gap:var(--sp-3); }
.tsk-check{ display:flex; align-items:flex-start; gap:var(--sp-2); font-size:var(--fs-xs); color:var(--ink-soft); font-weight:400; }
.tsk-err{ color:var(--danger); font-size:var(--fs-xs); font-weight:600; }
.tsk-err[hidden]{ display:none; }
.tsk-readonly{ padding:var(--sp-2) var(--sp-3); background:var(--surface-2); border-radius:var(--r-sm); overflow-wrap:anywhere; }
.tsk-pick{ max-height:240px; overflow-y:auto; border:1px solid var(--border); border-radius:var(--r-sm); }
.tsk-pickrow{ display:flex; align-items:center; gap:var(--sp-3); padding:var(--sp-2) var(--sp-3); border-bottom:1px solid var(--border); cursor:pointer; min-height:var(--h-btn); }
.tsk-pickrow:last-child{ border-bottom:0; }
.tsk-pick-name{ font-weight:600; flex:1 1 auto; min-width:0; overflow-wrap:anywhere; }
.tsk-pick-sub{ font-size:var(--fs-xs); color:var(--ink-faint); }
.tsk-preview{ font-size:var(--fs-xs); color:var(--ink-soft); background:var(--surface-2); border-radius:var(--r-sm); padding:var(--sp-2) var(--sp-3); }
.tsk-rota{ font-size:var(--fs-xs); background:var(--success-bg); color:var(--success); border-radius:var(--r-sm); padding:var(--sp-2) var(--sp-3); }
.tsk-rota.warn{ background:var(--warning-bg); color:var(--ink); }
.tsk-rota[hidden]{ display:none; }
.tsk-foot{ display:flex; justify-content:flex-end; gap:var(--sp-2); flex-wrap:wrap; }
.tsk-modal .tsk-lead{ margin-bottom:var(--sp-2); }
.tsk-modal{ width:min(420px,92vw); }
.tsk-modal .modal-foot{ margin-top:var(--sp-3); }
.tsk-modal .tsk-err{ margin-top:var(--sp-1); }
/* everyone does it + the window (tasks 1.2.0) */
.tsk-wkind{ max-width:100%; }
.tsk-wkind .seg-tab{ flex:1 1 auto; min-width:0; white-space:normal; }
.tsk-each{ margin-top:var(--sp-3); display:flex; flex-direction:column; gap:var(--sp-2); min-width:0; }
.tsk-progress{ font-weight:600; font-size:var(--fs-base); overflow-wrap:anywhere; }
.tsk-mine{ margin-top:var(--sp-2); display:flex; flex-direction:column; gap:var(--sp-1); min-width:0; }
.tsk-people{ border:1px solid var(--border); border-radius:var(--r-sm); background:var(--surface-2); min-width:0; }
.tsk-people > summary{ display:flex; align-items:center; min-height:36px; padding:0 var(--sp-3); cursor:pointer; font-weight:600; font-size:var(--fs-base); }
.tsk-plist{ list-style:none; margin:0; padding:0; }
.tsk-prow{ padding:var(--sp-3); border-top:1px solid var(--border); display:flex; flex-direction:column; gap:var(--sp-1); min-width:0; }
.tsk-prow-head{ display:flex; justify-content:space-between; align-items:center; gap:var(--sp-2); flex-wrap:wrap; }
.tsk-prow-name{ font-weight:600; min-width:0; overflow-wrap:anywhere; }
.tsk-prow .tsk-actions{ margin-top:var(--sp-2); }
@media (max-width:820px){
  .tsk-chip, .tsk-rep-row summary, .tsk-pickrow, .tsk-home-btn, .tsk-people > summary{ min-height:var(--h-touch); }
  .tsk-sel, .tsk-search, .tsk-in, .tsk-ta{ font-size:16px; min-height:var(--h-touch); }
  .tsk-ta{ min-height:96px; }
  .tsk-sel, .tsk-search{ flex:1 1 100%; }
  .tsk-two{ grid-template-columns:1fr; }
  .tsk-actions .btn{ flex:1 1 auto; justify-content:center; }
  .tsk-card{ padding:var(--sp-3); }
  .tsk-tabs{ max-width:none; }
  .tsk-check input[type=checkbox]{ flex:0 0 auto; margin-top:0; }
  .tsk-check{ min-height:var(--h-touch); align-items:center; }
}

/* ---------- Manager Requests: "Needs your decision" rows and the History group labels (index.html renderRequestsManager) ---------- */
.dec-row{ display:flex; align-items:center; gap:var(--sp-4); padding:var(--sp-3) var(--sp-1); border-bottom:1px solid var(--border); }
.dec-row:last-child{ border-bottom:none; }
.dec-main{ flex:1; min-width:0; }
.dec-who{ display:flex; flex-wrap:wrap; align-items:center; gap:var(--sp-2); }
.dec-who .title{ font-weight:600; font-size:var(--fs-base); }
.dec-main .sub{ font-size:var(--fs-xs); color:var(--ink-soft); margin-top:var(--sp-1); }
.dec-actions{ display:flex; gap:var(--sp-2); flex:none; }
.list-group-label{ font-size:var(--fs-xs); font-weight:600; color:var(--ink-soft); text-transform:uppercase; letter-spacing:.04em; padding:var(--sp-3) var(--sp-1) var(--sp-1); }
@media (max-width: 820px){
  .dec-row{ flex-direction:column; align-items:stretch; gap:var(--sp-3); }
  .dec-actions{ width:100%; }
  .dec-actions .btn{ flex:1 1 0; min-height:var(--h-touch); }
  .hist-row{ flex-wrap:wrap; }
  .hist-row .grow{ flex:1 1 100%; }
  .hist-row .icon-btn{ margin-left:auto; }
}

/* ---------- Opening hours card (Overview, index.html). oh- prefix. Tokens only; the phone rules are in the 820px block at the end of this section. ---------- */
#openingHoursCard .card-body{ gap:var(--sp-4); min-width:0; }
.oh-lead{ margin:0; color:var(--ink-soft); font-size:var(--fs-base); line-height:1.5; }
.oh-sec{ display:flex; flex-direction:column; gap:var(--sp-3); min-width:0; }
.oh-sec-head{ display:flex; align-items:center; justify-content:space-between; gap:var(--sp-3); flex-wrap:wrap; }
.oh-h{ margin:0; font-family:var(--font-display); font-size:var(--fs-md); font-weight:600; }
.oh-sub{ font-size:var(--fs-xs); color:var(--ink-soft); }
.oh-tools{ display:flex; flex-wrap:wrap; gap:var(--sp-2); align-items:center; }
.oh-grid{ display:flex; flex-direction:column; border:1px solid var(--border); border-radius:var(--r-md); background:var(--surface); min-width:0; }
.oh-row{ display:grid; grid-template-columns:104px minmax(0,1fr) minmax(0,1fr) auto; grid-template-areas:"day open close closed" ". hint hint hint"; gap:var(--sp-1) var(--sp-3); align-items:end; padding:var(--sp-3); border-top:1px solid var(--border); }
.oh-row:first-child{ border-top:0; }
.oh-day{ grid-area:day; font-weight:600; align-self:center; }
.oh-f{ display:flex; flex-direction:column; gap:var(--sp-1); font-size:var(--fs-xs); font-weight:600; color:var(--ink-soft); min-width:0; }
.oh-f.open{ grid-area:open; } .oh-f.close{ grid-area:close; }
.oh-closed{ grid-area:closed; align-self:end; }
.oh-hint{ grid-area:hint; font-size:var(--fs-xs); color:var(--ink-soft); min-height:1em; overflow-wrap:anywhere; }
.oh-row.is-closed .oh-f{ opacity:.55; }
.oh-row.is-bad .oh-f input{ border-color:var(--danger); }
.oh-off{ padding:var(--sp-3); border:1px dashed var(--border-strong); border-radius:var(--r-md); color:var(--ink-soft); font-size:var(--fs-base); }
.oh-warns{ display:flex; flex-direction:column; gap:var(--sp-2); }
.oh-warns:empty{ display:none; }
.oh-ex-list{ display:flex; flex-direction:column; gap:var(--sp-2); }
.oh-ex{ display:flex; align-items:center; justify-content:space-between; gap:var(--sp-3); flex-wrap:wrap; padding:var(--sp-3); border:1px solid var(--border); border-radius:var(--r-md); background:var(--surface); min-width:0; }
.oh-ex-main{ display:flex; flex-direction:column; gap:2px; min-width:0; flex:1 1 220px; }
.oh-ex-date{ font-weight:600; }
.oh-ex-what{ font-size:var(--fs-base); color:var(--ink-soft); overflow-wrap:anywhere; }
.oh-ex-note{ font-size:var(--fs-xs); color:var(--ink-faint); }
.oh-ex-warn{ font-size:var(--fs-xs); color:var(--warning); }
.oh-ex-acts{ display:flex; gap:var(--sp-1); align-items:center; }
.oh-form{ display:flex; flex-direction:column; gap:var(--sp-3); padding:var(--sp-3); border:1px solid var(--border-strong); border-radius:var(--r-md); background:var(--surface-2); min-width:0; }
.oh-form[hidden]{ display:none; }
.oh-form-row{ display:grid; grid-template-columns:repeat(3,minmax(0,1fr)); gap:var(--sp-3); }
.oh-form-foot{ display:flex; justify-content:flex-end; gap:var(--sp-2); flex-wrap:wrap; }
.oh-pv{ margin:0; padding:0; list-style:none; display:flex; flex-direction:column; border:1px solid var(--border); border-radius:var(--r-md); background:var(--surface); }
.oh-pv li{ display:flex; gap:var(--sp-3); padding:var(--sp-2) var(--sp-3); border-top:1px solid var(--border); font-size:var(--fs-base); }
.oh-pv li:first-child{ border-top:0; }
.oh-pv-d{ flex:0 0 96px; font-weight:600; }
.oh-pv-t{ min-width:0; overflow-wrap:anywhere; color:var(--ink-soft); }
.oh-pv li.is-closed .oh-pv-t{ color:var(--warning); }
.oh-note{ display:flex; flex-direction:column; gap:var(--sp-1); }
.oh-state{ display:flex; align-items:center; gap:var(--sp-3); flex-wrap:wrap; font-size:var(--fs-xs); color:var(--ink-soft); }
.oh-state .badge{ flex:none; }
@media (max-width:820px){
  .oh-row{ grid-template-columns:minmax(0,1fr) minmax(0,1fr); grid-template-areas:"day closed" "open close" "hint hint"; }
  .oh-closed{ justify-self:end; align-self:center; }
  .oh-form-row{ grid-template-columns:1fr; }
  .oh-ex-acts{ width:100%; justify-content:flex-end; }
  .oh-pv li{ flex-direction:column; gap:2px; }
  .oh-pv-d{ flex:none; }
}
@media (max-width:820px){
  #openingHoursCard summary{ min-height:var(--h-touch); display:flex; align-items:center; }
}
