html,body{overflow-x:hidden;max-width:100%}
/* EwizPro-specific admin tweaks — loaded AFTER the vendored Hitcourt Design System
   so app overrides win (per USAGE rule 1). Keep this tiny; real design changes
   belong in the design-system repo, not here. */

.form-narrow { max-width: 640px; }

/* Standalone auth screen (login) — the app shell isn't used pre-auth. */
.auth-shell { min-height: 100dvh; display: grid; place-items: center; padding: 2rem 1rem; background: var(--ground); }
.auth-card  { width: 100%; max-width: 400px; }
.auth-brand { display: flex; align-items: center; justify-content: center; gap: .6rem; margin-bottom: 1.1rem; }
.auth-brand .mark {
  width: 40px; height: 40px; border-radius: var(--radius); display: grid; place-items: center;
  font-weight: 700; color: var(--on-accent-strong); background: var(--accent-strong);
}
.auth-brand .name { font-weight: 600; line-height: 1.1; }
.auth-brand .name small { display: block; color: var(--ink-3); font-weight: 500; font-size: var(--fs--1); }

/* Theme-toggle icons: inline SVGs shown/hidden purely by [data-theme] (NOT via theme.js's
   <i> class-swap, which no-ops because FontAwesome SVG-JS turns <i> into <svg>).
   Light mode -> dark-blue half-moon ("go dark"); dark mode -> orange sun ("go light"). */
[data-theme-toggle] .theme-ico { display: inline-flex; align-items: center; line-height: 0; }
[data-theme-toggle] .theme-ico-sun { display: none; }
:root[data-theme="dark"] [data-theme-toggle] .theme-ico-moon { display: none; }
:root[data-theme="dark"] [data-theme-toggle] .theme-ico-sun  { display: inline-flex; }

/* ---- Avatar field + cropper (200x200 profile photos) ---- */
.avatar-field { display: flex; align-items: center; gap: 1rem; margin-bottom: 1.25rem; }
.avatar-preview { position: relative; width: 76px; height: 76px; border-radius: 50%; overflow: hidden;
  background: var(--surface-2); border: 1px solid var(--rule); flex: none; }
.avatar-preview img { width: 100%; height: 100%; object-fit: cover; display: block; }
.avatar-preview img.is-empty { display: none; }
.avatar-preview__ph { position: absolute; inset: 0; display: grid; place-items: center; color: var(--ink-3); font-size: 1.5rem; }
.avatar-preview img:not(.is-empty) + .avatar-preview__ph { display: none; }
/* rounded thumbnail in list tables */
.avatar-thumb { width: 40px; height: 40px; border-radius: var(--radius-sm); object-fit: cover; display: block; }

.cropper-wrap { max-width: 100%; }
/* Cap the crop area to the viewport so tall/portrait photos can't overflow the screen.
   Cropper.js sizes its container to the <img>'s rendered box, so bounding the img bounds the UI. */
.cropper-wrap img, #cropperImage { display: block; max-width: 100%; max-height: 52vh; }
.cropper-container { max-height: 52vh; }
#cropperModal .modal-body { max-height: 66vh; overflow: hidden; }
/* Round framing ONLY for the avatar cropper (#cropperModal, WhatsApp-style). The unified image
   cropper (#ecCropperModal — logo/banner/cover/public-photo) stays SQUARE/rectangular. */
#cropperModal .cropper-view-box, #cropperModal .cropper-face { border-radius: 50%; }
.cropper-controls { display: flex; align-items: center; gap: .75rem; margin-top: 1rem; }
.cropper-controls #cropZoom { flex: 1; accent-color: var(--accent); }

/* ---- De-green (Rajat directive 2026-07-22): positive/success states use BLUE, never green.
   Overrides the vendored design-system --success token (app stylesheet wins). Danger stays red,
   warning stays amber. Applies to Active/Booked badges, Money-in, success alerts, beacons. ---- */
:root, :root[data-theme="light"] {
  --success: #0284c7; --success-soft: #e0f2fe; --success-ink: #0369a1; --on-success: #ffffff;
  --bs-success: #0284c7; --bs-success-rgb: 2,132,199;
}
:root[data-theme="dark"] {
  --success: #38bdf8; --success-soft: #0c2b3a; --success-ink: #7dd3fc; --on-success: #06283a;
  --bs-success: #38bdf8; --bs-success-rgb: 56,189,248;
}

/* Website editor — gallery thumbnails (showcase manager) */
.gallery-thumb { display:inline-flex; flex-direction:column; gap:.35rem; cursor:pointer; }
.gallery-thumb img { width:110px; height:110px; object-fit:cover; border-radius:10px; border:1px solid var(--bs-border-color, #d0d7de); display:block; }
.gallery-thumb__rm { font-size:var(--fs--1, .82rem); color:var(--bs-secondary, #6b7280); display:inline-flex; align-items:center; gap:.3rem; }
.gallery-thumb input:checked ~ * { }
.gallery-thumb:has(input:checked) img { outline:2px solid #dc3545; opacity:.55; }

/* ── Row-action kebab (⋮) menus + single-line credential cell (2026-09-08) ───────────────
   Consolidates per-row actions into one uniform dropdown so admin list Action columns never
   stagger; the Account column shows creds/status on ONE line. */
.creds-inline{display:flex;align-items:center;gap:14px;flex-wrap:nowrap;white-space:nowrap;font-size:var(--fs--1);line-height:1.6}
.creds-inline .pw-cell{display:inline-flex;align-items:center;gap:4px}
.pw-cell .pw{font-variant-numeric:tabular-nums;letter-spacing:.5px}
.row-actions{display:inline-block}
.row-actions .dropdown-menu{min-width:210px}
.row-actions form{margin:0}
/* a <button> acting as a dropdown-item: reset native button chrome + match the design-system
   .dropdown-item type EXACTLY (font-size var(--fs--1), weight var(--fw-medium)) so link items
   (<a>, e.g. Edit) and form items (<button>) render at the identical size in every kebab menu. */
.dropdown-menu button.dropdown-item{width:100%;text-align:left;border:0;background:transparent;cursor:pointer;
    font-family:inherit;font-size:var(--fs--1);font-weight:var(--fw-medium);line-height:1.4}

/* ── User-table extras: serial-no column + country flag (2026-09-08) ── */
.col-sno{width:46px;text-align:center;color:var(--ink-3);font-variant-numeric:tabular-nums}
.cc-flag{font-size:1.15em;line-height:1;cursor:help;vertical-align:-1px}

/* clickable row title (opens a detail view) */
.row-title{color:var(--accent-strong, #2563eb);font-weight:700;text-decoration:none}
.row-title:hover{text-decoration:underline}

/* clamp long free-text cells to 2 lines so they never overflow into neighbouring columns
   (full text available on hover via the cell's title attribute) */
.cell-clamp{max-width:360px;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;text-overflow:ellipsis;white-space:normal;line-height:1.45}

/* ── Dossier profile (feature #1) — "classified file" hero + intel grid ── */
.dossier-hero{position:relative;overflow:hidden;border-radius:16px;padding:26px 28px;margin-bottom:18px;
  background:linear-gradient(135deg,#0c2444 0%,#12325a 55%,#1b4a7e 100%);color:#fff;box-shadow:0 12px 40px rgba(18,50,90,.25)}
.dossier-hero .dossier-scan{position:absolute;inset:0;pointer-events:none;opacity:.10;
  background:repeating-linear-gradient(0deg,#fff 0 1px,transparent 1px 4px)}
.dossier-id{position:absolute;top:14px;right:18px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
  font-size:12px;letter-spacing:2px;color:#ffd9a8;border:1px solid rgba(255,255,255,.25);padding:4px 10px;border-radius:6px}
.dossier-top{position:relative;z-index:2;display:flex;gap:22px;align-items:center}
.dossier-photo{flex:0 0 108px;width:108px;height:108px;border-radius:14px;overflow:hidden;background:rgba(255,255,255,.10);
  border:2px solid rgba(255,255,255,.35);display:grid;place-items:center;box-shadow:0 6px 20px rgba(0,0,0,.3)}
.dossier-photo img{width:100%;height:100%;object-fit:cover;object-position:top center}
.dossier-photo span{font-size:40px;font-weight:900;color:#fff;opacity:.85}
.dossier-headline .tag{font-family:ui-monospace,monospace;font-size:11px;letter-spacing:2px;color:#ccdcf0;margin-bottom:4px}
.dossier-headline .tag .on{color:#7ef0b0}.dossier-headline .tag .off{color:#ffb0a8}
.dossier-headline h2{margin:0 0 10px;font-size:clamp(22px,3vw,30px);font-weight:800}
.dossier-headline h2 small{font-weight:500;color:#cdd9ea;font-size:.6em}
.dossier-facts{display:flex;flex-wrap:wrap;gap:8px}
.dossier-facts span{background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.16);border-radius:999px;
  padding:5px 12px;font-size:12.5px;font-weight:600;display:inline-flex;align-items:center;gap:6px}
.dossier-facts span.sport{background:rgba(217,164,65,.22);border-color:rgba(217,164,65,.4)}
.dossier-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px}
.dcard{background:var(--surface,#fff);border:1px solid var(--rule,#e6ebf2);border-radius:14px;padding:16px 18px;box-shadow:var(--shadow-sm,0 4px 18px rgba(18,50,90,.06))}
.dcard-wide{grid-column:1/-1}
.dcard h6{margin:0 0 12px;font-size:12px;letter-spacing:1px;text-transform:uppercase;color:var(--accent-strong,#12325a);
  display:flex;align-items:center;gap:8px;font-weight:700}
.dcard dl{margin:0;display:grid;grid-template-columns:auto 1fr;gap:6px 14px}
.dcard dt{color:var(--ink-3,#8090a6);font-size:12.5px;font-weight:600;white-space:nowrap}
.dcard dd{margin:0;font-size:13.5px;font-weight:600;color:var(--ink,#16233a)}
.dcard .muted{color:var(--ink-3,#8090a6);font-weight:500}
.dcard .dlist{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:9px;font-size:13.5px}
.dcard .dlist li{padding-bottom:9px;border-bottom:1px solid var(--rule,#eef2f7)}
.dcard .dlist li:last-child{border-bottom:0;padding-bottom:0}
@media(max-width:640px){.dossier-top{flex-direction:column;text-align:center}.dossier-facts{justify-content:center}}

/* ── Player dashboard (feature #5) — mobile-first ── */
.pdash{display:flex;flex-direction:column;gap:14px}
.pdash-hi h1{margin:0;font-size:1.5rem}
.pdash-next{border-radius:16px;padding:18px 20px;color:#fff;
  background:linear-gradient(135deg,var(--accent-strong,#12325a),#1b4a7e);box-shadow:0 10px 30px rgba(18,50,90,.22)}
.pdash-next.empty{opacity:.85}
.pdash-next .lbl{font-size:11px;letter-spacing:2px;text-transform:uppercase;color:#ffd9a8;font-weight:700;margin-bottom:6px}
.pdash-next .when{font-size:1.35rem;font-weight:800;line-height:1.2}
.pdash-next .meta{display:flex;flex-wrap:wrap;gap:14px;margin-top:8px;font-size:13px;color:#dbe6f5}
.pdash-next .meta i{margin-right:5px}
.pdash-next .focus{margin-top:10px;font-size:13px;color:#eaf1fb;background:rgba(255,255,255,.12);border-radius:9px;padding:7px 11px}
.pdash-stats{display:grid;grid-template-columns:repeat(4,1fr);gap:10px}
.pstat{background:var(--surface,#fff);border:1px solid var(--rule,#e6ebf2);border-radius:12px;padding:12px 8px;text-align:center;box-shadow:var(--shadow-sm,0 4px 18px rgba(18,50,90,.05))}
.pstat b{display:block;font-size:1.5rem;font-weight:800;color:var(--accent-strong,#12325a);line-height:1}
.pstat span{font-size:11px;color:var(--ink-3,#8090a6);font-weight:600}
.pdash-cols{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}
.pcard{margin:0}
.pcard-h{display:flex;align-items:center;gap:8px;font-size:12px;letter-spacing:.6px;text-transform:uppercase;
  color:var(--accent-strong,#12325a);font-weight:700;margin-bottom:12px}
.pcard-h .ml-auto{margin-left:auto;font-size:11px;text-transform:none;letter-spacing:0}
.pcoach{display:flex;align-items:center;gap:12px}
.pcoach-av{width:52px;height:52px;border-radius:50%;overflow:hidden;background:var(--surface-2,#eef2f7);display:grid;place-items:center;flex:none}
.pcoach-av img{width:100%;height:100%;object-fit:cover}
.pcoach-av span{font-weight:800;color:var(--accent-strong,#12325a)}
.pcoach .nm{font-weight:700}
.pchips{display:flex;flex-wrap:wrap;gap:7px}
.pchip{background:var(--accent-soft,#e0f2fe);color:var(--accent-ink,#0369a1);border-radius:999px;padding:5px 13px;font-size:13px;font-weight:600}
.plist{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:10px}
.plist li{padding-bottom:10px;border-bottom:1px solid var(--rule,#eef2f7)}
.plist li:last-child{border-bottom:0;padding-bottom:0}
.plist .sub{font-size:12px;color:var(--ink-3,#8090a6);margin-top:2px}
.plist a{text-decoration:none;color:inherit}
.pdash-tiles{display:grid;grid-template-columns:repeat(auto-fill,minmax(104px,1fr));gap:10px}
.ptile{display:flex;flex-direction:column;align-items:center;gap:7px;padding:16px 8px;border-radius:14px;text-decoration:none;
  background:var(--surface,#fff);border:1px solid var(--rule,#e6ebf2);color:var(--ink,#16233a);font-weight:600;font-size:12.5px;transition:transform .12s,box-shadow .12s}
.ptile:hover{transform:translateY(-2px);box-shadow:var(--shadow-sm,0 6px 20px rgba(18,50,90,.1))}
.ptile i{font-size:19px;color:var(--accent-strong,#12325a)}
@media(max-width:560px){.pdash-stats{grid-template-columns:repeat(2,1fr)}}

/* ── Trilingual admin (spec §8, RU·UZ·EN since 2026-10-06): hide the two INACTIVE
   languages only, scoped UNDER html[data-lang] so the selector never matches
   <html lang="…"> itself (which would blank the whole page — HL-4). NEVER a blanket
   [lang] hide. Admin defaults RU (data-lang set in the layout); UZ uses the new
   government alphabet (ö ğ ş ç). ── */
/* !important (bridge review H6, 2026-10-06): the VENDORED theme is read-only and its
   collapse-on-hover block carries `.app.is-collapsed .ds-sidebar:is(:hover,:focus-within)
   .ds-nav-label span{display:block}` — specificity 0,5,1, which out-ranks these 0,2,0
   reveal rules and showed ALL THREE languages in the collapsed sidebar strip. Hiding an
   inactive language must never lose a specificity race, whatever the theme adds next, so
   the three rules are declared !important here (the public sheet already did this).
   Still scoped under html[data-lang] — never a blanket [lang] hide (HL-4). */
html[data-lang="ru"] [lang="uz"],html[data-lang="ru"] [lang="en"]{display:none!important}
html[data-lang="uz"] [lang="ru"],html[data-lang="uz"] [lang="en"]{display:none!important}
html[data-lang="en"] [lang="ru"],html[data-lang="en"] [lang="uz"]{display:none!important}
/* ── ONE-FLAG LANGUAGE PICKER (Owner 2026-10-07) ──────────────────────────────
   Replaced the three-button RU|UZ|EN strip (.lang-toggle) on the admin topbar, the staff sign-in and
   the member portal: just the CURRENT language's flag, the other two on hover or click. Markup =
   app/Views/partials/lang_picker.php; behaviour = assets/js/lang-picker.js. The PUBLIC sheet carries
   this same block against the same class names (rt-lp* = this component's own namespace, HL-6) —
   one component, two stylesheets, because neither zone loads the other's CSS.
   The flags are inline SVG, NOT emoji: Windows ships no flag glyphs and prints the letters "RU". */
.rt-lp{position:relative;display:inline-block;padding-bottom:4px}
.rt-lp__btn{display:inline-flex;align-items:center;gap:6px;min-height:30px;padding:3px 7px;border:1px solid var(--rule,#eef2f7);border-radius:999px;background:var(--surface-2,#eef2f7);color:var(--ink-1,#12325a);font:inherit;cursor:pointer}
.rt-lp__btn:hover{border-color:var(--accent-strong,#12325a)}
.rt-lp__cur{display:none;align-items:center;gap:5px}
/* CLOSED = exactly one flag in the layout; the other two wrappers are not rendered at all, so they
   cannot be measured, read aloud or tabbed to. */
html[data-lang="ru"] .rt-lp__cur[data-lp-cur="ru"],
html[data-lang="uz"] .rt-lp__cur[data-lp-cur="uz"],
html[data-lang="en"] .rt-lp__cur[data-lp-cur="en"]{display:inline-flex}
.rt-lp__code{font-size:12px;font-weight:700;letter-spacing:.04em}
.rt-lp__flag{display:inline-flex}
.rt-lp__svg{display:block;border-radius:2px;box-shadow:0 0 0 1px rgba(0,0,0,.28)}
.rt-lp__caret{flex:none;opacity:.7;transition:transform .15s ease}
.rt-lp.is-open .rt-lp__caret{transform:rotate(180deg)}
/* CLOSED by default declared HERE: a class with display:flex out-ranks the UA's [hidden]{display:none},
   which is how the menu first shipped permanently open. */
.rt-lp__menu{position:absolute;top:100%;right:0;z-index:600;min-width:92px;display:none;flex-direction:column;gap:2px;padding:5px;background:var(--surface-1,#fff);border:1px solid var(--rule,#eef2f7);border-radius:10px;box-shadow:var(--shadow-md,0 12px 32px rgba(18,50,90,.16))}
.rt-lp__opt{display:flex;align-items:center;gap:7px;width:100%;min-height:30px;padding:5px 8px;border:0;border-radius:7px;background:transparent;color:var(--ink-1,#12325a);font:inherit;cursor:pointer;text-align:left}
.rt-lp__opt:hover,.rt-lp__opt:focus-visible{background:var(--surface-2,#eef2f7)}
/* OPEN = the OTHER TWO: the option for the language already on screen is hidden, so the menu never
   offers what the reader is already reading (Owner: "the other two flags"). */
.rt-lp.is-open .rt-lp__menu{display:flex}
.rt-lp__menu[hidden]{display:none}
html[data-lang="ru"] .rt-lp__opt[data-lang-btn="ru"],
html[data-lang="uz"] .rt-lp__opt[data-lang-btn="uz"],
html[data-lang="en"] .rt-lp__opt[data-lang-btn="en"]{display:none}

/* ── Dashboard extras layered on the design-system stat/card primitives ── */
.dash-grid{display:grid;grid-template-columns:2fr 1fr;gap:16px;align-items:start}
@media(max-width:900px){.dash-grid{grid-template-columns:1fr}}
.stream-row{display:flex;align-items:center;gap:12px;padding:9px 0;border-bottom:1px solid var(--rule,#eef2f7)}
.stream-row:last-child{border-bottom:0}
.stream-row .bar{flex:1;height:8px;border-radius:999px;background:var(--surface-2,#eef2f7);overflow:hidden}
.stream-row .bar>span{display:block;height:100%;border-radius:999px;background:var(--accent-strong,#12325a)}
.stream-row .amt{font-variant-numeric:tabular-nums;font-weight:700;min-width:104px;text-align:right}
.curve{display:flex;align-items:flex-end;gap:10px;height:120px;padding-top:8px}
.curve .col{flex:1;display:flex;flex-direction:column;align-items:center;gap:6px;height:100%;justify-content:flex-end}
.curve .col .b{width:100%;border-radius:8px 8px 0 0;background:linear-gradient(180deg,#1BA1DB,#147EAE);min-height:6px}
.curve .col small{font-size:11px;color:var(--ink-3,#8090a6)}
.mini-list{list-style:none;margin:0;padding:0}
.mini-list li{display:flex;justify-content:space-between;gap:10px;padding:8px 0;border-bottom:1px solid var(--rule,#eef2f7);font-size:13px}
.mini-list li:last-child{border-bottom:0}
.night-pill{font-size:10px;font-weight:700;padding:1px 7px;border-radius:999px;background:#0c3d54;color:#fff}
.day-pill{font-size:10px;font-weight:700;padding:1px 7px;border-radius:999px;background:#FCE300;color:#0c3d54}

/* Court-management sub-tabs (Chunk D) */
.ct-tabs{display:flex;gap:.4rem;flex-wrap:wrap;margin:0 0 1rem}
.ct-tab{display:inline-flex;align-items:center;gap:.3rem;padding:.45rem .85rem;border-radius:10px;font-size:13px;font-weight:600;text-decoration:none;color:#5b7086;background:#eef2f7;border:1px solid transparent}
.ct-tab:hover{color:#0c2233}
.ct-tab.on{background:#0c3d54;color:#fff;border-color:#0c3d54}
:root[data-theme="dark"] .ct-tab{background:#12233a;color:#9fb2c6}
:root[data-theme="dark"] .ct-tab.on{background:#1b4b6b;color:#fff}

/* Admin court-booking OVERVIEW grid (Chunk D) — the user grid, with booker names admin-side */
.ag-legend{font-size:12px;color:#5b7086;display:flex;gap:1.1rem;flex-wrap:wrap;margin:.1rem 0 .7rem}
.ag-legend i.ag-sw{display:inline-block;width:12px;height:12px;border-radius:3px;vertical-align:-1px;margin-right:.3rem}
.ag-sw.free{background:#eaf6ec}.ag-sw.taken{background:#f0f3f7;border:1px solid #dbe3ec}
.ag-sw.blocked{background:repeating-linear-gradient(45deg,#eef1f5,#eef1f5 3px,#e4e8ee 3px,#e4e8ee 6px)}
.ag-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch;border-radius:12px;max-width:100%}
.ag-grid{border-collapse:separate;border-spacing:3px}
.ag-grid th{font-size:11px;color:#5b7086;font-weight:700;text-align:center;min-width:34px;padding:2px}
.ag-court{font-size:12px;font-weight:700;white-space:nowrap;padding-right:.5rem;position:sticky;left:0;background:#fff;z-index:1}
.ag-slot{display:block;width:34px;height:30px;border-radius:6px;border:0;font-size:.62rem;font-weight:700;line-height:30px;text-align:center;padding:0}
.ag-slot.free{background:#eaf6ec;color:#166534;cursor:pointer}
.ag-slot.free:hover{background:#22a03a;color:#fff}
.ag-slot.taken{background:#f0f3f7;color:#9fb0c2;cursor:help}
.ag-slot.blocked{background:repeating-linear-gradient(45deg,#eef1f5,#eef1f5 3px,#e4e8ee 3px,#e4e8ee 6px);color:#c0687a;cursor:help}
.ag-slot.past{background:#f6f7f9;color:#c7cfda}
.ag-slot.closed{background:#f6f7f9;opacity:.45}
.ag-tooltip{position:fixed;z-index:100;background:#0c2233;color:#fff;font-size:12px;font-weight:600;padding:7px 11px;border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.32);pointer-events:none;max-width:270px;line-height:1.35}
.ag-flash{outline:2px solid #22a03a;outline-offset:4px;border-radius:12px}
:root[data-theme="dark"] .ag-court{background:#12233a}
:root[data-theme="dark"] .ag-slot.free{background:#12332099;color:#7fd39a}
:root[data-theme="dark"] .ag-slot.taken{background:#1a2740;color:#8195ad}

/* ── SLEEK MOBILE PASS (Owner 2026-09-30 — admins run RTSHOR from phones/pads too).
   Overrides ONLY (the ds shell lives in the vendored theme, S4.1 read-only). One notch
   down at phone widths: heads, stat tiles, cards, tables, buttons. ── */
@media (max-width: 480px) {
    .page-head { gap: 10px; margin: 2px 0 14px; }
    .page-head h1 { font-size: 1.15rem; }
    .page-head .sub { font-size: .78rem; }
    .page-head .icon-circle { width: 36px; height: 36px; font-size: .85rem; }
    .stat { padding: 12px; gap: 10px; }
    .stat .n { font-size: 1.25rem; }
    .stat .l { font-size: .68rem; }
    .stat .icon-circle { width: 34px; height: 34px; font-size: .8rem; }
    .card-body { padding: 13px; }
    .table { font-size: 12px !important; }
    .btn { min-height: 34px; padding: 5px 12px; font-size: .82rem; }
    .btn-sm { min-height: 30px; padding: 3px 9px; font-size: .78rem; }
    .alert { padding: 9px 11px; font-size: .84rem; }
    .ds-topbar .who { display: none; } /* greeting is noise on a phone — the avatar stays */
    /* S4.5 (wave 4 · C gate): at 360–390 the top bar ran 15–33 px past the edge in RU/UZ. The topbar Sign Out
       duplicates the avatar menu's Sign Out, so it goes on phones; the venue name is clipped, never pushing. */
    .ds-topbar .tb-signout { display: none; }
    .ds-topbar { min-width: 0; gap: 6px; }
    .ds-topbar .vsw__now { display: inline-block; max-width: 28vw; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: bottom; }
    .ct-tabs { gap: 4px; }
    .ct-tab { padding: 5px 9px; font-size: .78rem; }
}
@media (max-width: 900px) {
    /* pads: slightly tighter content gutter than the desktop default */
    .ds-content { padding: 16px 16px 8px; }

    /* ── Narrow rail: the sub-nav has to FIT the rail it lives in ────────────────────────
       The vendored theme narrows the sidebar to --sidebar-collapsed-w below 900px and hides
       `.ds-nav-item .txt`, but it only hides `.ds-nav-sub` under the explicit `.is-collapsed`
       class — which the media query never adds, and which the hamburger cannot usefully add
       on a phone (the grid column is already collapsed-width). So an OPEN nav group printed
       its sub-labels into a ~20px-wide box: "Front Desk" / "Ресепшн" / "Resepşn" overflowed
       by 50–160px. The trilingual gate's clip check caught it in ALL THREE languages — it is
       a layout bug, not a translation one.

       We do NOT hide the sub-nav: on a phone those sub-items are the ONLY way to reach a
       module, so hiding them would trade a cosmetic bug for a dead end. And we do NOT widen
       the rail: the content column is already tight at 390px, and taking 60px from it pushed
       the Hotel board's desk actions into a sideways-scrolling card — the persona drive caught
       that regression immediately (hospitality journey, "4 desk actions need a sideways swipe").

       So the rail keeps the theme's width and the LABEL is made to fit it: drop the 30px
       indent (it was sized for the 220px desktop sidebar), clear the theme's `white-space:
       nowrap` — which is what actually pinned the text on one line — and let long words break.
       `min-width: 0` is what lets a flex child wrap at all. No font shrink: the type scale is
       untouched, as the clip gate requires. public/theme/ is read-only vendored (S4.1), so the
       override belongs here. */
    .app .ds-nav-sub { padding-left: 0; }
    .app .ds-nav-subitem { padding: 6px 4px; gap: 0; line-height: 1.2; white-space: normal; text-align: center; }
    .app .ds-nav-subitem::before { display: none; }   /* the bullet costs 13px of a 66px rail */
    .app .ds-nav-subitem .txt { min-width: 0; overflow-wrap: anywhere; }
    .app .ds-nav-group > summary { padding-inline: 6px; }
}

/* ── BOOKING CHART interaction (HitCourt operational core, Owner 2026-10-02) ──
   Multi-select cells, bottom action bar, Book-for-a-User + Block modals, typeahead,
   and the 10-per-view layout with booker names inline (Owner's two-layouts ask). */
.ag-slot{font-family:inherit}
.ag-slot.taken,.ag-slot.blocked{cursor:pointer}
.ag-slot.taken:hover{background:#dde4ec;color:#51657c}
.ag-slot.blocked:hover{filter:brightness(.95)}
.ag-slot.free.is-sel{background:#1B2444;color:#fff;box-shadow:0 0 0 2px rgba(27,36,68,.3)}
.ag-grid--wide .ag-slot{width:118px;font-size:.68rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 4px}
.ag-grid--wide th{min-width:118px}
.ag-grid--wide .ag-slot.taken{background:#e8eefb;color:#2C3963;font-weight:600;cursor:pointer}
.ag-bar{position:fixed;left:0;right:0;bottom:0;z-index:40;display:flex;align-items:center;gap:12px;
    padding:10px 18px;background:var(--surface,#fff);border-top:1px solid var(--rule,#e3e8ee);
    box-shadow:0 -4px 18px rgba(0,0,0,.08);font-size:14px}
.ag-modal{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;
    background:rgba(12,20,35,.45);padding:16px}
.ag-modal[hidden]{display:none}
.ag-modal__card{width:100%;max-width:440px;max-height:90svh;overflow:auto;background:var(--surface,#fff);
    border-radius:14px;padding:18px;box-shadow:0 18px 50px rgba(0,0,0,.25)}
.ag-hits{border:1px solid var(--rule,#e3e8ee);border-radius:8px;overflow:hidden;max-height:200px;overflow-y:auto}
.ag-hit{display:block;width:100%;text-align:left;border:0;background:none;padding:8px 12px;font-size:13px;cursor:pointer}
.ag-hit:hover{background:#eef2f7}
[data-theme="dark"] .ag-hit:hover{background:rgba(255,255,255,.06)}
.ag-nohit{padding:8px 12px;font-size:12.5px;color:var(--ink-2,#475569);background:var(--surface-2,#f8fafc);cursor:default}
/* Coach on Court (Dmitriy Q4): optional coach assignment picker + on-chart coach line. */
.ag-coachpicked{display:flex;align-items:center;gap:6px;font-size:13px;padding:6px 10px;border:1px solid var(--rule,#e3e8ee);border-radius:8px;background:var(--surface-2,#f8fafc)}
.ag-coachclear{margin-left:auto;border:0;background:none;font-size:18px;line-height:1;cursor:pointer;color:var(--ink-2,#475569)}
/* Coach on the SAME line as the member (S4.7 fixed-grid): the cell is a 30px single-line button with ellipsis; a
   display:block second line rendered at 0px (clipped) and would otherwise have grown the row. Full name = tooltip. */
.ag-coach{display:inline;font-size:.92em;opacity:.8;margin-left:3px;white-space:nowrap}
@media (max-width:480px){
    .ag-bar{padding:8px 10px;font-size:12.5px;flex-wrap:wrap}
    .ag-grid--wide .ag-slot{width:96px}
}

/* Chart transposed (Owner 2026-10-02): courts across the top, time down the left. */
.ag-courthead{font-size:11px;font-weight:700;color:#1B2444;white-space:nowrap;text-align:center;padding:4px 6px}
[data-theme="dark"] .ag-courthead{color:var(--ink-1,#e6eef6)}
.ag-grid--wide .ag-courthead{min-width:118px}
.ag-grid:not(.ag-grid--wide) .ag-courthead{min-width:52px;font-size:10.5px}
.ag-grid:not(.ag-grid--wide) .ag-slot{width:52px}

/* ── PRINT the Booking Chart (LTAT Chart Reports parity, Owner GO 2026-10-02) ── */
@media print {
    .ds-sidebar, .ds-topbar, .ct-tabs, .ag-legend, .ag-codes, .ag-bar, .ag-modal, .ag-tooltip,
    .page-head .icon-circle, .btn, .btn-group, form, .alert, .ds-footer { display: none !important; }
    .ds-content { padding: 0 !important; }
    .card { border: 0 !important; box-shadow: none !important; }
    .ag-scroll { overflow: visible !important; }
    .ag-grid { border-spacing: 1px; }
    .ag-slot { width: auto !important; min-width: 30px; height: 22px !important; line-height: 22px !important; font-size: 8.5px !important; }
    .ag-courthead { font-size: 8.5px !important; min-width: 30px !important; }
    .ag-court { font-size: 9px !important; }
    body { background: #fff !important; }
}

/* Ping 47b: users phone card — email over mobile, never clipped. */
@media (max-width:575px){ .rt-stack .au-contact{white-space:normal;word-break:break-all} }

/* ── 📍 Venue Creator (Owner ruling 2026-10-03) — topbar switcher + the two stepper screens ── */
.vsw{position:relative}
.vsw__btn{display:flex;align-items:center;gap:7px;cursor:pointer;list-style:none;padding:5px 10px;border:1px solid var(--line,#e3e8ef);border-radius:8px;font-size:12.5px;font-weight:600;color:#1B2444;background:#fff;max-width:230px}
.vsw__btn::-webkit-details-marker{display:none}
.vsw__now{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.vsw__menu{position:absolute;right:0;top:calc(100% + 6px);z-index:60;min-width:250px;max-width:min(320px,88vw);background:#fff;border:1px solid var(--line,#e3e8ef);border-radius:10px;box-shadow:0 10px 28px rgba(16,24,40,.14);padding:5px;display:flex;flex-direction:column;gap:2px}
.vsw__item{display:block;width:100%;text-align:left;background:none;border:0;border-radius:7px;padding:7px 9px;font-size:12.5px;font-weight:600;color:#1B2444;cursor:pointer}
.vsw__item small{display:block;font-weight:500;font-size:11px;color:#64748b}
.vsw__item:hover{background:#eef2f7}
.vsw__item.on{background:#1B2444;color:#fff}
.vsw__item.on small{color:rgba(255,255,255,.72)}
[data-theme="dark"] .vsw__btn,[data-theme="dark"] .vsw__menu{background:rgba(255,255,255,.06);color:var(--ink-1,#e6eef6);border-color:rgba(255,255,255,.14)}
[data-theme="dark"] .vsw__item{color:var(--ink-1,#e6eef6)}
[data-theme="dark"] .vsw__item:hover{background:rgba(255,255,255,.1)}
[data-theme="dark"] .vsw__item.on{background:#2d6cdf;color:#fff}

/* Progress tally + step rail, shared by /admin/setup and the branch wizard. */
.vsetup-tally{display:flex;flex-wrap:wrap;gap:8px 22px;font-size:13px;color:#475569}
.vsetup-tally b{font-size:17px;color:#1B2444;margin-right:4px}
.vsetup-tally .is-ok{color:#15803d;font-weight:600}
.vsetup-tally .is-todo{color:#b45309;font-weight:600}
[data-theme="dark"] .vsetup-tally{color:#9fb3c8}
[data-theme="dark"] .vsetup-tally b{color:var(--ink-1,#e6eef6)}
.vsetup-steps{display:flex;flex-wrap:wrap;gap:8px}
.vsetup-step{display:flex;align-items:center;gap:8px;padding:7px 12px;border:1px solid var(--line,#e3e8ef);border-radius:999px;font-size:12.5px;font-weight:600;color:#475569;text-decoration:none;background:#fff;cursor:pointer}
.vsetup-step__n{display:inline-flex;align-items:center;justify-content:center;width:20px;height:20px;border-radius:50%;background:#eef2f7;font-size:11px;flex:0 0 auto}
.vsetup-step.on{border-color:#1B2444;color:#1B2444;box-shadow:inset 0 0 0 1px #1B2444}
.vsetup-step.done .vsetup-step__n{background:#15803d;color:#fff}
.vsetup-step:hover{color:#1B2444}
[data-theme="dark"] .vsetup-step{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.14);color:#9fb3c8}
[data-theme="dark"] .vsetup-step__n{background:rgba(255,255,255,.12)}
[data-theme="dark"] .vsetup-step.on{border-color:#2d6cdf;color:var(--ink-1,#e6eef6);box-shadow:inset 0 0 0 1px #2d6cdf}

/* Weekly-hours chips (each chip is its own remove form). */
.vsetup-chips{display:flex;flex-wrap:wrap;gap:6px}
.vsetup-chip{display:inline-flex;align-items:center;gap:6px;margin:0;padding:3px 4px 3px 10px;border:1px solid var(--line,#e3e8ef);border-radius:999px;font-size:12px;background:#f8fafc}
.vsetup-chip button{border:0;background:#e2e8f0;color:#475569;border-radius:50%;width:18px;height:18px;line-height:1;font-size:12px;cursor:pointer}
.vsetup-chip button:hover{background:#fecaca;color:#991b1b}
[data-theme="dark"] .vsetup-chip{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.14)}
[data-theme="dark"] .vsetup-chip button{background:rgba(255,255,255,.14);color:var(--ink-1,#e6eef6)}

/* Branch-wizard review list. */
.vc-review{display:grid;grid-template-columns:150px 1fr;gap:6px 14px;font-size:13px;margin:0 0 14px}
.vc-review dt{color:#64748b;font-weight:600}
.vc-review dd{margin:0;color:#1B2444;word-break:break-word}
[data-theme="dark"] .vc-review dd{color:var(--ink-1,#e6eef6)}
@media (max-width:575px){ .vc-review{grid-template-columns:1fr;gap:2px 0} .vc-review dd{margin-bottom:8px} }

/* Wallet control room (Owner 2026-10-03): float card, derived-discount chip, signed amounts */
.wlt-stats{display:grid;grid-template-columns:1fr;gap:14px;margin-bottom:14px}
.wlt-float{background:#0c3d54;border-color:#0c3d54;color:#fff}
.wlt-float__label{font-size:11px;text-transform:uppercase;letter-spacing:.06em;opacity:.8}
.wlt-float__sum{font-size:30px;font-weight:800;line-height:1.15;margin:2px 0}
.wlt-float__sum small{font-size:13px;font-weight:600;opacity:.85}
.wlt-float__note{font-size:12px;opacity:.85}
.wlt-kv{display:flex;justify-content:space-between;gap:10px;font-size:13px;padding:4px 0;border-bottom:1px dashed var(--rule,#e3e8ee)}
.wlt-kv:last-of-type{border-bottom:0}
.wlt-pct{font-size:18px;font-weight:800;text-align:center;padding:6px 0;white-space:nowrap}
.wlt-pct.is-bad{color:#b91c1c}
.wlt-off{opacity:.55}
.wlt-pos{color:#166534;font-weight:700;white-space:nowrap}
.wlt-neg{color:#b91c1c;font-weight:700;white-space:nowrap}
.wlt-sell{display:grid;gap:8px}
@media (min-width:900px){ .wlt-stats{grid-template-columns:minmax(260px,1fr) 2fr} }

/* ── Money spine, back office (EC-2, 2026-10-07) ──────────────────────────────
   `.wlt-float__split` extends the existing Wallet float card with the member/staff halves.
   `.cfz-*`  = the Café till (/admin/cafe).  `.mywl-*` = a staff member's own wallet (/admin/my-wallet).
   `.dsk-pairnote` = the one-line "recorded as a top-up + payment" note under the desk method select.
   New prefixes throughout, so nothing here can quietly restyle an earlier component (HL-6). */
.wlt-float__split{display:flex;gap:1.1rem;flex-wrap:wrap;margin-top:8px;padding-top:7px;
      border-top:1px solid rgba(255,255,255,.22);font-size:12px}
.wlt-float__split b{margin-left:.35rem}
.dsk-pairnote{line-height:1.35}
/* `.dsk-confirm*` = the pending-request Confirm control, which gained a "paid by" select when
   confirming started taking the money through the wallet (bridge M1). Inline row so the select and
   the button stay on one line in the actions cell; it wraps on a phone rather than overflowing. */
.dsk-confirm{display:inline-flex;gap:6px;align-items:center;flex-wrap:wrap;vertical-align:middle}
.dsk-confirm__pay{width:auto;min-width:9.5rem}

.cfz-stats{display:grid;grid-template-columns:1fr;gap:14px;margin-bottom:14px}
.cfz-kv{display:flex;justify-content:space-between;gap:10px;font-size:13px;padding:4px 0;border-bottom:1px dashed var(--rule,#e3e8ee)}
.cfz-kv:last-of-type{border-bottom:0}
.cfz-form{display:grid;gap:8px}
.cfz-neg{color:#b91c1c;font-weight:700;white-space:nowrap}

.mywl-hero{background:#0c3d54;border-color:#0c3d54;color:#fff;margin-bottom:14px}
.mywl-hero__label{font-size:11px;text-transform:uppercase;letter-spacing:.06em;opacity:.8}
.mywl-hero__sum{font-size:30px;font-weight:800;line-height:1.15;margin:2px 0}
.mywl-hero__sum small{font-size:13px;font-weight:600;opacity:.85}
.mywl-hero__note{font-size:12px;opacity:.85}
.mywl-pos{color:#166534;font-weight:700;white-space:nowrap}
.mywl-neg{color:#b91c1c;font-weight:700;white-space:nowrap}
@media (min-width:900px){ .cfz-stats{grid-template-columns:minmax(260px,1fr) 2fr} }

/* ── 15 · Staff presence (EC-1, 2026-10-07) ───────────────────────────────────
   Four NEW prefixes, so nothing here can quietly restyle an earlier component (HL-6):
     `.ksk-*`  the entrance wall display (/kiosk/{key}) — a full-screen page on a TV
     `.atn-*`  the staff phone screens (/attend) — confirmation, refusal, the GPS ask
     `.att-*`  the back-office board (/admin/attendance + the month view)
     `.myat-*` a staff member's own record (/admin/my-attendance)
   The kiosk and the phone are STANDALONE pages (no app shell), so they carry their own
   body rules — scoped to .ksk-body / .atn-body and never to a bare `body`. */

/* The wall display. Sized in vmin so one stylesheet serves a 24" portrait panel and a 55" TV:
   the QR has to be readable from two metres with a phone held at arm's length. */
.ksk-body{margin:0;background:#07293a;color:#fff;font-family:var(--font-sans,Poppins,system-ui,sans-serif)}
.ksk{min-height:100vh;display:flex;flex-direction:column;padding:2.2vmin 3vmin}
.ksk__head{display:flex;align-items:center;justify-content:space-between;gap:2vmin}
.ksk__brand{display:flex;align-items:center;gap:1.4vmin;min-width:0}
.ksk__mark{flex:none;display:grid;place-items:center;width:6vmin;height:6vmin;min-width:38px;min-height:38px;
  border-radius:1.2vmin;background:#12a5d8;color:#fff;font-weight:800;font-size:2.4vmin}
.ksk__venue{font-size:3vmin;font-weight:700;line-height:1.15;overflow-wrap:anywhere}
.ksk__clock{font-size:4.6vmin;font-weight:800;font-variant-numeric:tabular-nums;letter-spacing:.02em;opacity:.95}
.ksk__stage{flex:1;display:flex;align-items:center;justify-content:center;gap:5vmin;flex-wrap:wrap;padding:2vmin 0}
.ksk__qrwrap{flex:none;display:flex;flex-direction:column;align-items:center;gap:1.6vmin}
.ksk__qr{width:46vmin;height:46vmin;max-width:88vw;background:#fff;border-radius:2vmin;padding:1.6vmin;box-sizing:border-box}
/* The code's life, drawn. It is the anti-remote argument made visible: a passer-by can see it run out. */
.ksk__bar{width:46vmin;max-width:88vw;height:1vmin;min-height:6px;border-radius:999px;background:rgba(255,255,255,.18);overflow:hidden}
.ksk__bar>span{display:block;height:100%;width:100%;border-radius:999px;background:#12a5d8;transition:width .25s linear}
.ksk__copy{flex:1 1 34vmin;min-width:min(100%,34vmin)}
.ksk__h1{font-size:4.2vmin;font-weight:800;line-height:1.18;margin:0 0 1.6vmin}
.ksk__sub{font-size:2.3vmin;line-height:1.45;margin:0 0 1.2vmin;opacity:.92}
.ksk__sub--dim{font-size:1.9vmin;opacity:.68}
.ksk__foot{display:flex;align-items:center;justify-content:space-between;gap:2vmin;font-size:1.7vmin;opacity:.6}
.ksk__err{color:#ffd166;opacity:1}
@media (max-width:760px){
  .ksk__h1{font-size:6vmin}.ksk__sub{font-size:3.4vmin}.ksk__sub--dim{font-size:3vmin}
  .ksk__qr,.ksk__bar{width:78vmin}.ksk__venue{font-size:4.4vmin}.ksk__clock{font-size:6vmin}
}

/* The staff phone. One centred card, thumb-sized, read at arm's length on the way through a door. */
.atn-body{margin:0;background:var(--surface-2,#eef2f7);font-family:var(--font-sans,Poppins,system-ui,sans-serif)}
.atn-top{display:flex;justify-content:flex-end;padding:.8rem 1rem 0}
.atn{max-width:26rem;margin:0 auto;padding:.5rem 1rem 2rem}
.atn-card{background:var(--surface-1,#fff);border:1px solid var(--rule,#e6ebf2);border-radius:18px;
  padding:1.6rem 1.2rem;text-align:center;box-shadow:var(--shadow-sm,0 6px 20px rgba(18,50,90,.1))}
.atn-tick{color:#1a7f37;line-height:0;margin-bottom:.6rem}
.atn-card.is-out .atn-tick{color:#12325a}
.atn-card.is-bad .atn-tick{color:#b91c1c}
.atn-tick--pin{color:#12a5d8;font-size:3.4rem;line-height:1.1}
.atn-greet{font-size:1.4rem;font-weight:800;margin:0 0 .2rem;color:var(--ink,#16233a)}
.atn-name{font-size:1rem;font-weight:600;color:var(--ink-2,#5b6b82)}
.atn-dir{margin:.7rem 0 .2rem}
.atn-chip{display:inline-block;padding:.3rem .8rem;border-radius:999px;font-size:.8rem;font-weight:700;letter-spacing:.03em}
.atn-chip.is-in{background:#e6f4ea;color:#1a7f37}
.atn-chip.is-out{background:#e8eef6;color:#12325a}
.atn-time{font-size:3rem;font-weight:800;font-variant-numeric:tabular-nums;line-height:1.1;color:var(--ink,#16233a)}
.atn-date{font-size:.85rem;color:var(--ink-3,#8090a6)}
.atn-anchor{margin-top:.8rem;font-size:.82rem;color:var(--ink-2,#5b6b82)}
.atn-anchor i{margin-right:.35rem}
/* STEP ONE of a kiosk scan (bridge H1) — a question, so neutral blue, never the green of a record. */
.atn-card.is-ask{border-color:#bfe3f2;background:linear-gradient(180deg,#f6fcff,var(--surface-1,#fff))}
/* THE DESIGN PREVIEW (bridge M3). Amber card + amber rule: unmistakable before a word is read, and
   impossible to crop out of a screenshot the way the old bottom-of-card badge was. */
.atn-card.is-preview{border:2px dashed #e0a300;background:#fffbf0}
.atn-card.is-preview .atn-tick,.atn-card.is-preview .atn-time{color:#8a5a00}
.atn-stamp{display:block;margin-bottom:.45rem;font-size:.7rem;font-weight:800;letter-spacing:.08em;
  color:#8a5a00;overflow-wrap:anywhere}
.atn-why{font-size:.9rem;line-height:1.45;color:var(--ink-2,#5b6b82);margin:.8rem 0 0}
.atn-why--err{color:#b91c1c}
.atn-note{font-size:.74rem;line-height:1.4;color:var(--ink-3,#8090a6);margin:.8rem 0 0}
.atn-out{margin:1rem 0 0;text-align:center;font-size:.85rem}
.atn-out a{color:var(--accent-strong,#12325a);text-decoration:none}
.atn-sep{color:var(--ink-3,#8090a6);margin:0 .4rem}

/* The board. */
.att-stats{display:grid;grid-template-columns:1fr;gap:14px;margin-bottom:14px}
.att-now{background:#0c3d54;border-color:#0c3d54;color:#fff}
.att-now__label{font-size:11px;text-transform:uppercase;letter-spacing:.06em;opacity:.8}
.att-now__sum{font-size:34px;font-weight:800;line-height:1.1;margin:2px 0}
.att-now__sum small{font-size:14px;font-weight:600;opacity:.75}
.att-now__names{font-size:12px;line-height:1.45;opacity:.9;overflow-wrap:anywhere}
.att-filter{display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap}
.att-scope{font-size:11px;color:var(--ink-3,#8090a6);margin:.7rem 0 0;line-height:1.4}
.att-who{display:flex;align-items:center;gap:8px;min-width:0}
.att-who>span:last-child{overflow-wrap:anywhere}
.att-role{font-size:12px;color:var(--ink-2,#5b6b82)}
.att-ico{margin-right:.3rem;color:var(--ink-3,#8090a6)}
/* THE ANCHOR PAIR (bridge H2): arrival anchor → departure anchor, in one cell on three screens. */
.att-anchors{display:inline-flex;align-items:center;gap:.3rem;flex-wrap:wrap;font-size:12px}
.att-anchors__to{color:var(--ink-3,#8090a6)}
.att-anchor-one{white-space:nowrap}
.att-row.is-absent{opacity:.62}
.att-open{font-size:10px;margin-left:.3rem;vertical-align:middle}
@media (min-width:900px){ .att-stats{grid-template-columns:minmax(260px,1fr) 2fr} }
@media (max-width:560px){ .att-hide-sm{display:none} }

/* The On Site Now card on the super-admin dashboard. */
.att-dash{display:flex;align-items:baseline;gap:12px;flex-wrap:wrap}
.att-dash__n{font-size:30px;font-weight:800;line-height:1.1;color:var(--ink,#16233a)}
.att-dash__n small{font-size:14px;font-weight:600;color:var(--ink-3,#8090a6)}
.att-dash__who{flex:1 1 140px;min-width:0;font-size:12px;color:var(--ink-2,#5b6b82);line-height:1.4}
/* A ticker, so the card's height never grows with the payroll: one line, clipped with an ellipsis. */
.att-dash__ticker{overflow:hidden}
.att-dash__ticker>span{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

/* A staff member's own record. */
.myat-hero{background:#0c3d54;border-color:#0c3d54;color:#fff;margin-bottom:14px}
.myat-hero__label{font-size:11px;text-transform:uppercase;letter-spacing:.06em;opacity:.8}
.myat-hero__sum{font-size:30px;font-weight:800;line-height:1.15;margin:2px 0}
.myat-hero__sum small{font-size:13px;font-weight:600;opacity:.85}
.myat-hero__note{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:12px;opacity:.92}
.myat-hero__link{color:#9fdcf4;text-decoration:none;font-weight:600}

/* ── 16 · My Profile — topbar avatar menu (2026-11-07) ─────────────────────────
   The initials (or the photo once set) open a two-item menu: My Profile + Sign Out. Tokens, not
   literals, so the menu follows the light/dark theme. */
.who-menu{position:relative}
.who-menu__btn{list-style:none;cursor:pointer;display:flex;align-items:center;border-radius:50%}
.who-menu__btn::-webkit-details-marker{display:none}
.who-menu__btn:focus-visible{outline:2px solid var(--accent,#2563eb);outline-offset:2px}
.who-menu__img{object-fit:cover;display:block}
.who-menu__list{position:absolute;right:0;top:calc(100% + 8px);z-index:60;min-width:190px;max-width:min(280px,88vw);
  background:var(--surface,#fff);border:1px solid var(--rule,#e3e8ef);border-radius:10px;box-shadow:0 10px 28px rgba(16,24,40,.14);
  padding:5px;display:flex;flex-direction:column;gap:2px}
.who-menu__item{display:flex;align-items:center;gap:8px;border-radius:7px;padding:8px 10px;font-size:13px;font-weight:600;
  color:var(--ink,#1B2444);text-decoration:none;white-space:nowrap}
.who-menu__item:hover{background:var(--surface-2,#eef2f7)}

/* ── wave 4 · A — Academy & Operations layout (S4.5 + S4.7), 2026-11-09 ───────────────────────────────────────
   .w4a-scroll  the bounded box a wide grid scrolls inside (the PAGE never scrolls sideways — S4.5)
   .w4a-grid    a FIXED grid: set column widths (colgroup), every cell + heading on ONE line, ellipsis; the full value
                rides in a tooltip (author title, or the shared fit-title.js — S4.7)
   .w4a-cards   phone (< 576px) variant of a .rt-stack desk table: the stacked cards keep their size too — each
                label/value line is one line with an ellipsis, so a long guest name or email never grows a card. */
.w4a-scroll{max-width:100%;overflow-x:auto}
.w4a-grid{table-layout:fixed;width:100%}
.w4a-grid th,.w4a-grid td{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}
.w4a-grid td>form,.w4a-grid td>.w4a-line{display:inline-flex;align-items:center;gap:4px;flex-wrap:nowrap;margin:0;max-width:100%}
.w4a-grid .form-control,.w4a-grid .form-select{min-width:0}
/* the password eye: one fixed box, so the eye ↔ eye-slash glyph swap never resizes the input beside it */
.input-group>[data-toggle-pw]{flex:0 0 42px;width:42px;justify-content:center;padding-left:0;padding-right:0}
@media (max-width:575.98px){
  .rt-stack.w4a-cards td{white-space:nowrap !important;overflow:hidden}
  .rt-stack.w4a-cards td>span,.rt-stack.w4a-cards td>b{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  .rt-stack.w4a-cards td.rt-stack__act,.rt-stack.w4a-cards tr.rt-stack__more td{white-space:normal !important}
}
/* KPI tiles + bar rows (shared .stat / .stream-row): a long figure ends in an ellipsis instead of wrapping, so a
   tile never grows when its value does (S4.7). Full value as a tooltip via the shared fit-title.js (admin layout). */
.stat>div:last-child{min-width:0;flex:1 1 auto}
.stat .n,.stat .l{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.stream-row>*{min-width:0}
.stream-row>div:first-child{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.stream-row .amt{flex:0 0 112px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ds-content .att-dash{flex-wrap:nowrap}
.ds-content .att-dash__n{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;flex:0 1 auto}
.ds-content .att-dash__who{flex:1 0 140px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* attendance board inside a fixed grid: the name ellipsises instead of wrapping (the cell carries the full name) */
.att-grid .att-who>span:last-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;overflow-wrap:normal;min-width:0}
.att-grid .att-anchors{white-space:nowrap;flex-wrap:nowrap;max-width:100%;overflow:hidden}
.att-grid .att-anchor-one{min-width:0;overflow:hidden;text-overflow:ellipsis}
/* a grid item's min-width defaults to its content: one long figure blew the 2fr/1fr dashboard columns wider (S4.7) */
.dash-grid>*{min-width:0}
.ds-content .myat-hero__sum,.ds-content .myat-hero__label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* ── end wave 4 · A ── */

/* ── wave 4 · C — Courts & Money layout (S4.5 + S4.7), 2026-11-09 ─────────────────────────────────────────────
   .w4c-grid   a FIXED list grid: column widths from its <colgroup> (px; the table's min-width = their sum, inside a
               .table-responsive = the bounded sideways box), every cell + heading on ONE line, ellipsis; the full
               value rides in the cell's title. Revealing / injecting a long value never moves a column or a row.
   .w4c-line   a one-line row of controls inside a cell (select + buttons) — never wraps, never grows the row.
   .w4c-chips  a one-line strip of chips (availability windows) that scrolls inside its own cell.
   .w4c-cards  phone (< 576px) variant of a .rt-stack table: every label/value line is one line with an ellipsis. */
.w4c-grid{table-layout:fixed;width:100%}
.w4c-grid th,.w4c-grid td{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}
.w4c-grid .w4c-line,.w4c-grid .w4c-line>form{display:flex;align-items:center;gap:6px;flex-wrap:nowrap;margin:0;min-width:0}
.w4c-grid .w4c-line{justify-content:flex-end}
.w4c-grid .form-select,.w4c-grid .form-control{min-width:0}
.w4c-sub{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.w4c-chips{display:flex;flex-wrap:nowrap;gap:4px;overflow-x:auto;max-width:100%;scrollbar-width:thin}
.w4c-chips>*{flex:0 0 auto}
@media (max-width:575.98px){ /* table.-qualified: rtshor-desk.css (.rt-stack td … !important) loads after this sheet */
  table.w4c-cards td{white-space:nowrap !important;overflow:hidden;min-width:0}
  table.w4c-cards td>.w4c-v{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right}
  table.w4c-cards td.rt-stack__t>*{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
  table.w4c-cards td.rt-stack__act{white-space:normal !important}
}
/* ── end wave 4 · C ── */
