*{margin:0;padding:0;box-sizing:border-box}
:root{
  /* Compact UI scale. Rem units respect the browser's default text size. */
  --type-caption:.6875rem;--type-small:.75rem;--type-body:.8125rem;
  --type-reading:.875rem;--type-title:1.375rem;

  --bg:#fafafa;--bg2:#ffffff;--bg3:#f3f4f6;--bg4:#e9eaec;
  --border:#e5e7eb;--border2:#d1d5db;
  --text:#111827;--text2:#4b5563;--text3:#667085;
  --accent:#6a8fbf;--accent-hover:#5078a8;--accent-light:#eff4fb;
  /* --accent is the brand color (logo, decorative fills). Text and filled
     buttons use --accent-ink: the smallest darkening of the accent that
     reaches WCAG AA (4.5:1) on every light surface. Recomputed per accent by
     _applyBrandSettings() (ui-shell.js) when an admin picks another one. */
  --accent-ink:#516d91;--accent-ink-hover:#435a78;--on-accent:#fff;
  --green:#059669;--yellow:#d97706;--red:#dc2626;--orange:#ea580c;
  --green-ink:#066647;--yellow-ink:#92400e;--orange-ink:#9a3412;
  --mono:'JetBrains Mono','SF Mono',Menlo,ui-monospace,"Cascadia Code","Courier New",monospace;
  --sans:'IBM Plex Sans',-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,sans-serif;
  --header-bg:rgba(255,255,255,0.96);--overlay-bg:rgba(255,255,255,0.99);--divider:#e5e7eb;
  --shadow-sm:0 1px 3px rgba(0,0,0,.06),0 1px 2px rgba(0,0,0,.04);
  --shadow-md:0 4px 12px rgba(0,0,0,.08),0 2px 4px rgba(0,0,0,.04);
  --shadow-lg:0 16px 48px rgba(0,0,0,.12),0 4px 8px rgba(0,0,0,.04);
  --r-xs:4px;--r-sm:6px;--r-md:8px;--r-lg:12px;--r-xl:16px;
  --chip-blue-bg:#dbeafe;--chip-blue-fg:#1d4ed8;
  --chip-green-bg:#dcfce7;--chip-green-fg:#166534;
  --chip-purple-bg:#f3e8ff;--chip-purple-fg:#6b21a8;
  --chip-red-bg:#fee2e2;--chip-red-fg:#991b1b;
  --warn-bg:#fff3cd;--warn-border:#ffc107;--warn-fg:#856404;
  color-scheme:light;
}
/* ── DARK THEME ─ real dark, not pure black: cool graphite surfaces, near-white text ── */
:root[data-theme="dark"]{
  --bg:#15181d;--bg2:#1c2128;--bg3:#252b34;--bg4:#2e3540;
  --border:#2c333d;--border2:#3d4653;
  --text:#e6e8eb;--text2:#aab2bd;--text3:#8a94a1;
  --accent:#82a7d6;--accent-hover:#9bbae3;--accent-light:#243348;
  /* Dark: the (light) accent already reads on dark surfaces; filled buttons
     take dark text instead of white (white on #82a7d6 is 2.5:1). */
  --accent-ink:var(--accent);--accent-ink-hover:var(--accent-hover);--on-accent:#15181d;
  --green:#3fb884;--yellow:#e0a63e;--red:#ef7168;--orange:#ef8e50;
  --green-ink:#65d6a1;--yellow-ink:#e8bd6a;--orange-ink:#f4a36c;
  --header-bg:rgba(21,24,29,0.94);--overlay-bg:rgba(21,24,29,0.98);--divider:#2c333d;
  --shadow-sm:0 1px 3px rgba(0,0,0,.35),0 1px 2px rgba(0,0,0,.25);
  --shadow-md:0 4px 12px rgba(0,0,0,.45),0 2px 4px rgba(0,0,0,.3);
  --shadow-lg:0 16px 48px rgba(0,0,0,.55),0 4px 8px rgba(0,0,0,.3);
  --chip-blue-bg:#1f3352;--chip-blue-fg:#8fb8f6;
  --chip-green-bg:#1c3b2c;--chip-green-fg:#7dd8a8;
  --chip-purple-bg:#372a4d;--chip-purple-fg:#c8a8f0;
  --chip-red-bg:#462423;--chip-red-fg:#f0918a;
  --warn-bg:#332b18;--warn-border:#8a6d1a;--warn-fg:#e8c86a;
  color-scheme:dark;
}
/* Dark-mode fixes for third-party / hardcoded-light components */
:root[data-theme="dark"] .ql-toolbar.ql-snow,
:root[data-theme="dark"] .ql-container.ql-snow{border-color:var(--border2);background:var(--bg2);color:var(--text)}
:root[data-theme="dark"] .ql-editor{color:var(--text)}
:root[data-theme="dark"] .ql-editor.ql-blank::before{color:var(--text3)}
:root[data-theme="dark"] .ql-snow .ql-stroke{stroke:var(--text2)}
:root[data-theme="dark"] .ql-snow .ql-fill{fill:var(--text2)}
:root[data-theme="dark"] .ql-snow .ql-picker{color:var(--text2)}
:root[data-theme="dark"] .ql-snow .ql-picker-options{background:var(--bg2);border-color:var(--border2)}
:root[data-theme="dark"] .ql-snow .ql-tooltip{background:var(--bg2);border-color:var(--border2);color:var(--text);box-shadow:var(--shadow-md)}
:root[data-theme="dark"] .ql-snow .ql-tooltip input[type=text]{background:var(--bg3);border-color:var(--border2);color:var(--text)}
:root[data-theme="dark"] .ql-snow.ql-toolbar button:hover .ql-stroke,
:root[data-theme="dark"] .ql-snow.ql-toolbar button.ql-active .ql-stroke{stroke:var(--accent)}
:root[data-theme="dark"] .ql-snow.ql-toolbar button:hover .ql-fill,
:root[data-theme="dark"] .ql-snow.ql-toolbar button.ql-active .ql-fill{fill:var(--accent)}
/* Chemical structures & reaction schemes: RDKit draws near-black bonds on a
   transparent/white canvas. In dark mode, invert the drawing so bonds render
   light on the dark surface; hue-rotate(180deg) restores heteroatom colors
   (O red, N blue) after inversion. RDKit SVGs are identified by their
   xmlns:rdkit attribute (inline) or data-URI (reaction schemes / thumbs).
   Screen only — printed reports and vial labels stay black-on-white. */
@media screen {
  :root[data-theme="dark"] svg[xmlns\:rdkit],
  :root[data-theme="dark"] img[src^="data:image/svg+xml"],
  :root[data-theme="dark"] img[src^="/api/structure/svg"],
  :root[data-theme="dark"] img[src^="/api/svg"],
  :root[data-theme="dark"] #lib-struct-thumb,
  :root[data-theme="dark"] #browser-struct-thumb,
  :root[data-theme="dark"] #rs-struct-thumb,
  :root[data-theme="dark"] .browser-eln-thumb,
  :root[data-theme="dark"] .bio-exp-modal-card img,
  :root[data-theme="dark"] #bio-exp-tooltip .tt-struct{filter:invert(.88) hue-rotate(180deg)}
  /* The forced --bg3 plate would invert to a light block — keep it transparent */
  :root[data-theme="dark"] .card-struct svg rect:first-child,
  :root[data-theme="dark"] .dp-struct svg rect:first-child,
  :root[data-theme="dark"] #cm-struct-preview svg rect:first-child{fill:transparent!important}
}
/* Reaction-table role colors: brighter variants for dark surfaces */
:root[data-theme="dark"] .rxn-row-reagent,:root[data-theme="dark"] .rxn-role-reagent,:root[data-theme="dark"] .rxn-role-reactant{color:#e3a94f}
:root[data-theme="dark"] .rxn-row-catalyst,:root[data-theme="dark"] .rxn-role-catalyst{color:#b79bf2}
:root[data-theme="dark"] .rxn-row-solvent,:root[data-theme="dark"] .rxn-role-solvent{color:#4ecbbd}
:root[data-theme="dark"] .rxn-row-product,:root[data-theme="dark"] .rxn-role-product{color:#5fce8f}
/* html needs its own overflow-x:hidden, not just body's — on iOS Safari the
   document's own elastic/rubber-band scroll is driven by <html>
   (documentElement), so body's overflow-x:hidden alone doesn't stop it: any
   descendant slightly wider than the viewport (the top nav's row of tabs is
   the usual culprit on a phone) still lets the whole page rubber-band-scroll
   sideways, and — unlike vertical bounce, which snaps back — there's no
   affordance to swipe back to x:0, so the page just stays shifted, with the
   left edge (logo, first nav tabs, sidebar) scrolled out of view. */
html{overflow-x:hidden}
/* body is overflow-x:clip, not hidden: with html already hidden, a hidden body becomes
   its own scroll container and the sticky <header> sticks to a body that never scrolls
   (the document does) — so on Home, the only page taller than the window, it scrolled away. */
:where(button,input,select,textarea){font-family:inherit}
body{background:var(--bg);color:var(--text);font-family:var(--sans);font-size:14px;min-height:100vh;overflow-x:clip;-webkit-font-smoothing:antialiased}
::selection{background:var(--accent-light);color:var(--accent-ink)}
::-webkit-scrollbar{width:6px;height:6px}
::-webkit-scrollbar-track{background:transparent}
::-webkit-scrollbar-thumb{background:var(--border2);border-radius:var(--r-xs)}
::-webkit-scrollbar-thumb:hover{background:var(--text3)}
:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
/* rows made focusable by _kbdClickableInit (ui-shell.js): draw inside, list containers clip overflow */
[data-kbd-click]:focus-visible{outline:2px solid var(--accent-ink);outline-offset:-2px}

/* ── AUTH OVERLAY ─────────────────────────────────────────────── */
#auth-overlay{position:fixed;inset:0;background:var(--overlay-bg);z-index:999;display:flex;align-items:center;justify-content:center}
.auth-card{background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-xl);padding:36px 40px;width:380px;max-width:95vw;box-shadow:var(--shadow-lg)}
.auth-card h1{font-size:16px;font-weight:600;letter-spacing:-.3px;margin-bottom:4px}
.auth-card .subtitle{font-size:12px;color:var(--text3);margin-bottom:28px}
.auth-form .form-row{margin-bottom:14px}
.auth-form label{display:block;font-size:11px;color:var(--text3);margin-bottom:5px;font-weight:500}
.auth-form input{width:100%;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-sm);padding:9px 12px;color:var(--text);font-size:13px;font-family:var(--sans);outline:none;transition:border .15s,box-shadow .15s}
.auth-form input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-light)}
.auth-error{font-size:12px;color:var(--red);margin-bottom:12px;display:none}
.auth-btn{width:100%;padding:10px;background:var(--accent-ink);color:var(--on-accent);border:none;border-radius:var(--r-md);font-size:13px;font-family:var(--sans);font-weight:500;cursor:pointer;transition:background .15s,box-shadow .15s;margin-top:4px;box-shadow:var(--shadow-sm)}
.auth-btn:hover{background:var(--accent-hover);box-shadow:var(--shadow-md)}
.auth-logo{display:flex;align-items:center;gap:10px;margin-bottom:24px}
.auth-lab-logo{display:block;max-width:100%;max-height:64px;width:auto;object-fit:contain;margin:0 0 20px}
/* a logo is drawn for a light page: on the dark theme it sits on a white plate so dark ink stays readable */
:root[data-theme="dark"] .auth-lab-logo{background:#fff;padding:8px 12px;border-radius:8px;box-sizing:content-box}
.auth-logo-suffix{font-size:15px;font-weight:600;letter-spacing:-.2px;color:var(--text)}
#auth-network-bg{position:absolute;inset:0;width:100%;height:100%;pointer-events:none;z-index:0}
.auth-card{position:relative;z-index:1}
.logo-img{width:22px;height:22px;object-fit:contain;border-radius:var(--r-xs);vertical-align:middle;margin-right:2px}

/* ── HEADER ───────────────────────────────────────────────────── */
header{position:sticky;top:0;z-index:200;background:var(--header-bg);backdrop-filter:blur(12px);border-bottom:1px solid var(--border);height:56px;display:flex;align-items:stretch;padding:0 20px;gap:16px;box-shadow:var(--shadow-sm)}
.logo{font-family:var(--sans);font-size:14px;font-weight:600;letter-spacing:-.02em;display:flex;align-items:center;gap:8px;flex-shrink:0}
.logo-badge{background:var(--accent-light);color:var(--accent-ink);font-size:9px;padding:2px 6px;border-radius:var(--r-xs);font-weight:600;letter-spacing:.02em}
.logo-mark-wrap{transition:transform .4s cubic-bezier(.34,1.56,.64,1)}
.logo:hover .logo-mark-wrap{transform:scale(1.12)}
/* overflow-x:auto (not visible/clipped) — on a narrow screen the tab row is
   wider than what's left of the header once the logo and the icon group on
   the right take their share, so it needs its own scroll container. Without
   this, blocking horizontal scroll on the page itself (html/body,
   overflow-x:hidden — see below) leaves the tabs past whatever fits with
   literally no way to reach them at all. Scrollbar hidden since this reads
   as a toolbar, not a scrollable list — the tabs' own :active/hover state
   and the swipe itself are enough affordance. */
nav{display:flex;gap:2px;flex:1;align-items:center;padding:0 4px;overflow-x:auto;overflow-y:hidden;scrollbar-width:none}
nav::-webkit-scrollbar{display:none}
.nav-item{display:flex;align-items:center;padding:5px 12px;border-radius:var(--r-md);border:none;font-size:13px;color:var(--text3);cursor:pointer;background:transparent;transition:color .12s,background .12s;height:36px;font-weight:500;flex-shrink:0}
.nav-dot{display:inline-flex;align-items:center;justify-content:center;background:var(--red);color:#fff;font-size:9px;font-weight:700;min-width:14px;height:14px;padding:0 3px;border-radius:var(--r-sm);margin-left:5px;line-height:1}
.nav-item:hover{color:var(--text2);background:var(--bg3)}
.nav-item.active{color:var(--accent-ink);font-weight:600;background:var(--accent-light)}
.module-locked{opacity:.5!important;pointer-events:none!important;filter:grayscale(.3)}
.module-lock-icon{display:inline-flex;vertical-align:middle;margin-left:5px;flex-shrink:0}
.module-lock-overlay{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;color:var(--text2);background:var(--bg2);z-index:5;text-align:center;font-size:13px;font-weight:500}
.user-menu{display:flex;align-items:center;gap:10px;flex-shrink:0;align-self:center}
.user-badge{display:flex;align-items:center;gap:7px;padding:5px 10px;border-radius:var(--r-md);background:var(--bg3);border:1px solid var(--border);font-size:12px;color:var(--text2);cursor:pointer;position:relative;transition:background .12s,border-color .12s}
.user-badge:hover{background:var(--bg4);border-color:var(--border2)}
.user-badge-compact{padding:5px 6px;gap:0;background:none;border-color:transparent}
.user-badge-compact:hover{background:none;border-color:transparent}
.user-badge-compact:hover .user-avatar{filter:brightness(1.12)}
.user-badge-compact:focus-visible{outline:2px solid var(--accent-ink);outline-offset:2px;border-radius:999px}
.user-badge-compact>div:not(.user-avatar){display:none}
.user-avatar{min-width:22px;height:22px;border-radius:999px;background:var(--accent-ink);color:var(--on-accent);font-size:10px;font-weight:600;display:flex;align-items:center;justify-content:center;padding:0 3px;box-sizing:border-box;letter-spacing:-.2px;overflow:hidden}
.user-avatar img{width:100%;height:100%;object-fit:cover}
.user-avatar svg{flex-shrink:0}
.user-role{font-size:10px;color:var(--text3);font-family:var(--mono)}
.user-dropdown{position:absolute;top:calc(100% + 6px);right:0;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-lg);min-width:180px;z-index:300;display:none;overflow:hidden;box-shadow:var(--shadow-md)}
.user-dropdown.open{display:block}
.user-dropdown button{width:100%;padding:9px 14px;text-align:left;background:transparent;border:none;color:var(--text2);font-size:12px;font-family:var(--sans);cursor:pointer;transition:background .1s,color .1s}
.user-dropdown button:hover{background:var(--bg3);color:var(--text)}
.user-dropdown .dd-sep,.help-hud-body .dd-sep{height:1px;background:var(--border);margin:8px 0}

/* ── NOTIFICATION CENTER ──────────────────────────────────────── */
/* Notifications — a popover under the bell (renderNotifCenter). Tone carries
   meaning through theme tokens, never the brand accent. */
.notif-backdrop{display:none;position:fixed;inset:0;z-index:299}
.notif-backdrop.open{display:block}
.notif-pop{position:fixed;top:60px;right:16px;width:392px;max-width:calc(100vw - 16px);max-height:min(600px,calc(100vh - 80px));display:none;flex-direction:column;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-lg);box-shadow:var(--shadow-lg);z-index:300;overflow:hidden}
.notif-pop.open{display:flex;animation:notif-in .14s ease-out}
@keyframes notif-in{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
.notif-head{display:flex;align-items:center;gap:10px;padding:12px 14px 10px;border-bottom:1px solid var(--border)}
.notif-head-title{font-size:14px;font-weight:600;color:var(--text)}
.notif-filter{display:flex;gap:2px;padding:2px;background:var(--bg3);border-radius:var(--r-sm)}
.notif-filter button{border:none;background:none;padding:3px 9px;font-size:12px;color:var(--text2);border-radius:var(--r-xs);cursor:pointer;display:inline-flex;align-items:center;gap:5px}
.notif-filter button.active{background:var(--bg2);color:var(--text);box-shadow:var(--shadow-sm);font-weight:500}
.notif-count:empty{display:none}
.notif-count{font-size:10px;font-weight:600;min-width:16px;padding:0 4px;height:16px;line-height:16px;text-align:center;border-radius:8px;background:var(--accent-ink);color:var(--on-accent)}
.notif-markall{margin-left:auto;background:none;border:none;padding:2px 0;font-size:12px;color:var(--accent-ink);cursor:pointer}
.notif-markall:hover{text-decoration:underline}
.notif-list{overflow-y:auto;padding:4px 0 6px}
.notif-section{padding:10px 16px 4px;font-size:11px;font-weight:600;color:var(--text3)}
.notif-item{position:relative;display:flex;align-items:flex-start;gap:11px;padding:10px 14px 10px 16px;cursor:pointer;transition:background .12s}
.notif-item:hover,.notif-item:focus-visible{background:var(--bg3);outline:none}
.notif-icon{width:28px;height:28px;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;margin-top:1px}
.notif-icon svg{width:14px;height:14px}
.notif-icon.tone-action{background:color-mix(in srgb,var(--accent-ink) 14%,transparent);color:var(--accent-ink)}
.notif-icon.tone-alert{background:color-mix(in srgb,var(--red) 14%,transparent);color:var(--red)}
.notif-icon.tone-warn{background:color-mix(in srgb,var(--orange) 16%,transparent);color:var(--orange-ink)}
.notif-icon.tone-ok{background:color-mix(in srgb,var(--green) 14%,transparent);color:var(--green-ink)}
.notif-icon.tone-task,.notif-icon.tone-neutral{background:var(--bg3);color:var(--text2)}
.notif-item:hover .notif-icon.tone-task,.notif-item:hover .notif-icon.tone-neutral{background:var(--bg4)}
.notif-body{flex:1;min-width:0}
.notif-title{font-size:13px;line-height:1.4;color:var(--text2)}
.notif-item.unread .notif-title{color:var(--text);font-weight:600}
.notif-meta{font-size:12px;line-height:1.4;color:var(--text3);margin-top:1px;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical}
.notif-actions{display:flex;gap:6px;margin-top:8px}
.notif-side{display:flex;flex-direction:column;align-items:flex-end;gap:8px;flex-shrink:0;padding-top:2px}
.notif-when{font-size:11px;color:var(--text3);white-space:nowrap}
.notif-dot{width:16px;height:16px;padding:0;border:none;background:none;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:50%}
.notif-dot::before{content:"";width:8px;height:8px;border-radius:50%;background:transparent;border:1.5px solid transparent;transition:background .12s,border-color .12s}
.notif-item.unread .notif-dot::before{background:var(--accent-ink)}
.notif-item:not(.unread):hover .notif-dot::before{border-color:var(--text3)}
.notif-dot:hover{background:var(--bg4)}
.notif-more{display:block;width:100%;background:none;border:none;border-top:1px solid var(--border);padding:10px;font-size:12px;color:var(--accent-ink);cursor:pointer;margin-top:4px}
.notif-empty{padding:36px 24px 40px;text-align:center}
.notif-empty-icon{display:inline-flex;width:40px;height:40px;border-radius:50%;align-items:center;justify-content:center;background:var(--bg3);color:var(--text3);margin-bottom:10px}
.notif-empty-icon svg{width:18px;height:18px}
.notif-empty-title{font-size:14px;font-weight:600;color:var(--text)}
.notif-empty-sub{font-size:12px;color:var(--text3);margin-top:4px}
.notif-empty-sub a{color:var(--accent-ink)}

/* ── LAYOUT ───────────────────────────────────────────────────── */
.page{display:none}
.page.active{display:contents}
#page-home.active{display:block;padding:32px 24px;max-width:1100px;margin:0 auto;width:100%}
/* Stock-ticker-style scrolling strip for active announcements, bleeding
   edge-to-edge above #page-home's own padding so it reads as sitting right
   under the header, not as another card in the content column. Track holds
   the item list duplicated twice back-to-back so the loop has no visible
   seam. Keeps scrolling on hover by design — pausing made the strip feel
   broken/stuck, and every item is short enough to read mid-scroll anyway. */
/* #page-home is a centered max-width:1100px column, so plain negative
   margins only break out to that column's own edges — the "break out of a
   centered container" trick (100vw + 50% left offset via position:relative)
   is what actually reaches the real browser window edges either side. */
.home-ticker{position:relative;left:50%;right:50%;margin-left:-50vw;margin-right:-50vw;width:100vw;overflow:hidden;background:var(--bg2);border-bottom:1px solid var(--border);margin-top:-32px;margin-bottom:20px;white-space:nowrap}
.home-ticker-track{display:inline-flex;align-items:center;animation:home-ticker-scroll 15s linear infinite}
.home-ticker-item{display:inline-flex;align-items:center;gap:6px;padding:7px 28px;font-size:12px;color:var(--text2);flex-shrink:0}
.home-ticker-item strong{color:var(--text);font-weight:600}
.home-ticker-item .home-ticker-dot{width:5px;height:5px;border-radius:50%;flex-shrink:0}
@media(prefers-reduced-motion:reduce){.home-ticker-track{animation:none}}
@keyframes home-ticker-scroll{from{transform:translateX(0)}to{transform:translateX(-50%)}}

/* Docking job progress bar while a ligand is actively being docked — real
   progress_current/progress_total only advances between whole ligands, so
   it sits frozen at the same width for however long a single Vina run
   takes (minutes). This sweeping segment is a deliberately fake "it's
   alive" cue for that in-between time, not a real progress indicator. */
.comp-dock-indeterminate{position:absolute;top:0;bottom:0;left:0;width:35%;background:var(--accent);border-radius:3px;animation:comp-dock-sweep 1.4s ease-in-out infinite}
@keyframes comp-dock-sweep{0%{left:-35%}100%{left:100%}}

/* Docking sidebar (grouped preps/jobs) + detail pane — .cv-dock-row is the
   shared selectable-card look for both a prep header and a job row so
   selection highlighting (--active) reads the same regardless of which
   kind of row it's on. */
.cv-dock-row{transition:border-color .12s,background .12s}
.cv-dock-row--active{border-color:var(--accent) !important;background:color-mix(in srgb,var(--accent) 10%,var(--bg2)) !important}
.cv-dock-group{margin-bottom:14px}
.cv-dock-detail-empty{display:flex;align-items:center;justify-content:center;height:100%;color:var(--text3);font-size:13px;text-align:center}
.home-hero{margin-bottom:28px}
.home-hero h2{font-size:var(--ui-title);font-weight:600;letter-spacing:-.02em;margin-bottom:4px}
.home-hero p{font-size:13px;color:var(--text3)}
.home-hero p a{color:var(--text2);cursor:pointer;text-decoration:none}
.home-hero p a:hover{color:var(--accent-ink)}
.home-hero p strong{font-family:var(--mono);font-weight:600}
.home-section{margin-bottom:32px}
.home-section:last-child{margin-bottom:0}
.home-section-title{font-size:12px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--text3);margin-bottom:12px;display:flex;align-items:center;gap:6px}
.home-relations-icon{display:inline-flex;color:var(--text3);cursor:pointer;transition:color .15s}
.home-relations-icon:hover{color:var(--accent-ink)}
.home-relations-icon.static{cursor:default;pointer-events:none}
.home-relations-icon svg{width:13px;height:13px;flex-shrink:0}
.home-empty-note{font-size:12px;color:var(--text3);padding:10px 2px}
.home-title-count:empty{display:none}
.home-title-count{font-size:10px;font-weight:600;letter-spacing:0;min-width:18px;height:17px;padding:0 5px;border-radius:9px;background:var(--bg3);color:var(--text2);display:inline-flex;align-items:center;justify-content:center}
.home-title-link{margin-left:auto;font-size:11px;font-weight:500;letter-spacing:0;text-transform:none;color:var(--text3);cursor:pointer;text-decoration:none}
.home-title-link:hover{color:var(--accent-ink)}
/* My Queue on Home (_mqHomeRowHtml) */
.mq-sec{display:flex;align-items:center;gap:6px;margin:10px 0 2px;font-size:11px;font-weight:600;color:var(--text3)}
.mq-sec:first-child{margin-top:0}
.mq-sec.overdue{color:var(--red)}
.mq-sec.missed{color:var(--red)}
.mq-sec-n{font-weight:500;opacity:.8}
.mq-sec-toggle{cursor:pointer;user-select:none}
.mq-chev{display:inline-flex;transition:transform .15s}.mq-chev svg{width:10px;height:10px}
.mq-chev.open{transform:rotate(90deg)}
.mq-row{display:flex;align-items:flex-start;gap:10px;padding:6px 8px;margin:0 -8px;border-radius:var(--r-sm);transition:background .12s}
.mq-row:hover{background:var(--bg3)}
.mq-row .mq-hover{opacity:0;transition:opacity .12s}
.mq-row:hover .mq-hover,.mq-row:focus-within .mq-hover{opacity:1}
.mq-row .mq-hover.danger:hover{color:var(--red);background:color-mix(in srgb,var(--red) 10%,transparent)}
@media(hover:none){.mq-row .mq-hover{opacity:1}}
.mq-row-link{cursor:pointer}
.mq-check{width:16px;height:16px;margin-top:1px;flex-shrink:0;border-radius:50%;border:1.5px solid var(--border2);background:var(--bg2);color:transparent;display:flex;align-items:center;justify-content:center;padding:0;cursor:pointer;transition:border-color .12s,background .12s,color .12s}
.mq-check svg{width:10px;height:10px}
.mq-check:hover{border-color:var(--green-ink);color:var(--green-ink)}
.mq-check.done{background:var(--green);border-color:var(--green-ink);color:#fff}
.mq-kind-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0;margin:6px 4.5px 0}
.mq-cal-error .mq-kind-dot{background:var(--orange)}
.mq-main{flex:1;min-width:0;cursor:pointer}
.mq-main[role=button]:focus-visible{outline:2px solid var(--accent);outline-offset:2px;border-radius:var(--r-sm)}
.mq-title{font-size:13px;color:var(--text);line-height:1.35;display:flex;align-items:center;gap:6px;min-width:0}
.mq-row.done .mq-title{color:var(--text3);text-decoration:line-through}
.mq-row-deadline.is-finished{opacity:.5}
.mq-row-deadline.is-finished .mq-title{text-decoration:line-through}
.mq-row-deadline.is-finished:hover{opacity:.9}
.mq-prio{display:inline-flex;color:var(--accent-ink)}.mq-prio svg{width:12px;height:12px}
.mq-doing{font-size:10px;font-weight:600;padding:1px 6px;border-radius:var(--r-xs);background:color-mix(in srgb,var(--accent-ink) 12%,transparent);color:var(--accent-ink)}
.mq-missed{font-size:10px;font-weight:600;padding:1px 6px;border-radius:var(--r-xs);background:color-mix(in srgb,var(--red) 11%,transparent);color:var(--red)}
.mq-meta{font-size:var(--ui-caption);color:var(--text3);margin-top:1px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.mq-meta .overdue{color:var(--red);font-weight:500}
/* Home's columns are a third of the page: let the detail line wrap instead of cutting off its actions (Reschedule, subtasks) */
#home-queue-tasks-row .mq-meta{white-space:normal;overflow:visible;text-overflow:clip;line-height:1.45}
.mq-meta .today{color:var(--text2);font-weight:500}
.mq-add{position:relative;display:flex;align-items:center;gap:10px;padding:6px 8px;margin:6px -8px 0;border-radius:var(--r-sm)}
.mq-add-plus{display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;flex-shrink:0;padding:0;border:none;border-radius:var(--r-sm);background:none;color:var(--text3);cursor:pointer;transition:background .12s,color .12s}.mq-add-plus svg{width:14px;height:14px;pointer-events:none}
.mq-add-plus.ready{color:var(--accent-ink)}
.mq-add-plus:not(:disabled):hover{background:var(--accent-light)}
.mq-add-plus:focus-visible{outline:2px solid var(--accent-ink);outline-offset:2px}
.mq-add-plus:disabled{cursor:default}
.mq-add-input{flex:1;border:none;background:none;outline:none;font-size:13px;color:var(--text);padding:0;min-width:0}
.mq-add-input::placeholder{color:var(--text3)}
.mq-add:focus-within{background:var(--bg3)}
/* Optional due date, all the way to the right of the row — a calendar icon
   at rest (an empty native date input still shows dd/mm/yyyy-shaped
   placeholder text, which read as a pre-filled "today"), swapping to the
   picked date's text once one is set (click it again to reopen the
   picker), plus a ✕ button to clear it. */
.mq-add-date-wrap{position:relative;display:inline-flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:var(--r-sm);color:var(--text3);cursor:pointer;flex-shrink:0;transition:background .12s,color .12s}
.mq-add-date-wrap:hover{background:var(--bg3);color:var(--text)}
.mq-add-date-wrap.has-date{width:auto;padding:0 6px;color:var(--accent-ink)}
.mq-add-date-icon{display:inline-flex;pointer-events:none}
.mq-add-date-wrap.has-date .mq-add-date-icon{display:none}
.mq-add-date-label{display:none;font-size:11px;font-weight:600;white-space:nowrap;pointer-events:none}
.mq-add-date-wrap.has-date .mq-add-date-label{display:inline}
/* The real control, stacked on the icon/label (later in source order = on
   top) and fully covering it so any click there actually clicks this —
   the browser's own picker then opens exactly like a normal date input. */
.mq-add-date-hidden{position:absolute;inset:0;width:100%;height:100%;margin:0;padding:0;border:none;background:none;opacity:0;cursor:pointer}
.mq-add-date-clear{display:inline-flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;border:none;background:none;border-radius:var(--r-sm);color:var(--text3);cursor:pointer;flex-shrink:0;transition:background .12s,color .12s}
.mq-add-date-clear:hover{background:var(--bg3);color:var(--red)}
.mq-add-date-clear[hidden]{display:none}
.mq-add-chip{display:inline-flex;align-items:center;gap:4px;height:22px;min-width:22px;justify-content:center;padding:0 4px;border:none;background:none;border-radius:var(--r-sm);color:var(--text3);cursor:pointer;flex-shrink:0;font:inherit;font-size:11px;font-weight:600;transition:background .12s,color .12s}
.mq-add-chip:hover{background:var(--bg3);color:var(--text)}
.mq-add-chip[hidden]{display:none}
.mq-add-chip.has-value{color:var(--accent-ink)}
.mq-add:not(.has-title) .mq-add-chip,.mq-add:not(.has-title) .mq-add-date-wrap,.mq-add:not(.has-title) .mq-add-time,.mq-add:not(.has-title) .mq-add-date-clear{display:none}
.mq-add-chip-ic{display:inline-flex;pointer-events:none}.mq-add-chip-ic svg{width:14px;height:14px}
.mq-add-chip-label{max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mq-add-chip-label:empty{display:none}
.mq-add-pop{position:fixed;z-index:3000;min-width:200px;max-width:280px;max-height:280px;overflow:auto;padding:4px;background:var(--bg);border:1px solid var(--border);border-radius:var(--r-md);box-shadow:0 8px 24px color-mix(in srgb,var(--text) 18%,transparent)}
.mq-add-pop-item{display:flex;align-items:center;gap:8px;width:100%;padding:6px 8px;border:none;background:none;border-radius:var(--r-sm);color:var(--text);font:inherit;font-size:13px;text-align:left;cursor:pointer}
.mq-add-pop-item:hover{background:var(--bg3)}
.mq-add-pop-item.active{color:var(--accent-ink);font-weight:600}
.mq-add-pop-item svg{flex-shrink:0}
/* Team rota on Home (loadHomeNextTasks) — same row language as My Queue */
.rota-row.mine{background:color-mix(in srgb,var(--accent-ink) 7%,transparent)}
.rota-row.mine:hover{background:color-mix(in srgb,var(--accent-ink) 11%,transparent)}
.rota-row>.home-task-icon-btn{margin-top:1px}
.rota-you{font-size:10px;font-weight:600;padding:0 6px;border-radius:var(--r-xs);background:var(--accent-ink);color:var(--on-accent)}
.rota-who{display:flex;align-items:center;gap:5px}
.rota-who .pj-av{flex-shrink:0}
.rota-stack{display:inline-flex}.rota-stack .pj-av+.pj-av{margin-left:-5px;box-shadow:0 0 0 1.5px var(--bg)}
.rota-out{display:flex;align-items:center;flex-wrap:wrap;gap:6px 10px;padding:7px 10px;margin:0 0 10px;border-radius:var(--r-sm);background:var(--bg3);font-size:12px;color:var(--text2)}
.rota-out-label{font-size:11px;font-weight:600;color:var(--text3)}
.rota-out-person{display:inline-flex;align-items:center;gap:5px}
.rota-out-why{font-size:var(--ui-caption);color:var(--text3)}
.rota-next{display:flex;align-items:center;gap:7px;margin-top:10px;padding-top:9px;border-top:1px solid var(--border);font-size:12px;color:var(--text2)}
.rota-next svg{width:13px;height:13px;color:var(--text3);flex-shrink:0}
#home-banners{margin-bottom:20px}
.home-2col{display:grid;grid-template-columns:1fr 1fr;gap:28px;align-items:start;margin-bottom:32px}
/* Without min-width:0, a 1fr grid track still won't shrink below its
   item's min-content width — the heatmap's own horizontal-scroll container
   doesn't matter if the column itself refuses to go below "wide enough for
   the whole year unscrolled", which is exactly what was stretching this
   column past its intended 50% and squeezing Recent activity into the rest. */
.home-2col .home-section{margin-bottom:0;min-width:0}
.home-2col.single{grid-template-columns:1fr}
@media(max-width:700px){.home-2col{grid-template-columns:1fr}}
/* Home's bottom row: activity graph + figures, recent activity, people online — three equal columns that share
   one body height, so none of them is left with a blank gap below it. */
.home-3col{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:28px;align-items:start;margin-bottom:32px}
.home-3col .home-section{margin-bottom:0;min-width:0}
.home-3col .home-section-title{height:24px;margin-bottom:8px}
@media(max-width:900px){.home-3col{grid-template-columns:1fr;gap:24px}}
.home-people-count{font-size:11px;font-weight:600;letter-spacing:0;text-transform:none;color:var(--accent-ink);background:color-mix(in srgb,var(--accent-ink) 14%,transparent);border-radius:999px;padding:1px 8px}
.home-people-list{display:flex;flex-direction:column}
.home-person{display:flex;align-items:center;gap:10px;padding:4px 0;border-bottom:1px solid var(--border);min-width:0}
.home-person-text{min-width:0;flex:1}
.home-person-name{font-size:var(--ui-body);font-weight:600;color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.home-person-name small{font-weight:400;color:var(--text3);margin-left:4px}
.home-person-st{font-size:var(--ui-caption);color:var(--text2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.home-person-pause{font-size:10px;padding:1px 6px;border-radius:var(--r-xs);background:color-mix(in srgb,var(--red) 12%,transparent);color:var(--red);flex-shrink:0;white-space:nowrap}
.home-person-msg{flex-shrink:0;color:var(--text2)}
@media (hover:hover){.home-person-msg{opacity:0;transition:opacity var(--mo-fast)}.home-person:hover .home-person-msg,.home-person-msg:focus-visible{opacity:1}}
.home-mini-av[role=button],.home-person[role=button]{cursor:pointer}
.home-person[role=button]:focus-visible{outline:none;box-shadow:0 0 0 2px var(--accent);border-radius:var(--r-sm)}
.person-pop{min-width:220px}
.person-pop-head{display:flex;align-items:center;gap:10px;padding:6px 8px 10px;border-bottom:1px solid var(--border);margin-bottom:6px;min-width:0}
.person-pop-text{display:flex;flex-direction:column;min-width:0}
.person-pop-text b{font-size:var(--ui-body);font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.person-pop-text b small{font-weight:400;color:var(--text3)}
.person-pop-text span{font-size:var(--ui-caption);color:var(--text2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chat-popup.person-pop .person-pop-acts{display:flex;gap:4px;padding:0 2px}
.chat-popup.person-pop .person-pop-acts button{width:auto;min-width:40px;min-height:40px;justify-content:center;padding:0;color:var(--text2)}
.home-away{display:flex;align-items:center;gap:8px;padding-top:9px;margin-top:6px;border-top:1px solid var(--border);font-size:var(--ui-caption);color:var(--text2);min-width:0}
.home-away-lbl{font-weight:600;color:var(--text3);flex-shrink:0}
.home-away-stack{display:flex;flex-shrink:0}
.home-away-stack .pj-av{filter:grayscale(.85);opacity:.8;box-shadow:0 0 0 2px var(--bg)}
.home-away-stack .pj-av+.pj-av{margin-left:-6px}
.home-away-tx{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.home-away-tx b{font-weight:600;color:var(--text)}
/* more than three connected: the rest as small avatars on the right, name + status on hover/focus */
.home-more{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 0;border-bottom:1px solid var(--border)}
.home-more-lbl{font-size:var(--ui-caption);font-weight:600;color:var(--text3);flex-shrink:0}
.home-mini{display:flex;flex-wrap:wrap;gap:4px;justify-content:flex-end;min-width:0}
.home-mini-av{position:relative;display:inline-flex;border-radius:50%;outline:none}
.home-mini-av:focus-visible{box-shadow:0 0 0 2px var(--accent)}
.home-mini-tip{display:none;position:absolute;bottom:calc(100% + 8px);right:-6px;z-index:20;white-space:nowrap;background:var(--bg);color:var(--text);border:1px solid var(--border2);border-radius:var(--r-sm);box-shadow:var(--shadow-md);padding:6px 9px;font-size:var(--ui-caption);line-height:1.35;text-align:left}
.home-mini-tip b{display:block;font-weight:600}
.home-mini-tip i{display:block;font-style:normal;color:var(--text2)}
.home-mini-av:hover .home-mini-tip,.home-mini-av:focus .home-mini-tip{display:block}
.home-mini-more{font-size:var(--ui-caption);color:var(--text3);align-self:center;padding:0 2px}

.home-next-item{display:flex;align-items:center;gap:6px;padding:2px 0;font-size:12px}
.home-next-item .dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}
.home-next-group>summary{list-style:none;cursor:pointer}
.home-next-group>summary::-webkit-details-marker{display:none}
.home-next-group>summary .home-next-item:hover{opacity:.8}
.mq-status-chip{font-family:var(--sans);font-size:11px;font-weight:500;text-transform:none;color:var(--text3);
  background:var(--bg3);border-radius:var(--r-xs);padding:1px 6px;flex-shrink:0}
.home-task-icon-btn{display:flex;align-items:center;justify-content:center;width:19px;height:19px;padding:0;border:none;background:none;border-radius:var(--r-sm);color:var(--text3);cursor:pointer;transition:background .15s,color .15s;flex-shrink:0}
.home-task-icon-btn:hover{background:var(--bg3);color:var(--text)}
.home-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px}
.home-grid.home-grid-small{grid-template-columns:repeat(6,minmax(0,1fr));gap:10px}
.home-grid.home-grid-big{grid-template-columns:repeat(2,minmax(0,1fr))}
@media(max-width:1100px){
  .home-grid.home-grid-small{grid-template-columns:repeat(4,minmax(0,1fr))}
}
@media(max-width:900px){
  .home-grid,.home-grid.home-grid-small,.home-grid.home-grid-big{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media(max-width:560px){
  .home-grid,.home-grid.home-grid-small,.home-grid.home-grid-big{grid-template-columns:minmax(0,1fr)}
}
/* Small: 6 modules in one row — same icon-left structure as Medium/Big,
   just narrower. No room for the stat number, so that's dropped; title and
   description wrap instead of ellipsis-truncating. Description is always
   exactly 2 lines — clamped so it never grows past that, and a min-height
   reserving that same 2-line space so every card lines up even when its
   text is short enough to only need one. */
.home-grid-small .home-card{padding:12px;gap:8px;min-width:0}
.home-grid-small .home-card-stat{display:none}
.home-grid-small .home-card-icon{width:32px;height:32px}
.home-grid-small .home-card-title{white-space:normal;font-size:13px;overflow-wrap:anywhere;overflow:visible;text-overflow:clip}
.home-grid-small .home-card-desc{white-space:normal;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:11px;line-height:1.35;min-height:calc(1.35em * 2)}
.home-links-row{display:flex;flex-wrap:wrap;justify-content:center;gap:36px}
.home-link-btn{display:flex;flex-direction:column;align-items:center;gap:6px;width:72px;padding:8px 4px;border-radius:var(--r-md);text-decoration:none;color:var(--text2);transition:background .15s,transform .15s}
.home-link-btn:hover{background:var(--bg2);transform:translateY(-2px)}
.home-link-btn img{width:18px;height:18px;object-fit:contain;filter:grayscale(1);opacity:.6;transition:filter .15s,opacity .15s}
.home-link-btn:hover img{filter:grayscale(0);opacity:1}
.home-link-fallback{width:18px;height:18px;border-radius:var(--r-xs);background:var(--bg3);display:flex;align-items:center;justify-content:center;font-size:8px;font-weight:700;color:var(--text3)}
.hl-preset-btn{display:flex;flex-direction:column;align-items:center;gap:5px;width:66px;padding:8px 4px;border:1px solid var(--border2);border-radius:var(--r-md);background:var(--bg2);color:var(--text2);font-size:11px;cursor:pointer;transition:border-color .15s,background .15s}
.hl-preset-btn:hover{border-color:var(--accent);background:var(--bg2)}
.hl-preset-icon{display:flex;align-items:center;justify-content:center;width:20px;height:20px}
.home-link-btn span{font-size:11px;text-align:center;overflow-wrap:break-word;white-space:normal;line-height:1.25;max-width:100%}
.home-card{background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-lg);padding:16px;cursor:pointer;transition:border-color .18s,box-shadow .18s,transform .18s;display:flex;flex-direction:row;align-items:center;justify-content:space-between;gap:12px;box-shadow:var(--shadow-sm);animation:card-in .42s cubic-bezier(.22,1,.36,1) backwards;min-width:0}
.home-card-main{display:flex;flex-direction:column;gap:6px;min-width:0;flex:1}
.home-card-stat{text-align:right;flex-shrink:0}
.home-card:nth-child(1){animation-delay:.04s}.home-card:nth-child(2){animation-delay:.09s}.home-card:nth-child(3){animation-delay:.14s}.home-card:nth-child(4){animation-delay:.19s}.home-card:nth-child(5){animation-delay:.24s}.home-card:nth-child(6){animation-delay:.29s}.home-card:nth-child(7){animation-delay:.34s}
@keyframes card-in{from{opacity:0;transform:translateY(14px)}to{opacity:1;transform:translateY(0)}}
.home-card:hover{border-color:color-mix(in srgb,var(--card-color,var(--border2)) 45%,var(--border));box-shadow:var(--shadow-md),0 0 0 1px color-mix(in srgb,var(--card-color,transparent) 12%,transparent);transform:translateY(-3px)}
.home-card-icon{width:38px;height:38px;border-radius:var(--r-md);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:background .2s,color .2s,transform .22s cubic-bezier(.34,1.56,.64,1)}
.home-card:hover .home-card-icon{background:var(--card-bg,var(--bg3))!important;color:var(--card-color,var(--text2))!important;transform:scale(1.1)}
.home-card:hover .home-card-icon svg{animation:none}
/* Chemistry: flask rocks + liquid rises + bubbles */
.ico-bubble1,.ico-bubble2,.ico-bubble3{transform-box:fill-box;transform-origin:center}
.home-card[data-tab="eln"]:hover .home-card-icon svg{animation:flask-rock .75s cubic-bezier(.36,.07,.19,.97) forwards;transform-box:fill-box;transform-origin:center bottom}
.home-card[data-tab="eln"]:hover .ico-flask-fill{animation:flask-rise .45s ease .05s forwards}
.home-card[data-tab="eln"]:hover .ico-bubble1{animation:bubble-up 1.4s ease 0s infinite}
.home-card[data-tab="eln"]:hover .ico-bubble2{animation:bubble-up 1.4s ease .45s infinite}
.home-card[data-tab="eln"]:hover .ico-bubble3{animation:bubble-up 1.4s ease .9s infinite}
/* Biology: DNA rotation handled by _initDnaRotation() RAF loop */
/* Lab: sun/moon day-night cycle behind the building (home card only; nav icon is static) */
/* Library: loupe scans shelf in loop */
.ico-loupe{opacity:0;transition:opacity .2s ease}
.ico-openbook{opacity:0}
.home-card[data-tab="library"]:hover .ico-loupe{opacity:1;animation:loupe-circle 2s linear infinite}
@keyframes loupe-circle{0%{transform:translate(4px,0)}25%{transform:translate(0,4px)}50%{transform:translate(-4px,0)}75%{transform:translate(0,-4px)}100%{transform:translate(4px,0)}}
/* Workspace: panels settle in sequence; the icon toggle also gates this motion. */
.ico-workspace-main,.ico-workspace-top,.ico-workspace-bottom{transform-box:fill-box;transform-origin:center}
#home-grid:not(.home-icons-static) .home-card[data-tab="projects"]:hover .ico-workspace-main{animation:workspace-panel-settle .6s ease both}
#home-grid:not(.home-icons-static) .home-card[data-tab="projects"]:hover .ico-workspace-top{animation:workspace-panel-settle .6s ease .08s both}
#home-grid:not(.home-icons-static) .home-card[data-tab="projects"]:hover .ico-workspace-bottom{animation:workspace-panel-settle .6s ease .16s both}
@keyframes workspace-panel-settle{0%,100%{transform:translateY(0);fill-opacity:.08}45%{transform:translateY(-1px);fill-opacity:.22}}
@media(prefers-reduced-motion:reduce){#home-grid:not(.home-icons-static) .home-card[data-tab="projects"]:hover .home-card-icon svg rect{animation:none}}
/* Lab building: sun and moon swing in an arc over the roof (pivot below the building), taking turns (loop) */
.ico-lab-sun,.ico-lab-moon{opacity:0;transform-box:view-box;transform-origin:9px 16.5px;transform:rotate(75deg)}
.home-card[data-tab="equipment"]:hover .ico-lab-sun{animation:lab-sun-cycle 5s linear infinite}
.home-card[data-tab="equipment"]:hover .ico-lab-moon{animation:lab-moon-cycle 5s linear infinite}
@keyframes lab-sun-cycle{0%{transform:rotate(75deg);opacity:0}12%{transform:rotate(45deg);opacity:1}38%{transform:rotate(-45deg);opacity:1}50%{transform:rotate(-75deg);opacity:0}100%{transform:rotate(-75deg);opacity:0}}
@keyframes lab-moon-cycle{0%,50%{transform:rotate(75deg);opacity:0}62%{transform:rotate(45deg);opacity:1}88%{transform:rotate(-45deg);opacity:1}100%{transform:rotate(-75deg);opacity:0}}
/* Lab easter egg: 30s hover → a UFO flies in, abducts the "Lab" title (and a cow) */
.home-card-header{position:relative}
.lab-ufo-scene{position:absolute;inset:0;pointer-events:none;overflow:visible;z-index:12}
.ufo-craft{position:absolute;left:0;top:-8px;animation:ufo-flyover-header 4.2s cubic-bezier(.4,0,.2,1) forwards}
.ufo-light{animation:ufo-lights-blink .5s steps(1) infinite}
.ufo-light:nth-child(2){animation-delay:.12s}
.ufo-light:nth-child(3){animation-delay:.24s}
.ufo-beam{position:absolute;left:44px;top:4px;width:34px;height:28px;background:linear-gradient(to bottom,rgba(125,211,252,.6),rgba(125,211,252,0));clip-path:polygon(38% 0,62% 0,100% 100%,0% 100%);opacity:0;transition:opacity .3s ease}
.lab-ufo-scene.beaming .ufo-beam{opacity:1;animation:ufo-beam-pulse 1s ease-in-out infinite}
.ufo-cow{position:absolute;left:56px;top:24px;font-size:12px;opacity:0;line-height:1}
.lab-ufo-scene.beaming .ufo-cow{animation:ufo-cow-abduct .9s ease-in forwards}
@keyframes ufo-flyover-header{
  0%{transform:translate(-24px,6px) scale(.6);opacity:0}
  10%{opacity:1}
  30%{transform:translate(30px,0) scale(.9)}
  50%,75%{transform:translate(48px,-2px) scale(1)}
  88%{opacity:1}
  100%{transform:translate(100px,8px) scale(.6);opacity:0}
}
@keyframes ufo-beam-pulse{0%,100%{opacity:.7}50%{opacity:1}}
@keyframes ufo-lights-blink{0%,49%{opacity:1}50%,100%{opacity:.25}}
@keyframes ufo-cow-abduct{
  0%{opacity:0;transform:translateY(0) scale(.6) rotate(0deg)}
  20%{opacity:1;transform:translateY(-2px) scale(.8) rotate(-10deg)}
  100%{opacity:0;transform:translateY(-26px) scale(.15) rotate(20deg)}
}
.home-card-title.ufo-abducted{animation:title-abduct 1s ease-in forwards}
.home-card-title.ufo-restored{animation:title-restore .5s cubic-bezier(.34,1.56,.64,1) forwards}
@keyframes title-abduct{0%{opacity:1;transform:translateY(0) scale(1)}100%{opacity:0;transform:translateY(-22px) scale(.7)}}
@keyframes title-restore{0%{opacity:0;transform:translateY(-10px) scale(.7)}60%{opacity:1;transform:translateY(2px) scale(1.08)}100%{opacity:1;transform:translateY(0) scale(1)}}
@media(prefers-reduced-motion:reduce){.lab-ufo-scene{display:none}.home-card-title.ufo-abducted,.home-card-title.ufo-restored{animation:none!important}}
@keyframes flask-rock{0%{transform:rotate(0)}25%{transform:rotate(-10deg)}60%{transform:rotate(8deg)}80%{transform:rotate(-4deg)}100%{transform:rotate(0)}}
@keyframes flask-rise{from{opacity:0;transform:translateY(3px)}to{opacity:1;transform:translateY(0)}}
@keyframes bubble-up{0%{opacity:0;transform:translateY(0)}15%{opacity:.9}75%{opacity:.7;transform:translateY(-5px)}100%{opacity:0;transform:translateY(-8px)}}
/* DNA rotation is handled by _initDnaRotation() in app.js (RAF, path computation) */
@keyframes chart-march{to{stroke-dashoffset:-6.5}}
/* Orders tab — shopping cart wheels */
.ico-wheel-l,.ico-wheel-r{transform-box:fill-box;transform-origin:center}
.home-card[data-tab="orders"]:hover .ico-wheel-l{animation:wheel-spin .45s linear infinite}
.home-card[data-tab="orders"]:hover .ico-wheel-r{animation:wheel-spin .45s linear infinite}
@keyframes wheel-spin{to{transform:rotate(360deg)}}
/* Chemistry easter egg: long hover → flask disappears, leaves a sad face */
.flask-heating svg{animation:flask-shake-mild .3s ease-in-out infinite!important;transform-box:fill-box;transform-origin:center bottom}
@keyframes flask-shake-mild{0%,100%{transform:rotate(0)}30%{transform:rotate(-9deg)}70%{transform:rotate(9deg)}}
.flask-kaboom svg{animation:flask-vanish .35s ease-in forwards!important;transform-box:fill-box;transform-origin:center}
@keyframes flask-vanish{0%{transform:scale(1);opacity:1}40%{transform:scale(1.1);opacity:.6}100%{transform:scale(0);opacity:0}}
.home-card-icon{position:relative;overflow:visible}
/* A rotated ":(" reads as an actual face (colon → two eyes side by side,
   parenthesis → a frown underneath) instead of flat sideways punctuation.
   The rotation lives on the inner span (shrink-wrapped to the glyphs, so it
   pivots around its own visual center) — the outer div just centers that
   span in the icon box, untransformed. */
.flask-sadface{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;pointer-events:none;color:var(--red)}
.flask-sadface span{display:inline-block;font-size:15px;font-weight:700;line-height:1;white-space:nowrap;animation:sadface-pop .35s ease-out forwards}
@keyframes sadface-pop{0%{transform:rotate(90deg) scale(0);opacity:0}60%{transform:rotate(90deg) scale(1.2);opacity:1}100%{transform:rotate(90deg) scale(1);opacity:1}}
/* Neutral (no fire-colored) explosion flash right as the flask vanishes */
.flask-boom{position:absolute;inset:-6px;border-radius:50%;background:radial-gradient(circle,rgba(255,255,255,.95) 0%,var(--text3) 55%,transparent 100%);animation:boom-expand .5s ease-out forwards;pointer-events:none;z-index:10}
.flask-boom::after{content:'';position:absolute;inset:-8px;border-radius:50%;border:3px solid var(--text3);opacity:.6;animation:boom-shockwave .5s ease-out .03s forwards}
@keyframes boom-expand{0%{transform:scale(0);opacity:1}60%{opacity:.85}100%{transform:scale(3);opacity:0}}
@keyframes boom-shockwave{0%{transform:scale(.3);opacity:.7}100%{transform:scale(4);opacity:0}}
.home-card-title{font-size:14px;font-weight:600;letter-spacing:-.01em;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.home-card-desc{font-size:12px;color:var(--text3);line-height:1.4;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.home-stat-main{font-size:20px;font-weight:600;font-family:var(--mono);letter-spacing:-.04em;line-height:1;color:var(--text)}
.home-stat-sub{font-size:11px;color:var(--text3);margin-top:3px}
.home-card[data-tab="computational"]:hover .ico-comp-bar{opacity:.85;animation:ico-comp-bar-slide 1s ease-in-out infinite}
@keyframes ico-comp-bar-slide{0%,100%{transform:translateX(0)}50%{transform:translateX(6px)}}
@media(prefers-reduced-motion:reduce){.home-card[data-tab="computational"]:hover .ico-comp-bar{animation:none;opacity:.85}}
/* Admin → Site → Home page → Icon behavior: "Animate module icons on hover"
   off. DNA rotation is skipped at the JS level (_initDnaRotation's animate
   arg); Workspace panel motion is gated above. CSS keyframes are neutralized
   the same way prefers-reduced-motion already handles Computational above. */
#home-grid.home-icons-static .home-card[data-tab="eln"]:hover .home-card-icon svg,
#home-grid.home-icons-static .home-card[data-tab="eln"]:hover .ico-flask-fill,
#home-grid.home-icons-static .home-card[data-tab="eln"]:hover .ico-bubble1,
#home-grid.home-icons-static .home-card[data-tab="eln"]:hover .ico-bubble2,
#home-grid.home-icons-static .home-card[data-tab="eln"]:hover .ico-bubble3,
#home-grid.home-icons-static .home-card[data-tab="equipment"]:hover .ico-lab-sun,
#home-grid.home-icons-static .home-card[data-tab="equipment"]:hover .ico-lab-moon,
#home-grid.home-icons-static .home-card[data-tab="library"]:hover .ico-loupe,
#home-grid.home-icons-static .home-card[data-tab="computational"]:hover .ico-comp-bar{animation:none!important}
#page-library.active{display:flex;flex-direction:column;height:calc(100vh - 56px);overflow:hidden}
/* Flexbox, same as every other sidebar+content pane (ELN/Bio/Projects/
   Equipment/Reagents/Orders) — this used to be a CSS Grid with a second,
   separately-toggled .sidebar-collapsed class on this container to swap
   grid-template-columns, kept in sync with #library-sidebar's own
   .collapsed by hand in toggleLibrarySidebar()/initLibrarySidebar(). Two
   elements' classes staying frame-perfectly in sync (plus the aside's own
   width transition animating independently of the grid's instant column
   snap) was the actual cause behind "sidebar sometimes collapses wrong,
   especially in Library" — a flex child's width transition alone, like
   every other sidebar already uses, has nothing else to fall out of sync
   with. */
#lib-compounds-inner{display:flex;flex:1;overflow:hidden;min-height:0}
#main-compounds{flex:1;min-width:0}
#lib-boxes-inner{display:flex;flex-direction:column;flex:1;min-height:0;overflow:hidden}
/* Boxes gets its own filter sidebar (search/project/location/sort) — same
   flex sidebar+content shape as bio-results (#lib-bio-results-inner);
   Plates keeps the old simple centered/padded layout, now on itself since
   the padding moved off the shared #lib-boxes-inner wrapper. */
.storage-shell{display:flex;min-height:0;flex:1;overflow:hidden}
#lib-bio-results-inner{display:flex;flex:1;overflow:hidden;min-height:0}
#lib-charts-inner{display:flex;flex:1;overflow:hidden;min-height:0}
#page-eln.active,#page-bio.active,#page-projects.active,#page-orders.active,#page-admin.active{display:flex;flex-direction:column;min-height:calc(100vh - 56px);padding:0;max-width:none}
#page-equipment.active,#page-computational.active{display:flex;flex-direction:column;height:calc(100vh - 56px);padding:0;max-width:none;overflow:hidden}
#page-orders.active{height:calc(100vh - 56px)}
#page-eln.active,#page-bio.active,#page-projects.active,#page-admin.active{height:calc(100vh - 56px)}
#admin-content{flex:1;overflow-y:auto;padding:24px;width:100%;box-sizing:border-box}
/* Shared shell for every left filter/list sidebar that isn't .eln-list
   (Equipment, Maintenance, Team, Dissemination, Projects) -- same base
   layout and header padding repeated 5x byte-for-byte before this; each
   module still owns its own collapsed-state hide rule below since which
   children get hidden differs per module. */
.side-panel{width:260px;height:100%;flex-shrink:0;border-right:1px solid var(--border);display:flex;flex-direction:column;overflow:visible;transition:width .2s ease}
.side-panel.collapsed{width:0;border-right:none}
.side-panel-header{padding:14px 14px 10px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px;flex-shrink:0}
#maint-sidebar.collapsed #maint-sidebar-header>:not(.sidebar-toggle-btn),#maint-sidebar.collapsed>:not(#maint-sidebar-header){display:none!important}
#team-sidebar.collapsed #team-sidebar-header>:not(.sidebar-toggle-btn),#team-sidebar.collapsed>:not(#team-sidebar-header){display:none!important}
#diss-sidebar.collapsed #diss-sidebar-header>:not(.sidebar-toggle-btn),#diss-sidebar.collapsed>:not(#diss-sidebar-header){display:none!important}
.equip-list-row{display:flex;align-items:center;gap:10px;padding:9px 14px;cursor:pointer;border-bottom:1px solid var(--border);transition:background .1s;font-size:13px;color:var(--text2)}
.equip-list-row:hover{background:var(--bg3)}
.equip-list-row.active{background:var(--accent-light);color:var(--accent-ink);font-weight:600}
.equip-list-row.active .equip-status{box-shadow:0 0 0 2px var(--accent-light)}
.equip-list-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}
.equip-list-meta{font-size:11px;color:var(--text3);white-space:nowrap}
.equip-list-group-header{font-size:10px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text3);padding:10px 14px 4px;margin-top:4px}
.equip-list-group-header:first-child{margin-top:0}
#equip-detail-panel{flex:1;display:flex;flex-direction:column;overflow:hidden;min-width:0}
.bk-provider-btn:hover{border-color:var(--accent)!important;box-shadow:0 0 0 3px var(--accent-light)}
.integration-card:hover{border-color:var(--accent)!important;box-shadow:0 0 0 3px var(--accent-light)}
#equip-detail-bar{justify-content:space-between;flex-shrink:0}
#equip-cards-inner{padding:16px}
.network-equipment-card{display:flex;flex-direction:column;gap:5px;width:100%;padding:13px 14px;text-align:left;border:1px solid var(--border);border-radius:var(--r-md);background:var(--bg2);color:var(--text);font:inherit;cursor:pointer;transition:border-color .12s,box-shadow .12s}
.network-equipment-card:hover,.network-equipment-card:focus-visible{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-light);outline:none}
.network-equipment-head{display:flex;align-items:center;justify-content:space-between;gap:12px;font-size:var(--ui-section)}
.network-equipment-lab{font-size:var(--ui-label);font-weight:600;color:var(--accent-ink)}
.network-equipment-meta,.network-equipment-desc{font-size:var(--ui-caption);color:var(--text3)}
.network-equipment-desc{color:var(--text2);line-height:1.45}
.network-section-title{font-size:var(--ui-section);font-weight:650;margin-bottom:5px}
.network-bookings{border:1px solid var(--border);border-radius:var(--r-md);background:var(--bg2);padding:10px 14px;margin-bottom:10px}
.network-booking-row{display:flex;align-items:center;gap:10px;padding:8px 0;border-top:1px solid var(--border)}
.network-booking-row>div{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1;font-size:var(--ui-body)}
.network-booking-row span{font-size:var(--ui-caption);color:var(--text3)}
.network-busy{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-height:32px;padding:7px 9px;border:1px solid var(--border);border-radius:var(--r-sm);background:var(--bg3);font-size:var(--ui-caption);color:var(--text2);margin-bottom:8px}
.network-busy strong{font-size:var(--ui-caption)}
.network-free{color:var(--green-ink)}
.org-limit-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}
@media(max-width:820px){.network-booking-row{padding:10px 0}.network-equipment-card{padding:14px}.network-bookings{padding:10px 12px}.org-limit-grid{grid-template-columns:1fr}}
.subtab-strip{display:flex;align-items:center;gap:2px;padding:8px 14px;min-height:48px;box-sizing:border-box;border-bottom:1px solid var(--border);background:var(--bg2);flex-shrink:0}
/* Work/resources own the old views without retaining duplicate module bars. */
#page-resources.active{display:flex;flex-direction:column;height:calc(100vh - 56px);padding:0;max-width:none;overflow:hidden}
.workspace-host{display:flex;flex:1;min-height:0;min-width:0;overflow:hidden}
.workspace-host>div{min-height:0;min-width:0;flex:1}
.workspace-tabs{gap:5px;overflow-x:auto;white-space:nowrap}
.workspace-tabs>*{flex-shrink:0}
.workspace-title{padding-right:14px;margin-right:5px;border-right:1px solid var(--border);border-bottom:none;margin-bottom:0;padding-bottom:0}
#projects-host #projects-workspace{width:100%}
.dashboard-info-card{cursor:pointer}
#pj-dashboard-queue .dashboard-work-card{border-left:3px solid var(--work-accent,var(--accent))}
#pj-dash-kanban .proj-task-col-body{max-height:clamp(300px,55vh,600px)}
.dashboard-card-label{font-size:10px;font-weight:600;color:var(--text3)}
.dashboard-card-kind{display:flex;align-items:center;gap:5px;margin-bottom:5px}
.dashboard-card-meta{font-size:11px;color:var(--text3);margin-top:4px}
.dashboard-card-head{display:flex;align-items:flex-start;gap:6px}
.dashboard-card-head .proj-task-title{flex:1}
.dashboard-card-actions{display:flex;flex-wrap:wrap;gap:4px;margin-top:7px}
.dashboard-card-head .dashboard-card-actions{margin-top:0;flex-wrap:nowrap}
.dashboard-card-actions:empty{display:none}
.dashboard-new-menu{position:relative}
.dashboard-new-menu summary{list-style:none;cursor:pointer}
.dashboard-new-menu summary::-webkit-details-marker{display:none}
.dashboard-new-options{position:absolute;right:0;top:100%;display:flex;flex-direction:column;min-width:150px;padding:5px;background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-sm);box-shadow:var(--shadow-sm);z-index:30}
.dashboard-new-options button{text-align:left}
.dashboard-calendar-notice{font-size:11px;color:var(--text3);margin:8px 0}
.pj-calendar-absence-toggle{display:flex;align-items:center;gap:5px;font-size:11px;color:var(--text3)}
.pj-calendar-absences{border-top:1px solid var(--border);margin-top:5px;padding-top:3px}
.pj-calendar-absence{font-size:10px;color:var(--text3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pj-cal-bar{flex-wrap:wrap}
/* Sub-navigation system: .subtab (pill, default) + variants
   .subtab--tab (underline tabs in Chem/Bio sidebars) and
   .subtab--row (full-width sidebar rows in Reagents/Orders). */
.subtab{padding:5px 14px;border-radius:var(--r-md);font-size:12px;color:var(--text3);cursor:pointer;border:none;background:transparent;transition:all .12s;font-weight:500}
.subtab:hover{color:var(--text2);background:var(--bg3)}
.subtab.active{color:var(--accent-ink);font-weight:600;background:var(--accent-light)}
.subtab--tab{flex:1;padding:6px 4px;font-size:11px;border-radius:0;border-bottom:2px solid transparent;margin-bottom:-1px}
.subtab--tab:hover{background:transparent}
.subtab--tab.active{background:transparent;border-bottom-color:var(--accent)}
.subtab--row{display:block;width:100%;text-align:left;padding:7px 14px;font-size:13px;color:var(--text2);border-radius:0;white-space:nowrap}

/* ── SIDEBAR ──────────────────────────────────────────────────── */
/* Background lives on each sidebar's own class/id below, not here — this
   bare-tag rule used to carry it too, which meant only the sidebars that
   happen to be an <aside> element (Library, Storage, Bio charts, Projects)
   got var(--bg2); the rest (plain <div>s) fell through to the page's own
   --bg and came out visibly grayer. */
aside{border-right:1px solid var(--border);padding:14px;overflow-y:auto;position:sticky;top:56px;height:calc(100vh - 56px)}
.eln-list,.pj-sidebar,#equip-sidebar,#maint-sidebar,#team-sidebar,#diss-sidebar{background:var(--bg2)}
.sl{font-family:var(--sans);font-size:10px;color:var(--text3);font-weight:700;margin-bottom:7px;padding-top:2px;text-transform:uppercase;letter-spacing:.06em}

/* Admin sidebar (#admin-sidebar) — macOS System Settings-style grouping:
   one colored icon badge per group, not per row. */
.admin-nav-group{margin:6px 0 16px}
.admin-nav-label{display:flex;align-items:center;gap:7px;font-family:var(--sans);font-size:11px;color:var(--text2);font-weight:700;margin:0 14px 5px;padding-top:2px}
.admin-nav-icon{width:18px;height:18px;border-radius:5px;display:flex;align-items:center;justify-content:center;flex-shrink:0}
.ss{margin-bottom:18px}
.search-wrap{position:relative;margin-bottom:10px}
.search-wrap input{width:100%;background:var(--bg3);border:1px solid var(--border);border-radius:var(--r-md);padding:8px 10px 8px 30px;color:var(--text);font-size:12px;font-family:var(--sans);outline:none;transition:border .15s,box-shadow .15s}
.search-wrap input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-light)}
.search-wrap input::placeholder{color:var(--text3)}
.si{position:absolute;left:9px;top:50%;transform:translateY(-50%);color:var(--text3);font-size:13px}
.fc{display:flex;align-items:center;justify-content:space-between;padding:5px 8px;border-radius:var(--r-sm);cursor:pointer;font-size:12px;color:var(--text2);border:none;background:transparent;width:100%;text-align:left;transition:all .12s;gap:6px}
.fc:hover{background:var(--bg3);color:var(--text)}
.fc.active{background:var(--accent-light);color:var(--accent-ink);font-weight:600}
.fc-left{display:flex;align-items:center;gap:6px;min-width:0;overflow:hidden}
.fc-label{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.fc-sub{font-size:10px;color:var(--text3);font-family:var(--mono);white-space:nowrap}
.fc-count{font-family:var(--mono);font-size:10px;background:var(--bg3);padding:1px 5px;border-radius:var(--r-xs);flex-shrink:0;color:var(--text3)}
.fc-right{display:flex;gap:2px;flex-shrink:0}
.stats-grid{display:grid;grid-template-columns:1fr 1fr;gap:5px}
.stat-card{background:var(--bg3);border:1px solid var(--border);border-radius:var(--r-md);padding:9px;text-align:center}
.stat-val{font-family:var(--mono);font-size:18px;font-weight:600;color:var(--text)}
.stat-lbl{font-size:10px;color:var(--text3);margin-top:2px}


/* ── MAIN ─────────────────────────────────────────────────────── */
main{padding:18px;overflow-y:auto;min-height:0}
.toolbar{display:flex;align-items:center;gap:8px;margin-bottom:14px}
.result-count{font-family:var(--mono);font-size:12px;color:var(--text3);flex:1}
select.sort-sel{background:var(--bg2);border:1px solid var(--border2);color:var(--text2);font-size:12px;padding:5px 9px;border-radius:var(--r-sm);outline:none;cursor:pointer;transition:border .15s;font-family:var(--sans)}
select.sort-sel:focus{border-color:var(--accent)}
.view-toggle{display:flex;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-sm);overflow:hidden}
.vb{padding:5px 10px;font-size:13px;cursor:pointer;color:var(--text3);border:none;background:transparent;transition:all .12s}
.vb.active{background:var(--bg3);color:var(--text)}
.btn{display:inline-flex;align-items:center;gap:5px;padding:7px 14px;border-radius:var(--r-md);font-size:var(--ui-action);font-family:var(--sans);cursor:pointer;transition:all .15s;border:none;white-space:nowrap;font-weight:500}
.btn:disabled{opacity:.45;cursor:not-allowed;pointer-events:none}
.btn-primary{background:var(--accent-ink);color:var(--on-accent);box-shadow:var(--shadow-sm)}
.btn-primary:hover{background:var(--accent-ink-hover);box-shadow:var(--shadow-md)}
.btn-ghost{background:transparent;color:var(--text2);border:1px solid var(--border2)}
.btn-ghost:hover{color:var(--text);background:var(--bg3);border-color:var(--border2)}
.btn-danger{background:transparent;color:var(--red);border:1px solid color-mix(in srgb,var(--red) 40%,transparent)}
#reac-section-search{display:flex;flex-direction:row}
.btn-danger:hover{background:color-mix(in srgb,var(--red) 8%,transparent);border-color:color-mix(in srgb,var(--red) 60%,transparent)}
.btn-sm{padding:4px 9px;font-size:var(--ui-action)}
.btn-icon{padding:4px 7px;font-size:12px;border-radius:var(--r-sm);background:var(--bg3);border:1px solid var(--border);color:var(--text3);cursor:pointer;line-height:1;transition:background .12s,color .12s}
.btn-icon:hover{background:var(--bg4);color:var(--text)}

/* ── ROLE PERMISSION GRID (clickable toggle cells) ───────────── */
.perm-toggle{width:28px;height:24px;padding:0;border:none;background:none;border-radius:var(--r-sm);
  cursor:pointer;color:var(--text3);line-height:1;transition:background .12s,color .12s}
.perm-toggle:hover{background:var(--bg3)}
.perm-toggle.on{color:var(--green-ink)}
.perm-toggle.on:hover{background:color-mix(in srgb,var(--red) 12%,transparent);color:var(--red)}

/* ── DRAFT RECOVERY BANNER ────────────────────────────────────── */
.draft-banner{display:flex;align-items:center;justify-content:space-between;gap:12px;
  background:var(--warn-bg);border:1px solid var(--warn-border);color:var(--warn-fg);
  border-radius:var(--r-sm);padding:8px 12px;margin-bottom:10px;font-size:13px}
.draft-banner-actions{display:flex;gap:6px;flex-shrink:0}

/* ── CARD GRID ────────────────────────────────────────────────── */
.cg{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:10px}
.cg.hide{display:none}
.card{background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-lg);overflow:hidden;cursor:pointer;transition:border-color .15s,box-shadow .15s,transform .15s;position:relative;box-shadow:var(--shadow-sm)}
.card:hover{border-color:var(--border2);box-shadow:var(--shadow-md);transform:translateY(-1px)}
.card-struct{background:var(--bg3);height:125px;display:flex;align-items:center;justify-content:center;border-bottom:1px solid var(--border);position:relative;overflow:hidden;padding:6px;box-sizing:border-box}
.card-struct svg{max-width:100%;max-height:100%;width:auto;height:auto}
#cm-struct-preview svg,#lib-struct-preview svg,#rs-struct-preview svg{max-width:100%;max-height:100%;width:auto;height:auto}
.card-struct svg rect:first-child,.dp-struct svg rect:first-child,#cm-struct-preview svg rect:first-child{fill:var(--bg3)!important}
.card-struct .no-struct{font-size:10px;color:var(--text3);font-family:var(--mono)}
.struct-loading{width:24px;height:24px;border:2px solid var(--border2);border-top-color:var(--accent);border-radius:50%;animation:spin .7s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.stock-dot{position:absolute;top:7px;right:7px;width:7px;height:7px;border-radius:50%;box-shadow:0 0 0 2px var(--bg3)}
.card-body{padding:9px 11px}
.card-id{font-family:var(--sans);font-size:12px;font-weight:700;color:var(--text);margin-bottom:2px}
.card-formula{font-size:10px;color:var(--text3);font-family:var(--mono);margin-bottom:5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.card-footer{display:flex;justify-content:space-between;font-size:11px;align-items:center}
.vol-badge{display:flex;align-items:center;gap:3px;font-family:var(--mono);font-size:11px}
.dot{width:7px;height:7px;border-radius:50%;flex-shrink:0;display:inline-block}
.card-tags{display:flex;flex-wrap:wrap;gap:3px;margin-top:5px}
/* Badges & chips — one system: .tag-pill (colored pill), and mono data
   badges (.hz-badge/.file-type-badge/.log-action: subtle bg, 4px radius) */
.tag-pill{font-size:9px;padding:2px 7px;border-radius:999px;color:#fff;font-weight:600;white-space:nowrap}
.hazard-mini{display:flex;gap:2px;margin-top:4px;flex-wrap:wrap}
.hz-badge{font-size:9px;padding:1px 5px;border-radius:var(--r-xs);background:color-mix(in srgb,var(--yellow) 12%,transparent);color:var(--yellow-ink);font-family:var(--mono)}

/* ── TABLE ────────────────────────────────────────────────────── */
.ct{width:100%;border-collapse:collapse;display:none}
.ct.show{display:table}
.ct th{font-family:var(--sans);font-size:var(--ui-label);color:var(--text3);font-weight:700;padding:8px 10px;text-align:left;border-bottom:1px solid var(--border);background:var(--bg3);white-space:nowrap;text-transform:uppercase;letter-spacing:.05em}
.ct td{padding:8px 10px;border-bottom:1px solid var(--border);font-size:var(--ui-body);color:var(--text2);vertical-align:middle}
.ct tbody tr{transition:background .1s}
.ct tr:hover td{background:var(--accent-light);cursor:pointer;color:var(--text)}
.mono{font-family:var(--mono)}
.smiles-td{max-width:160px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-family:var(--mono);font-size:10px}

/* ── DETAIL PANEL ─────────────────────────────────────────────── */
/* z-index 270, not the app's usual 150 for a right-side slide-in panel — has
   to clear .note-page's 260 (full-screen) so a compound link clicked from
   inside a note/canvas shows the detail panel over it instead of hidden
   behind it, while staying under actual modals (.modal-overlay at 300). */
.dp{position:fixed;right:0;top:56px;width:600px;height:calc(100vh - 56px);background:var(--bg2);border-left:1px solid var(--border);transform:translateX(600px);transition:transform .25s cubic-bezier(.4,0,.2,1);z-index:270;display:flex;flex-direction:column;overflow:hidden;box-shadow:-4px 0 24px rgba(0,0,0,.06)}
.help-hud{position:fixed;right:0;top:56px;width:360px;height:calc(100vh - 56px);background:var(--bg2);border-left:1px solid var(--border);transform:translateX(360px);transition:transform .25s cubic-bezier(.4,0,.2,1);z-index:250;display:flex;flex-direction:column;overflow:hidden}
.help-hud.open{transform:translateX(0)}
.help-hud-backdrop{display:none;position:fixed;inset:0;z-index:249}
/* ── Guided tour ── */
/* The cut-out itself carries the chapter's color (a ring plus a soft glow),
   so the thing being pointed at is visibly part of the section being
   explained, not just "the lit rectangle". --tour-chapter is set per step. */
.tour-spotlight{position:fixed;z-index:6000;border-radius:var(--r-md);--tour-backdrop:rgba(17,24,39,.55);box-shadow:0 0 0 3px color-mix(in srgb,var(--tour-chapter,var(--accent)) 85%,transparent),0 0 0 9px color-mix(in srgb,var(--tour-chapter,var(--accent)) 22%,transparent),0 0 0 9999px var(--tour-backdrop);outline:0 solid transparent;outline-offset:2px;pointer-events:none;transition:top .25s ease,left .25s ease,width .25s ease,height .25s ease,box-shadow .25s ease}
/* A click-to-continue step pulses, so it reads as "do something here" rather
   than "read this". Steadier than the error nudge, and in the chapter color. */
.tour-spotlight.awaiting-click{animation:tour-await 1.8s ease-in-out infinite}
@keyframes tour-await{
  0%,100%{box-shadow:0 0 0 3px color-mix(in srgb,var(--tour-chapter,var(--accent)) 85%,transparent),0 0 0 9px color-mix(in srgb,var(--tour-chapter,var(--accent)) 22%,transparent),0 0 0 9999px var(--tour-backdrop)}
  50%{box-shadow:0 0 0 4px var(--tour-chapter,var(--accent)),0 0 0 16px color-mix(in srgb,var(--tour-chapter,var(--accent)) 26%,transparent),0 0 0 9999px var(--tour-backdrop)}
}
@media (prefers-reduced-motion: reduce){ .tour-spotlight.awaiting-click{animation:none} }
:root[data-theme="dark"] .tour-spotlight{--tour-backdrop:rgba(0,0,0,.72)}
.tour-spotlight.nudge{animation:tour-nudge .6s ease}
@keyframes tour-nudge{
  0%,20%,40%,100%{outline-width:0}
  10%,30%{outline-width:3px;outline-color:var(--red)}
}
.tour-card{position:fixed;z-index:6001;width:300px;background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-lg);box-shadow:var(--shadow-lg);padding:14px 16px;transition:top .25s ease,left .25s ease}
.tour-card h4{font-size:14px;font-weight:600;margin:2px 0 6px}
.tour-card p{font-size:12px;color:var(--text2);line-height:1.5}
.tour-step-label{font-size:10px;color:var(--text3);font-family:var(--mono)}
/* Chapter identity: each section of the tour tints its own card, so it is
   obvious at a glance which module is being explained (and that the tour has
   moved on to a new one). --tour-chapter is set per step in _tourShow. */
.tour-card{border-top:3px solid var(--tour-chapter,var(--accent))}
.tour-chapter-bar{display:flex;align-items:center;gap:6px;margin-bottom:7px}
.tour-chapter-dot{width:7px;height:7px;border-radius:50%;background:var(--tour-chapter,var(--accent));flex-shrink:0}
.tour-chapter-name{font-size:11px;font-weight:700;color:var(--tour-chapter,var(--accent));letter-spacing:.02em}
.tour-chapter-count{font-size:10px;color:var(--text3)}
.tour-chapter-bar .tour-step-label{margin-left:auto}
.tour-progress{height:3px;border-radius:2px;background:var(--bg3);overflow:hidden;margin-bottom:10px}
.tour-progress>span{display:block;height:100%;background:var(--tour-chapter,var(--accent));border-radius:2px;transition:width .25s ease}
/* Opening "how much do you want to see" picker */
.tour-mode-opt{display:flex;flex-direction:column;align-items:flex-start;gap:2px;width:100%;text-align:left;padding:11px 13px;border:1px solid var(--border);border-radius:var(--r-md);background:var(--bg2);cursor:pointer;transition:border-color .15s,background .15s}
.tour-mode-opt:hover{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 6%,var(--bg2))}
.tour-mode-opt-title{font-size:13px;font-weight:600;color:var(--text)}
.tour-mode-opt-sub{font-size:12px;color:var(--text2);line-height:1.45}
.tour-mode-opt-meta{font-size:11px;color:var(--text3);font-family:var(--mono);margin-top:2px}
.tour-actions{display:flex;gap:6px;margin-top:12px;align-items:center;flex-wrap:wrap}
.tour-hint{font-size:11px;color:var(--accent-ink);font-weight:600;margin-top:8px;display:flex;align-items:center;flex-wrap:wrap;gap:4px}
.tour-kbd{display:inline-flex;align-items:center;justify-content:center;min-width:20px;height:20px;padding:0 5px;border-radius:var(--r-sm);border:1px solid var(--border2);background:var(--bg3);color:var(--text);font-family:var(--mono);font-size:11px;font-weight:700;box-shadow:0 2px 0 var(--border2);animation:tour-kbd-press 1.6s ease-in-out infinite}
.tour-kbd-plus{color:var(--text3);font-weight:600}
@keyframes tour-kbd-press{0%,55%,100%{transform:translateY(0);box-shadow:0 2px 0 var(--border2)}28%{transform:translateY(2px);box-shadow:0 0 0 var(--border2)}}
.help-hud-backdrop.open{display:block}
.help-hud-header{padding:14px 18px 12px;border-bottom:1px solid var(--border);display:flex;align-items:center;justify-content:space-between;flex-shrink:0}
.help-hud-label{font-size:11px;font-weight:600;color:var(--text3);margin-bottom:2px}
.help-hud-title{font-size:14px;font-weight:600}
.help-hud-body{flex:1;overflow-y:auto;padding:16px 18px 24px}
.hh-section{margin-bottom:20px}
.hh-section h4{font-size:11px;font-weight:600;color:var(--text3);margin-bottom:8px}
.hh-section p,.hh-section li{font-size:13px;color:var(--text2);line-height:1.65}
.hh-section ol,.hh-section ul{padding-left:16px}
.hh-section li{margin-bottom:3px}
.hh-kbd{font-family:var(--mono);background:var(--bg3);border:1px solid var(--border2);padding:1px 5px;border-radius:var(--r-xs);font-size:11px;color:var(--accent-ink)}
.hh-tag{display:inline-block;background:var(--bg3);border:1px solid var(--border2);padding:0px 5px;border-radius:var(--r-xs);font-size:11px;font-family:var(--mono)}
.hh-details{border:1px solid var(--border);border-radius:var(--r-sm);margin-bottom:5px;overflow:hidden}
.hh-details>summary{padding:7px 10px 7px 28px;cursor:pointer;font-size:12px;font-weight:600;color:var(--text2);background:var(--bg3);list-style:none;position:relative;user-select:none}
.hh-details>summary::before{content:'▸';position:absolute;left:10px;top:50%;transform:translateY(-50%);font-size:9px;color:var(--text3);transition:transform .15s}
.hh-details[open]>summary::before{transform:translateY(-50%) rotate(90deg)}
.hh-db{padding:9px 12px;font-size:12px;color:var(--text2);line-height:1.65}
.hh-db p{margin:0 0 5px}.hh-db p:last-child{margin-bottom:0}
.hh-db ol,.hh-db ul{padding-left:16px;margin:0}.hh-db li{margin-bottom:3px}
.nav-icon-group{display:flex;align-items:center;gap:4px;margin:0 6px;flex-shrink:0}
.btn-help,.nav-icon-btn{background:none;border:none;color:var(--text2);width:28px;height:28px;border-radius:var(--r-xs);cursor:pointer;font-size:13px;font-weight:600;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;align-self:center;position:relative;transition:background .15s,color .15s}
.btn-help:hover,.nav-icon-btn:hover{background:var(--bg3);color:var(--text)}
.nav-icon-btn.active{background:var(--accent-light);color:var(--accent-ink)}
.dp.open{transform:translateX(0)}
.dp-header{padding:14px 18px 12px;border-bottom:1px solid var(--border);display:flex;align-items:flex-start;justify-content:space-between;flex-shrink:0}
.dp-header-info{min-width:0;flex:1}
.dp-id{font-family:var(--sans);font-size:16px;font-weight:700;color:var(--text);margin-bottom:2px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dp-name{font-size:15px;font-weight:500;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dp-header-actions{display:flex;gap:6px;align-items:center;flex-shrink:0}
.close-btn{background:var(--bg3);border:1px solid var(--border);color:var(--text3);width:28px;height:28px;border-radius:var(--r-sm);cursor:pointer;font-size:13px;display:flex;align-items:center;justify-content:center;transition:background .12s,color .12s}
.close-btn:hover{background:var(--bg4);color:var(--text)}
.dp-body{flex:1;overflow-y:auto}
.dp-section{padding:12px 18px;border-bottom:1px solid var(--border)}
.dp-stitle{font-family:var(--sans);font-size:11px;color:var(--text3);font-weight:600;margin-bottom:9px}
details.dp-section > summary.dp-stitle{cursor:pointer;list-style:none;user-select:none;margin-bottom:0}
details.dp-section > summary.dp-stitle::-webkit-details-marker{display:none}
details.dp-section > summary.dp-stitle::before{content:'▸';display:inline-block;margin-right:6px;font-size:9px;transition:transform .15s}
details.dp-section[open] > summary.dp-stitle::before{transform:rotate(90deg)}
details.dp-section[open] > summary.dp-stitle{margin-bottom:9px}
details.dp-section .prop-row:first-of-type{margin-top:2px}
.dp-struct{background:var(--bg3);border-radius:var(--r-md);height:170px;display:flex;align-items:center;justify-content:center;border:1px solid var(--border);overflow:hidden;margin-bottom:10px;padding:8px;box-sizing:border-box}
/* Cap the SVG instead of forcing it to 100% — object-fit does nothing for an inline
   SVG, so stretching it to the panel width blew large structures past the box. */
.dp-struct svg{max-width:100%;max-height:100%;width:auto;height:auto}
.prop-row{display:flex;justify-content:space-between;padding:4px 0;border-bottom:1px solid var(--divider);font-size:12px;align-items:center}
.prop-row:last-child{border:none}
.pk{color:var(--text2)}
.pv{font-family:var(--mono);color:var(--text);text-align:right;max-width:240px;word-break:break-all}
/* words, not codes: names, IUPAC, notes — sans, and wrap at word boundaries first */
.pv-text{font-family:var(--sans);word-break:normal;overflow-wrap:anywhere}
.hazard-row{display:flex;flex-wrap:wrap;gap:5px;margin-top:6px}
.hz-chip{display:flex;align-items:center;gap:4px;padding:3px 9px;border-radius:var(--r-sm);background:color-mix(in srgb,var(--yellow) 12%,transparent);border:1px solid color-mix(in srgb,var(--yellow) 25%,transparent);font-size:11px;color:var(--yellow-ink);font-weight:500}
.hz-chip.ghs01,.hz-chip.ghs06{background:color-mix(in srgb,var(--red) 10%,transparent);border-color:color-mix(in srgb,var(--red) 22%,transparent);color:var(--red)}
.hz-chip.ghs02{background:color-mix(in srgb,var(--orange) 10%,transparent);border-color:color-mix(in srgb,var(--orange) 22%,transparent);color:var(--orange-ink)}
.hz-chip.ghs09{background:color-mix(in srgb,var(--green) 10%,transparent);border-color:color-mix(in srgb,var(--green) 22%,transparent);color:var(--green-ink)}
.purity-bar-wrap{width:100%;background:var(--bg3);border-radius:var(--r-xs);height:5px;margin-top:4px;overflow:hidden}
.purity-bar{height:100%;border-radius:var(--r-xs);background:var(--green);transition:width .3s}

/* ── FILES ────────────────────────────────────────────────────── */
.file-item{display:flex;align-items:center;gap:8px;padding:6px 0;border-bottom:1px solid var(--divider);font-size:11px}
.file-item:last-child{border:none}
.file-type-badge{font-family:var(--mono);font-size:9px;padding:2px 6px;border-radius:var(--r-xs);background:var(--bg4);color:var(--text3);flex-shrink:0}
.file-name{flex:1;color:var(--text2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.file-size{font-family:var(--mono);font-size:10px;color:var(--text3);flex-shrink:0}
.upload-drop{border:1.5px dashed var(--border2);border-radius:var(--r-md);padding:18px;text-align:center;font-size:12px;color:var(--text3);cursor:pointer;transition:all .15s;margin-top:8px;background:var(--bg3)}
.upload-drop:hover{border-color:var(--accent);color:var(--accent-ink);background:var(--accent-light)}
.upload-drop input[type=file]{display:none}

/* ── USAGE LOG ────────────────────────────────────────────────── */
.log-entry{display:flex;gap:8px;padding:7px 0;border-bottom:1px solid var(--divider);font-size:11px}
.log-entry:last-child{border:none}
.log-action{font-family:var(--mono);padding:2px 6px;border-radius:var(--r-xs);font-size:10px;flex-shrink:0;align-self:flex-start;margin-top:1px}
.la-use{background:color-mix(in srgb,var(--red) 12%,transparent);color:var(--red)}
.la-restock{background:color-mix(in srgb,var(--green) 12%,transparent);color:var(--green-ink)}
.la-new{background:var(--accent-light);color:var(--accent-ink)}
.la-discard{background:color-mix(in srgb,var(--yellow) 14%,transparent);color:var(--yellow-ink)}
.log-meta{color:var(--text3);line-height:1.6}

/* ── FORM / MODAL ─────────────────────────────────────────────── */
.form-row{display:flex;flex-direction:column;gap:5px;margin-bottom:12px}
.form-row label{font-size:var(--ui-label);color:var(--text3);font-weight:500}
/* Baseline for every form control no scoped rule styles (zero specificity via :where,
   so any existing rule — and every inline style — still wins). Without it a control
   outside .form-row & co. rendered with the browser's default black border. */
:where(input:not([type=checkbox],[type=radio],[type=color],[type=range],[type=file],[type=hidden],[type=button],[type=submit],[type=reset],[type=image]),select,textarea){background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-xs);padding:5px 8px;color:var(--text);font-size:12px;font-family:var(--sans);outline:none;box-sizing:border-box;transition:border-color .15s}
:where(input:not([type=checkbox],[type=radio],[type=color],[type=range],[type=file],[type=hidden]),select,textarea):focus{border-color:var(--accent)}
:where(textarea){line-height:1.5}
/* One closed look for every native select (the open menu stays native: keyboard, screen
   readers and phones handle it better than a hand-made list). The chevron and its padding
   are !important on purpose — scoped rules use the background/padding shorthands, which
   would otherwise wipe them; a disabled or locked select keeps its plain read-only look.
   .sel-bare opts out (a 34 px operator picker has no room for a chevron). */
:where(select:not([multiple]):not([size]):not(.sel-bare)){-webkit-appearance:none;appearance:none;text-overflow:ellipsis;cursor:pointer}
:where(select:not([multiple]):not([size]):not(.sel-bare):not(:disabled)){background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='%238a94a1' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E")!important;background-repeat:no-repeat!important;background-position:right 8px center!important;background-size:10px 10px!important;padding-right:26px!important}
:where(select:disabled){cursor:default}
/* Date/time fields in the lab's format (core.js _dtEnhance): a text field + the native input,
   transparent, laid over the calendar icon so a click opens its picker. */
.dt-wrap{position:relative;display:inline-flex;align-items:center;vertical-align:middle;max-width:100%}
.dt-wrap>.dt-text{flex:1 1 auto;min-width:0;width:100%}
.dt-date{width:9.5em}
.dt-time{width:6.5em}
.form-row .dt-wrap,.dt-wrap:has(>.dt-text.form-input){display:flex;width:100%}
.dt-wrap.dt-date>.dt-text{padding-right:28px}
.dt-pick{position:absolute;right:6px;top:50%;transform:translateY(-50%);width:18px;height:18px;display:flex;align-items:center;justify-content:center;color:var(--text3);cursor:pointer}
.dt-pick:hover{color:var(--accent-ink)}
.dt-native{position:absolute;inset:0;width:100%;height:100%;opacity:0;margin:0;padding:0;border:0;cursor:pointer}
.dt-native::-webkit-calendar-picker-indicator{position:absolute;inset:0;width:auto;height:auto;margin:0;padding:0;opacity:0;cursor:pointer}
.dt-time>.dt-native{pointer-events:none;width:1px;height:1px}
.dt-disabled .dt-pick{display:none}
.form-row input,.form-row select,.form-row textarea{background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-sm);padding:8px 12px;color:var(--text);font-size:var(--ui-input);font-family:var(--sans);outline:none;transition:border .15s,box-shadow .15s;width:100%}
.form-row input[type=checkbox],.form-row input[type=radio]{width:auto;flex-shrink:0;padding:0}
.form-row input:focus,.form-row select:focus,.form-row textarea:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-light)}
.form-row textarea{resize:vertical;min-height:60px;line-height:1.5}
.form-row input[type=date]{color-scheme:light}
/* .form-input on its own (not inside a .form-row) had no base rule at all —
   every sidebar filter select built this way (Orders' budget-line/project/
   supplier/PI/year pickers, etc.) fell back to the browser's bare native
   <select> box, focus ring included (the thick, square-cornered blue outline
   that doesn't match anything else in the app). Same recipe as .form-row's
   own fields above, just sized for a compact sidebar rather than a modal. */
.form-input{background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-sm);padding:6px 9px;color:var(--text);font-family:var(--sans);outline:none;transition:border .15s,box-shadow .15s;width:100%}
.form-input:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-light)}
/* Icon picker (e.g. the reagent-request Type field) — a row of icon+label
   cards instead of a native <select>, so what each choice actually IS is
   visible at a glance instead of hidden behind a dropdown's closed state. */
.icon-pick-row{display:flex;gap:8px;flex-wrap:wrap}
.icon-pick-btn{display:flex;flex-direction:column;align-items:center;gap:5px;width:74px;padding:10px 6px;background:var(--bg2);border:1.5px solid var(--border2);border-radius:var(--r-md);color:var(--text2);cursor:pointer;transition:border-color .15s,background .15s,color .15s}
.icon-pick-btn:hover{border-color:var(--border);background:var(--bg3)}
.icon-pick-btn span{font-size:11px;font-weight:500;text-align:center;line-height:1.2}
.icon-pick-btn.selected{border-color:var(--accent);background:var(--accent-light);color:var(--accent-ink)}
/* Number fields are typed, never clicked up and down. The Firefox half of
   this was already global; the WebKit half only existed on the ELN table
   (.rxn-inp.num below), so every other number field in the app — bio
   experiments, orders, plates, admin — still grew spinners in Chrome. A
   spinner on a mass, a concentration or an IC50 is worse than useless: the
   step is arbitrary and one stray scroll silently changes a measured value. */
input[type=number]{-moz-appearance:textfield;appearance:textfield}
input[type=number]::-webkit-inner-spin-button,
input[type=number]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}
.input-error,.form-row .input-error,.form-input.input-error{border-color:var(--red) !important;box-shadow:0 0 0 3px rgba(220,38,38,.12) !important}
.form-row .input-error:focus,.form-input.input-error:focus{border-color:var(--red) !important;box-shadow:0 0 0 3px rgba(220,38,38,.2) !important}
.form-cols{display:grid;grid-template-columns:1fr 1fr;gap:12px}
@keyframes modal-in{from{opacity:0;transform:scale(.96) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}
@keyframes modal-out{from{opacity:1;transform:scale(1)}to{opacity:0;transform:scale(.96)}}
.modal-overlay{position:fixed;inset:0;background:rgba(17,24,39,.55);backdrop-filter:blur(3px);z-index:300;display:none;align-items:center;justify-content:center}
.modal-overlay.show{display:flex}
.modal-overlay.show .modal{animation:modal-in .15s cubic-bezier(.34,1.56,.64,1)}
.modal{background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-xl);padding:22px 24px;width:520px;max-width:95vw;max-height:85vh;overflow-y:auto;box-shadow:var(--shadow-lg)}
.modal h3{font-size:var(--ui-dialog);font-weight:600;margin-bottom:16px;display:flex;align-items:center;gap:8px;color:var(--text)}
/* One modal footer: the last row of a modal that is only buttons (.modal-actions,
   .modal-footer, or a hand-rolled flex div ending the modal) sits right-aligned
   [Cancel] [Primary], stays visible while a long form scrolls, and a destructive action
   that leads the row is pushed to the left, away from the primary. Inline flex:1 on the
   buttons (full-width pairs) is overridden so every modal ends the same way. */
.modal > .modal-actions:last-child,
.modal > .modal-footer:last-child,
.modal > div:last-child:has(> .btn-primary):not(:has(> :not(.btn, button))){display:flex;justify-content:flex-end;align-items:center;flex-wrap:wrap;gap:8px;position:sticky;bottom:-22px;z-index:2;margin:18px 0 -22px;padding:12px 0 22px;background:var(--bg2);border-top:1px solid var(--border)}
.modal > .modal-actions:last-child > .btn,
.modal > .modal-footer:last-child > .btn,
.modal > div:last-child:has(> .btn-primary):not(:has(> :not(.btn, button))) > .btn{flex:0 0 auto!important;width:auto!important}
.modal > div:last-child > .btn-danger:first-child{margin-right:auto}
/* Status pill (core.js statusPill): Sentence case, sans, tinted by its own colour. */
.status-pill{display:inline-flex;align-items:center;font-size:11px;font-weight:600;line-height:1.5;padding:0 8px;border-radius:999px;white-space:nowrap;color:var(--pill);background:color-mix(in srgb,var(--pill) 12%,transparent);border:1px solid color-mix(in srgb,var(--pill) 32%,transparent)}
.status-pill-lg{font-size:12px;padding:1px 10px}
.reac-line-status-control{display:inline-block;position:relative;border-radius:999px}
.reac-line-status-control select{position:absolute;inset:0;width:100%;height:100%;min-width:0;min-height:0;margin:0;padding:0;opacity:0;cursor:pointer}
.reac-line-status-control:focus-within{outline:2px solid var(--accent);outline-offset:2px}
.reac-line-status-control:has(select:disabled){opacity:.65}
.dp-footer{justify-content:flex-end;padding:10px 18px;border-top:1px solid var(--border);display:flex;gap:6px;flex-shrink:0;background:var(--bg3)}

/* ── HAZARD SELECTOR ──────────────────────────────────────────── */
.hazard-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:5px}
.hazard-opt{display:flex;align-items:center;gap:6px;padding:6px 8px;border:1px solid var(--border2);border-radius:var(--r-xs);cursor:pointer;font-size:11px;color:var(--text2);transition:all .15s;user-select:none}
.hazard-opt:hover{border-color:var(--text3)}
.hazard-opt.selected{border-color:var(--yellow-ink);background:rgba(240,192,64,.08);color:var(--yellow-ink)}
.hazard-opt input{display:none}


/* ── PROJECTS PAGE ────────────────────────────────────────────── */
.projects-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:14px;margin-top:16px}
.proj-list{display:flex;flex-direction:column;gap:0;margin-top:12px;border:1px solid var(--border);border-radius:var(--r-lg);overflow:hidden;box-shadow:var(--shadow-sm)}
.proj-list-row{display:flex;align-items:center;gap:10px;padding:10px 14px;background:var(--bg2);border-bottom:1px solid var(--border);transition:background .1s}
.proj-list-row:last-child{border-bottom:none}
.proj-list-row:hover{background:var(--bg3)}
.proj-list-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}
.proj-list-name{font-size:13px;font-weight:500;min-width:140px;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.proj-list-meta{font-size:11px;color:var(--text3);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.proj-card{background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-lg);overflow:hidden;transition:border .15s,box-shadow .15s,transform .15s;box-shadow:var(--shadow-sm)}
.proj-card:hover{border-color:var(--border2);box-shadow:var(--shadow-md);transform:translateY(-1px)}
.proj-card-header{display:flex;align-items:center;gap:10px;padding:14px 16px 10px}
.proj-card-title{font-size:14px;font-weight:600;flex:1;min-width:0;color:var(--text)}
.proj-status{font-size:10px;padding:3px 8px;border-radius:var(--r-sm);font-weight:600}
.ps-active{background:color-mix(in srgb,var(--green) 12%,transparent);color:var(--green-ink)}
.ps-completed{background:var(--accent-light);color:var(--accent-ink)}
.ps-archived{background:var(--bg3);color:var(--text3)}
.proj-card-body{padding:4px 16px 14px 30px}
.proj-card-desc{font-size:11px;color:var(--text3);margin-bottom:8px;line-height:1.5}
.proj-card-footer{display:flex;align-items:center;justify-content:space-between}
.proj-compound-count{font-family:var(--mono);font-size:12px;color:var(--text2)}
.proj-actions{display:flex;gap:5px}

/* ── BIOLOGY PAGE ────────────────────────────────────────────── */
/* ── BIO RESULTS TABLE ────────────────────────────────────────── */
.bio-filter-bar{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.bio-filter-bar select,.bio-filter-bar input[type=text],.bio-filter-bar input[type=number]{font-size:12px;padding:5px 8px;border:1px solid var(--border2);border-radius:var(--r-xs);background:var(--bg2);color:var(--text)}
.bio-filter-bar input[type=number]{width:68px}
.bio-filter-panel{width:260px;flex-shrink:0;border-right:1px solid var(--border);display:flex;flex-direction:column;overflow:visible;transition:width .2s ease}
.bio-filter-panel.collapsed{width:0;border-right:none}
.bio-filter-panel-hdr{padding:14px 14px 10px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px;flex-shrink:0}
.bio-filter-panel-body{flex:1;overflow-y:auto;padding:14px 12px;display:flex;flex-direction:column;gap:12px}
#bio-exp-sidebar.collapsed{width:0}
#bio-exp-sidebar.collapsed .eln-list-header>:not(.sidebar-toggle-btn),#bio-exp-sidebar.collapsed .eln-list-body{display:none!important}
#bio-exp-group-list{padding:2px 0}
.bio-filter-panel.collapsed .bio-filter-panel-body,.bio-filter-panel.collapsed .bio-filter-panel-ftr{display:none!important}
.bio-filter-panel.collapsed .bio-filter-panel-hdr>:not(#bio-res-filter-toggle){display:none!important}
.bio-filter-panel-ftr{padding:10px 12px;border-top:1px solid var(--border);display:flex;flex-direction:column;gap:5px;flex-shrink:0}
.bio-filter-panel select,.bio-filter-panel input{width:100%;font-size:12px;padding:5px 7px;border:1px solid var(--border2);border-radius:var(--r-xs);background:var(--bg2);color:var(--text);outline:none;box-sizing:border-box}
.bio-filter-panel .search-wrap input{padding-left:28px}
.bio-filter-panel .bio-range-row{display:flex;align-items:center;gap:4px}
.bio-filter-panel .bio-range-row input{width:0;flex:1}
#bio-res-filter-toggle{background:none;border:none;cursor:pointer;color:var(--text3);padding:2px 5px;border-radius:var(--r-xs);font-size:15px;line-height:1;flex-shrink:0}
#bio-res-filter-toggle:hover{background:var(--bg3);color:var(--text)}
.bio-results-main{flex:1;padding:16px 20px;overflow:auto;display:flex;flex-direction:column;min-width:0}
/* ── BIO EXPLORER (3-panel charts) ──────────────────────────── */
.bio-exp-panel{border-right:1px solid var(--border);flex-shrink:0;display:flex;flex-direction:column;overflow:hidden}
.bio-exp-panel:last-child{border-right:none}
.bio-exp-row-group{width:52px;flex-shrink:0;font-size:10px;border:2px solid var(--border2);border-radius:3px;background:var(--bg2);color:var(--text2);padding:1px 2px;cursor:pointer}
.bio-exp-row-swatch{width:16px;height:16px;flex-shrink:0;padding:0;border:1px solid var(--border2);border-radius:3px;background:none;cursor:pointer}
.bio-exp-row-swatch::-webkit-color-swatch-wrapper{padding:1px}
.bio-exp-row-swatch::-webkit-color-swatch{border:none;border-radius:2px}
.bio-exp-row-swatch-reset{flex-shrink:0;width:14px;height:16px;padding:0;font-size:10px;line-height:1;border:none;background:none;color:var(--text3);cursor:pointer}
.bio-exp-row-swatch-reset:hover{color:var(--accent-ink)}
/* Select-compounds modal toolbar — one bordered block holding search,
   selection actions, project filter and group assignment, so the modal
   reads as one coherent control panel instead of loose stacked rows. */
.bio-exp-modal-toolbar{display:flex;flex-direction:column;gap:8px;padding:10px;margin-bottom:12px;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-md)}
.bio-exp-modal-toolbar-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.bio-exp-modal-toolbar-row:not(:last-child){padding-bottom:8px;border-bottom:1px solid var(--border)}
.bio-exp-modal-search-wrap{display:flex;align-items:center;gap:6px;flex:1;min-width:180px;padding:0 8px;border:1px solid var(--border2);border-radius:var(--r-xs);background:var(--bg);color:var(--text3)}
.bio-exp-modal-search-wrap input{flex:1;border:none;background:none;padding:6px 0;font-size:12px;color:var(--text);outline:none}
.bio-exp-modal-seg{display:flex;border:1px solid var(--border2);border-radius:var(--r-xs);overflow:hidden;flex-shrink:0}
.bio-exp-modal-seg button{background:var(--bg);border:none;color:var(--text2);font-size:12px;padding:6px 10px;cursor:pointer}
.bio-exp-modal-seg button:not(:last-child){border-right:1px solid var(--border2)}
.bio-exp-modal-seg button:hover{background:var(--bg3);color:var(--text)}
.bio-exp-modal-clear:hover{color:var(--red)!important}
.bio-exp-modal-filter-details{position:relative;flex-shrink:0}
.bio-exp-modal-filter-details summary{list-style:none;cursor:pointer;user-select:none;font-size:12px;padding:6px 10px;border:1px solid var(--border2);border-radius:var(--r-xs);background:var(--bg);color:var(--text2)}
.bio-exp-modal-filter-details summary::-webkit-details-marker{display:none}
.bio-exp-modal-filter-details summary:hover{color:var(--text);border-color:var(--accent)}
.bio-exp-modal-filter-details[open] summary{color:var(--text);border-color:var(--accent)}
.bio-exp-modal-filter-panel{position:absolute;top:calc(100% + 4px);left:0;z-index:20;min-width:220px;max-height:260px;overflow-y:auto;display:flex;flex-direction:column;gap:6px;padding:10px;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-sm);box-shadow:0 10px 28px rgba(0,0,0,.2)}
.bio-exp-modal-filter-panel .bio-exp-project-filter-list{display:flex;flex-direction:column;gap:4px}
#bio-exp-modal-group-select{font-size:12px;padding:6px 8px;border:1px solid var(--border2);border-radius:var(--r-xs);background:var(--bg);color:var(--text)}
.bio-exp-modal-grid{overflow-y:auto;flex:1;display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:8px;padding:2px 2px 4px}
.bio-exp-modal-card{display:flex;flex-direction:column;align-items:center;gap:4px;padding:10px 8px;border:1px solid var(--border2);border-radius:var(--r-md);cursor:pointer;text-align:center;position:relative;background:var(--bg2);transition:border-color .12s,box-shadow .12s,transform .12s}
.bio-exp-modal-card:hover{border-color:var(--text3);box-shadow:0 2px 8px rgba(0,0,0,.08);transform:translateY(-1px)}
.bio-exp-modal-card.checked{border-color:var(--accent);background:color-mix(in srgb, var(--accent) 8%, transparent)}
.bio-exp-modal-card input[type=checkbox]{position:absolute;top:6px;left:6px;margin:0;width:15px;height:15px;accent-color:var(--accent)}
.bio-exp-modal-card img{width:120px;height:70px;object-fit:contain;background:#fff;border-radius:var(--r-xs)}
.bio-exp-modal-card .cid{font-weight:700;font-size:12px;color:var(--text)}
.bio-exp-modal-card .cnt{font-size:10px;color:var(--text3);font-family:var(--mono)}
.bio-exp-modal-card-group{display:flex;align-items:center;gap:4px;margin-top:2px;width:100%}
.bio-exp-modal-card-group .bio-exp-row-group{width:auto;flex:1}
.bio-exp-group-row{display:flex;align-items:center;gap:5px;font-size:11px;padding:3px 0}
.bio-exp-group-row .name{flex:1;color:var(--text2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bio-exp-group-row .n{color:var(--text3);font-family:var(--mono);font-size:10px}
.bio-exp-group-swatch{width:16px;height:16px;flex-shrink:0;padding:0;border:1px solid var(--border2);border-radius:3px;background:none;cursor:pointer}
.bio-exp-group-swatch::-webkit-color-swatch-wrapper{padding:1px}
.bio-exp-group-swatch::-webkit-color-swatch{border:none;border-radius:2px}
.bio-exp-group-shape{font-size:10px;padding:1px 3px;border:1px solid var(--border2);border-radius:3px;background:var(--bg2);color:var(--text2);max-width:64px}
.bio-exp-group-row button{background:none;border:none;color:var(--text3);cursor:pointer;font-size:11px;padding:0 2px;flex-shrink:0;display:inline-flex;align-items:center}
.bio-exp-group-row button:last-child:hover{color:var(--red)}
.bio-exp-group-row button:not(:last-child):hover{color:var(--accent-ink)}
.bio-exp-group-row.hidden{opacity:.45}
.bio-exp-group-row .bio-exp-shape-btn{width:22px;height:22px;flex-shrink:0;display:flex;align-items:center;justify-content:center;border:1px solid var(--border2)!important;border-radius:4px;background:var(--bg2)!important;color:var(--text2);padding:0}
.bio-exp-group-row .bio-exp-shape-btn:hover{background:var(--bg3)!important;color:var(--text)}
.bio-exp-group-row .bio-exp-shape-btn:disabled{opacity:.4;cursor:default}
.bio-exp-shape-pop{position:absolute;z-index:60;top:100%;right:0;margin-top:3px;background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-sm);box-shadow:0 6px 18px rgba(0,0,0,.28);padding:5px;display:grid;grid-template-columns:repeat(4,26px);gap:3px}
.bio-exp-shape-opt{width:26px;height:26px;display:flex;align-items:center;justify-content:center;border:1px solid transparent!important;border-radius:4px;background:none!important;color:var(--text2);cursor:pointer;padding:0}
.bio-exp-shape-opt:hover{background:var(--bg3)!important;color:var(--text)}
.bio-exp-shape-opt.active{border-color:var(--accent)!important;color:var(--accent-ink)}
.bio-exp-style-preset.active{background:var(--bg3);color:var(--text);border-color:var(--accent)}
.bio-exp-group-expand{width:14px;color:var(--text3);font-size:10px!important}
.bio-exp-group-members{display:flex;flex-direction:column;gap:3px;padding:2px 0 6px 20px}
.bio-exp-group-member-chip{display:flex;align-items:center;gap:5px;font-size:11px;background:var(--bg3);border-radius:var(--r-xs);padding:2px 4px}
.bio-exp-group-member-chip .cid{flex:1;color:var(--text2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600}
.bio-exp-group-member-chip button{background:none;border:none;color:var(--text3);cursor:pointer;flex-shrink:0;display:inline-flex;align-items:center;padding:0}
.bio-exp-group-member-chip .bio-exp-chip-btn{width:17px;height:17px;justify-content:center;border-radius:3px}
.bio-exp-group-member-chip .bio-exp-chip-btn:hover{color:var(--accent-ink);background:var(--bg2)}
.bio-exp-group-member-chip .bio-exp-chip-btn.active{color:var(--accent-ink);background:color-mix(in srgb, var(--accent) 16%, transparent)}
.bio-exp-move-pop{position:absolute;z-index:60;top:100%;right:0;margin-top:3px;background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-sm);box-shadow:0 6px 18px rgba(0,0,0,.28);padding:4px;display:flex;flex-direction:column;gap:1px;min-width:140px;max-height:220px;overflow-y:auto}
.bio-exp-group-member-chip .bio-exp-move-opt{display:flex;align-items:center;gap:6px;padding:5px 7px;border-radius:4px;font-size:11px;color:var(--text2);text-align:left;white-space:nowrap;width:100%}
.bio-exp-group-member-chip .bio-exp-move-opt:hover{background:var(--bg3);color:var(--text)}
.bio-exp-group-member-chip .bio-exp-move-opt.active{color:var(--accent-ink);font-weight:600}
.bio-exp-move-opt .sw{width:9px;height:9px;border-radius:50%;flex-shrink:0}
.bio-exp-oor-notice{position:absolute;bottom:10px;left:50%;transform:translateX(-50%);background:var(--warn-bg);border:1px solid var(--warn-border);color:var(--warn-fg);font-size:11px;padding:4px 10px;border-radius:var(--r-lg);z-index:4;cursor:help;white-space:nowrap}
.nmr-peaks-warn-box{background:var(--warn-bg);border:1px solid var(--warn-border);color:var(--warn-fg);font-size:11px;line-height:1.6;padding:6px 9px;border-radius:var(--r-sm);margin-top:6px}
.bio-exp-shockwave{position:fixed;width:14px;height:14px;margin:-7px 0 0 -7px;border-radius:50%;border:3px solid var(--accent);pointer-events:none;z-index:9999;animation:bioExpShockwave .9s ease-out forwards}
@keyframes bioExpShockwave{0%{transform:scale(.3);opacity:1}100%{transform:scale(6);opacity:0}}
.bio-exp-config{width:230px;padding:14px 12px;overflow-y:auto;gap:14px}
.bio-exp-type-grid{display:grid;grid-template-columns:1fr 1fr;gap:6px}
.bio-exp-type-btn{display:flex;flex-direction:column;align-items:center;gap:4px;padding:8px 4px;border:1px solid var(--border2);border-radius:var(--r-sm);background:var(--bg2);color:var(--text2);cursor:pointer}
.bio-exp-type-btn span{font-size:10px;font-weight:600}
.bio-exp-type-btn:hover{border-color:var(--accent);color:var(--text)}
.bio-exp-type-btn.active{background:color-mix(in srgb, var(--accent) 12%, transparent);border-color:var(--accent);color:var(--accent-ink)}
.bio-exp-config .sl{font-size:11px;color:var(--text3);font-weight:600;text-transform:uppercase;letter-spacing:.04em;margin-bottom:4px}
.bio-exp-config select{width:100%;font-size:12px;padding:6px 8px;border:1px solid var(--border2);border-radius:var(--r-xs);background:var(--bg2);color:var(--text);outline:none;box-sizing:border-box}
.bio-exp-config label.chk{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text2);padding:3px 0;cursor:pointer}
.bio-exp-chart-area{flex:1;padding:16px 20px;position:relative;min-width:420px}
.bio-exp-heatmap-table{border-collapse:collapse;font-size:11px;white-space:nowrap}
.bio-exp-heatmap-table th{position:sticky;top:0;background:var(--bg2);padding:6px 8px;text-align:center;border-bottom:1px solid var(--border2);z-index:2}
.bio-exp-heat-col-type{color:var(--accent-ink);font-family:var(--mono);font-size:9px;text-transform:uppercase;letter-spacing:.03em}
.bio-exp-heat-col-name{color:var(--text);font-weight:600}
.bio-exp-heat-col-unit{color:var(--text3);font-size:9px;font-family:var(--mono)}
.bio-exp-heat-rowhead{position:sticky;left:0;background:var(--bg2);display:flex;align-items:center;gap:6px;padding:4px 10px 4px 6px;font-weight:600;border-right:1px solid var(--border2);z-index:1}
.bio-exp-heat-rowhead img{width:32px;height:20px;object-fit:contain;border-radius:var(--r-xs);flex-shrink:0}
.bio-exp-heat-cell{text-align:center;padding:6px 10px;font-family:var(--mono);color:var(--text);border-bottom:1px solid var(--border)}
.bio-exp-heat-cell.empty{color:var(--text3)}
.bio-exp-heat-toolbar{position:sticky;top:0;left:0;z-index:3;display:flex;align-items:center;justify-content:space-between;gap:12px;background:var(--bg2);border-bottom:1px solid var(--border2);padding:0 0 8px;margin-bottom:4px}
.bio-exp-heat-legend{display:flex;align-items:center;gap:6px;font-size:10px;color:var(--text3)}
.bio-exp-heat-legend-bar{width:110px;height:10px;border-radius:3px;border:1px solid var(--border2)}
#bio-exp-heat-scale-select{padding:3px 6px;border:1px solid var(--border2);border-radius:var(--r-xs);background:var(--bg2);color:var(--text2)}
.bio-exp-heat-collist{display:flex;flex-direction:column;gap:2px;max-height:280px;overflow-y:auto}
.bio-exp-heat-collist .chk{white-space:nowrap}
#bio-exp-tooltip{position:fixed;z-index:2000;pointer-events:none;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-md);box-shadow:0 8px 24px rgba(0,0,0,.18);padding:10px;font-size:11px;display:none;width:220px}
#bio-exp-tooltip .tt-struct{width:100%;height:90px;background:#fff;border-radius:var(--r-xs);overflow:hidden;display:flex;align-items:center;justify-content:center;margin-bottom:6px}
#bio-exp-tooltip .tt-struct svg{max-width:100%;max-height:100%}
#bio-exp-tooltip .tt-cid{font-weight:700;font-size:12px;color:var(--text);margin-bottom:4px}
#bio-exp-tooltip table{width:100%;border-collapse:collapse}
#bio-exp-tooltip td{padding:1px 0;color:var(--text2)}
#bio-exp-tooltip td:last-child{text-align:right;font-family:var(--mono);color:var(--text)}
#bio-exp-tooltip .tt-section{font-size:9px;font-weight:700;color:var(--text3);text-transform:uppercase;letter-spacing:.05em;margin:6px 0 2px;padding-top:4px;border-top:1px solid var(--border2)}
.be-file-badge{font-size:10px;font-weight:600;padding:1px 6px;border-radius:var(--r-lg);flex-shrink:0}
.be-file-badge.data{background:color-mix(in srgb,var(--accent) 12%,transparent);color:var(--accent-ink)}
.be-file-badge.report{background:color-mix(in srgb,var(--orange) 12%,transparent);color:var(--orange-ink)}
.be-file-badge.image{background:var(--bg4);color:var(--text2)}
.be-file-badge.other{background:var(--bg4);color:var(--text3)}
.bio-table{width:100%;border-collapse:collapse}
.bio-table thead th{text-align:left;font-size:var(--ui-label);color:var(--text3);font-weight:700;padding:7px 10px;border-bottom:1px solid var(--border);white-space:nowrap;background:var(--bg3);text-transform:uppercase;letter-spacing:.05em}
.bio-table tbody td{padding:8px 10px;border-bottom:1px solid var(--border);font-size:var(--ui-body);vertical-align:middle}
.bio-table tbody tr:last-child td{border-bottom:none}
.bio-tr{cursor:pointer}
.bio-tr:hover td{background:var(--bg3)}
.bio-assay-tag{display:inline-block;font-size:10px;font-family:var(--mono);padding:2px 7px;border-radius:var(--r-sm);background:var(--accent-light);border:1px solid color-mix(in srgb,var(--accent) 20%,transparent);color:var(--accent-ink);white-space:nowrap;font-weight:500}
.bio-target-tag{display:inline-block;font-size:10px;font-family:var(--mono);padding:2px 7px;border-radius:var(--r-sm);background:var(--bg3);border:1px solid var(--border2);color:var(--text2);white-space:nowrap}
.cid-chip{font-family:var(--sans);font-size:12px;font-weight:700;color:var(--text)}
/* Bio results in compound detail panel */
.bio-row{position:relative;padding:7px 30px 7px 0;border-bottom:1px solid var(--border);font-size:12px}
.bio-row:last-child{border-bottom:none}
.bio-row-main{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.bio-name{color:var(--text);flex:1;min-width:0}
.bio-value{font-family:var(--mono);font-weight:700;color:var(--text);white-space:nowrap}
.bio-row-meta{font-size:11px;color:var(--text3);margin-top:2px}
.bio-row-notes{font-size:11px;color:var(--text2);margin-top:2px;font-style:italic}
.bio-row-actions{position:absolute;top:7px;right:0;display:flex;gap:2px;opacity:0;transition:opacity .15s}
.bio-row:hover .bio-row-actions{opacity:1}
.bio-del-btn,.bio-edit-btn{background:none;border:none;cursor:pointer;color:var(--text3);font-size:12px;padding:2px 4px;border-radius:var(--r-xs)}
.bio-del-btn:hover{background:rgba(220,38,38,.12);color:var(--red)}
.bio-edit-btn:hover{background:var(--bg3);color:var(--text)}
.bio-row-group .bio-row-main:hover{color:var(--accent-ink)}
.bio-group-toggle{color:var(--text3);font-size:10px;flex-shrink:0}
.bio-group-detail{padding-left:14px;border-left:2px solid var(--border2);margin:0 0 4px 2px}
.bio-group-detail .bio-row{padding-right:30px}
.bio-tr-group{background:color-mix(in srgb, var(--accent) 5%, transparent)}
.bio-tr-group:hover td{background:color-mix(in srgb, var(--accent) 10%, transparent)!important}
.bio-tr-sub td:nth-child(4){padding-left:16px}
.bio-tr-sub{opacity:.9}
.bio-report-link{display:inline-flex;align-items:center;gap:3px;font-size:11px;color:var(--accent-ink);text-decoration:none;margin-top:3px}
.bio-report-link:hover{text-decoration:underline}
.bio-files{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}
.bio-file-chip{display:inline-flex;align-items:center;gap:4px;font-size:11px;padding:2px 7px;border-radius:var(--r-xs);background:var(--bg3);border:1px solid var(--border2);color:var(--text2);cursor:pointer;text-decoration:none}
.bio-file-chip:hover{border-color:var(--accent);color:var(--accent-ink)}
.bio-attach-btn{font-size:12px;color:var(--text3);background:none;border:none;cursor:pointer;padding:2px 4px;border-radius:var(--r-xs)}
.bio-attach-btn:hover{background:var(--bg3);color:var(--accent-ink)}
.bio-table td.bio-td-notes{max-width:180px;white-space:pre-wrap;word-break:break-word;font-size:11px;color:var(--text3)}
.bio-table .bio-report-cell a{color:var(--accent-ink);font-size:11px;text-decoration:none}
.bio-table .bio-report-cell a:hover{text-decoration:underline}

/* ── COMPOUND AUTOCOMPLETE ────────────────────────────────────── */
.cmp-ac-wrap{position:relative}
.cmp-ac-dropdown{position:absolute;top:calc(100% + 4px);left:0;right:0;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-md);box-shadow:0 6px 20px rgba(0,0,0,.12);z-index:500;overflow:hidden;display:none;max-height:240px;overflow-y:auto}
.cmp-ac-dropdown.open{display:block}
.cmp-ac-item{display:flex;align-items:center;gap:8px;padding:7px 12px;cursor:pointer;font-size:13px;transition:background .1s}
.cmp-ac-item:hover,.cmp-ac-item.focused{background:var(--bg3)}
.cmp-ac-none{padding:10px 12px;font-size:12px;color:var(--text3)}

/* ── BIO SUB-TABS & REPORTS ───────────────────────────────────── */
.bio-subtabs{display:flex;gap:2px;background:transparent;padding:2px 0}
.bio-subtab{padding:4px 14px;border-radius:var(--r-xs);font-size:12px;color:var(--text3);cursor:pointer;border:none;background:transparent;transition:all .15s}
.bio-subtab.active{color:var(--text);font-weight:500;background:var(--bg2)}
.bio-import-preview{max-height:320px;overflow-y:auto;margin:12px 0}
.bio-import-table{width:100%;border-collapse:collapse;font-size:12px}
.bio-import-table th{text-align:left;padding:5px 8px;font-size:11px;color:var(--text3);font-weight:500;border-bottom:1px solid var(--border)}
.bio-import-table td{padding:5px 8px;border-bottom:1px solid var(--border)}
.bio-import-row-ok{background:rgba(52,199,89,.05)}
.bio-import-row-err{background:rgba(255,59,48,.05);color:var(--red)}
.bio-import-row-skip{opacity:.5;text-decoration:line-through}

/* ── Compound Picker ─────────────────────────────────────────── */
.cpd-picker-list{max-height:280px;overflow-y:auto;border:1px solid var(--border);border-radius:var(--r-sm)}
.cpd-picker-row{display:flex;align-items:center;gap:10px;padding:8px 12px;cursor:pointer;border-bottom:1px solid var(--border);font-size:12px}
.cpd-picker-row:last-child{border-bottom:none}
.cpd-picker-row:hover{background:var(--bg3)}
.cpd-picker-cid{font-family:var(--sans);font-weight:700;color:var(--text2);min-width:72px;flex-shrink:0}
.cpd-picker-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cpd-picker-formula{font-size:11px;color:var(--text3);flex-shrink:0}
.cpd-pick-btn{background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-xs);padding:3px 8px;font-size:12px;color:var(--text2);cursor:pointer;max-width:120px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}
.cpd-pick-btn:hover{border-color:var(--accent);color:var(--accent-ink)}
.cpd-pick-btn.has-value{color:var(--accent-ink);font-family:var(--mono);font-weight:600}

/* ── BIO-ELN ─────────────────────────────────────────────────── */
.be-table,.admin-table{width:100%;border-collapse:collapse}
.be-table th,.admin-table th{text-align:left;padding:5px 8px;font-size:11px;color:var(--text3);font-weight:500;border-bottom:1px solid var(--border)}
.be-table td,.admin-table td{padding:6px 8px;border-bottom:1px solid var(--border);font-size:var(--ui-body);color:var(--text)}
.be-table tr:last-child td,.admin-table tr:last-child td{border-bottom:none}
.admin-table tr:hover td{background:var(--bg3)}
.be-add-row td{background:var(--bg3);border-top:1px dashed var(--border2)!important}
#pharm-diss-section input[type=number]:focus,#pharm-diss-section input[type=text]:focus{background:var(--bg2)!important;box-shadow:inset 0 0 0 2px var(--accent);border-radius:2px}
#pharm-diss-section input[type=number]:hover,#pharm-diss-section input[type=text]:hover{background:var(--bg3)!important}
#pharm-diss-section tr:hover td{background:color-mix(in srgb,var(--accent) 4%,transparent)}
.be-add-row input,.be-add-row select{background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-xs);padding:3px 5px;font-size:12px;color:var(--text);outline:none}
.be-inline-input{width:100%;background:transparent;border:none;border-bottom:1px solid transparent;padding:2px 0;font-size:12px;color:var(--text);outline:none;font-family:var(--sans)}
.be-inline-input:focus,.be-inline-input:hover{border-bottom-color:var(--border2)}

/* ── ELN ──────────────────────────────────────────────────────── */
#page-eln{padding:0;overflow:hidden}
#page-eln.active{display:flex;flex-direction:column;height:calc(100vh - 56px)}
.eln-layout{display:flex;flex:1;overflow:hidden}
/* height:100% overrides the legacy bare `aside{height:calc(100vh - 56px)}`
   rule below — that fixed viewport-relative height only happens to match
   when nothing else shares the page above the sidebar; Library's subtab
   strip (Compounds/Storage/Bio Results/Charts) eats into that space, so
   without this the sidebar box itself ends up taller than its actual grid
   row and the last ~40px (rendered content there, whatever it is) gets
   clipped by the grid container's overflow:hidden — not fixable by
   scrolling, since it's the sidebar's own box that's oversized. */
.eln-list{width:260px;height:100%;flex-shrink:0;border-right:1px solid var(--border);display:flex;flex-direction:column;overflow:visible;transition:width .2s ease}
.eln-list.collapsed{width:0;border-right:none}
#eln-sidebar.collapsed .eln-list-header>:not(#eln-sidebar-toggle),#eln-sidebar.collapsed .subtab-bar,#eln-sidebar.collapsed .pj-scope,#eln-sidebar.collapsed #eln-entries-panel,#eln-sidebar.collapsed #eln-ci-panel{display:none!important}
#bio-sidebar.collapsed .eln-list-header>:not(#bio-sidebar-toggle),#bio-sidebar.collapsed .subtab-bar,#bio-sidebar.collapsed .pj-scope,#bio-sidebar.collapsed .eln-list-search,#bio-sidebar.collapsed .eln-list-body,#bio-sidebar.collapsed .ci-panel-notice{display:none!important}
#d2b-sidebar.collapsed .eln-list-header>:not(#d2b-sidebar-toggle),#d2b-sidebar.collapsed .pj-scope,#d2b-sidebar.collapsed #d2b-entries-panel,#d2b-sidebar.collapsed #d2b-browser-panel,#d2b-sidebar.collapsed #d2b-source-panel{display:none!important}
#bio-labtools-sidebar.collapsed .eln-list-body,#admin-sidebar.collapsed .eln-list-body{display:none!important}

/* ── Shared collapsible-sidebar toggle ──────────────────────────
   Every collapsible sidebar (ELN/Bio/D2B/Projects/Library/Storage/
   Equipment/Reagents/Orders/Maintenance/Team/Dissemination/Lab tools/
   Admin, plus the Bio results filter panel) uses the same handle: a
   small pill fixed to the vertical middle of the sidebar's own right
   edge, straddling it (half in, half out), so it's the ONE thing that
   stays visible and reachable when the sidebar is fully collapsed to
   width:0 — not just shrunk to a sliver. Its containing block is the
   sidebar element itself (position:relative, set per-id below for the
   plain-<div> ones; the handful that are real <aside> tags already get
   position:sticky from the bare `aside` rule, which works the same way
   here), so `right:0` tracks the sidebar's *current* edge whether it's
   expanded or collapsed — no separate collapsed-state position needed. */
#eln-sidebar,#bio-sidebar,#d2b-sidebar,#reac-nav-sidebar,#equip-sidebar,#maint-sidebar,#team-sidebar,#diss-sidebar,#orders-nav-sidebar,#bio-res-filter,#bio-labtools-sidebar,#admin-sidebar{position:relative}
/* Belt-and-braces for the header row specifically: it should already go
   to width:0 by inheriting the collapsed sidebar's own width (flex-column
   cross-axis stretch), same as every other child — but that leaves it
   resting entirely on stretch actually reaching 0 in every browser. Zero
   its box (and the border-bottom that a 0-width box shouldn't paint, but
   sometimes still does) explicitly instead of trusting that. */
.eln-list.collapsed .eln-list-header,.side-panel.collapsed .side-panel-header,.bio-filter-panel.collapsed .bio-filter-panel-hdr{width:0;padding:0;border-bottom:none;overflow:hidden}
.sidebar-toggle-btn{
  position:absolute;top:50%;right:-9px;transform:translateY(-50%);margin:0;z-index:8;
  width:18px;height:44px;padding:0;display:flex;align-items:center;justify-content:center;
  background:var(--bg2);border:1px solid var(--border);border-radius:6px;
  color:var(--text3);cursor:pointer;font-size:14px;line-height:1;
  box-shadow:0 1px 3px rgba(0,0,0,.12);
  transition:transform .15s ease;
}
.sidebar-toggle-btn:hover{background:var(--bg3);color:var(--text)}
/* The glyph itself never changes in JS — it's driven purely by whether an
   ancestor sidebar carries .collapsed (the same class that already
   reliably drives the width/visibility change), so it can't drift out of
   sync with the actual state the way a JS innerHTML swap on click could. */
/* Collapsed sidebars are width:0, so the handle straddles the same point the
   neighboring pane's content starts at — its own edge (padding/border/first
   row) can visually crowd the mirrored arrow otherwise. A couple more px of
   clearance, not a bigger icon. */
.eln-list.collapsed .sidebar-toggle-btn,.side-panel.collapsed .sidebar-toggle-btn,.bio-filter-panel.collapsed .sidebar-toggle-btn{right:-13px;transform:translateY(-50%) scaleX(-1)}
.sidebar-plain-icon-btn{background:none;border:none;cursor:pointer;color:var(--text3);padding:2px 5px;border-radius:var(--r-xs);display:inline-flex;align-items:center;flex-shrink:0}
.sidebar-plain-icon-btn:hover{background:var(--bg3);color:var(--text)}
#library-sidebar.collapsed{width:0}
#library-sidebar.collapsed .eln-list-header>:not(.sidebar-toggle-btn),#library-sidebar.collapsed .eln-list-body,#library-sidebar.collapsed .eln-list-footer{display:none!important}
#storage-sidebar.collapsed{width:0}
#storage-sidebar.collapsed .eln-list-header>:not(.sidebar-toggle-btn),#storage-sidebar.collapsed .eln-list-body{display:none!important}
#equip-sidebar.collapsed #equip-sidebar-header>:not(.sidebar-toggle-btn),#equip-sidebar.collapsed>:not(#equip-sidebar-header){display:none!important}
#reac-nav-sidebar.collapsed{width:0}
#reac-nav-sidebar.collapsed .eln-list-header>:not(.sidebar-toggle-btn),#reac-nav-sidebar.collapsed .eln-list-body{display:none!important}
#orders-nav-sidebar.collapsed{width:0}
#orders-nav-sidebar.collapsed .eln-list-header>:not(.sidebar-toggle-btn),#orders-nav-sidebar.collapsed .eln-list-body{display:none!important}
.ci-res-thumb{flex-shrink:0;border-radius:var(--r-xs);background:var(--bg3);border:1px solid var(--border2)}
.eln-list-header{padding:14px 14px 10px;border-bottom:1px solid var(--border);display:flex;align-items:center;gap:8px}
.eln-list-header .page-title{flex:1;font-size:14px}
.eln-review-alert{display:flex;flex-direction:column;gap:6px;margin:8px 12px 0;padding:8px 10px;background:rgba(249,115,22,.08);border:1px solid rgba(249,115,22,.3);border-radius:var(--r-sm);font-size:12px;color:var(--orange-ink)}
.eln-review-alert .btn{align-self:flex-start}
.eln-list-search{padding:8px 12px;border-bottom:1px solid var(--border)}
.eln-list-search input{width:100%;background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-xs);padding:6px 9px;font-size:12px;color:var(--text);outline:none}
.eln-list-search .search-wrap input{padding-left:30px}
.eln-list-body{flex:1;overflow-y:auto;padding:6px}
.eln-list-footer{flex-shrink:0;padding:10px 14px;border-top:1px solid var(--border)}
.subtab-bar{display:flex;border-bottom:1px solid var(--border);padding:0 10px;gap:2px;flex-shrink:0}
#eln-entries-panel{flex:1;display:flex;flex-direction:column;overflow:hidden}
#eln-ci-panel{flex:1;flex-direction:column;overflow:hidden;display:none}
#d2b-entries-panel{flex:1;display:flex;flex-direction:column;overflow:hidden}
#d2b-browser-panel{flex:1;flex-direction:column;overflow:hidden;display:none}
.ci-panel-notice{margin:8px 10px 4px;padding:6px 9px;background:rgba(99,102,241,.07);border:1px solid rgba(99,102,241,.2);border-radius:var(--r-sm);font-size:11px;color:var(--text2);line-height:1.4}
.ci-panel-search{padding:8px 10px;border-bottom:1px solid var(--border);display:flex;flex-direction:column;gap:5px}
.ci-panel-result{padding:8px 10px;border-bottom:1px solid var(--border2);font-size:12px}
.ci-panel-result-name{font-weight:600;color:var(--text);margin-bottom:2px}
.ci-panel-result-meta{color:var(--text3);font-size:11px;line-height:1.5}
.browser-panel-head{padding:10px;display:flex;flex-direction:column;gap:8px;border-bottom:1px solid var(--border)}
.browser-section-hdr{display:flex;align-items:center;gap:6px;padding:5px 10px;font-size:10px;font-weight:700;color:var(--text3);letter-spacing:.05em;text-transform:uppercase;border-bottom:1px solid var(--border);cursor:pointer;user-select:none;transition:background .1s;position:sticky;top:0;background:var(--bg2);z-index:1}
.browser-section-hdr:hover{background:var(--bg3)}
.browser-draw-card{border:1.5px dashed var(--border2);border-radius:var(--r-md);padding:10px 12px;cursor:pointer;display:flex;align-items:center;justify-content:center;min-height:52px;transition:border-color .15s,background .15s}
.browser-draw-card:hover{border-color:var(--accent);background:rgba(99,102,241,.04)}
.browser-draw-card.has-struct{border-style:solid;border-color:var(--border);cursor:default}
.browser-eln-card{display:flex;gap:10px;align-items:stretch;cursor:pointer;padding:8px 10px;border-bottom:1px solid var(--border2);transition:background .1s}
.browser-eln-card:hover{background:var(--bg3)}
.browser-eln-thumb{width:68px;height:68px;border:1px solid var(--border2);border-radius:var(--r-sm);background:white;object-fit:contain;flex-shrink:0;align-self:center}
.browser-eln-info{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:center;gap:3px}
.browser-eln-role{display:inline-block;font-size:9px;font-weight:700;text-transform:uppercase;padding:1px 5px;border-radius:var(--r-xs);background:rgba(0,0,0,.06);letter-spacing:.03em}
.eln-card{position:relative;overflow:hidden;padding:10px 12px 10px 14px;border-radius:var(--r-md);cursor:pointer;margin-bottom:3px;border:1px solid transparent;transition:background .1s,border-color .1s}
/* Left accent band, same language as the Projects sidebar (.pj-card::before) —
   here it carries the entry's status color, matching the status dot */
.eln-card::before{content:'';position:absolute;left:0;top:6px;bottom:6px;width:3px;border-radius:0 3px 3px 0;background:var(--text3);opacity:.45;transition:opacity .12s}
.eln-card:hover::before{opacity:.85}
.eln-card.active::before{opacity:1}
/* draft/completed/annulled/pending_review/sent are shared across Chem/ELN,
   Bio (experiments + requests) and D2B, so a color here is app-wide, not
   per-module — draft ("open") reads blue everywhere per lab feedback
   (2026-09-10, #help-chemlib). "sent" (Bio's external pharma requests
   only) took purple instead of blue so it stays visually distinct from
   draft in the one list where both statuses can appear together. */
.eln-card:has(.eln-status-dot.draft)::before{background:var(--accent)}
.eln-card:has(.eln-status-dot.completed)::before{background:var(--green)}
.eln-card:has(.eln-status-dot.annulled)::before{background:var(--red)}
.eln-card:has(.eln-status-dot.pending_review)::before{background:var(--orange)}
.eln-card:has(.eln-status-dot.sent)::before{background:var(--chip-purple-fg)}
.eln-card:hover{background:var(--bg3)}
.eln-card.active{background:var(--accent-light);border-color:color-mix(in srgb,var(--accent) 20%,transparent)}
.eln-card-head{display:flex;align-items:center;gap:6px;margin-bottom:3px}
.eln-id-badge{font-family:var(--sans);font-size:11px;font-weight:700;color:var(--text3)}
.eln-status{font-size:10px;padding:1px 6px;border-radius:var(--r-xs);margin-left:auto}
.eln-status.draft{background:var(--accent-light);color:var(--accent-ink);font-weight:600}
.eln-status.completed{background:color-mix(in srgb,var(--green) 12%,transparent);color:var(--green-ink);font-weight:600}
.eln-status.annulled{background:color-mix(in srgb,var(--red) 10%,transparent);color:var(--red);font-weight:600}
.eln-status.pending_review{background:color-mix(in srgb,var(--orange) 14%,transparent);color:var(--orange-ink);font-weight:600}
.eln-status.sent{background:var(--chip-purple-bg);color:var(--chip-purple-fg);font-weight:600}
.eln-status-dot{width:8px;height:8px;border-radius:50%;margin-left:auto;flex-shrink:0}
.eln-status-dot.draft{background:var(--accent)}
.eln-status-dot.completed{background:var(--green)}
.eln-status-dot.annulled{background:var(--red)}
.eln-status-dot.pending_review{background:var(--orange)}
.eln-status-dot.sent{background:var(--chip-purple-fg)}
/* Completed, but a mandatory characterization requirement was overridden with a
   reason instead of actually attached — same "done" color, hollow instead of
   filled, so it never looks identical to a normal, clean completion. */
.eln-status-dot.completed.char-override{width:9px;height:9px;box-sizing:border-box;background:transparent;border:2px solid var(--green)}
/* Same idea while still pending review — the submitter already overrode the
   gap with a reason, before the reviewer ever sees it. */
.eln-status-dot.pending_review.char-override{width:9px;height:9px;box-sizing:border-box;background:transparent;border:2px solid var(--orange)}

/* Status filter — one circle per status, same colors as .eln-status-dot
   above, all on one row instead of a native <select>. */
.eln-status-filter-row{display:flex;gap:5px;align-items:center}
.eln-status-filter-btn{display:flex;align-items:center;justify-content:center;width:22px;height:22px;border-radius:var(--r-sm);border:1px solid var(--border2);background:var(--bg3);cursor:pointer;padding:0;flex-shrink:0;transition:border-color .12s,box-shadow .12s}
.eln-status-filter-btn:hover{border-color:var(--text3)}
.eln-status-filter-btn.active{border-color:var(--text);box-shadow:0 0 0 1px var(--text)}
.eln-status-filter-dot{width:9px;height:9px;border-radius:3px;flex-shrink:0}
.eln-status-filter-dot.all{background:transparent;border:1.5px solid var(--text3)}
.eln-status-filter-dot.draft{background:var(--accent)}
.eln-status-filter-dot.pending_review{background:var(--orange)}
.eln-status-filter-dot.completed{background:var(--green)}
.eln-status-filter-dot.annulled{background:var(--red)}
.eln-card.annulled{opacity:.55}
.eln-card.annulled .eln-card-title{text-decoration:line-through}
.proj-team-chip{display:inline-flex;align-items:center;gap:4px;padding:2px 6px 2px 3px;border-radius:20px;background:var(--bg3);border:1px solid var(--border);font-size:10px;color:var(--text2);white-space:nowrap}
.proj-team-chip-av{min-width:14px;height:14px;border-radius:999px;color:#fff;font-size:8px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;padding:0 2px;box-sizing:border-box;letter-spacing:-.2px}
.proj-team-chip-role{font-size:var(--ui-caption);font-weight:600;padding:0 4px;border-radius:var(--r-md);flex-shrink:0}
.proj-task-progress{flex:1;height:6px;border-radius:99px;background:var(--bg3);overflow:hidden}
.proj-task-progress-bar{height:100%;background:var(--accent);border-radius:99px;transition:width .2s}
.proj-task-board{display:grid;grid-template-columns:repeat(3,1fr);gap:0;transition:grid-template-rows .15s;border-radius:var(--r-lg);overflow:hidden;border:1px solid var(--border)}
.proj-task-board.collapsed{display:none}
.proj-task-col{background:var(--bg3);padding:9px 8px}
.proj-task-col+.proj-task-col{border-left:1px solid var(--border)}
.proj-task-col-head{display:flex;align-items:center;gap:5px;font-size:10px;font-weight:600;color:var(--text3);text-transform:uppercase;letter-spacing:.04em;margin-bottom:7px}
.proj-task-col-head-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0}
.proj-task-col[data-status="todo"] .proj-task-col-head-dot{background:var(--text3)}
.proj-task-col[data-status="doing"] .proj-task-col-head-dot{background:var(--accent)}
.proj-task-col[data-status="done"] .proj-task-col-head-dot{background:var(--green)}
.proj-task-col-body{display:flex;flex-direction:column;gap:10px;min-height:30px;max-height:260px;overflow-y:auto;border-radius:var(--r-sm);padding:1px}
.proj-task-col-body.drag-over{background:color-mix(in srgb,var(--accent) 8%,transparent);outline:1.5px dashed color-mix(in srgb,var(--accent) 50%,transparent);outline-offset:-1px}
.proj-task-card{border:none;border-radius:var(--r-sm);padding:6px 8px;background:var(--bg2);cursor:pointer;box-shadow:var(--shadow-sm);transition:transform .1s,box-shadow .1s}
.proj-task-card:hover{transform:translateY(-1px);box-shadow:var(--shadow-md)}
.proj-task-title{font-size:12px;font-weight:500;color:var(--text);line-height:1.35}
.proj-task-structure{width:26px;height:20px;display:flex;align-items:center;justify-content:center;background:var(--bg3);border-radius:3px;flex-shrink:0;overflow:hidden}
.proj-task-structure svg{max-width:100%;max-height:100%}
.proj-task-synth{margin-top:4px;font-size:9px;font-weight:600;color:var(--green-ink);cursor:pointer;display:inline-block}
.proj-task-synth:hover{text-decoration:underline}
.proj-task-lock{cursor:help;font-size:11px;line-height:1;opacity:.6}
.proj-task-lock:hover{opacity:1}
.proj-task-card.highlight{box-shadow:0 0 0 2px var(--accent),var(--shadow-md)}
.proj-task-collapse-btn{background:none;border:none;color:var(--text3);cursor:pointer;padding:2px;display:inline-flex;align-items:center;transition:transform .15s}
.proj-task-collapse-btn.collapsed{transform:rotate(-90deg)}
.proj-pending-row{cursor:pointer;border-bottom:1px dashed var(--border2);background:color-mix(in srgb,var(--text3) 4%,transparent)}
.proj-pending-row:hover{background:color-mix(in srgb,var(--accent) 8%,transparent)}
.proj-subtask-list{display:flex;flex-direction:column;gap:2px;margin-top:5px;padding-top:5px;border-top:1px solid var(--border)}
.proj-subtask-row{display:flex;align-items:center;gap:5px;padding:3px 4px;border-radius:var(--r-xs);cursor:pointer;transition:background .1s}
.proj-subtask-row:hover{background:var(--bg3)}
.proj-subtask-row.highlight{box-shadow:0 0 0 2px var(--accent)}
.proj-subtask-thumb{width:28px;height:20px;display:flex;align-items:center;justify-content:center;background:var(--bg3);border-radius:3px;flex-shrink:0;overflow:hidden}
.proj-subtask-thumb svg{max-width:100%;max-height:100%}
.proj-subtask-title{font-size:11px;color:var(--text2);flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.eln-card-title{font-size:12px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.eln-card-meta{font-size:11px;color:var(--text3);margin-top:2px}
.eln-table-grid{width:100%;border-collapse:collapse;font-size:13px;table-layout:fixed}
.eln-table-grid thead th{position:sticky;top:0;background:var(--bg2);border-bottom:1px solid var(--border2);text-align:left;font-size:var(--ui-label);font-weight:600;color:var(--text3);text-transform:uppercase;letter-spacing:.03em;padding:9px 12px;z-index:1;white-space:nowrap}
.eln-table-grid thead th.eln-tg-sortable,.ct thead th.eln-tg-sortable{cursor:pointer;user-select:none}
.eln-table-grid thead th.eln-tg-sortable:hover,.ct thead th.eln-tg-sortable:hover{color:var(--text)}
.eln-tg-sort-arrow{display:inline-block;margin-left:3px;font-size:9px;opacity:.8}
.eln-table-grid td{padding:8px 12px;border-bottom:1px solid var(--border);vertical-align:middle;color:var(--text2);height:48px;box-sizing:border-box}
.eln-tg-row{cursor:pointer;transition:background .1s}
.eln-tg-row:nth-child(even){background:color-mix(in srgb,var(--bg2) 45%,transparent)}
.eln-tg-row:hover{background:var(--bg3)}
.eln-tg-scheme{width:70px;padding:4px 8px !important}
.eln-tg-scheme-box{width:54px;height:38px;display:flex;align-items:center;justify-content:center;background:var(--bg3);border-radius:var(--r-xs);overflow:hidden;margin:0 auto}
.eln-tg-title{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500;color:var(--text);display:block}
.eln-tg-ellip{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.eln-table-grid th:nth-child(1),.eln-table-grid td:nth-child(1){width:70px}
.eln-table-grid th:nth-child(2),.eln-table-grid td:nth-child(2){width:80px}
.eln-table-grid th:nth-child(3),.eln-table-grid td:nth-child(3){width:auto}
.eln-table-grid th:nth-child(4),.eln-table-grid td:nth-child(4){width:15%}
.eln-table-grid th:nth-child(5),.eln-table-grid td:nth-child(5){width:16%}
.eln-table-grid th:nth-child(6),.eln-table-grid td:nth-child(6){width:90px}
.eln-table-grid th:nth-child(7),.eln-table-grid td:nth-child(7){width:110px}
.eln-table-grid th:nth-child(8),.eln-table-grid td:nth-child(8){width:80px}
.eln-detail{flex:1;overflow-y:auto;display:flex;flex-direction:column}
.eln-empty{flex:1;display:flex;align-items:center;justify-content:center;color:var(--text3);font-size:13px;flex-direction:column;gap:8px}
.eln-editor{padding:20px 24px;flex:1}
.eln-editor-head{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}
.eln-title-input{flex:1;font-size:16px;font-weight:500;background:none;border:none;border-bottom:1px solid var(--border2);padding:4px 0;color:var(--text);font-family:var(--sans);outline:none;min-width:160px;text-overflow:ellipsis}
.rxn-table .rxn-col-empty{display:none}
.rxn-scheme-label{max-width:170px;text-align:center;font-size:10px;line-height:1.35;color:var(--text3);display:flex;flex-direction:column;align-items:center}
.rxn-scheme-id{font-family:var(--mono);font-weight:600;color:var(--text2)}
.rxn-scheme-name{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere}
#eln-editor.eln-locked #eln-ed-procedure.ql-container .ql-editor{min-height:0}
.eln-title-input:focus{border-bottom-color:var(--accent)}
.eln-meta-row{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap}
.eln-meta-row label{font-size:var(--ui-label);color:var(--text3)}
.eln-meta-row input,.eln-meta-row select{background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-xs);padding:4px 8px;font-size:12px;color:var(--text);outline:none}
.eln-section{margin-bottom:20px}
.eln-section-title{font-size:11px;font-weight:600;color:var(--text3);margin-bottom:8px}
.rxn-area{display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap}
.rxn-draw-panel{flex-shrink:0}
.rxn-draw-btns{display:flex;gap:6px;margin-top:6px}
.rxn-table-panel{flex:1;min-width:300px;overflow-x:auto;border:1px solid var(--border);border-radius:var(--r-md);overflow:hidden}
.rxn-table{width:100%;border-collapse:collapse;font-size:12px}
.rxn-table thead tr{background:var(--bg2)}
.rxn-table th{text-align:left;font-size:11px;color:var(--text2);font-weight:600;padding:5px 6px;border-bottom:1px solid var(--border);border-right:1px solid var(--border2);white-space:nowrap}
.rxn-table th:last-child{border-right:none}
.rxn-table td{padding:3px 4px;border-bottom:1px solid var(--border2);border-right:1px solid var(--border2);vertical-align:middle}
.rxn-table td:last-child{border-right:none}
.rxn-table tr:last-child td{border-bottom:none}
.rxn-row-reagent td:first-child,.rxn-row-catalyst td:first-child,.rxn-row-solvent td:first-child,.rxn-row-product td:first-child{box-shadow:inset 3px 0 0 currentColor}
.rxn-row-reagent{color:#b45309}.rxn-row-catalyst{color:#7c3aed}.rxn-row-solvent{color:#0d9488}.rxn-row-product{color:#16a34a}
.rxn-inp{width:100%;background:var(--bg3);border:1px solid transparent;border-radius:var(--r-xs);padding:3px 6px;font-size:var(--ui-input);color:var(--text);font-family:var(--sans);outline:none;min-width:0}
.rxn-inp:focus{border-color:var(--accent);background:var(--bg2)}
.rxn-inp.calc{background:transparent;color:var(--text2);font-family:var(--mono);font-size:var(--ui-input);cursor:default}
.rxn-inp.num{width:72px;font-family:var(--mono);text-align:right}
.rxn-inp.num::-webkit-inner-spin-button,.rxn-inp.num::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}
.rxn-inp.num{-moz-appearance:textfield}
.rxn-inp.wide{width:120px}
/* Theoretical-mass ghost text (product row) lives in a real sibling <span>,
   not the input's native placeholder — see _updateCalcCells() in eln.js for
   why. The wrapper carries the field's usual background/border so the input
   itself can go transparent and let the ghost text show through underneath. */
.rxn-mass-wrap{position:relative;border:1px solid transparent;border-radius:var(--r-xs);background:var(--bg3)}
.rxn-mass-wrap:focus-within{border-color:var(--accent);background:var(--bg2)}
.rxn-mass-wrap .rxn-inp{background:transparent;border-color:transparent}
.rxn-mass-wrap .rxn-inp:focus{background:transparent}
.rxn-mass-ghost{position:absolute;inset:0;display:flex;align-items:center;justify-content:flex-end;padding:3px 6px;font-family:var(--mono);font-size:12px;color:var(--text3);pointer-events:none;white-space:nowrap;overflow:hidden}
.rxn-role-sel{background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-xs);padding:3px 4px;font-size:11px;color:var(--text);outline:none;width:88px}
.info-tip{position:relative;cursor:help;font-weight:400;color:var(--text3)}
.info-tip::after{content:attr(data-tip);position:absolute;left:0;top:100%;margin-top:6px;background:var(--bg2);color:var(--text);border:1px solid var(--border);border-radius:var(--r-sm);padding:6px 8px;font-size:11px;font-weight:400;white-space:normal;width:220px;z-index:50;display:none;box-shadow:0 4px 12px rgba(0,0,0,.2);text-transform:none}
.info-tip:hover::after,.info-tip:focus::after{display:block}
/* This info-tip sits at the end of a long label near the modal's right edge —
   the default left:0 tooltip would spill outside the (narrower) role modal. */
#rm-requires-countersign ~ .info-tip::after{left:auto;right:0}
.rxn-lim-radio{text-align:center;vertical-align:middle;cursor:pointer}
.rxn-lim-radio input{cursor:pointer;accent-color:var(--accent);display:block;margin:0 auto}
.rxn-lim-mark{color:var(--accent-ink);font-weight:700}
.rxn-del-btn{background:none;border:none;color:var(--text3);cursor:pointer;padding:2px 5px;border-radius:var(--r-xs);font-size:12px}
.rxn-del-btn:hover{background:var(--bg3);color:var(--red)}
.rxn-draw-row-btn{background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-xs);cursor:pointer;padding:1px 5px;font-size:var(--ui-action);font-family:var(--sans);color:var(--text2);white-space:nowrap}
.rxn-draw-row-btn:hover{border-color:var(--accent);color:var(--accent-ink)}
/* Locked ELN entry (completed / annulled / in review / not yours): values read as text, not as disabled form fields */
#eln-editor.eln-locked :is(input,select,textarea):is([readonly],:disabled){border-color:transparent!important;background:transparent!important;box-shadow:none!important;-webkit-appearance:none;appearance:none;cursor:default;opacity:1}
#eln-editor.eln-locked :is(input,select,textarea):is([readonly],:disabled):not(.rxn-role-sel){color:var(--text);-webkit-text-fill-color:var(--text)}
#eln-editor.eln-locked :is(input,select,textarea):is([readonly],:disabled)::placeholder{color:transparent;-webkit-text-fill-color:transparent}
#eln-editor.eln-locked input:is([readonly],:disabled)::-webkit-calendar-picker-indicator{display:none}
#eln-editor.eln-locked input[type=number]:is([readonly],:disabled)::-webkit-inner-spin-button{display:none}
#eln-editor.eln-locked .rxn-draw-row-btn,#eln-editor.eln-locked .rxn-scheme-edit-hint,#eln-editor.eln-locked .eln-edit-only{display:none!important}
#eln-editor.eln-locked select.rxn-role-sel:disabled{padding-right:6px;font-weight:600;-webkit-text-fill-color:currentColor}
.rxn-draw-row-btn svg{display:block;width:var(--control-icon);height:var(--control-icon)}
.rxn-register-btn{background:none;border:1px solid var(--green);color:var(--green-ink);border-radius:var(--r-xs);font-size:10px;padding:2px 6px;cursor:pointer;white-space:nowrap}
.rxn-register-btn:hover{background:rgba(22,163,74,.1)}
.rxn-registered-badge{font-size:10px;color:var(--green-ink);white-space:nowrap}
.rxn-unlink-btn{background:none;border:1px solid var(--border2);color:var(--text3);cursor:pointer;padding:1px 5px;font-size:9px;border-radius:var(--r-xs);line-height:1.4}
.rxn-unlink-btn:hover{border-color:var(--red);color:var(--red)}
.rxn-role-reactant{color:#b45309}.rxn-role-product{color:#16a34a}.rxn-role-reagent{color:#b45309}.rxn-role-catalyst{color:#7c3aed}.rxn-role-solvent{color:#0d9488}
.eln-textarea{width:100%;background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-sm);padding:10px 12px;font-size:12px;color:var(--text);font-family:var(--sans);resize:vertical;outline:none;min-height:80px;line-height:1.6}
.eln-textarea:focus{border-color:var(--accent);background:var(--bg2)}
.eln-procedure-ce{min-height:140px;white-space:pre-wrap;cursor:text}
.eln-format-bar{display:flex;gap:3px;margin-bottom:4px}
.eln-fmt-btn{background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-xs);padding:2px 0;font-size:12px;color:var(--text);cursor:pointer;line-height:1.6;transition:background .1s;width:28px;text-align:center;flex-shrink:0}
.eln-fmt-btn:hover{background:var(--bg4)}
.eln-fmt-sep{width:1px;height:18px;background:var(--border2);margin:0 8px;flex-shrink:0;align-self:center}
.eln-fmt-color{width:28px;height:28px;border-radius:var(--r-xs);border:2px solid transparent;cursor:pointer;padding:0;flex-shrink:0;transition:border-color .1s,transform .1s}
.eln-fmt-color:hover{border-color:var(--text3);transform:scale(1.1)}
.eln-procedure-ce:empty::before{content:attr(data-placeholder);color:var(--text3);pointer-events:none}
.eln-procedure-ce ol,.eln-procedure-ce ul{padding-left:1.5em;margin:4px 0}
.eln-procedure-ce li{margin:2px 0}
.eln-insert-chips{display:flex;flex-wrap:wrap;gap:5px;margin-bottom:6px;min-height:0}
.eln-ref-chip{background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-lg);padding:2px 9px;font-size:11px;color:var(--text2);cursor:pointer;white-space:normal;overflow-wrap:break-word;max-width:260px;text-align:left;line-height:1.35}
.eln-ref-chip:hover{border-color:var(--accent);color:var(--accent-ink)}
/* Row names that come from a linked compound's IUPAC name can run to a
   hundred-plus characters — nowrap would just let a single chip stretch
   past the edge of whatever it's embedded in (the procedure editor, the
   insert-chips picker row) instead of wrapping like the rest of the text
   around it. */
.eln-ref{display:inline-block;background:var(--accent-light);border:1px solid color-mix(in srgb,var(--accent) 25%,transparent);border-radius:var(--r-xs);padding:0 5px;font-size:11px;color:var(--accent-ink);cursor:default;user-select:none;white-space:normal;overflow-wrap:break-word;font-family:var(--mono)}
.bio-step-ref{display:inline-block;background:var(--accent-light);border:1px solid color-mix(in srgb,var(--accent) 25%,transparent);border-radius:var(--r-xs);padding:0 5px;font-size:11px;color:var(--accent-ink);cursor:pointer;user-select:none;white-space:nowrap;font-family:var(--mono)}
.bio-step-ref:hover{border-color:var(--accent)}
.step-time-chip{display:inline-flex;align-items:center;gap:3px;font-size:11px;padding:1px 7px;border-radius:var(--r-lg);background:var(--bg3);border:1px solid var(--border2);color:var(--text3);white-space:nowrap;font-family:var(--mono)}
.step-time-chip.running{color:var(--accent-ink);border-color:color-mix(in srgb,var(--accent) 35%,transparent)}
.step-time-chip.overrun{color:var(--red);border-color:color-mix(in srgb,var(--red) 40%,transparent);background:color-mix(in srgb,var(--red) 8%,transparent)}
.be-step-card.highlight{outline:2px solid var(--accent);outline-offset:2px}

/* Quill: Quill adds .ql-container to #eln-ed-procedure and inserts .ql-toolbar before it as a sibling */
#eln-ed-procedure.ql-container.ql-snow{border:1px solid var(--border2);border-top:0;border-radius:0 0 6px 6px;font-size:13px;font-family:var(--sans);height:auto!important}
#eln-ed-procedure.ql-container .ql-editor{min-height:200px;height:auto!important;line-height:1.6;color:var(--text);font-family:var(--sans)}
#eln-ed-procedure.ql-container .ql-editor.ql-blank::before{color:var(--text3);font-style:normal}
.ql-toolbar.ql-snow:has(+#eln-ed-procedure){border:1px solid var(--border2);border-radius:var(--r-sm) 6px 0 0;background:var(--bg2);padding:4px 8px;font-family:var(--sans)}
.ql-editor img{max-width:100%;border-radius:var(--r-xs);cursor:pointer}
.ql-img-size-menu{position:absolute;z-index:500;display:flex;gap:2px;background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-sm);box-shadow:var(--shadow-sm);padding:2px}
.ql-img-size-menu button{font-size:11px;font-weight:500;padding:3px 8px;border:none;border-radius:var(--r-xs);background:none;color:var(--text2);cursor:pointer;white-space:nowrap}
.ql-img-size-menu button:hover{background:var(--bg3);color:var(--text)}
.ql-img-size-sep{width:1px;background:var(--border2);margin:2px 2px}
.ql-editor .ql-align-center img{display:block;margin-left:auto;margin-right:auto}
.ql-editor .ql-align-right img{display:block;margin-left:auto}
.ql-toolbar.ql-snow:has(+#eln-ed-procedure) .ql-stroke{stroke:var(--text2)}
.ql-toolbar.ql-snow:has(+#eln-ed-procedure) button:hover .ql-stroke,.ql-toolbar.ql-snow:has(+#eln-ed-procedure) button.ql-active .ql-stroke{stroke:var(--accent)}
.ql-toolbar.ql-snow:has(+#eln-ed-procedure) .ql-fill{fill:var(--text2)}
.ql-toolbar.ql-snow:has(+#eln-ed-procedure) button:hover .ql-fill,.ql-toolbar.ql-snow:has(+#eln-ed-procedure) button.ql-active .ql-fill{fill:var(--accent)}
.ql-snow .ql-tooltip{z-index:9999}
.eln-del-btn{color:var(--text3);background:none;border:none;cursor:pointer;padding:4px 8px;border-radius:var(--r-xs);font-size:12px}
.eln-del-btn:hover{background:var(--bg3);color:var(--red)}

/* ── ACTIVITY PAGE ────────────────────────────────────────────── */
.activity-list{margin-top:16px}

/* ── ACTIVITY LOG (collapsed under Statistics) ───────────────────── */
.act-day-header{font-size:11px;font-weight:600;color:var(--text3);text-transform:uppercase;letter-spacing:.03em;padding:14px 0 5px}
.act-day-header:first-child{padding-top:0}

/* ── MODULE ACCESS (Admin > Settings) ────────────────────────────── */
.modlock-table{display:flex;flex-direction:column;gap:10px}
.modlock-row{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.modlock-name{width:260px;flex-shrink:0;font-size:13px;color:var(--text2)}
.modlock-hint{font-size:var(--ui-caption);color:var(--text3);line-height:1.35;margin-top:2px}
.modlock-row .module-lock-reason{flex:1;min-width:180px;max-width:360px;font-size:12px;padding:4px 8px}

/* ── STATS PAGE ───────────────────────────────────────────────── */
.stats-section{margin-bottom:24px}
.stats-section h3{font-size:13px;font-weight:500;margin-bottom:12px;color:var(--text2)}
/* Two charts side by side instead of stacked full-width — half the height
   on screen for the same data, so a tab reads as a dashboard you can take
   in at a glance rather than a long scroll of skinny strips. Collapses to
   one column on anything narrower than a small laptop. */
.stats-grid-2{display:grid;grid-template-columns:1fr 1fr;gap:20px;margin-bottom:24px}
.stats-grid-2>.stats-section{margin-bottom:0}
@media(max-width:900px){.stats-grid-2{grid-template-columns:1fr}}
.stat-grid-wide{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;margin-bottom:20px}
.bar-row{display:flex;align-items:center;gap:10px;margin-bottom:7px;font-size:12px}
.bar-label{width:100px;color:var(--text2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex-shrink:0}
.bar-track{flex:1;background:var(--bg3);border-radius:var(--r-xs);height:8px;overflow:hidden}
.bar-fill{height:100%;border-radius:var(--r-xs)}
.bar-count{font-family:var(--mono);font-size:11px;color:var(--text3);width:40px;text-align:right;flex-shrink:0}

/* ── ADMIN PAGE ───────────────────────────────────────────────── */
.admin-section{margin-bottom:32px}
.admin-section h3{font-size:var(--ui-section);font-weight:600;margin-bottom:14px;padding-bottom:10px;border-bottom:2px solid var(--border);color:var(--text)}
.user-table{width:100%;border-collapse:collapse;font-size:12px}
.user-table th{font-family:var(--sans);font-size:var(--ui-label);color:var(--text3);font-weight:700;padding:8px 10px;text-align:left;border-bottom:1px solid var(--border);background:var(--bg3);text-transform:uppercase;letter-spacing:.05em}
.user-table td{padding:10px 10px;border-bottom:1px solid var(--border);color:var(--text2);vertical-align:middle}
.user-table tbody tr{transition:background .1s}
.user-table tr:hover td{background:var(--bg3)}
.role-badge{font-family:var(--mono);font-size:10px;padding:3px 8px;border-radius:var(--r-sm);font-weight:600}
.rb-admin{background:var(--accent-light);color:var(--accent-ink)}
.rb-member{background:var(--bg3);color:var(--text3)}
.status-dot{width:8px;height:8px;border-radius:50%;display:inline-block}

/* ── PROJECT MULTI-SELECT ─────────────────────────────────────── */
.proj-select-list{display:flex;flex-direction:column;gap:2px;max-height:120px;overflow-y:auto;border:1px solid var(--border2);border-radius:var(--r-xs);padding:6px}
.proj-sel-item{display:flex;align-items:center;gap:5px;padding:3px 5px;border-radius:var(--r-xs);cursor:pointer;font-size:12px;color:var(--text2)}
.proj-sel-item:hover{background:var(--bg3)}
.proj-sel-item input[type=checkbox]{accent-color:var(--accent);width:13px;height:13px;flex-shrink:0;margin:0}

/* ── EQUIPMENT TAB ────────────────────────────────────────────── */
.equip-grid{display:flex;flex-direction:column;gap:2px}
.equip-table{border-collapse:collapse;width:100%;font-size:13px}
.equip-table thead th{text-align:left;padding:8px 12px;font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--text3);border-bottom:2px solid var(--border2);background:var(--bg2);position:sticky;top:0;z-index:1}
.equip-table thead th.eqt-actions-col{width:1%}
.equip-table td{padding:9px 12px;border-bottom:1px solid var(--border);vertical-align:top}
.equip-table-cat td{padding:14px 12px 6px;font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text3);border-bottom:none}
.equip-table-row{cursor:pointer;transition:background .12s}
.equip-table-row:hover{background:var(--bg2)}
.equip-table-row.inactive{opacity:.55}
.equip-table-row.not-bookable{cursor:default}
.equip-table-row.not-bookable:hover{background:none}
.eqt-name-cell{font-size:13px;font-weight:600;min-width:160px}
.eqt-badge{display:inline-block;font-size:10px;font-weight:600;color:var(--text3);background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-xs);padding:1px 6px}
.eqt-badge-icon{display:inline-flex;align-items:center;justify-content:center;padding:2px;line-height:0}
.eqt-badge-icon svg{vertical-align:middle}
.eqt-empty{color:var(--text3)}
.eqt-location-link{cursor:pointer;border-radius:4px;padding:1px 3px;margin:-1px -3px}
.eqt-location-link:hover{background:var(--accent-light);color:var(--accent-ink)}
.equip-row-desc{font-size:12px;color:var(--text2);line-height:1.4;margin-top:3px;font-weight:400}
.eqt-actions{white-space:nowrap}
/* the flex box lives inside the cell: a td with display:flex stops being a table cell, so the
   action block drew as its own column whose dividers never lined up with the rows */
.eqt-actions-inner{display:flex;align-items:center;justify-content:flex-end;gap:6px}
.eqt-status{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:600;white-space:nowrap;color:var(--text2)}
.eqt-status::before{content:'';width:7px;height:7px;border-radius:50%;background:currentColor;flex-shrink:0}
.eqt-st-free{color:var(--green-ink)}
.eqt-st-busy{color:var(--red)}
.eqt-st-warn{color:var(--orange-ink)}
.eqt-st-assigned{color:var(--accent-ink)}
.eqt-st-off{color:var(--text3)}
.equip-until-line{font-size:11px;color:var(--text3);margin-top:2px}
.equip-status{width:7px;height:7px;border-radius:50%;flex-shrink:0;display:inline-block}
.equip-status.on{background:var(--green)}
.equip-status.off{background:var(--text3)}
.equip-status.busy{background:var(--red);animation:equip-status-pulse 1.6s ease-in-out infinite}
@keyframes equip-status-pulse{0%,100%{opacity:1}50%{opacity:.35}}
@media(prefers-reduced-motion:reduce){.equip-status.busy{animation:none}}

/* ── Cleaning tasks table (Lab > Tasks) ──────────────────────────── */
.cln-table{border-collapse:collapse;width:100%;font-size:13px}
.cln-table thead th{text-align:left;padding:8px 12px;font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--text3);border-bottom:2px solid var(--border2);background:var(--bg2);position:sticky;top:0;z-index:1}
.cln-table td{padding:9px 12px;border-bottom:1px solid var(--border);vertical-align:top}
.cln-table-row{cursor:pointer;transition:background .12s}
.cln-table-row:hover{background:var(--bg2)}
.cln-table-row.mine-today{background:color-mix(in srgb,var(--accent) 7%,transparent)}
.cln-table-row.mine-today:hover{background:color-mix(in srgb,var(--accent) 12%,transparent)}
.cln-table-row.mine-today td:first-child{box-shadow:inset 2px 0 0 var(--accent)}
.cln-mine-chip{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;color:var(--accent-ink);background:color-mix(in srgb,var(--accent) 16%,transparent);padding:2px 6px;border-radius:var(--r-xs);white-space:nowrap}
.cln-name-cell{display:flex;align-items:center;gap:8px;font-size:13px;font-weight:600;min-width:160px}
.cln-row-summary{font-size:12px;color:var(--text3)}
.cln-overdue-summary{color:var(--chip-red-fg);font-weight:600}
.cln-row-chevron{flex-shrink:0;color:var(--text3);transition:transform .15s}
.cln-table-row.expanded .cln-row-chevron{transform:rotate(90deg)}
.cln-table-body-row td{cursor:default;background:var(--bg2)}
.cln-table-body-row .btn{cursor:pointer}
.equip-busy-badge{color:var(--red);font-weight:600}
.equip-free-badge{color:var(--green-ink);font-weight:600}

/* ══ Equipment > Map ═══════════════════════════════════════════ */
#map-room-bar{display:flex;align-items:center;gap:8px;padding:10px 16px;border-bottom:1px solid var(--border);flex-wrap:wrap}
#map-room-pills{display:flex;gap:6px;flex-wrap:wrap;flex:1}
#map-mode-toggle{display:flex;background:var(--bg3);border-radius:var(--r-md);padding:2px;gap:1px}
#map-mode-toggle button{border:none;background:transparent;color:var(--text2);font-size:12px;font-weight:600;padding:5px 12px;border-radius:calc(var(--r-md) - 2px);cursor:pointer;transition:background .12s,color .12s}
#map-mode-toggle button.active{background:var(--bg2);color:var(--text);box-shadow:var(--shadow-sm)}
.map-draw-tools{display:flex;align-items:center;gap:4px;padding:2px 6px;background:var(--bg3);border-radius:var(--r-md)}
.map-draw-tools .icon-btn.armed{background:var(--accent-ink);color:var(--on-accent)}
.map-shape-picker{position:absolute;top:calc(100% + 6px);left:0;z-index:30;display:flex;gap:2px;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-md);padding:4px;box-shadow:var(--shadow-md)}
.map-shape-picker button{border:none;background:transparent;color:var(--text2);padding:6px;border-radius:6px;cursor:pointer;display:flex;transition:background .12s,color .12s}
.map-shape-picker button:hover{background:var(--bg3);color:var(--text)}
#map-body{display:flex;flex:1;overflow:hidden}
#map-canvas-wrap{flex:1;overflow:auto;padding:20px;display:flex;align-items:flex-start;justify-content:center;background:var(--bg)}
#map-canvas{position:relative;display:inline-block;max-width:100%;transition:filter .15s}
#map-canvas img{max-width:100%;display:block;border-radius:var(--r-lg);border:1px solid var(--border);box-shadow:var(--shadow-md);-webkit-user-drag:none;user-select:none}
#map-canvas.empty{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;width:100%;min-height:300px;color:var(--text3);font-size:13px;text-align:center}
#map-canvas.drag-over img{outline:2px dashed var(--accent);outline-offset:2px}
#map-sidebar{width:220px;flex-shrink:0;border-left:1px solid var(--border);padding:14px;overflow-y:auto}
.map-sidebar-title{font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--text3);margin-bottom:10px}
#map-status-filters{margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid var(--border)}
.map-group-title{font-size:10px;font-weight:700;letter-spacing:.03em;text-transform:uppercase;color:var(--text3);margin:12px 0 6px;padding-top:8px;border-top:1px solid var(--border);cursor:pointer;border-radius:4px;transition:color .12s}
.map-group-title:first-child{margin-top:0;padding-top:0;border-top:none}
.map-group-title:hover{color:var(--accent-ink)}
.map-group-title.selected{color:var(--accent-ink)}
.map-unplaced-chip{padding:7px 10px;border:1px solid var(--border);border-radius:var(--r-md);font-size:13px;margin-bottom:6px;cursor:pointer;background:var(--bg2);transition:border-color .15s,background .15s}
.map-unplaced-chip:hover{border-color:var(--accent)}
.map-unplaced-chip:active{cursor:grabbing}
.map-unplaced-chip.selected{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 10%,var(--bg2))}
.map-unplaced-chip .mc-dot{display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:6px;vertical-align:middle}

.map-area{position:absolute;border-radius:6px;border:1.5px solid transparent;cursor:grab;box-sizing:border-box;min-width:12px;min-height:12px;box-shadow:0 1px 3px rgba(0,0,0,.12);transition:opacity .18s,filter .18s}
.map-area:hover{z-index:4}
.map-area:active{cursor:grabbing}
#map-canvas.edit-mode .map-area{cursor:grab}
#map-canvas:not(.edit-mode) .map-area{cursor:pointer}
.map-area-busy{background:color-mix(in srgb,var(--red) 26%,transparent);border-color:color-mix(in srgb,var(--red) 70%,transparent)}
.map-area-free{background:color-mix(in srgb,var(--green) 26%,transparent);border-color:color-mix(in srgb,var(--green) 70%,transparent)}
.map-area-maintenance{background:color-mix(in srgb,var(--orange) 26%,transparent);border-color:color-mix(in srgb,var(--orange) 70%,transparent)}
.map-area-assigned{background:color-mix(in srgb,var(--accent) 26%,transparent);border-color:color-mix(in srgb,var(--accent) 70%,transparent)}
.map-area-inactive{background:color-mix(in srgb,var(--text3) 20%,transparent);border-color:color-mix(in srgb,var(--text3) 60%,transparent)}
.map-area-drawing{background:color-mix(in srgb,var(--accent) 14%,transparent);border:2px dashed var(--accent);pointer-events:none;box-shadow:none}
.map-area.highlighted{filter:brightness(1.15) saturate(1.3);box-shadow:0 0 0 2px var(--bg2),0 0 0 4px var(--accent),0 4px 14px rgba(0,0,0,.25);z-index:5}
.map-area.dimmed{opacity:.25}
/* Free-standing work areas (RoomMarker) — a dashed neutral zone, distinct
   from equipment's solid status colors since a marker has no status. Custom
   color (--marker-color) is optional; falls back to --text3. */
.map-marker-area{background:color-mix(in srgb,var(--marker-color,var(--text3)) 16%,transparent);border:1.5px dashed color-mix(in srgb,var(--marker-color,var(--text3)) 65%,transparent);z-index:1}
.map-marker-area .map-area-label{color:var(--text2);font-weight:600}
/* Safety-icon markers (extinguisher, exit, shower...) — a small solid badge
   rather than a dashed zone, since these mark one physical fixture, not an
   area. Green reads as "safety equipment" without hijacking the semantic
   status colors equipment areas use. */
.map-marker-safety{background:color-mix(in srgb,var(--red) 18%,var(--bg2));border:1.5px solid color-mix(in srgb,var(--red) 55%,transparent);z-index:2}
.map-marker-safety .map-area-icon{color:var(--red)}

/* Free-floating text — no box at all, just the label */
.map-marker-text{background:none;border:none;box-shadow:none;z-index:2}
.map-marker-text .map-area-label{color:var(--text);font-weight:700;font-size:13px;white-space:nowrap}

/* Decorative shapes (square/circle/arrow) — pure diagramming, no label */
.map-marker-shape{background:color-mix(in srgb,var(--marker-color,var(--text2)) 30%,transparent);border:1.5px solid color-mix(in srgb,var(--marker-color,var(--text2)) 70%,transparent);z-index:1}
.map-shape-circle{border-radius:50%}
.map-shape-square{border-radius:4px}
.map-shape-arrow{background:none;border:none;box-shadow:none;color:var(--marker-color,var(--text2))}
.map-shape-arrow-svg{position:absolute;inset:12%;width:76%;height:76%}
.map-safety-chip{display:flex;align-items:center;gap:7px}
.map-safety-chip svg{flex-shrink:0;color:var(--red)}
#map-canvas.armed-draw{cursor:crosshair}
#map-canvas.armed-draw .map-area{pointer-events:none}
.map-area-icon{display:inline-flex;color:var(--text);filter:drop-shadow(0 0 2px var(--bg2)) drop-shadow(0 0 2px var(--bg2))}
.map-area-label{font-size:10px;font-weight:700;color:var(--text);background:color-mix(in srgb,var(--bg2) 82%,transparent);border-radius:3px;padding:0 4px;line-height:1.5;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
.map-area-assignee{font-size:9px;font-weight:600;color:var(--accent-ink);background:color-mix(in srgb,var(--bg2) 82%,transparent);border-radius:3px;padding:0 4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100%}
/* Single always-present, always-positioned label — centered on the box by
   default, moved to wherever it was last dragged otherwise (see
   _mapPositionLabels/_mapBindLabelDrag in equipment.js). A narrow area
   rotates its label 90° instead of clipping it, and a too-small/dragged-out
   one gets a short leader line, same idea as a map-pin callout. */
.map-area-label-pos{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);display:flex;flex-direction:column;align-items:center;gap:1px;pointer-events:none;z-index:3;max-width:160px;padding:3px}
.map-area-label-pos.outside .map-area-label,.map-area-label-pos.outside .map-area-assignee{white-space:nowrap;max-width:none}
/* Leader line — real geometry (see _mapPositionLabels), not a fixed tick:
   left/top/width/transform are all set from JS per-area so it always runs
   from whichever side of the box faces the label to whichever side of the
   label faces the box. */
.map-area-line{position:absolute;left:0;top:0;height:1px;width:0;background:var(--text3);transform-origin:0 50%;pointer-events:none;z-index:2;display:none}
.map-area-label-pos.vertical{flex-direction:row}
.map-area-label-pos.vertical .map-area-label,
.map-area-label-pos.vertical .map-area-assignee{writing-mode:vertical-rl;text-orientation:mixed;white-space:nowrap;max-height:100%}
/* Only receives pointer events (and this hover) once _mapBindLabelDrag has
   set pointer-events:auto inline — i.e. only in edit mode, and only after
   this element is actually draggable, so the affordance can't lie. */
.map-area-label-pos:hover{outline:1.5px dashed var(--accent);outline-offset:2px;border-radius:4px}
.map-area-delete{position:absolute;top:-8px;right:-8px;width:16px;height:16px;border-radius:50%;border:1px solid var(--border);background:var(--bg2);color:var(--text2);font-size:9px;line-height:1;display:flex;align-items:center;justify-content:center;cursor:pointer;opacity:0;transition:opacity .12s,background .12s,color .12s}
.map-area:hover .map-area-delete{opacity:1}
.map-area-delete:hover{background:var(--red);color:#fff;border-color:var(--red)}
/* Open-issue badge — always visible (not hover-only like delete), opposite
   corner so the two never collide. */
.map-area-issue{position:absolute;top:-8px;left:-8px;width:18px;height:18px;border-radius:50%;border:1px solid var(--bg2);background:var(--red);color:#fff;display:flex;align-items:center;justify-content:center;cursor:pointer;z-index:6;box-shadow:0 1px 3px rgba(0,0,0,.25);padding:0}
.map-area-issue svg{width:11px;height:11px}
.map-area-issue:hover{filter:brightness(1.15)}
.map-area-handle{position:absolute;width:9px;height:9px;background:var(--bg2);border:1.5px solid var(--text);border-radius:2px;opacity:0;transition:opacity .12s}
.map-area:hover .map-area-handle{opacity:1}
.map-area-handle-nw{top:-5px;left:-5px;cursor:nwse-resize}
.map-area-handle-se{bottom:-5px;right:-5px;cursor:nwse-resize}
.map-area-handle-ne{top:-5px;right:-5px;cursor:nesw-resize}
.map-area-handle-sw{bottom:-5px;left:-5px;cursor:nesw-resize}

/* Edit-mode click menu on an area — Remove from map / Move label out|in.
   position:fixed + viewport coords (see _mapOpenAreaMenu), same small-card
   look as .user-dropdown. */
.map-area-menu{position:fixed;z-index:2100;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-lg);min-width:170px;overflow:hidden;box-shadow:var(--shadow-md)}
.map-area-menu button{display:block;width:100%;padding:9px 14px;text-align:left;background:transparent;border:none;color:var(--text2);font-size:12px;font-family:var(--sans);cursor:pointer;transition:background .1s,color .1s}
.map-area-menu button:hover{background:var(--bg3);color:var(--text)}
.map-area-menu button.danger:hover{color:var(--red)}

/* Hover info card — cursor-following, same pattern as #well-tooltip/
   #bio-exp-tooltip (see _positionTooltip in boxes.js) */
#map-tooltip{position:fixed;z-index:2000;pointer-events:none;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-md);box-shadow:var(--shadow-lg);padding:11px 13px;font-size:12px;display:none;width:230px}
#map-tooltip .mtt-name{font-weight:700;color:var(--text);font-size:13px;margin-bottom:2px}
#map-tooltip .mtt-status{font-size:11px;font-weight:600;margin-bottom:6px}
#map-tooltip .mtt-desc{color:var(--text2);font-size:12px;line-height:1.4;margin-bottom:6px}
#map-tooltip .mtt-row{display:flex;justify-content:space-between;gap:8px;font-size:11px;padding:3px 0;border-top:1px solid var(--border)}
#map-tooltip .mtt-row span:first-child{color:var(--text3);flex-shrink:0}
#map-tooltip .mtt-row span:last-child{text-align:right;color:var(--text)}
/* agenda */
.equip-agenda-wrap{overflow-x:auto;overflow-y:auto;flex:1}
.equip-agenda-inner{min-width:660px}
.equip-agenda-header{display:grid;grid-template-columns:52px repeat(7,1fr);position:sticky;top:0;z-index:2;background:var(--bg2);border-bottom:2px solid var(--border2);box-shadow:var(--shadow-sm)}
.equip-agenda-header .equip-day-hdr{padding:10px 4px 8px;text-align:center;display:flex;flex-direction:column;align-items:center;gap:2px;font-size:10px;font-weight:600;color:var(--text3);text-transform:uppercase;letter-spacing:.05em}
.equip-day-num{width:26px;height:26px;display:flex;align-items:center;justify-content:center;border-radius:50%;font-size:14px;font-weight:600;color:var(--text2);letter-spacing:-.01em;line-height:1}
.equip-agenda-header .equip-day-hdr.today{color:var(--accent-ink)}
.equip-agenda-header .equip-day-hdr.today .equip-day-num{background:var(--accent-ink);color:var(--on-accent)}
.equip-agenda-body{display:grid;grid-template-columns:52px repeat(7,1fr);padding-top:6px}
.equip-time-gutter{position:relative;background:var(--bg2)}
.equip-time-label{position:absolute;right:7px;font-size:10px;color:var(--text3);transform:translateY(-50%);font-family:var(--mono);white-space:nowrap}
.equip-day-col{position:relative;border-left:1px solid var(--border);cursor:pointer;transition:background .1s}
.equip-day-col:hover{background:color-mix(in srgb,var(--accent) 4%,transparent)}
.equip-offhour{position:absolute;left:0;right:0;background:var(--bg3);pointer-events:none;opacity:.6}
.equip-hour-line{position:absolute;left:0;right:0;border-top:1px solid var(--border)}
.equip-half-line{position:absolute;left:0;right:0;border-top:1px dashed var(--border);opacity:.4}
.equip-now-line{position:absolute;left:0;right:0;border-top:2px solid var(--red);z-index:3;pointer-events:none}.equip-now-line::before{content:'';position:absolute;left:-4px;top:-4px;width:8px;height:8px;border-radius:50%;background:var(--red)}
.equip-booking{position:absolute;left:3px;right:3px;border-radius:var(--r-sm);padding:4px 7px;font-size:11px;overflow:hidden;cursor:default;z-index:1;border-left-width:3px;border-left-style:solid;transition:box-shadow .12s,filter .12s}
.equip-booking.mine{cursor:pointer}
.equip-booking.mine:hover{filter:brightness(.92);box-shadow:0 2px 8px rgba(0,0,0,.12)}
.equip-booking-user{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-size:11px}
.equip-booking-time{font-size:10px;opacity:.75;font-family:var(--mono);margin-top:1px}
/* overview */
.equip-overview-wrap{overflow-x:auto}
.equip-overview-table{border-collapse:collapse;width:100%;min-width:640px;font-size:12px}
.equip-overview-table th{padding:8px 8px;text-align:center;font-size:11px;font-weight:600;color:var(--text2);border-bottom:2px solid var(--border2);white-space:nowrap;text-transform:uppercase;letter-spacing:.04em}
.equip-overview-table th.eq-name-col{text-align:left;width:140px;text-transform:none;font-size:12px}
.equip-overview-table th.today-col{color:var(--accent-ink);background:var(--accent-light)}
.equip-overview-table td{border:1px solid var(--border);padding:2px;vertical-align:top;height:56px;cursor:pointer}
.equip-overview-table td:hover{background:var(--bg3)}
.equip-overview-table td.eq-name-cell{cursor:default;padding:6px 8px;font-weight:500;color:var(--accent-ink);vertical-align:middle;border-right:2px solid var(--border2);display:flex;align-items:center;gap:4px}
.equip-overview-table td.eq-name-cell:hover{background:var(--accent-light)}
.eq-name-cell-label{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.eq-name-cell .icon-btn{flex-shrink:0;opacity:.55}
.eq-name-cell .icon-btn:hover{opacity:1}
.equip-overview-cell{position:relative;width:100%;height:52px}
.equip-ov-block{position:absolute;top:2px;height:calc(100% - 4px);border-radius:var(--r-xs);min-width:3px;overflow:hidden;font-size:9px;padding:1px 3px;white-space:nowrap;border-left-width:2px;border-left-style:solid}
/* reagent catalog list rows */
.rs-row{display:flex;gap:8px;align-items:center;padding:8px 12px;border-bottom:1px solid var(--border);cursor:pointer;transition:background .1s}
.rs-row:hover{background:var(--bg2)}
.rs-row.active{background:var(--accent-light);border-left:2px solid var(--accent)}
.rs-row-thumb{width:44px;height:44px;flex-shrink:0;background:var(--bg2);border-radius:var(--r-sm);overflow:hidden;display:flex;align-items:center;justify-content:center;border:1px solid var(--border)}
.rs-row-body{flex:1;min-width:0}
.rs-row-name{font-size:12px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rs-row-meta{font-size:10px;color:var(--text3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;margin-top:1px}
.rs-row-stock{font-size:10px;font-weight:500;flex-shrink:0;text-align:right}
/* month calendar */
#equip-month-inner{padding:12px 16px}
.equip-month-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:0;border-top:1px solid var(--border);border-left:1px solid var(--border)}
.equip-month-head{text-align:center;font-size:11px;font-weight:600;color:var(--text3);padding:6px 4px;border-right:1px solid var(--border);border-bottom:2px solid var(--border2)}
/* min-width:0 is load-bearing: a grid item's default auto-minimum is its
   content's min-content width, and a nowrap+ellipsis event label (long
   absence name, long celebration title...) has nothing to wrap to — so
   that day's column silently grew wider than the other six until this
   overrode it, ellipsis clipping only kicking in *after* the column had
   already been sized against the unwrapped text. */
.equip-month-cell{min-height:88px;min-width:0;overflow:hidden;border-right:1px solid var(--border);border-bottom:1px solid var(--border);padding:4px;cursor:pointer;transition:background .1s}
.equip-month-cell:hover{background:var(--accent-light)}
.equip-month-cell.emc-today .equip-month-day-num{background:var(--accent-ink);color:var(--on-accent);border-radius:50%;width:20px;height:20px;display:flex;align-items:center;justify-content:center;font-weight:700}
.equip-month-cell.emc-other{opacity:.45}
.equip-month-cell.emc-drag-sel{background:var(--accent-light);box-shadow:inset 0 0 0 1px var(--accent)}
.equip-month-cell{user-select:none}
.equip-month-day-num{font-size:12px;font-weight:500;color:var(--text2);margin-bottom:3px;width:20px;height:20px;display:flex;align-items:center;justify-content:center}
.equip-month-event{font-size:10px;border-radius:var(--r-xs);padding:1px 4px;margin-bottom:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;border-left-width:2px;border-left-style:solid;cursor:pointer}
.equip-month-event:hover{filter:brightness(1.1)}
.equip-month-more{font-size:10px;color:var(--text3);padding-left:4px}
/* Tasks month calendar tends to have more entries per day than Bookings/Team, so it gets a taller cell */
#maint-month-wrap .equip-month-cell{min-height:150px}

/* ── TOAST ────────────────────────────────────────────────────── */
.toast{position:fixed;bottom:24px;right:24px;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-lg);padding:11px 16px 11px 14px;font-size:13px;z-index:500;transform:translateY(80px);opacity:0;transition:transform .25s cubic-bezier(.34,1.56,.64,1),opacity .2s ease;pointer-events:none;box-shadow:var(--shadow-md);display:flex;align-items:center;gap:9px;max-width:320px;font-weight:500}
.toast::before{font-size:15px;flex-shrink:0}
.toast.show{transform:translateY(0);opacity:1}
.toast.success{border-left:3px solid var(--green);color:var(--green-ink);border-color:color-mix(in srgb,var(--green) 30%,var(--border))}
.toast.success::before{content:'✓'}
.toast.error{border-left:3px solid var(--red);color:var(--red);border-color:color-mix(in srgb,var(--red) 30%,var(--border))}
.toast.error::before{content:'✕'}
.toast.info{border-left:3px solid var(--accent);color:var(--accent-ink);border-color:color-mix(in srgb,var(--accent) 30%,var(--border))}
.toast.info::before{content:'ℹ'}

.empty{text-align:center;padding:40px 20px;color:var(--text3);font-size:13px;line-height:1.6}
.empty-sm{color:var(--text3);font-size:12px;padding:10px 12px}
.page-header{display:flex;align-items:center;justify-content:space-between;padding-bottom:16px;margin-bottom:20px;border-bottom:1px solid var(--border)}
.page-title{font-size:16px;font-weight:700;letter-spacing:-.02em;color:var(--text)}
/* The subtab-strip's own section name (Chemistry/Biology/.../Orders) —
   scoped to a direct child of .subtab-strip so this doesn't also mute the
   unrelated sidebar-header "Filters"/"Bio Results"/etc. .page-titles
   elsewhere, which keep the default near-black. Same gray as the
   inactive sub-tabs right next to it (.subtab uses --text3 too) — size
   and weight alone are what still set it apart as the section anchor. */
.subtab-strip>.page-title{color:var(--text3)}

/* ── DRAW BUTTON ──────────────────────────────────────────────── */
.btn-draw{display:inline-flex;align-items:center;gap:4px;padding:4px 9px;border-radius:var(--r-xs);font-size:11px;cursor:pointer;border:1px solid var(--border2);background:var(--bg3);color:var(--text2);transition:all .15s;white-space:nowrap}
.btn-draw:hover{border-color:var(--border2);color:var(--text)}

/* ── STOCK TYPE SELECTOR ──────────────────────────────────────── */
.stock-type-seg{display:flex;background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-sm);overflow:hidden;margin-bottom:12px}
.stock-type-seg label{flex:1;text-align:center;padding:6px 4px;font-size:11px;cursor:pointer;color:var(--text2);transition:all .15s;user-select:none}
.stock-type-seg input[type=radio]{display:none}
.stock-type-seg label:has(input:checked){background:var(--accent-ink);color:var(--on-accent)}

/* ── BOXES PAGE ───────────────────────────────────────────────── */
.boxes-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:14px;margin-top:12px}
.box-card{background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-lg);overflow:hidden;transition:border .15s,box-shadow .15s,transform .15s;cursor:pointer;box-shadow:var(--shadow-sm)}
.box-card:hover{border-color:var(--accent);box-shadow:var(--shadow-md);transform:translateY(-1px)}
.box-card-header{padding:12px 14px 8px;display:flex;align-items:flex-start;justify-content:space-between;gap:8px}
.box-card-title{font-size:13px;font-weight:500}
.box-card-meta{font-size:11px;color:var(--text3);margin-top:2px}
.box-mini-wrap{padding:2px 14px 10px}
.box-mini-grid{display:inline-flex;flex-direction:column;gap:1px}
.box-mini-row{display:flex;gap:1px}
.box-mini-cell{width:9px;height:9px;border-radius:1px}
.plate-mini-cell{width:9px;height:9px;border-radius:50%}
.box-card-footer{padding:8px 14px;border-top:1px solid var(--border);display:flex;align-items:center;gap:10px;font-size:11px;color:var(--text3)}
.box-occ-bar{flex:1;background:var(--bg3);border-radius:var(--r-xs);height:4px;overflow:hidden}
.box-occ-fill{height:100%;border-radius:var(--r-xs);background:var(--accent)}

/* ── BOX DETAIL GRID ──────────────────────────────────────────── */
.box-detail-wrap{overflow:auto;margin-top:10px}
.box-detail-tbl{border-collapse:separate;border-spacing:3px}
.bd-corner{width:18px;height:18px}
.bd-col-lbl{font-size:9px;color:var(--text3);font-family:var(--mono);text-align:center;min-width:34px}
.bd-row-lbl{font-size:9px;color:var(--text3);font-family:var(--mono);vertical-align:middle;padding-right:4px;text-align:right;width:18px}
.bd-cell{width:34px;min-width:34px;height:34px;border-radius:50%;border:1px solid var(--border);cursor:pointer;text-align:center;vertical-align:middle;font-size:8px;font-family:var(--mono);transition:all .12s;user-select:none;line-height:1.2;padding:2px;overflow:hidden}
.bd-cell.empty{background:var(--bg3);color:var(--text3)}
.bd-cell.empty:hover{border-color:var(--accent);background:var(--accent-light);color:var(--accent-ink)}
.bd-cell.occupied{color:#fff;font-weight:500}
.bd-cell.occupied:hover{filter:brightness(1.1);transform:scale(1.12);z-index:1;position:relative;box-shadow:var(--shadow-md)}
.bd-cell.highlighted{outline:2px solid var(--accent);outline-offset:2px}

/* ── COMPOUND MODAL (stacked over box view) ───────────────────── */
#compound-modal-overlay{z-index:400}
/* _pjZoomStructure is opened from inside other already-open modals (Molecule,
   reagent requests, ELN structure thumbnails...) — needs a higher z-index
   than the base .modal-overlay, not just DOM order, or whichever of the two
   .modal-overlay elements happened to be created first in the page's
   lifetime silently wins the tie and the zoom view opens behind it. */
#structure-zoom-modal{z-index:400}
.structure-zoom-dialog{width:min(860px,94vw)!important;max-width:94vw!important}
#structure-zoom-body{display:flex;justify-content:center;align-items:center;min-height:min(540px,72vh);overflow:auto}
#structure-zoom-body svg{display:block;max-width:100%;max-height:72vh;width:auto;height:auto}
/* Confirm/prompt must always sit above whatever modal spawned them — #info-modal
   and #prompt-modal are appended to <body> at first use, so DOM order alone would
   paint them over the (static, earlier) #confirm-modal. */
#prompt-modal{z-index:450}
#confirm-modal{z-index:500}
/* Same DOM-order problem as above: Ketcher is opened from inside another
   already-open modal (compound edit, molecule detail, ELN row…) far more
   often than from the bare page, so it must always win regardless of which
   modal happens to come later in the DOM. */
#draw-modal{z-index:520}
.cm-grid{display:grid;grid-template-columns:240px 1fr;gap:16px;margin-bottom:14px}
#cm-svg{background:var(--bg3);border-radius:var(--r-md);display:flex;align-items:center;justify-content:center;min-height:155px;border:1px solid var(--border);overflow:hidden}
#cm-svg svg{max-width:230px;max-height:155px}
.cm-prop{display:flex;justify-content:space-between;font-size:11px;padding:3px 0;border-bottom:1px solid var(--divider)}
.cm-prop span:first-child{color:var(--text3)}
.cm-prop span:last-child{font-family:var(--mono);text-align:right}
.cm-stock-row{display:flex;justify-content:space-between;align-items:center;font-size:11px;padding:4px 0;border-bottom:1px solid var(--divider)}
#cm-loguse{background:var(--bg3);border-radius:var(--r-sm);padding:9px 12px;margin-bottom:12px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
#cm-vol{width:68px;font-size:12px}
#cm-qty{width:68px;font-size:12px}
#cm-stock-sel{font-size:12px;flex:1;min-width:100px}
/* Move mode */
#move-bar{display:none;align-items:center;gap:8px;background:var(--accent-light);border:1px solid color-mix(in srgb,var(--accent) 22%,transparent);border-radius:var(--r-md);padding:8px 12px;margin-bottom:10px;font-size:12px;flex-wrap:wrap}
#move-bar select{font-size:11px;padding:3px 6px;border-radius:var(--r-sm);border:1px solid var(--border2);background:var(--bg2);color:var(--text);cursor:pointer}
.bd-cell.move-src{outline:2px solid var(--orange) !important;outline-offset:2px}
.bd-cell.move-ok{background:color-mix(in srgb,var(--accent) 13%,transparent) !important;border-color:var(--accent) !important;cursor:crosshair !important}
/* Assign pick mode */
#assign-bar{display:none;align-items:center;gap:8px;background:color-mix(in srgb,var(--green) 10%,transparent);border:1px solid color-mix(in srgb,var(--green) 30%,transparent);border-radius:var(--r-md);padding:8px 12px;margin-bottom:10px;font-size:12px;flex-wrap:wrap}
.bd-cell.assign-ok{background:color-mix(in srgb,var(--green) 15%,transparent) !important;border-color:color-mix(in srgb,var(--green) 50%,transparent) !important;cursor:crosshair !important}
.bd-cell.move-ok:hover{background:color-mix(in srgb,var(--accent) 28%,transparent) !important;transform:scale(1.15) !important}
.bd-cell.move-blocked{opacity:0.3;cursor:not-allowed !important;pointer-events:none}
.bd-cell[draggable="true"]{cursor:grab}
.bd-cell[draggable="true"]:active{cursor:grabbing}
.bd-cell.drag-over{outline:2px solid var(--accent);background:color-mix(in srgb,var(--accent) 20%,transparent) !important;transform:scale(1.1);z-index:1;position:relative}

/* ── WELL TOOLTIP ─────────────────────────────────────────────── */
#well-tooltip{position:fixed;z-index:9999;background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-lg);padding:12px 14px;pointer-events:none;display:none;box-shadow:var(--shadow-lg);min-width:190px;max-width:230px}
#well-tooltip .wtt-id{font-family:var(--mono);font-size:13px;font-weight:600;color:var(--text);margin-bottom:2px}
#well-tooltip .wtt-pos{font-size:10px;color:var(--text3);margin-bottom:8px}
#well-tooltip .wtt-svg{text-align:center;min-height:70px;display:flex;align-items:center;justify-content:center;margin-bottom:8px}
#well-tooltip .wtt-svg svg{max-width:170px;max-height:90px;border-radius:var(--r-xs)}
#well-tooltip .wtt-row{display:flex;justify-content:space-between;font-size:10px;padding:2px 0;border-top:1px solid var(--border)}
#well-tooltip .wtt-row span:first-child{color:var(--text3)}
#well-tooltip .wtt-row span:last-child{font-family:var(--mono);color:var(--text)}

/* ── POSITION PICKER ──────────────────────────────────────────── */
.pp-wrap{overflow-x:auto;margin-top:8px}
.pp-tbl{border-collapse:separate;border-spacing:3px}
.pp-col-lbl{font-size:8px;color:var(--text3);font-family:var(--mono);text-align:center;min-width:28px}
.pp-row-lbl{font-size:8px;color:var(--text3);font-family:var(--mono);padding-right:4px;text-align:right;width:16px}
.pp-cell{width:28px;min-width:28px;height:28px;border-radius:50%;border:1px solid var(--border);font-size:7px;font-family:var(--mono);text-align:center;vertical-align:middle;transition:all .1s;user-select:none;overflow:hidden;line-height:1.2;padding:2px}
.pp-cell.empty{background:var(--bg3);cursor:pointer}
.pp-cell.empty:hover{border-color:var(--accent);background:var(--accent-light);transform:scale(1.1)}
.pp-cell.taken{background:var(--border2);color:var(--text2);cursor:default;font-weight:500}
.pp-cell.chosen{background:var(--accent-ink);border-color:var(--accent-ink);color:var(--on-accent);cursor:pointer;transform:scale(1.1);box-shadow:0 2px 8px color-mix(in srgb,var(--accent) 40%,transparent)}



/* ── CUSTOM CONFIRM ───────────────────────────────────────────── */
#confirm-modal .modal{max-width:380px}
#confirm-msg{font-size:13px;color:var(--text2);line-height:1.6;margin-bottom:18px}
#confirm-title{font-size:15px;font-weight:600;margin-bottom:8px}

/* ── PRINT LABEL ──────────────────────────────────────────────── */
@media print {
  body > *:not(#print-frame){ display:none!important }
  #print-frame{ display:block!important; position:static; background:#fff; }
}
#print-frame{ display:none }
/* ── ELN PDF report styles (injected into #print-frame) ─────── */
.eln-report{ font-family:-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif; font-size:11pt; color:#111; padding:18mm 20mm; max-width:none }
.eln-report h1{ font-size:15pt; font-weight:700; margin:0 0 2mm }
.eln-report h2{ font-size:10pt; font-weight:600; color:#444; margin:6mm 0 2mm; text-transform:uppercase; letter-spacing:.05em; border-bottom:0.5pt solid #ddd; padding-bottom:1mm }
.eln-report .rpt-header{ display:flex; justify-content:space-between; align-items:flex-start; border-bottom:1.5pt solid #111; padding-bottom:3mm; margin-bottom:5mm }
.eln-report .rpt-meta{ display:grid; grid-template-columns:auto 1fr; gap:1mm 6mm; font-size:9pt; margin-bottom:4mm }
.eln-report .rpt-meta .lbl{ color:#666; font-weight:500 }
.eln-report table{ width:100%; border-collapse:collapse; font-size:8.5pt; margin-bottom:4mm }
.eln-report table th{ background:#f0f0f0; border:0.5pt solid #ccc; padding:1.5mm 2mm; text-align:left; font-weight:600 }
.eln-report table td{ border:0.5pt solid #ccc; padding:1.5mm 2mm; vertical-align:top }
.eln-report table tr.role-catalyst td{ background:#fffbf0 }
.eln-report table tr.role-solvent  td{ background:#f0f8ff }
.eln-report table tr.role-product  td{ background:#f0fff4 }
.eln-report .rpt-conditions{ display:flex; gap:8mm; flex-wrap:wrap; font-size:9.5pt; margin-bottom:4mm; padding:2mm 3mm; background:#f8f8f8; border-radius:2mm }
.eln-report .rpt-conditions span{ white-space:nowrap }
.eln-report .rpt-conditions .lbl{ color:#666; font-size:8.5pt }
.eln-report .rpt-body{ white-space:pre-wrap; font-size:10pt; line-height:1.5; text-align:justify }
.eln-report .rpt-body ol,.eln-report .rpt-body ul{ padding-left:1.5em; margin:4px 0; white-space:normal }
.eln-report .rpt-body li{ margin:2px 0 }
.eln-report .rpt-footer{ margin-top:8mm; font-size:8pt; color:#999; border-top:0.5pt solid #ddd; padding-top:2mm }
.eln-report .rpt-scheme{ text-align:center; margin:3mm 0 5mm; page-break-inside:avoid }
.eln-report .rpt-scheme svg,.eln-report .rpt-scheme img{ max-width:100%; max-height:60mm }
.label-sheet{ display:flex; flex-wrap:wrap; gap:8mm; padding:10mm }
.vial-label{
  border:0.5pt solid #ccc; border-radius:2mm;
  padding:3mm; display:flex; flex-direction:column; justify-content:space-between;
  font-family:"SF Mono",Menlo,ui-monospace,"Courier New",monospace; box-sizing:border-box;
  page-break-inside:avoid; position:relative;
}
.vial-label .lbl-id{ font-size:var(--lbl-id,14pt); font-weight:700; letter-spacing:-.3px; line-height:1.1; white-space:nowrap; overflow:hidden; display:block; transform-origin:left center }
.vial-label .lbl-sub{ font-size:var(--lbl-body,7pt); color:#555; margin-top:0.5mm; line-height:1.15; white-space:nowrap; overflow:hidden; display:block; transform-origin:left center }
.vial-label .lbl-qty{ font-size:var(--lbl-body,7pt); font-weight:600; margin-top:0.5mm; line-height:1.15; white-space:nowrap; overflow:hidden; display:block; transform-origin:left center }
.vial-label .lbl-comment{ font-size:var(--lbl-body,7pt); font-weight:600; color:#111; line-height:1.2; white-space:nowrap; overflow:hidden; display:block; transform-origin:left center }
.vial-label .lbl-qr{ flex-shrink:0; margin-top:1mm }
.vial-label-inner{ display:flex; flex-direction:column; height:100%; overflow:hidden }
.vial-label-text{ flex:1 1 0; min-height:0; min-width:0; overflow:hidden }

/* ── MOBILE ───────────────────────────────────────────────────── */
@media(max-width:768px){
  header{padding:0 12px;gap:8px}
  nav{gap:0;padding:0 2px}
  nav .nav-item{padding:5px 8px;font-size:12px;height:32px}
  /* On a phone, nav sits between the logo and the user badge in one flex
     row; if those two never shrink, nav's flex:1 share collapses to almost
     nothing and its own overflow-x:auto has no real range to scroll
     within (observed: ~3px). Icon-only nav items + icon-only logo/user
     badge reclaim that width so nav actually has room to scroll, and stay
     tappable (each still opens the same tab/menu via its existing
     onclick). */
  .logo>svg{display:none}
  .nav-label{display:none}
  .user-badge>div:not(.user-avatar){display:none}
  .user-badge{padding:5px 6px;gap:0}
  aside{display:none;position:fixed;left:0;top:56px;bottom:0;z-index:200;width:260px;box-shadow:4px 0 24px rgba(0,0,0,.12);border-right:1px solid var(--border)}
  aside.open{display:flex;flex-direction:column;animation:slide-in-left .2s cubic-bezier(.4,0,.2,1)}
  @keyframes slide-in-left{from{transform:translateX(-100%)}to{transform:translateX(0)}}
  #mobile-menu-btn{display:flex}
  .dp.open{width:100%!important;right:0!important;transform:none!important;border-left:none;border-radius:0}
  .modal{width:100vw;max-width:100vw;border-radius:var(--r-xl) var(--r-xl) 0 0;padding:20px 20px;position:fixed;bottom:0;left:0;right:0;max-height:90vh;margin:0}
  .modal-overlay{align-items:flex-end}
  .btn{min-height:40px;padding:8px 14px}
  .form-row input,.form-row select,.form-row textarea{min-height:42px;font-size:var(--ui-input)}
  .home-grid{gap:12px}
  .home-card{padding:16px}
  /* Every list+detail module (sidebar + a fixed-width list + a detail pane,
     several with hard min-widths well over a phone's own) is a flex ROW
     with overflow:hidden — built for a wide monitor, never meant to reflow.
     Turning that into a real stacked/one-panel-at-a-time mobile layout is
     its own project; for now, matching <nav>'s own fix above, give each row
     its own horizontal scroll so every panel is at least reachable by
     swiping, without the page itself moving (html/body's overflow-x:hidden
     stays in force). !important: each of these already sets overflow:hidden
     inline, which otherwise beats any external stylesheet rule regardless
     of selector specificity. */
  .eln-layout, .pj-layout, #reac-main-layout, #orders-main-layout, #d2b-layout,
  #equip-bookings-inner, #equip-maintenance-inner, #equip-team-inner, #equip-dissemination-inner,
  #lib-compounds-inner, #lib-bio-results-inner, #lib-charts-inner{
    overflow-x:auto!important;-webkit-overflow-scrolling:touch;scrollbar-width:none;
  }
  .eln-layout::-webkit-scrollbar, .pj-layout::-webkit-scrollbar, #reac-main-layout::-webkit-scrollbar,
  #orders-main-layout::-webkit-scrollbar, #d2b-layout::-webkit-scrollbar, #equip-bookings-inner::-webkit-scrollbar,
  #equip-maintenance-inner::-webkit-scrollbar, #equip-team-inner::-webkit-scrollbar, #equip-dissemination-inner::-webkit-scrollbar,
  #lib-compounds-inner::-webkit-scrollbar, #lib-bio-results-inner::-webkit-scrollbar, #lib-charts-inner::-webkit-scrollbar{
    display:none;
  }
  /* Same story one level up: the sub-tab ribbons at the top of a module
     (Library's Compounds/Storage/Bio Results/Charts, Equipment's mode +
     detail bars, ELN/Bio/D2B/Orders mode bars, the sidebar Entries/Browser
     switch, etc.) are flex rows sized for a wide screen too. flex-shrink:0
     on every direct child stops them from being squeezed/wrapped instead
     of overflowing, which is what actually makes overflow-x:auto have
     something real to scroll. */
  .subtab-strip{overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;flex-wrap:nowrap}
  .subtab-strip>*{flex-shrink:0;white-space:nowrap}
  .subtab-strip::-webkit-scrollbar{display:none}
  .pj-scope{overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}
  .pj-scope>*{flex-shrink:0;white-space:nowrap}
  .pj-scope::-webkit-scrollbar{display:none}
}
@media(max-width:480px){
  .home-grid{grid-template-columns:1fr;gap:10px}
  nav .nav-item{padding:5px 10px}
  .dp.open{width:100vw}
}
#mobile-menu-btn{display:none;align-items:center;justify-content:center;width:36px;height:36px;border-radius:var(--r-md);border:1px solid var(--border2);background:var(--bg2);cursor:pointer;font-size:18px;margin-right:4px;flex-shrink:0;transition:background .12s}
#mobile-menu-btn:hover{background:var(--bg3)}
#yt-overlay{position:fixed;inset:0;background:rgba(0,0,0,.92);backdrop-filter:blur(8px);z-index:10000;display:none;align-items:center;justify-content:center;flex-direction:column;gap:16px}
#yt-overlay.visible{display:flex}
#yt-frame{width:min(854px,90vw);aspect-ratio:16/9;border:none;border-radius:var(--r-lg);box-shadow:0 32px 100px rgba(0,0,0,.7)}
#yt-close{background:rgba(255,255,255,.12);border:1px solid rgba(255,255,255,.2);color:#fff;border-radius:var(--r-md);padding:6px 18px;cursor:pointer;font-size:13px;font-family:inherit}
#yt-close:hover{background:rgba(255,255,255,.22)}

/* ── Bio-ELN plate map & dose-response ──────────────────────────────── */
.be-plate-card{border:1px solid var(--border2);border-radius:var(--r-md);padding:10px;margin-bottom:10px;background:var(--bg2)}
.be-plate-head{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.be-plate-name{flex:0 1 auto;min-width:120px}
.be-plate-dim{font-size:11px;color:var(--text3);font-family:var(--mono)}
.be-palette{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:6px}
.be-palette-lbl{font-size:11px;color:var(--text3)}
.be-role-btn{display:inline-flex;align-items:center;gap:5px;font-size:11px;padding:3px 9px;border:1px solid var(--border2);border-radius:var(--r-sm);background:var(--bg3);color:var(--text2);cursor:pointer;font-family:inherit}
.be-role-btn:hover{border-color:var(--accent)}
.be-role-btn.active{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 14%,transparent);color:var(--text);font-weight:600}
.be-role-sw{width:12px;height:12px;border-radius:3px;border:1px solid var(--border2);display:inline-block}
.be-brush-row{display:flex;align-items:center;gap:6px;margin-bottom:6px}
.be-brush-input{font-size:12px;padding:3px 7px}
.be-dilution-form,.be-paste-form{border:1px solid var(--border2);border-radius:var(--r-sm);padding:8px;margin-bottom:8px;background:var(--bg3)}
.be-dil-grid{display:flex;flex-wrap:wrap;gap:10px}
.be-dil-grid label{display:flex;flex-direction:column;gap:2px;font-size:10px;color:var(--text3)}
.be-dil-grid .form-input{font-size:12px;padding:3px 6px}
.be-plate-grid-wrap{overflow-x:auto;margin-bottom:8px}
.be-plate-grid{border-collapse:separate;border-spacing:2px}
.be-plate-grid th{font-size:9px;color:var(--text3);font-weight:600;font-family:var(--mono);text-align:center;padding:0 2px}
.be-plate-grid .be-row-h{padding-right:4px}
.be-cond-row th{border:none;padding:0 2px 4px;height:15px;font-family:var(--sans)}
/* The bracket border/ticks live on the <th> itself (.be-cond-th below),
   not on a percentage-height/width child span — an earlier version tried
   height:100% on the inner span to make a row bracket reach from its first
   row to its last, which worked in Chromium but not Safari/WebKit: a
   percentage height inside a table cell is only reliably resolvable in
   some browsers, and WebKit instead resolved it against something far
   larger than the actual cell, stretching the bracket hundreds of pixels
   past where it should've ended. A border always hugs the real edges of
   its own box no matter how that box's size was arrived at — a <th>,
   rowspan or not, always has a genuine, definite height/width for that
   purpose — so it can't misrender this way regardless of browser. */
th.be-cond-th{position:relative;border-bottom:1.5px solid var(--cond-color,var(--accent))}
th.be-cond-th::before,th.be-cond-th::after{content:'';position:absolute;bottom:-1px;width:1.5px;height:5px;background:var(--cond-color,var(--accent))}
th.be-cond-th::before{left:0}
th.be-cond-th::after{right:0}
.be-cond-seg{font-size:9px;font-weight:600;color:var(--text2);white-space:nowrap;padding:0 2px 3px}
.be-cond-x{cursor:pointer;color:var(--text3);margin-left:3px}
.be-cond-x:hover{color:var(--red)}
/* Row-axis condition bracket — same idea, rotated: a right-hand border
   instead of a bottom one, tick marks at top/bottom instead of left/right,
   vertical text since the cell is narrow. Overrides .be-cond-th's
   bottom-border rules (source order, equal specificity). */
th.be-cond-th-row{border-bottom:none;border-right:1.5px solid var(--cond-color,var(--accent));vertical-align:middle}
th.be-cond-th-row::before,th.be-cond-th-row::after{left:auto;right:-1px;bottom:auto;width:5px;height:1.5px}
th.be-cond-th-row::before{top:0}
th.be-cond-th-row::after{bottom:0}
.be-cond-seg-row{writing-mode:vertical-rl;text-orientation:mixed;padding:3px 0}
.be-cond-seg-row .be-cond-x{margin-left:0;margin-top:3px}
.be-cond-form{display:flex;flex-wrap:wrap;gap:8px;align-items:flex-end;border:1px solid var(--border2);border-radius:var(--r-sm);padding:8px;margin-bottom:8px;background:var(--bg3)}
.be-cond-form label{display:flex;flex-direction:column;gap:2px;font-size:10px;color:var(--text3)}
.be-cond-form .form-input{font-size:12px;padding:3px 6px}
.be-well-combo{outline:1.5px dashed var(--text3);outline-offset:-1px}
.be-well{width:34px;height:34px;min-width:34px;border:1px solid var(--border2);border-radius:4px;text-align:center;vertical-align:middle;cursor:pointer;padding:0;position:relative;user-select:none;line-height:1.05;transition:box-shadow .08s}
.be-well:hover{box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 45%,transparent)}
.be-well-lbl{display:block;font-size:9px;font-weight:700;color:var(--text);font-family:var(--mono)}
.be-well-conc{display:block;font-size:8px;color:var(--text2);font-family:var(--mono)}
.be-well-read{display:block;font-size:8px;color:var(--text3);font-family:var(--mono)}
.be-plate-tools{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:8px}
.be-tool-lbl{display:flex;align-items:center;gap:5px;font-size:11px;color:var(--text3)}
.be-zprime{font-size:12px;font-weight:600;font-family:var(--mono);color:var(--text3);padding:2px 8px;border-radius:var(--r-sm);border:1px solid var(--border2)}
.be-zprime.be-z-good{color:var(--green-ink);border-color:color-mix(in srgb,var(--green) 45%,transparent);background:color-mix(in srgb,var(--green) 10%,transparent)}
.be-zprime.be-z-ok{color:var(--warn-text,#a86a00);border-color:color-mix(in srgb,var(--warn-border,#e0a000) 45%,transparent);background:color-mix(in srgb,var(--warn-border,#e0a000) 10%,transparent)}
.be-zprime.be-z-bad{color:var(--red);border-color:color-mix(in srgb,var(--red) 45%,transparent);background:color-mix(in srgb,var(--red) 10%,transparent)}
.be-curves{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:8px}
.be-curve-card{border:1px solid var(--border2);border-radius:var(--r-sm);padding:6px 8px;background:var(--bg3)}
.be-curve-head{display:flex;align-items:center;gap:6px;margin-bottom:2px;flex-wrap:wrap}
.be-curve-dot{width:10px;height:10px;border-radius:50%;flex-shrink:0}
.be-curve-name{font-size:12px;font-weight:600;color:var(--text);font-family:var(--mono)}
.be-curve-fit{font-size:10px;color:var(--text3);font-family:var(--mono)}
.be-curve-card.be-curve-lowconf{border-color:color-mix(in srgb,var(--red) 45%,var(--border2))}
.be-curve-flag{font-size:9px;font-weight:600;color:var(--red);background:color-mix(in srgb,var(--red) 12%,transparent);border-radius:var(--r-xs);padding:1px 6px;flex-shrink:0}
.be-curve-plot{width:100%;min-height:190px}
.be-well-sel{box-shadow:inset 0 0 0 2px var(--accent)}
.be-selbar{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-bottom:8px;padding:6px 8px;border:1px solid var(--accent);border-radius:var(--r-sm);background:color-mix(in srgb,var(--accent) 8%,transparent)}
.be-sel-count{font-size:11px;font-weight:600;color:var(--text)}
.be-fmt-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:12px}
.be-fmt-card{display:flex;flex-direction:column;align-items:center;gap:3px;padding:10px 8px;border:1px solid var(--border2);border-radius:var(--r-md);background:var(--bg2);cursor:pointer;font-family:inherit;transition:border-color .1s,transform .06s}
.be-fmt-card:hover{border-color:var(--accent);transform:translateY(-1px)}
.be-fmt-thumb{width:100%;aspect-ratio:3/2;border:1px solid var(--border2);border-radius:var(--r-sm);background:var(--bg3);color:var(--accent-ink);display:flex;align-items:center;justify-content:center;overflow:hidden}
.be-fmt-name{font-size:13px;font-weight:600;color:var(--text)}
.be-fmt-sub{font-size:11px;color:var(--text3);font-family:var(--mono)}
.be-fmt-custom{display:flex;align-items:center;gap:8px;padding-top:10px;border-top:1px solid var(--border)}
.be-fmt-custom .form-input{font-size:12px;padding:3px 6px}
.be-fmt-custom-preview{width:36px;height:24px;flex-shrink:0;border:1px solid var(--border2);border-radius:4px;background:var(--bg3);color:var(--accent-ink);display:flex;align-items:center;justify-content:center;overflow:hidden}

/* D2B — plate-based combinatorial screening */
.d2b-reagent-cols{display:flex;flex-direction:column;gap:14px}
.d2b-reagent-col{border:1px solid var(--border2);border-radius:var(--r-md);padding:10px;background:var(--bg2)}
.d2b-reagent-col-head{font-size:11px;font-weight:600;color:var(--text2);margin-bottom:6px;display:flex;align-items:center;gap:6px}
.d2b-reagent-col-name{font-size:11px;font-weight:600;color:var(--text2);background:none;border:none;border-bottom:1px solid transparent;padding:1px 2px;min-width:40px;flex:0 1 auto}
.d2b-reagent-col-name:hover,.d2b-reagent-col-name:focus{border-bottom-color:var(--border2);outline:none}
.d2b-reagent-col-del{background:none;border:none;color:var(--text3);cursor:pointer;font-size:11px;padding:0;margin-left:auto}
.d2b-reagent-col-del:hover{color:var(--red)}
.d2b-reagent-col-reacts{display:flex;align-items:center;gap:4px;font-size:11px;color:var(--text3);margin-bottom:6px;cursor:pointer}
.d2b-reagent-col-reacts input{width:12px;height:12px;cursor:pointer}
.d2b-reagent-list{display:flex;flex-direction:column;gap:5px;margin-bottom:6px}
.d2b-reagent-row{display:flex;align-items:center;gap:6px;padding:5px 6px;border:1px solid var(--border2);border-radius:var(--r-sm);background:var(--bg2);transition:border-color .12s,box-shadow .12s,background .12s}
.d2b-reagent-row.hl{border-color:var(--accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 35%,transparent);background:color-mix(in srgb,var(--accent) 6%,transparent)}
.d2b-reagent-row.assignable .d2b-reagent-thumb{border-color:var(--accent);box-shadow:0 0 0 1px color-mix(in srgb,var(--accent) 30%,transparent)}
.d2b-reagent-thumb{width:30px;height:26px;flex-shrink:0;border:1px solid var(--border2);border-radius:4px;background:var(--bg3);display:flex;align-items:center;justify-content:center;cursor:pointer;overflow:hidden}
.d2b-well-reagent-chip{width:36px;height:30px;flex-shrink:0;border:1.5px solid var(--border2);border-radius:var(--r-sm);background:var(--bg3);display:inline-flex;align-items:center;justify-content:center;cursor:pointer;overflow:hidden;padding:0;font-size:9px;color:var(--text2)}
.d2b-well-reagent-chip:hover{border-color:var(--accent)}
.d2b-well-reagent-chip.active{border-color:var(--accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 35%,transparent)}
.d2b-well-reagent-chip.clear{background:var(--bg3);color:var(--text3);border-style:dashed}
.d2b-reagent-thumb svg{max-width:26px;max-height:22px}
.d2b-reagent-thumb-plus{font-size:13px;color:var(--text3);opacity:.5}
.d2b-reagent-input{background:none;border:none;border-bottom:1px solid transparent;color:var(--text);font-size:11px;padding:2px 3px;outline:none;min-width:0}
.d2b-reagent-input:hover,.d2b-reagent-input:focus{border-bottom-color:var(--border2)}
.d2b-reagent-input.d2b-ri-cas{width:64px;flex-shrink:0}
.d2b-reagent-input.d2b-ri-equiv,.d2b-reagent-input.d2b-ri-conc,.d2b-reagent-input.d2b-ri-unit{width:38px;flex-shrink:0}
.d2b-reagent-input.d2b-ri-solvent{width:52px;flex-shrink:0}
.d2b-reagent-del{background:none;border:none;color:var(--text3);cursor:pointer;font-size:12px;padding:2px 3px;flex-shrink:0}
.d2b-reagent-del:hover{color:var(--red)}
.d2b-reagent-id{flex:1 1 auto;min-width:60px;position:relative}
.d2b-reagent-name{font-size:11px;color:var(--text);display:flex;align-items:center;gap:5px;overflow:hidden}
.d2b-reagent-name-txt{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.d2b-reagent-tag{font-size:9px;font-weight:600;padding:1px 5px;border-radius:var(--r-lg);flex-shrink:0;text-transform:uppercase;letter-spacing:.02em}
.d2b-reagent-tag.db{background:color-mix(in srgb,var(--accent) 14%,transparent);color:var(--accent-ink)}
.d2b-reagent-tag.ci{background:color-mix(in srgb,var(--orange) 14%,transparent);color:var(--orange-ink)}
.d2b-reagent-unlink{background:none;border:none;color:var(--text3);cursor:pointer;font-size:10px;padding:0;flex-shrink:0}
.d2b-reagent-edit{background:none;border:none;color:var(--text3);cursor:pointer;font-size:10px;padding:0;flex-shrink:0;text-decoration:underline}
.d2b-reagent-edit:hover{color:var(--accent-ink)}
/* Reusable "N selected" toolbar for a plain checkbox list (as opposed to
   the grid-cell selection .d2b-select-bar/.be-selbar are for) — same visual
   language, promoted out of what used to be one-off inline styles on the
   Print Labels modal. */
.list-selbar{display:flex;align-items:center;gap:8px;font-size:12px;color:var(--text2);background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-sm);padding:6px 10px;margin:0 12px 8px}
.list-sel-count{font-weight:600;color:var(--text)}
.list-selbar .btn{margin-left:auto}
.list-selbar .btn+.btn{margin-left:0}
.eln-card.list-sel-mode{padding-left:34px}
.eln-card .list-sel-check{position:absolute;left:10px;top:12px;width:15px;height:15px;cursor:pointer}
.d2b-select-bar{display:none;align-items:center;gap:8px;font-size:12px;color:var(--text2);background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-sm);padding:6px 10px;margin:6px 0}
.d2b-select-bar select{background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-sm);padding:3px 6px;font-size:11px;color:var(--text)}
.d2b-well-selected{outline:2px solid var(--accent);outline-offset:-2px}
.d2b-plate-grid.selecting .d2b-well{cursor:cell}
.d2b-plate-grid.selecting .be-row-h,.d2b-plate-grid.selecting .be-col-h{cursor:cell}
.d2b-reagent-unlink:hover{color:var(--red)}
.d2b-reagent-search-btn{background:none;border:1px dashed var(--border2);border-radius:var(--r-xs);color:var(--text3);font-size:11px;padding:2px 7px;cursor:pointer;white-space:nowrap}
.d2b-reagent-search-btn:hover{border-color:var(--accent);color:var(--accent-ink)}
.d2b-plate-card{border:1px solid var(--border2);border-radius:var(--r-md);padding:10px 12px;margin-bottom:12px;background:var(--bg2)}
.d2b-plate-card-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}
.d2b-view-toggle-label{font-size:11px;color:var(--text3);flex-shrink:0}
.d2b-scheme-label{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--text3);margin-bottom:8px}
.d2b-view-toggle{display:flex;align-items:center;gap:4px;flex-shrink:0;overflow-x:auto;max-width:100%}
.d2b-view-btn{flex-shrink:0;white-space:nowrap;background:var(--bg2);border:1px solid var(--border2);color:var(--text2);font-size:11px;font-weight:600;padding:4px 11px;border-radius:999px;cursor:pointer;transition:background .12s,color .12s,border-color .12s}
.d2b-view-btn:hover{border-color:var(--accent);color:var(--text)}
.d2b-view-btn.active{background:var(--accent-ink);border-color:var(--accent-ink);color:var(--on-accent)}
.d2b-plate-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:6px 0}
.d2b-plate-row-lbl{font-size:11px;color:var(--text3);flex-shrink:0}
/* Generic bordered icon-only button (hover text via title=) — introduced for
   the D2B plate toolbar, then adopted app-wide for any row/card action bar
   that was leaning on several text buttons in a line. */
.icon-btn{width:var(--control-size);height:var(--control-size);flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--border2);border-radius:var(--r-sm);background:var(--bg2);color:var(--text2);cursor:pointer;transition:border-color .12s,color .12s,background .12s}
.icon-btn:hover{border-color:var(--accent);color:var(--accent-ink)}
.icon-btn.active{background:var(--accent-ink);border-color:var(--accent-ink);color:var(--on-accent)}
.icon-btn.danger{color:var(--red);border-color:color-mix(in srgb,var(--red) 35%,var(--border2))}
.icon-btn.danger:hover{border-color:var(--red);color:var(--red)}
.icon-btn:disabled{opacity:.35;cursor:default;border-color:var(--border2);color:var(--text3);background:var(--bg2)}
.icon-btn-sm{--control-size:var(--control-compact-size);--control-icon:12px;width:var(--control-size);height:var(--control-size)}
.icon-btn-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
/* Flat modifier — no border/background at rest, for dense inline rows
   (Dissemination cards, file lists) where a bordered box per action reads
   as cluttered; only the icon shows until hovered. */
.icon-btn-flat{border-color:transparent;background:transparent}
.icon-btn-flat:hover{background:var(--bg3);border-color:transparent}
.cv-seq-res{cursor:pointer;border-radius:2px}
.cv-seq-res:hover{background:var(--accent-ink);color:var(--on-accent)}
.cv-prep-progress-bar{height:100%;width:35%;border-radius:3px;background:var(--accent);animation:cv-progress-slide 1.1s ease-in-out infinite}
@keyframes cv-progress-slide{0%{margin-left:0%}50%{margin-left:65%}100%{margin-left:0%}}
.cv-dd{position:relative;display:inline-block}
.cv-dd-btn{display:flex;align-items:center;gap:5px;white-space:nowrap}
.cv-dd-btn svg{flex-shrink:0;opacity:.6}
.cv-dd-menu{display:none;position:absolute;top:calc(100% + 4px);left:0;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-md);box-shadow:var(--shadow-md);z-index:50;min-width:150px;overflow:hidden;padding:3px}
.cv-dd-menu.show{display:block}
/* CNS MPO desirability bar (ADME profile, library.js _admeMpoHtml) */
/* ADME sheet (library.js _admeHtml) — verdicts first, then the two pictures, then rules,
   then the numbers. Values use tabular sans figures, not mono; colour = tone of the result. */
.adme-modal{padding-top:0}
.adme-modal-head{position:sticky;top:0;z-index:2;display:flex;align-items:center;gap:8px;justify-content:space-between;background:var(--bg2);padding:18px 0 12px;margin-bottom:4px;border-bottom:1px solid var(--border)}
.adme{display:flex;flex-direction:column;gap:14px;font-size:12px}
.adme-head{display:flex;gap:16px;align-items:center;flex-wrap:wrap}
.adme-struct{flex-shrink:0;background:var(--bg);border:1px solid var(--border);border-radius:var(--r-md);padding:4px;line-height:0}
.adme-struct svg{display:block}
.adme-head-main{flex:1;min-width:260px;display:flex;flex-direction:column;gap:10px}
.adme-head-line{font-size:14px;font-weight:600;color:var(--text)}
.adme-verdicts{display:flex;flex-wrap:wrap;gap:6px}
.adme-verdict{display:inline-flex;flex-direction:column;gap:1px;padding:6px 10px;border-radius:var(--r-md);border:1px solid var(--border);background:var(--bg);min-width:78px}
.adme-verdict>span{font-size:var(--ui-caption);color:var(--text3)}
.adme-verdict>strong{font-size:14px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--text)}
.adme-verdict-ok{border-color:color-mix(in srgb,var(--green) 40%,var(--border))}
.adme-verdict-ok>strong{color:var(--green-ink)}
.adme-verdict-warn{border-color:color-mix(in srgb,var(--orange) 45%,var(--border))}
.adme-verdict-warn>strong{color:var(--orange-ink)}
.adme-verdict-bad{border-color:color-mix(in srgb,var(--red) 45%,var(--border));background:color-mix(in srgb,var(--red) 6%,var(--bg))}
.adme-verdict-bad>strong{color:var(--red)}
.adme-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:14px}
.adme-wide{grid-column:1/-1}
@media (max-width:760px){.adme-grid{grid-template-columns:1fr}}
.adme-card{border:1px solid var(--border);border-radius:var(--r-lg);padding:12px 14px;background:var(--bg);min-width:0}
.adme-card h4{margin:0 0 8px;font-size:13px;font-weight:600;color:var(--text)}
.adme-h-sub{font-weight:400;color:var(--text3);font-size:12px;margin-left:4px}
.adme-row{display:flex;justify-content:space-between;align-items:baseline;gap:12px;padding:5px 0;border-bottom:1px solid var(--divider)}
.adme-row:last-child{border-bottom:none}
.adme-k{color:var(--text2)}
.adme-val{text-align:right;font-variant-numeric:tabular-nums;color:var(--text)}
.adme-why{font-size:11px;color:var(--text3);margin:0 6px}
.adme-v{font-weight:600}
.adme-ok{color:var(--green-ink)}
.adme-warn{color:var(--orange-ink)}
.adme-bad{color:var(--red)}
.adme-sub{font-size:12px;color:var(--text3)}
.adme-chips{display:inline-flex;flex-wrap:wrap;gap:4px;justify-content:flex-end}
.adme-chip{font-size:11px;padding:1px 7px;border-radius:999px;border:1px solid var(--border)}
.adme-chip-bad{color:var(--red);border-color:color-mix(in srgb,var(--red) 45%,transparent);background:color-mix(in srgb,var(--red) 8%,transparent)}
.adme-chip-warn{color:var(--orange-ink);border-color:color-mix(in srgb,var(--orange) 45%,transparent);background:color-mix(in srgb,var(--orange) 8%,transparent)}
.adme-props{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:28px}
@media (max-width:760px){.adme-props{grid-template-columns:1fr}}
.adme-egg{margin-bottom:8px;border:1px solid var(--border);border-radius:var(--r-md);background:var(--bg2);overflow:hidden}
.adme-egg-key{display:flex;gap:14px;flex-wrap:wrap;padding:6px 10px 8px;font-size:11px;color:var(--text3)}
.adme-mpo-score{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
.adme-mpo-num{font-size:28px;font-weight:700;font-variant-numeric:tabular-nums;line-height:1.1}
.adme-pill{font-size:11px;font-weight:600;padding:2px 9px;border-radius:999px;border:1px solid currentColor;margin-left:6px}
.adme-pill-ok{color:var(--green-ink)}
.adme-pill-warn{color:var(--orange-ink)}
.adme-pill-bad{color:var(--red)}
.mpo-table{width:100%;margin-top:8px;font-size:12px}
.mpo-table td.num{font-family:var(--sans);font-variant-numeric:tabular-nums}
.mpo-cell{white-space:nowrap;text-align:right}
.adme-details{margin-top:8px;font-size:12px;color:var(--text2);line-height:1.55}
.adme-details summary{cursor:pointer;color:var(--accent-ink)}
.adme-details ul{margin:6px 0;padding-left:18px}
.adme-note{margin:0;font-size:var(--ui-caption);color:var(--text3);line-height:1.55;border-top:1px solid var(--border);padding-top:10px}
.mpo-bar{display:inline-block;width:70px;height:6px;border-radius:3px;background:var(--bg3);vertical-align:middle;overflow:hidden}
.mpo-bar>span{display:block;height:100%}
/* type-to-filter box of long pickers (_ddEnhanceSearch, core.js) */
.cv-dd-search{position:sticky;top:0;z-index:1;display:block;width:100%;box-sizing:border-box;margin:0 0 4px;padding:5px 8px;font-size:12px;border:1px solid var(--border2);border-radius:var(--r-sm);background:var(--bg);color:var(--text);outline:none}
.cv-dd-search:focus{border-color:var(--accent-ink)}
.cv-dd-empty{padding:6px 10px;font-size:12px;color:var(--text3)}
.cv-dd-menu button .cv-dd-sub{color:var(--text3);font-size:11px}
.cv-dd-menu button .cv-dd-count{float:right;margin-left:8px;color:var(--text3);font-family:var(--mono);font-size:11px}
.cv-dd-menu button{display:block;width:100%;text-align:left;padding:6px 10px;font-size:12px;background:none;border:none;cursor:pointer;color:var(--text);border-radius:var(--r-sm)}
.cv-dd-menu button:hover{background:var(--bg3)}
.cv-dd-menu button.active{color:var(--accent-ink);font-weight:600}
.cv-dd-sep:not(:empty){border-top:1px solid var(--border);margin-top:3px;padding-top:3px}
.cv-dd-row{display:flex;align-items:center;gap:2px}
.cv-dd-row button:first-child{flex:1}
/* NMR-subtype multi-select popover (core.js nmrSubtypePickerHtml) — same
   visual language as .cv-dd-menu, own class since it's not Computational-
   viewer-specific (used by the ELN attach toolbar and Library file rows). */
.nmr-subtype-dd{position:relative;display:inline-block}
.nmr-subtype-dd-menu{display:none;position:absolute;top:calc(100% + 4px);left:0;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-md);box-shadow:var(--shadow-md);z-index:50;min-width:110px;padding:6px 10px;flex-direction:column;gap:5px}
.nmr-subtype-dd-menu.show{display:flex}
.nmr-subtype-dd-menu label{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--text2);cursor:pointer;white-space:nowrap}
.nmr-subtype-dd-menu input[type="checkbox"]{accent-color:var(--accent)}
.cv-dd-row-x{width:22px!important;flex-shrink:0;text-align:center!important;color:var(--text3)}
.cv-dd-row-x:hover{color:var(--red)!important;background:var(--bg3)}
.cv-search-group-label{font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.02em;color:var(--text3);padding:8px 10px 4px}
.cv-search-row{display:flex;align-items:center;gap:8px;padding:6px 10px;cursor:pointer;border-bottom:1px solid var(--border)}
.cv-search-row:hover{background:var(--bg3)}
.d2b-well-enum-badge{position:absolute;top:2px;right:2px;font-size:9px;font-weight:700;padding:1px 4px;border-radius:999px;line-height:1.4}
.d2b-well-enum-badge.generated{background:var(--chip-green-bg);color:var(--chip-green-fg)}
.d2b-well-enum-badge.ambiguous{background:var(--chip-yellow-bg,rgba(202,138,4,.15));color:var(--chip-yellow-fg,#ca8a04)}
.d2b-well-enum-badge.no_match{background:var(--chip-red-bg);color:var(--chip-red-fg)}
.d2b-well-enum-badge.incomplete{background:var(--bg3);color:var(--text3)}
.d2b-plate-name-input{font-size:13px;font-weight:600;background:none;border:none;border-bottom:1px solid transparent;color:var(--text);padding:1px 2px;min-width:80px}
.d2b-plate-name-input:hover,.d2b-plate-name-input:focus{border-bottom-color:var(--border2);outline:none}
.d2b-plate-grid-wrap{overflow-x:auto;margin-bottom:4px}
.d2b-plate-grid{border-collapse:separate;border-spacing:3px}
.d2b-plate-grid th{font-size:9px;color:var(--text3);font-weight:600;font-family:var(--mono);text-align:center;padding:2px;border-radius:4px;transition:background .1s,color .1s}
.d2b-plate-grid .be-row-h{padding-right:4px}
.d2b-well{width:64px;height:64px;min-width:64px;border:1px solid var(--border2);border-radius:6px;text-align:center;vertical-align:middle;cursor:pointer;padding:2px;position:relative;user-select:none;background:var(--bg2);transition:box-shadow .08s,border-color .08s}
.d2b-well *{pointer-events:none;-webkit-user-drag:none;user-drag:none}
.d2b-well:hover{border-color:var(--accent);box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 35%,transparent)}
.d2b-well.has-struct{background:var(--bg3)}
.d2b-well-code{position:absolute;top:2px;left:3px;font-size:8px;font-weight:700;color:var(--text3);font-family:var(--mono)}
.d2b-well-struct{display:flex;align-items:center;justify-content:center;width:100%;height:100%}
.d2b-well-struct svg{max-width:56px;max-height:36px}
.d2b-well-plus{font-size:18px;color:var(--text3);opacity:.35;font-weight:400}
.d2b-well-label{position:absolute;bottom:14px;left:0;right:0;font-size:8px;color:var(--text2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;padding:0 4px}
.d2b-well-yield{position:absolute;bottom:2px;left:0;right:0;font-size:9px;font-weight:700;color:var(--accent-ink);font-family:var(--mono)}
/* Reagent A/B and Yield well-views: a colored chip fills the well instead of a structure thumbnail */
.d2b-well-chip{display:flex;flex-direction:column;align-items:center;justify-content:center;width:100%;height:100%;border-radius:4px;gap:2px;background:var(--bg3)}
.d2b-well-chip-label{font-size:9px;font-weight:600;color:var(--text);max-width:56px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.d2b-well-chip-sub{font-size:8px;color:var(--text3);font-family:var(--mono);max-width:58px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.d2b-well-chip-struct{display:flex;align-items:center;justify-content:center;max-width:100%;max-height:32px}
.d2b-well-chip-struct svg{max-width:44px;max-height:30px}
.d2b-well-yield-big{font-size:15px;font-weight:700;font-family:var(--mono);color:var(--text)}

/* ══ Projects module ═══════════════════════════════════════════════════════
   Own namespace (.pj-*) rather than borrowing .eln-list/.eln-card: the project
   sidebar carries a progress ring, an accent band and an avatar stack that the
   ELN list has no use for, and sharing the classes made both hard to change. */
.pj-layout{display:flex;flex:1;overflow:hidden;min-height:0}

/* ── Sidebar ── */
#proj-sidebar.collapsed .pj-sb-head>:not(.sidebar-toggle-btn),#proj-sidebar.collapsed .pj-sb-filters,#proj-sidebar.collapsed .pj-sb-body,#proj-sidebar.collapsed .pj-dashboard-row{display:none!important}
#proj-sidebar.collapsed .pj-sb-head{width:100%;padding:12px 0 10px;justify-content:center}
#pj-dashboard-sidebar.collapsed #pj-dashboard-sidebar-content{display:none!important}
#pj-dashboard-recurring-filters #maint-sidebar-filter-body{padding:10px 0 0;overflow:visible}
.pj-sb-head .btn-primary{flex:1}
.pj-sb-filters{padding:9px 12px;border-bottom:1px solid var(--border);display:flex;flex-direction:column;gap:7px}
.pj-scope{display:flex;background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-sm);padding:2px;gap:2px}
.pj-scope-btn{flex:1;background:none;border:none;color:var(--text3);font-size:11px;font-weight:600;padding:4px 0;border-radius:calc(var(--r-sm) - 2px);cursor:pointer;transition:background .12s,color .12s}
.pj-scope-btn:hover{color:var(--text2)}
.pj-scope-btn.active{background:var(--bg2);color:var(--text);box-shadow:var(--shadow-sm)}
.eln-sort-btn{display:flex;align-items:center;justify-content:center;gap:4px}
.eln-sort-arrow{font-size:9px}
/* Boxes/Plates keeps the pill highlight on .active but stays gray text/icon
   rather than the usual dark --text — a deliberate one-off, not a change
   to the shared Mine/All-style toggle look used elsewhere. */
#storage-subtab-boxes.active,#storage-subtab-plates.active{color:var(--text3)}
/* Pinned "Dashboard" row — not a project card, always present above the list */
.pj-dashboard-row{display:flex;align-items:center;gap:8px;width:calc(100% - 16px);margin:6px 8px 2px;padding:8px 10px;
  background:none;border:1px solid transparent;border-radius:var(--r-md);color:var(--text2);font-size:13px;font-weight:600;cursor:pointer;transition:background .12s,border-color .12s}
.pj-dashboard-row:hover{background:var(--bg3)}
.pj-dashboard-row.active{background:color-mix(in srgb,var(--accent) 9%,transparent);border-color:color-mix(in srgb,var(--accent) 26%,transparent);color:var(--text)}
.pj-sb-body{flex:1;min-height:0;overflow-y:auto;padding:8px 8px 20px}

/* Collapsible status group */
.pj-group+.pj-group{margin-top:10px}
.pj-group-head{display:flex;align-items:center;gap:6px;width:100%;background:none;border:none;padding:4px 6px;cursor:pointer;color:var(--text3);font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em}
.pj-group-head:hover{color:var(--text2)}
.pj-group-chev{transition:transform .15s;flex-shrink:0}
.pj-group.collapsed .pj-group-chev{transform:rotate(-90deg)}
.pj-group-count{margin-left:auto;font-family:var(--mono);font-weight:600;font-size:10px;opacity:.75}
.pj-group.collapsed .pj-group-body{display:none}
/* Parent-project sub-grouping inside a status section. Deliberately quieter
   than the status heading above it (sentence case, no letter-spacing) so the
   sidebar reads as one list with dividers, not two competing hierarchies. */
.pj-subgroup+.pj-subgroup{margin-top:6px}
/* "Ungrouped" is everything else, not another programme — detached with a
   rule and extra air so the last real group doesn't look like it owns it. */
.pj-subgroup.loose{margin-top:12px;padding-top:8px;border-top:1px dashed var(--border)}
.pj-subgroup.loose .pj-subgroup-head{font-style:italic;opacity:.85}
.pj-subgroup-row{display:flex;align-items:center}
.pj-subgroup-row .pj-subgroup-head{flex:1;min-width:0}
.pj-subgroup-edit{flex-shrink:0;background:none;border:none;padding:2px 6px;cursor:pointer;color:var(--text3);opacity:0;transition:opacity .12s;display:flex;align-items:center}
.pj-subgroup-row:hover .pj-subgroup-edit,.pj-subgroup-edit:focus-visible{opacity:1}
.pj-subgroup-edit:hover{color:var(--text)}
.pp-swatch{width:22px;height:22px;border-radius:var(--r-sm);border:2px solid transparent;cursor:pointer;padding:0}
.pp-swatch.active{border-color:var(--text);box-shadow:0 0 0 1px var(--bg)}
.pj-subgroup-head{display:flex;align-items:center;gap:5px;width:100%;background:none;border:none;padding:3px 6px 3px 10px;cursor:pointer;color:var(--text3);font-size:11px;font-weight:600}
.pj-subgroup-head:hover{color:var(--text2)}
.pj-subgroup .pj-group-chev{transition:transform .15s;flex-shrink:0}
.pj-subgroup.collapsed .pj-group-chev{transform:rotate(-90deg)}
.pj-subgroup.collapsed .pj-subgroup-body{display:none}
.pj-subgroup-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0}

/* Project card */
.pj-card{position:relative;display:flex;gap:9px;align-items:center;padding:5px 10px;margin-bottom:2px;border-radius:var(--r-md);border:1px solid transparent;cursor:pointer;overflow:hidden;transition:background .12s,border-color .12s}
.pj-card:hover{background:var(--bg3)}
/* Not a member: listed but not openable — dimmed, no hover invitation */
.pj-card.locked{opacity:.5;cursor:not-allowed}
.pj-req-btn{display:inline-flex;margin-top:6px;padding:2px 9px;font-size:11px;font-weight:600;border:1px solid var(--accent);color:var(--accent-ink);background:none;border-radius:var(--r-xs);cursor:pointer}
.pj-req-btn:hover{background:color-mix(in srgb, var(--accent) 10%, transparent)}
.pj-req-sent{display:inline-flex;align-items:center;gap:4px;margin-top:6px;font-size:11px;color:var(--text3)}
.pj-req-sent svg{width:11px;height:11px}
.pj-card.locked:hover{background:none}
.pj-card.active .pj-card-title{color:var(--text);font-weight:500}
.pj-card.active{background:color-mix(in srgb,var(--accent) 9%,transparent);border-color:color-mix(in srgb,var(--accent) 26%,transparent)}
.pj-card-main{flex:1;min-width:0}
.pj-card-dot{width:8px;height:8px;border-radius:3px;flex-shrink:0}
.pj-card-name{min-width:0;overflow-wrap:anywhere;line-height:1.25}
.pj-card-dot{align-self:flex-start;margin-top:5px}
.pj-trend{display:inline-flex;flex-shrink:0}
.pj-trend.up{color:var(--green-ink)}
.pj-trend.down{color:var(--yellow-ink)}
.pj-trend.dormant{color:var(--text3)}
.pj-card-bar{position:absolute;left:10px;right:10px;bottom:1px;height:2px;border-radius:2px;background:var(--bg3);overflow:hidden}
.pj-card-bar i{display:block;height:100%;background:var(--accent);border-radius:2px}
.pj-card{padding-bottom:7px}
.pj-card-title{font-family:var(--sans);font-size:13px;font-weight:400;color:var(--text2);display:flex;align-items:center;gap:5px;min-width:0}
.pj-card-meta{font-size:11px;color:var(--text3);margin-top:3px;font-family:var(--mono);display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.pj-card-meta b{font-weight:600;color:var(--text2)}
.pj-lock{display:inline-flex;align-items:center;color:var(--text3);flex-shrink:0}

/* Progress ring */
.pj-ring{flex-shrink:0;position:relative;width:30px;height:30px}
.pj-ring svg{transform:rotate(-90deg);display:block}
.pj-ring-track{stroke:var(--bg3)}
.pj-ring-bar{stroke:var(--accent);transition:stroke-dashoffset .3s}
.pj-ring-label{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;font-size:9px;font-weight:700;font-family:var(--mono);color:var(--text2)}

/* Overlapping avatar stack */
.pj-stack{display:flex;align-items:center;margin-top:6px}
.pj-stack .pj-av{margin-left:-5px;border:1.5px solid var(--bg2)}
.pj-stack .pj-av:first-child{margin-left:0}
.pj-card.active .pj-stack .pj-av{border-color:color-mix(in srgb,var(--accent) 9%,var(--bg2))}
.pj-av{width:19px;height:19px;border-radius:999px;color:#fff;font-size:8px;font-weight:700;display:inline-flex;align-items:center;justify-content:center;flex-shrink:0;letter-spacing:-.2px;box-sizing:border-box;overflow:hidden}
.pj-av img{width:100%;height:100%;object-fit:cover}
.pj-av-more{background:var(--bg3);color:var(--text3);font-family:var(--mono)}

/* ── Detail pane ── */
.pj-detail{flex:1;overflow-y:auto;display:flex;flex-direction:column;min-width:0}
.pj-empty{flex:1;display:flex;align-items:center;justify-content:center;color:var(--text3);font-size:13px;flex-direction:column;gap:8px}

/* ── Dashboard panel (pinned sidebar entry, not a real project) ── */
.pj-dashboard{padding:20px 26px 26px;max-width:1180px}
.pj-dashboard-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px}
.pj-dashboard-head h2{margin:0 0 4px;font-size:var(--ui-title);font-weight:600;letter-spacing:-.02em}
.pj-dashboard-sub{margin:0 0 18px;color:var(--text3);font-size:13px}
.pj-dash-mol-head{display:flex;align-items:center;gap:7px;cursor:pointer;user-select:none;padding:8px 0;margin-bottom:10px;border-bottom:1px solid var(--border)}
.pj-dash-mol-head span:first-of-type{font-size:13px;font-weight:700}
.pj-dash-mol-chev{transition:transform .12s;flex-shrink:0;color:var(--text3)}
.pj-dash-mol-chev.open{transform:rotate(90deg)}
.pj-dash-pipe .pj-pipe-body{max-height:280px}
/* Modules (Your tasks/Your canvases/Stats) stack full-width in whatever
   order+visibility "Edit dashboard" saved — see _pjRenderDashboardModules
   in projects.js. Used to be a fixed 2-column grid (main + a narrow stats
   sidebar); now every module gets the same width, since which ones show at
   all is no longer fixed either. */
.pj-dashboard-body{display:flex;flex-direction:column;gap:22px}
.pj-dash-module:empty{display:none}
.pj-dashboard-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px}
.pj-dashboard-empty{color:var(--text3);font-size:13px;text-align:center;padding:40px 0}
.pj-dashboard-empty a{color:var(--accent-ink);cursor:pointer}
#pj-dashboard-molecules:empty{display:none}
.pj-notes-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:10px}
.pj-notes-empty{grid-column:1/-1;color:var(--text3);font-size:13px;padding:18px 0;text-align:center}
.pj-note-card{position:relative;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-lg);padding:8px 10px;display:flex;flex-direction:column;gap:4px;min-height:130px;box-shadow:var(--shadow-sm);transition:background-color .15s,border-color .15s,box-shadow .18s}
.pj-note-card:hover{box-shadow:var(--shadow-md)}
.pj-note-accent{background:color-mix(in srgb,var(--accent) 10%,var(--bg2));border-color:color-mix(in srgb,var(--accent) 35%,var(--border2))}
.pj-note-green{background:color-mix(in srgb,var(--green) 10%,var(--bg2));border-color:color-mix(in srgb,var(--green) 35%,var(--border2))}
.pj-note-yellow{background:color-mix(in srgb,var(--yellow) 10%,var(--bg2));border-color:color-mix(in srgb,var(--yellow) 35%,var(--border2))}
.pj-note-orange{background:color-mix(in srgb,var(--orange) 10%,var(--bg2));border-color:color-mix(in srgb,var(--orange) 35%,var(--border2))}
.pj-note-red{background:color-mix(in srgb,var(--red) 10%,var(--bg2));border-color:color-mix(in srgb,var(--red) 35%,var(--border2))}
.pj-note-card-head{display:flex;align-items:center;gap:2px}
.pj-note-title{flex:1;min-width:0;border:none;background:none;font-size:13px;font-weight:700;color:var(--text);padding:0;outline:none}
.pj-note-title::placeholder{color:var(--text3);font-weight:600}
.pj-note-icon-btn{flex-shrink:0;border:none;background:none;color:var(--text3);cursor:pointer;font-size:12px;padding:3px 5px;border-radius:var(--r-xs);line-height:1;display:flex;align-items:center}
.pj-note-icon-btn:hover{color:var(--text);background:var(--bg3)}
.pj-note-del:hover{color:var(--red)}
.pj-note-pin.active{color:var(--accent-ink)}
.pj-note-card.pinned{border-top:2px solid var(--accent)}
.pj-note-shared-tag{flex-shrink:0;display:flex;align-items:center;gap:3px;font-size:10px;color:var(--text3);background:var(--bg3);border-radius:var(--r-xs);padding:2px 6px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:110px}
.pj-note-share-wrap{position:relative;flex-shrink:0}
.pj-note-share-menu{display:none;position:absolute;top:calc(100% + 4px);right:0;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-md);box-shadow:var(--shadow-md);z-index:50;min-width:160px;padding:6px;font-size:12px}
.pj-note-share-menu.show{display:block}
.pj-note-share-title{font-size:10px;font-weight:700;color:var(--text3);text-transform:uppercase;letter-spacing:.04em;padding:2px 4px 5px}
.pj-note-share-row{display:flex;align-items:center;gap:7px;padding:4px;border-radius:var(--r-sm);cursor:pointer;color:var(--text2)}
.pj-note-share-row:hover{background:var(--bg3)}
.pj-note-share-row input{cursor:pointer}
.pj-note-share-empty{color:var(--text3);padding:4px;font-size:11px}
.pj-note-body-wrap{flex:1;min-height:0;display:flex;flex-direction:column}
/* Quill's default toolbar (28x24px buttons, 15px group gaps) is built for a
   full-width document editor — at that size 8 buttons across 3 groups don't
   fit a ~220px note card without wrapping, and a wrapped toolbar overflows
   the card into the next grid row's paint area, which is what was actually
   making the buttons unclickable (keyboard shortcuts still worked — they
   don't go through the covered-up DOM element). Shrink everything down so
   the whole toolbar reliably fits on one line instead. */
.pj-note-card .ql-toolbar.ql-snow{display:none;border:none;padding:0 0 4px;background:none;white-space:nowrap}
.pj-note-card.editing .ql-toolbar.ql-snow{display:block}
.pj-note-card .ql-toolbar.ql-snow .ql-formats{margin-right:6px}
.pj-note-card .ql-toolbar.ql-snow button{width:16px;height:16px;padding:1px;box-sizing:border-box}
.pj-note-card .ql-toolbar.ql-snow button svg{width:100%;height:100%}
.pj-note-card .ql-toolbar.ql-snow .ql-stroke{stroke:var(--text3)}
.pj-note-card .ql-toolbar.ql-snow .ql-fill{fill:var(--text3)}
.pj-note-card .ql-toolbar.ql-snow button:hover .ql-stroke,.pj-note-card .ql-toolbar.ql-snow button.ql-active .ql-stroke{stroke:var(--accent)}
.pj-note-card .ql-toolbar.ql-snow button:hover .ql-fill,.pj-note-card .ql-toolbar.ql-snow button.ql-active .ql-fill{fill:var(--accent)}
.pj-note-card .ql-container.ql-snow{border:none;font-family:var(--sans);font-size:12px}
.pj-note-card .ql-editor{padding:0;min-height:64px;color:var(--text2);line-height:1.45}
.pj-note-card .ql-editor.ql-blank::before{color:var(--text3);font-style:normal;left:0}
.pj-note-card .ql-editor ul[data-checked],.pj-note-card .ql-editor ul:not([data-checked]){padding-left:0}
.pj-note-colors{display:flex;align-items:center;gap:5px;padding-top:2px}
.pj-note-color-dot{width:13px;height:13px;border-radius:50%;border:1px solid var(--border2);cursor:pointer;padding:0;flex-shrink:0}
.pj-note-color-dot.active{box-shadow:0 0 0 2px var(--bg2),0 0 0 3px var(--text3)}
.pj-note-color-dot.c-none{background:var(--bg3)}
/* ── Notes: editor content (cards + full page, js/notes.js) ── */
:root{--note-blue:#2563eb;--note-purple:#7c3aed}
:root[data-theme="dark"]{--note-blue:#7aa7f5;--note-purple:#b39afc}
.pj-note-foot{margin-left:auto;font-size:10px;color:var(--text3)}
/* Canvas rows (project Canvas & docs tab, Dashboard "Recent project canvases") */
.pj-canvas-list{display:flex;flex-direction:column;border:1px solid var(--border);border-radius:var(--r-md);overflow:hidden;background:var(--bg2)}
.pj-canvas-list .pj-empty-sm{padding:10px 12px}
.pj-canvas-row{display:flex;align-items:center;gap:10px;padding:9px 12px;cursor:pointer;border-top:1px solid var(--border);transition:background .12s}
.pj-canvas-row:first-child{border-top:none}
.pj-canvas-row:hover{background:var(--bg3)}
.pj-canvas-ico{display:inline-flex;color:var(--text3)}.pj-canvas-ico svg{width:14px;height:14px}
.pj-canvas-title{font-size:13px;font-weight:500;color:var(--text);flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pj-canvas-proj{font-size:11px;padding:1px 7px;border-radius:var(--r-xs);background:var(--bg3);color:var(--text2);white-space:nowrap}
.pj-canvas-when{font-size:var(--ui-caption);color:var(--text3);white-space:nowrap}
.pj-notes-empty kbd,.note-page kbd{font-family:var(--mono);font-size:10px;padding:0 4px;border:1px solid var(--border2);border-radius:var(--r-xs);background:var(--bg2)}
.nc-red{color:var(--red)}.nc-orange{color:var(--orange-ink)}.nc-yellow{color:var(--yellow-ink)}.nc-green{color:var(--green-ink)}
.nc-blue{color:var(--note-blue)}.nc-purple{color:var(--note-purple)}.nc-gray{color:var(--text3)}
.nh-red{background:color-mix(in srgb,var(--red) 18%,transparent)}.nh-orange{background:color-mix(in srgb,var(--orange) 18%,transparent)}
.nh-yellow{background:color-mix(in srgb,var(--yellow) 24%,transparent)}.nh-green{background:color-mix(in srgb,var(--green) 18%,transparent)}
.nh-blue{background:color-mix(in srgb,var(--note-blue) 18%,transparent)}.nh-purple{background:color-mix(in srgb,var(--note-purple) 18%,transparent)}
.nh-gray{background:var(--bg3)}
.ql-editor .note-mention{display:inline-flex;align-items:center;padding:0 5px;margin:0 1px;border-radius:var(--r-xs);background:color-mix(in srgb,var(--accent-ink) 12%,transparent);color:var(--accent-ink);font-weight:500;cursor:pointer;white-space:nowrap}
.ql-editor .note-mention[data-kind="compound"],.ql-editor .note-mention[data-kind="eln"],.ql-editor .note-mention[data-kind="bio_exp"]{font-family:var(--mono);font-size:.94em}
.ql-editor .note-mention[data-kind="user"]{cursor:default}
.ql-editor .note-mention:hover{background:color-mix(in srgb,var(--accent-ink) 20%,transparent)}
/* <aside> also matches the app's sidebar rule (sticky, full height, hidden on mobile) — undo all of it here. */
.ql-editor .note-callout{display:block;position:relative;top:auto;height:auto;width:auto;overflow:visible;border:none;box-shadow:none;z-index:auto;animation:none;padding:8px 12px 8px 34px;margin:6px 0;border-radius:var(--r-sm);background:var(--bg3)}
.ql-editor .note-callout::before{content:"💡";position:absolute;left:11px;top:7px;font-size:.95em}
.ql-editor hr.note-divider{border:none;border-top:1px solid var(--border2);margin:12px 0}
.ql-editor blockquote{border-left:3px solid var(--border2)!important;padding-left:12px!important;color:var(--text2)}
.ql-snow .ql-editor code,.ql-editor code{background:var(--bg3);border-radius:var(--r-xs);padding:1px 4px;font-family:var(--mono);font-size:.9em;color:var(--red)}
.ql-snow .ql-editor pre.ql-syntax,.ql-editor pre.ql-syntax{background:var(--bg3);color:var(--text);border-radius:var(--r-sm);font-family:var(--mono);font-size:12px}
.pj-note-card .ql-editor h1{font-size:15px}.pj-note-card .ql-editor h2{font-size:14px}.pj-note-card .ql-editor h3{font-size:13px}
.pj-note-card .ql-editor{max-height:240px;overflow-y:auto}
/* "/" and "@" menu */
.note-menu{position:fixed;z-index:420;display:none;width:280px;max-height:320px;overflow-y:auto;padding:4px;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-md);box-shadow:var(--shadow-lg)}
.note-menu-group{padding:8px 8px 3px;font-size:var(--ui-caption);font-weight:600;color:var(--text3)}
.note-menu-item{display:flex;align-items:center;gap:9px;padding:5px 8px;border-radius:var(--r-sm);cursor:pointer;font-size:13px;color:var(--text)}
.note-menu-item.active{background:var(--bg3)}
.note-menu-ico{width:22px;height:22px;flex-shrink:0;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--border);border-radius:var(--r-xs);background:var(--bg2);font-size:11px;font-weight:700;color:var(--text2)}
.note-menu-ico svg{width:13px;height:13px}
.note-menu-label{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.note-menu-hint{font-size:11px;color:var(--text3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:110px}
.note-menu-empty{padding:10px;font-size:12px;color:var(--text3)}
/* format bar on selection */
.note-bubble{position:fixed;z-index:420;display:none;align-items:center;gap:1px;padding:3px;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-md);box-shadow:var(--shadow-md)}
.note-bubble button{min-width:26px;height:26px;padding:0 5px;border:none;background:none;border-radius:var(--r-xs);cursor:pointer;color:var(--text2);font-size:13px;display:inline-flex;align-items:center;justify-content:center}
.note-bubble button:hover{background:var(--bg3);color:var(--text)}
.note-bubble button.on{background:color-mix(in srgb,var(--accent-ink) 14%,transparent);color:var(--accent-ink)}
.note-bubble button svg{width:13px;height:13px}
.note-bubble .mono{font-family:var(--mono);font-size:11px}
.note-bubble-sep{width:1px;height:18px;background:var(--border);margin:0 3px}
.note-bubble-dot{min-width:20px!important;padding:0!important;font-weight:700}
/* the swatches themselves must show their color over the buttons' own text color */
.note-bubble .note-bubble-dot.nc-red,.note-menu .note-menu-ico.nc-red{color:var(--red)}.note-bubble .note-bubble-dot.nc-orange,.note-menu .note-menu-ico.nc-orange{color:var(--orange-ink)}.note-bubble .note-bubble-dot.nc-yellow,.note-menu .note-menu-ico.nc-yellow{color:var(--yellow-ink)}.note-bubble .note-bubble-dot.nc-green,.note-menu .note-menu-ico.nc-green{color:var(--green-ink)}.note-bubble .note-bubble-dot.nc-blue,.note-menu .note-menu-ico.nc-blue{color:var(--note-blue)}.note-bubble .note-bubble-dot.nc-purple,.note-menu .note-menu-ico.nc-purple{color:var(--note-purple)}.note-bubble .note-bubble-dot.nc-gray,.note-menu .note-menu-ico.nc-gray{color:var(--text3)}
.note-bubble .note-bubble-dot.nh-yellow,.note-menu .note-menu-ico.nh-yellow{color:var(--text);background:color-mix(in srgb,var(--yellow) 24%,transparent)}
/* full-page editor */
.note-page{position:fixed;inset:0;z-index:260;display:none;flex-direction:column;background:var(--bg2)}
.note-page.open{display:flex;animation:notif-in .14s ease-out}
body.note-page-open{overflow:hidden}
.note-page-bar{display:flex;align-items:center;gap:12px;padding:10px 18px;border-bottom:1px solid var(--border);flex-shrink:0}
.note-page-back{display:inline-flex;align-items:center;gap:6px;border:none;background:none;cursor:pointer;color:var(--text2);font-size:13px;padding:4px 8px;border-radius:var(--r-sm)}
.note-page-back svg{transform:scaleX(-1)}
.note-page-back:hover{background:var(--bg3);color:var(--text)}
.note-page-meta{font-size:12px;color:var(--text3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.note-page-presence{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--text2)}
.note-page-avs{display:inline-flex}.note-page-avs .pj-av+.pj-av{margin-left:-6px;box-shadow:0 0 0 2px var(--bg2)}
.note-page-status{font-size:var(--ui-caption);color:var(--text3);min-width:60px}
.note-page-actions{margin-left:auto;display:flex;align-items:center;gap:8px}
.note-page-dots{display:flex;gap:5px;margin-right:4px}
.note-page-actions .btn svg{width:11px;height:11px;margin-right:4px;vertical-align:-1px}
.note-page-scroll{flex:1;overflow-y:auto}
.note-page-doc{max-width:760px;margin:0 auto;padding:48px 24px 120px}
.note-page-title{width:100%;border:none;background:none;outline:none;font-size:32px;font-weight:700;letter-spacing:-.01em;color:var(--text);padding:0;margin-bottom:14px}
.note-page-title::placeholder{color:var(--bg4)}
.note-page-banner{margin-bottom:14px;padding:8px 12px;border-radius:var(--r-sm);background:color-mix(in srgb,var(--accent-ink) 10%,transparent);color:var(--accent-ink);font-size:var(--ui-body)}
.note-page-editor.ql-container.ql-snow,.note-page-editor .ql-container{border:none!important}
.note-page-editor{font-family:var(--sans);font-size:15px}
.note-page-editor .ql-editor{padding:0;min-height:55vh;line-height:1.65;color:var(--text);outline:none}
.note-page-editor .ql-editor:focus-visible,.pj-note-card .ql-editor:focus-visible{outline:none}
.note-page-editor .ql-editor.ql-blank::before{left:0;right:0;color:var(--text3);font-style:normal}
.note-page-editor .ql-editor h1{font-size:26px;margin:22px 0 6px}
.note-page-editor .ql-editor h2{font-size:21px;margin:18px 0 4px}
.note-page-editor .ql-editor h3{font-size:17px;margin:14px 0 2px}
.note-page-editor .ql-editor p,.note-page-editor .ql-editor li{margin:2px 0}
.note-page-editor .ql-editor ul[data-checked="true"]>li{color:var(--text3);text-decoration:line-through}
@media (max-width:700px){.note-page-meta,.note-page-dots{display:none}.note-page-doc{padding:24px 16px 80px}.note-page-title{font-size:24px}}
.pj-note-color-dot.c-accent{background:var(--accent);border-color:var(--accent)}
.pj-note-color-dot.c-green{background:var(--green);border-color:var(--green-ink)}
.pj-note-color-dot.c-yellow{background:var(--yellow);border-color:var(--yellow-ink)}
.pj-note-color-dot.c-orange{background:var(--orange);border-color:var(--orange-ink)}
.pj-note-color-dot.c-red{background:var(--red);border-color:var(--red)}
.pj-dash-stat-card{background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-lg);padding:14px;box-shadow:var(--shadow-sm);transition:border-color .18s,box-shadow .18s,transform .18s;animation:card-in .42s cubic-bezier(.22,1,.36,1) backwards}
.pj-dash-stat-card:nth-child(1){animation-delay:.04s}
.pj-dash-stat-card:nth-child(2){animation-delay:.09s}
.pj-dash-stat-card:nth-child(3){animation-delay:.14s}
.pj-dash-stat-card:hover{border-color:var(--border);box-shadow:var(--shadow-md);transform:translateY(-2px)}
.pj-dash-stat-title{font-size:11px;font-weight:700;color:var(--text3);text-transform:uppercase;letter-spacing:.04em;margin-bottom:8px;min-height:24px;display:flex;align-items:center}
.pj-dash-stat-title-row{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-bottom:8px;min-height:24px}
.pj-dash-stat-title-row .pj-dash-stat-title{margin-bottom:0}
.pj-rhythm-toggle{width:auto}
.pj-rhythm-toggle .pj-scope-btn{padding:2px 9px;font-size:10px}
.pj-dash-rhythm-caption{margin-top:8px;font-size:11px;color:var(--text3);text-align:center}
/* Chart.js's maintainAspectRatio:false only respects a container that already
   has a real height — without this, a canvas with no CSS height keeps
   growing (especially a bar chart with several categories). */
.pj-dash-chart-wrap{position:relative;height:110px}
.pj-dash-chart-wrap-donut{height:150px;max-width:180px;margin:0 auto}
.pj-dash-chart-empty{display:flex;align-items:center;justify-content:center;height:100%;color:var(--text3);font-size:12px;text-align:center}
/* Activity heatmap (Home's "My/Team Activity" widget, _homeRenderActivityHeatmap
   in ui-shell.js) — GitHub-style contribution calendar, one .pj-heat-col per
   week (7 stacked .pj-heat-cell days), a full year always rendered. No
   scrollbar, ever: align-items:flex-end pins the grid's right edge (today)
   flush with the container's right edge — an item aligned to an edge always
   overflows away from that edge in one direction only, never split across
   both like center alignment does — and overflow-x:hidden silently clips
   whatever spills past the left edge (however many months that ends up
   being) instead of making it reachable by scrolling. No JS width
   measurement needed: this is exactly "show as many recent months as fit,
   clip the rest," done in CSS alone. */
.home-heat-wrap{height:160px;display:flex;flex-direction:column;align-items:flex-end;justify-content:center;overflow-x:hidden;overflow-y:hidden}
.pj-heat-grid{display:flex;gap:3px;width:max-content}
.pj-heat-col{display:flex;flex-direction:column;gap:3px}
.pj-heat-month{font-size:10px;color:var(--text3);height:12px;white-space:nowrap}
.pj-heat-days{display:flex;flex-direction:column;gap:3px}
.pj-heat-cell{width:10px;height:10px;border-radius:2px;background:var(--bg3)}
.pj-heat-cell.pj-heat-empty{background:transparent}
.pj-heat-cell[data-level="1"]{background:color-mix(in srgb,var(--green) 25%,var(--bg3))}
.pj-heat-cell[data-level="2"]{background:color-mix(in srgb,var(--green) 50%,var(--bg3))}
.pj-heat-cell[data-level="3"]{background:color-mix(in srgb,var(--green) 75%,var(--bg3))}
.pj-heat-cell[data-level="4"]{background:var(--green)}
.pj-heat-scale{display:flex;align-items:center;gap:3px;margin-top:8px;font-size:10px;color:var(--text3)}
/* Weekday labels + a clipping track that keeps today flush right, the same
   "show as many recent months as fit" behaviour as before. */
.pj-heat-body{display:flex;gap:5px;max-width:100%;min-width:0}
.pj-heat-wds{display:flex;flex-direction:column;gap:3px;flex-shrink:0}
.pj-heat-wd{height:10px;font-size:10px;line-height:10px;color:var(--text3)}
.pj-heat-clip{display:flex;justify-content:flex-end;overflow:hidden;min-width:0}
.home-heat-wrap .pj-heat-scale{width:100%;justify-content:flex-end}
.pj-heat-summary{margin-right:auto;font-size:11px;color:var(--text3)}
.pj-heat-summary strong{color:var(--text2);font-weight:600}
.home-heat-cell[data-day]{cursor:pointer}
.home-heat-cell[data-level="0"]{background:var(--bg4)}
#home-activity-heatmap .pj-heat-cell[data-level="1"]{background:color-mix(in srgb,var(--accent-ink) 25%,var(--bg3))}
#home-activity-heatmap .pj-heat-cell[data-level="2"]{background:color-mix(in srgb,var(--accent-ink) 48%,var(--bg3))}
#home-activity-heatmap .pj-heat-cell[data-level="3"]{background:color-mix(in srgb,var(--accent-ink) 72%,var(--bg3))}
#home-activity-heatmap .pj-heat-cell[data-level="4"]{background:var(--accent-ink)}
.home-heat-cell[data-day]:hover{outline:1px solid var(--text3);outline-offset:0}
.home-heat-cell.selected{outline:2px solid var(--accent-ink);outline-offset:1px}
.home-heat-tip{position:fixed;z-index:400;display:none;pointer-events:none;min-width:150px;max-width:240px;padding:8px 10px;border-radius:var(--r-sm);background:var(--text);color:var(--bg2);font-size:12px;line-height:1.45;box-shadow:var(--shadow-md)}
.home-heat-tip-date{font-weight:600;margin-bottom:3px}
.home-heat-tip-total{opacity:.85;margin-bottom:2px}
.home-heat-tip-row{display:flex;gap:6px;opacity:.9}
.home-heat-tip-row span{font-family:var(--mono);font-weight:600;min-width:18px;text-align:right}
.home-heat-tip-none,.home-heat-tip-hint{opacity:.65;font-size:11px}
.home-heat-tip-hint{margin-top:4px}
/* Own box (not .home-heat-tip's inverted dark-chip look) — a normal card
   matching the app's other popovers (.notif-pop), since the richer
   multi-line content here (title + description paragraph + meta lines)
   reads better as an integrated card than a flipped-contrast OS tooltip. */
.home-rota-tip{position:fixed;z-index:400;display:none;pointer-events:none;min-width:180px;max-width:280px;padding:9px 11px;border-radius:var(--r-md);background:var(--bg2);border:1px solid var(--border2);color:var(--text);font-size:12px;line-height:1.45;box-shadow:var(--shadow-lg)}
.home-rota-tip-title{font-weight:600;margin-bottom:2px;color:var(--text)}
.home-rota-tip-meta{color:var(--text3);font-size:11px;margin-bottom:5px}
.home-rota-tip-desc{color:var(--text2);margin-bottom:5px;white-space:pre-wrap}
.home-rota-tip-line{color:var(--text2)}
.home-rota-tip-line+.home-rota-tip-line{margin-top:1px}
.home-recent-day{max-height:260px;overflow-y:auto}
#home-recent-activity .home-recent-day{max-height:none;flex:1;min-height:0}
.pj-dash-kanban-head{margin:0 0 8px;display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap}
.pj-dash-kanban-head>span{font-size:11px;font-weight:700;color:var(--text3);text-transform:uppercase;letter-spacing:.05em}
.pj-dash-kanban-head .pj-scope{width:auto}
.pj-dash-kanban-head .pj-scope-btn{padding:4px 12px}
.pj-dash-tag{display:inline-block;margin-top:4px;padding:1px 7px;border-radius:var(--r-sm);font-size:10px;font-weight:600}
@media (max-width:900px){.pj-dashboard-body{grid-template-columns:1fr}}

.pj-hero{padding:20px 26px 0;border-bottom:1px solid var(--border);position:relative}
.pj-hero::before{content:'';position:absolute;left:0;right:0;top:0;height:3px;background:var(--pj-color,var(--accent))}
.pj-hero-top{display:flex;align-items:flex-start;gap:14px}
.pj-hero-title{margin:0;font-size:var(--ui-title);font-weight:700;letter-spacing:-.01em;display:flex;align-items:center;gap:9px;flex-wrap:wrap}
.pj-badge{font-size:10px;font-family:var(--mono);font-weight:600;color:var(--text3);background:var(--bg3);border:1px solid var(--border);border-radius:var(--r-xs);padding:1px 5px;text-transform:uppercase;letter-spacing:.04em}
.pj-hero-desc{font-size:13px;color:var(--text2);margin-top:7px;line-height:1.55;max-width:70ch}
.pj-hero-links{display:flex;align-items:center;gap:14px;margin-top:9px;flex-wrap:wrap}
.pj-hero-link{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--accent-ink);text-decoration:none}
.pj-hero-link:hover{text-decoration:underline}
.pj-hero-actions{display:flex;gap:6px;flex-shrink:0}

/* Metric strip under the hero title — a bordered card row, not raw floating numbers */
.pj-metrics{display:flex;margin-top:15px;width:fit-content;border:1px solid var(--border);border-radius:var(--r-md);overflow:hidden;background:var(--bg2)}
.pj-metric{background:none;border:none;border-right:1px solid var(--border);padding:8px 18px;text-align:left;cursor:pointer;font:inherit;transition:background .1s}
.pj-metric:last-child{border-right:none}
.pj-metric:hover{background:var(--bg3)}
.pj-metric-n{font-size:17px;font-weight:600;font-family:var(--mono);color:var(--text);line-height:1.15}
.pj-metric-l{font-size:10px;color:var(--text3);text-transform:uppercase;letter-spacing:.05em;margin-top:2px}
.pj-metric:hover .pj-metric-n{color:var(--accent-ink)}

.pj-tabbar{display:flex;gap:2px;margin-top:16px;overflow-x:auto;scrollbar-width:none}
/* Inside the workspace the underline tabs take the project's own accent */
.pj-tabbar .subtab--tab.active{border-bottom-color:var(--accent)}
/* Left-aligned at their natural width — the base .subtab--tab is flex:1, which
   spread seven tabs across the whole pane with wide dead gaps between them */
.pj-tabbar .subtab--tab{flex:none;padding:8px 14px;font-size:12px}
.pj-tabbar::-webkit-scrollbar{display:none}
.pj-panel{padding:22px 26px 40px;max-width:1180px}

/* ── Pipeline board (Design → Make → Test → Analyse) ── */
/* Stacked Molecules + Tasks board */
.pj-board-head{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.pj-board-heading{margin:0;font-size:14px;font-weight:700;letter-spacing:-.01em}
.pj-board-split{height:1px;background:var(--border);margin:52px 0 34px}

/* Reaction scheme expanded inline under a row in Projects > Chemistry */
.pj-chem-scheme{display:flex;align-items:center;gap:12px;padding:10px 12px;background:var(--bg2);border-top:1px solid var(--border)}
.pj-chem-canvas{flex:1;min-width:0;min-height:78px;display:flex;align-items:center;justify-content:center;gap:6px;flex-wrap:wrap;background:var(--bg3);border-radius:var(--r-sm);padding:8px;overflow-x:auto}
.pj-chem-canvas img{max-height:70px;width:auto}

/* Inline task editing — the card expands in place instead of a form at the top */
.proj-task-card.editing{cursor:default;box-shadow:0 0 0 2px var(--accent),var(--shadow-md);background:var(--bg2)}
.proj-task-edit{display:flex;flex-direction:column;gap:6px}
.proj-task-edit .form-input{font-size:12px;padding:4px 6px;width:100%}
.proj-task-edit-row{display:flex;gap:5px;flex-wrap:wrap}
.proj-task-edit-row .form-input{flex:1;min-width:88px}
.proj-task-edit textarea.form-input{resize:vertical;font:inherit;font-size:12px}
.proj-task-edit-actions{display:flex;align-items:center;gap:6px;margin-top:2px}
.pj-pipe{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
.pj-pipe-col{background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-lg);display:flex;flex-direction:column;min-height:120px;overflow:hidden}
.pj-pipe-head{display:flex;align-items:center;gap:6px;padding:9px 11px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text2);border-bottom:1px solid var(--border);background:var(--bg3);cursor:pointer;user-select:none}
.pj-pipe-head .n{margin-left:auto;font-family:var(--mono);color:var(--text3);font-weight:600}
.pj-pipe-chev{transition:transform .12s;flex-shrink:0;color:var(--text3)}
.pj-pipe-col.collapsed .pj-pipe-chev{transform:rotate(-90deg)}
.pj-pipe-col.collapsed .pj-pipe-head{border-bottom:none}
.pj-pipe-col.collapsed .pj-pipe-body{display:none}
.pj-pipe-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}
.pj-pipe-col[data-stage="designed"]    .pj-pipe-dot{background:var(--text3)}
.pj-pipe-col[data-stage="synthesized"] .pj-pipe-dot{background:var(--chip-blue-fg,#5b7fa6)}
.pj-pipe-col[data-stage="tested"]      .pj-pipe-dot{background:var(--chip-purple-fg,#a06ab4)}
.pj-pipe-col[data-stage="evaluated"]   .pj-pipe-dot{background:var(--green)}
.pj-pipe-body{padding:8px;display:flex;flex-direction:column;gap:6px;overflow-y:auto;max-height:60vh}
.pj-pipe-empty{border:1px dashed var(--border2);border-radius:var(--r-md);padding:14px 6px;text-align:center;color:var(--text3);font-size:11px}
.pj-mol{display:flex;gap:8px;align-items:center;padding:7px 8px;background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-md);cursor:pointer;transition:border-color .12s,transform .1s,box-shadow .1s}
.pj-mol:hover{border-color:color-mix(in srgb,var(--accent) 40%,var(--border));transform:translateY(-1px);box-shadow:var(--shadow-sm)}
/* Someone already has an open (not-yet-completed) reaction making this
   designed molecule — a slow, low-amplitude "heartbeat" glow instead of a
   loud static color, so it reads as "in progress" without competing for
   attention against the rest of the board. */
.pj-mol--open-reaction{background:color-mix(in srgb,var(--accent) 6%,var(--bg2));border-color:color-mix(in srgb,var(--accent) 35%,var(--border));animation:pj-heartbeat 2.6s ease-in-out infinite}
@keyframes pj-heartbeat{
  0%,100%{box-shadow:0 0 0 0 color-mix(in srgb,var(--accent) 16%,transparent)}
  50%{box-shadow:0 0 0 4px color-mix(in srgb,var(--accent) 8%,transparent)}
}
@media (prefers-reduced-motion:reduce){.pj-mol--open-reaction{animation:none;box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 12%,transparent)}}
/* Completed in ELN but not yet registered in the Library — a done signal,
   not an in-progress one, so a static tint (no pulse) in the "synthesized"
   stage color rather than the accent used for open reactions. */
.pj-mol--completed-reaction{background:color-mix(in srgb,var(--green) 6%,var(--bg2));border-color:color-mix(in srgb,var(--green) 30%,var(--border))}
/* Expanded/grouped Molecules view — same card, more room: bigger thumbnail,
   title/sub allowed to wrap instead of ellipsis-truncating since a card here
   is a fixed-width tile, not a column-constrained kanban row. Card/thumbnail
   size is user-selectable (S/M/L, see _pjMolExpandedSize) — the JS-side pixel
   sizes fed into getSVG() live in _PJ_MOL_THUMB_PX and must stay in step with
   the thumbnail box sizes below, or the rendered SVG gets stretched/squished
   by CSS instead of drawn at its native size. */
.pj-mol--big{padding:10px;gap:10px;align-items:flex-start}
.pj-mol--big .pj-mol-title{white-space:normal}
.pj-mol--big .pj-mol-sub{white-space:normal}
.pj-mol--big.pj-mol--sm{flex:0 0 190px;width:190px}
.pj-mol--big.pj-mol--sm .pj-mol-thumb{width:72px;height:52px}
.pj-mol--big.pj-mol--md{flex:0 0 260px;width:260px}
.pj-mol--big.pj-mol--md .pj-mol-thumb{width:108px;height:78px}
.pj-mol--big.pj-mol--lg{flex:0 0 340px;width:340px}
.pj-mol--big.pj-mol--lg .pj-mol-thumb{width:156px;height:112px}
.pj-mol--big.pj-mol--xl{flex:0 0 440px;width:440px}
.pj-mol--big.pj-mol--xl .pj-mol-thumb{width:220px;height:160px}
/* Groups render as horizontal, wrapping rows of cards (left-to-right, one
   section per group) rather than side-by-side kanban columns — this view is
   for scanning/comparing structures at a glance, which a shelf of rows reads
   better for than several parallel columns each fighting for width. */
.pj-mol-expanded-rows{display:flex;flex-direction:column;gap:16px}
.pj-mol-exp-row-head{display:flex;align-items:center;gap:6px;font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;color:var(--text2);margin-bottom:8px}
.pj-mol-exp-row-body{display:flex;flex-wrap:wrap;gap:10px}
.pj-mol-thumb{width:52px;height:38px;flex-shrink:0;background:var(--bg3);border-radius:var(--r-xs);display:flex;align-items:center;justify-content:center;overflow:hidden}
.pj-mol-thumb svg{max-width:100%;max-height:100%}
.pj-mol-thumb--zoomable{cursor:pointer;position:relative}
.pj-mol-thumb--zoomable::after{content:'full size';position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  background:rgba(0,0,0,.55);color:#fff;font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;
  opacity:0;transition:opacity .15s;border-radius:var(--r-xs)}
.pj-mol-thumb--zoomable:hover::after{opacity:1}
.pj-mol-body{flex:1;min-width:0}
.pj-mol-title{font-size:12px;font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pj-mol-sub{font-size:10px;color:var(--text3);font-family:var(--mono);margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* Global search (⌘K) — anchored near the top so the input never moves as
   results come and go. */
.gs-overlay.show{align-items:flex-start;padding-top:12vh}
.gs-modal{max-width:600px;width:calc(100vw - 32px);padding:0;overflow:hidden;display:flex;flex-direction:column}
.gs-input-row{display:flex;align-items:center;gap:10px;padding:14px 18px;border-bottom:1px solid var(--border)}
.gs-input-row input{flex:1;border:none;background:transparent;outline:none;font-size:15px;color:var(--text);padding:0}
.gs-input-row input::placeholder{color:var(--text3)}
.gs-results{max-height:min(440px,60vh);overflow-y:auto;padding:6px}
.gs-cat{margin:10px 10px 4px;font-size:11px;font-weight:600;color:var(--text3)}
.gs-cat:first-child{margin-top:4px}
.gs-result-row{display:flex;align-items:center;gap:10px;padding:8px 10px;border-radius:var(--r-sm);cursor:pointer;min-width:0}
.gs-result-row.active{background:var(--accent-light)}
.gs-ico{display:inline-flex;align-items:center;justify-content:center;width:16px;flex-shrink:0;color:var(--text3)}
.gs-result-row.active .gs-ico{color:var(--accent-ink)}
.gs-label{font-size:13px;font-weight:500;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex-shrink:1;min-width:0;max-width:60%}
.gs-label.mono{font-family:var(--mono);font-size:var(--ui-body)}
.gs-label.hint{font-family:var(--mono);color:var(--text3)}
.gs-label.more{color:var(--accent-ink)}
.gs-sub{font-size:12px;color:var(--text3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0}
.gs-hl{background:none;color:inherit;font-weight:700;text-decoration:underline;text-decoration-color:color-mix(in srgb,var(--accent-ink) 55%,transparent);text-underline-offset:2px}
.gs-empty{padding:28px 16px;text-align:center;color:var(--text2);font-size:13px}
.gs-empty-sub{margin-top:4px;font-size:12px;color:var(--text3)}
.gs-note{margin:6px 10px 2px;font-size:12px;color:var(--text3)}
.gs-foot{display:flex;align-items:center;gap:14px;padding:8px 16px;border-top:1px solid var(--border);background:var(--bg);font-size:11px;color:var(--text3)}
.gs-foot kbd{display:inline-block;min-width:16px;padding:0 4px;margin-right:3px;border:1px solid var(--border2);border-bottom-width:2px;border-radius:var(--r-xs);background:var(--bg2);font-family:var(--mono);font-size:10px;line-height:15px;text-align:center;color:var(--text2)}
.gs-foot-tip{margin-left:auto}
@media (max-width:640px){.gs-foot-tip{display:none}}
.pj-mol-del{flex-shrink:0;opacity:0;transition:opacity .12s}
.pj-mol:hover .pj-mol-del{opacity:1}
.pj-mol.mine{border-color:color-mix(in srgb,var(--accent) 45%,var(--border));background:color-mix(in srgb,var(--accent) 6%,var(--bg2))}
.pj-mol-mine-tag{flex-shrink:0;font-size:9px;font-weight:700;color:var(--accent-ink);background:color-mix(in srgb,var(--accent) 16%,transparent);padding:1px 6px;border-radius:var(--r-xs);text-transform:uppercase;letter-spacing:.03em}
/* Series rationale line under the series filter bar */
.pj-series-note{display:flex;align-items:baseline;gap:8px;font-size:12px;color:var(--text2);line-height:1.5;margin-bottom:12px;padding:7px 10px;background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-md)}
.pj-series-note-actions{margin-left:auto;display:flex;gap:10px;flex-shrink:0;align-items:baseline}

/* Task priority + overdue badges */
.pj-prio{font-size:9px;font-weight:700;padding:1px 5px;border-radius:var(--r-xs);text-transform:uppercase;letter-spacing:.03em}
.pj-prio.high{background:var(--chip-red-bg);color:var(--chip-red-fg)}
.pj-prio.low{background:var(--bg3);color:var(--text3)}
.pj-prio.normal{background:var(--chip-blue-bg);color:var(--chip-blue-fg)}
.pj-due-over{font-size:9px;font-weight:700;color:var(--chip-red-fg);background:var(--chip-red-bg);padding:1px 5px;border-radius:var(--r-xs);font-family:var(--mono)}

/* Dashboard quick-filter chips (All/Overdue/Today/This week/No date) —
   sits right under the Board/Table header, above whichever view is active. */
.pj-dash-filters{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 12px}
.pj-filter-chip{background:var(--bg3);border:1px solid var(--border2);color:var(--text2);font-size:11px;font-weight:600;padding:4px 10px;border-radius:999px;cursor:pointer;transition:background .12s,border-color .12s,color .12s}
.pj-filter-chip:hover{border-color:var(--border);color:var(--text)}
.pj-filter-chip.active{background:color-mix(in srgb,var(--accent) 14%,var(--bg2));border-color:color-mix(in srgb,var(--accent) 45%,var(--border2));color:var(--accent-ink)}
.pj-filter-n{opacity:.75;font-weight:500}

/* Dashboard Table view — a Notion-style spreadsheet over the same items the
   Board (kanban) shows, with sortable headers, group headers, per-cell
   inline edit (priority chip, date input, status chip) and row selection. */
.pj-table-wrap{border:1px solid var(--border);border-radius:var(--r-lg);overflow:hidden;overflow-x:auto}
.pj-table{width:100%;border-collapse:collapse;font-size:var(--ui-body)}
.pj-table thead th{background:var(--bg3);color:var(--text3);font-size:var(--ui-label);font-weight:700;text-transform:uppercase;letter-spacing:.04em;text-align:left;padding:8px 10px;border-bottom:1px solid var(--border);white-space:nowrap}
.pj-table th.pj-table-sortable{cursor:pointer;user-select:none}
.pj-table th.pj-table-sortable:hover{color:var(--text)}
.pj-table th.pj-table-check,.pj-table td.pj-table-check{width:28px;padding-left:10px;padding-right:0}
.pj-table tbody tr.pj-table-row{cursor:pointer;transition:background .12s}
.pj-table tbody tr.pj-table-row:hover{background:var(--bg3)}
.pj-table tbody tr.pj-table-row.selected{background:color-mix(in srgb,var(--accent) 8%,transparent)}
.pj-table tbody tr.pj-table-row.done .pj-table-title{color:var(--text3);text-decoration:line-through}
.pj-table td{padding:7px 10px;border-bottom:1px solid var(--border);vertical-align:middle}
.pj-table tbody tr.pj-table-row:last-child td{border-bottom:none}
.pj-table-title{display:flex;align-items:center;gap:6px;color:var(--text);font-weight:500}
.pj-table-muted{color:var(--text3);font-style:italic}
.pj-table-group-row td{background:var(--bg3);color:var(--text3);font-size:var(--ui-label);font-weight:700;text-transform:uppercase;letter-spacing:.04em;padding:6px 10px;border-bottom:1px solid var(--border)}
.pj-table-group-dot{display:inline-block;width:6px;height:6px;border-radius:50%;margin-right:6px;vertical-align:middle}
.pj-table-date-input{border:none;background:none;color:var(--text2);font-size:var(--ui-input);font-family:var(--mono);padding:2px 0;cursor:pointer;width:100px}
.pj-table-date-input:hover,.pj-table-date-input:focus{color:var(--text)}
.pj-table-empty{text-align:center;color:var(--text3);padding:22px 0!important;font-style:italic}
.pj-table-row-editing td{padding:8px;background:var(--bg3)}

/* Bulk-action bar — appears above the table once one or more rows are
   selected; the mark-done/priority/delete actions apply to every selected
   row at once (see _pjDashBulk* in projects.js). */
.pj-bulkbar{display:flex;align-items:center;gap:12px;flex-wrap:wrap;background:color-mix(in srgb,var(--accent) 10%,var(--bg2));border:1px solid color-mix(in srgb,var(--accent) 30%,var(--border2));border-radius:var(--r-md);padding:8px 12px;margin-bottom:10px}
.pj-bulkbar-count{font-size:12px;font-weight:600;color:var(--text)}
.pj-bulkbar-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-left:auto}
.pj-bulkbar-actions select{font-size:12px;padding:4px 8px}

/* "Edit dashboard" modal — module show/hide + reorder, same up/down-arrow
   pattern as Admin's Home-widget layout editor. */
.pj-layout-list{display:flex;flex-direction:column;max-height:340px;overflow-y:auto}
.pj-layout-row{display:flex;align-items:center;gap:10px;padding:9px 2px;border-bottom:1px solid var(--border)}
.pj-layout-row:last-child{border-bottom:none}
.pj-layout-label{display:flex;align-items:center;gap:10px;flex:1;min-width:0;cursor:pointer}
.pj-layout-text{display:flex;flex-direction:column;gap:1px;min-width:0}
.pj-layout-title{font-size:13px;font-weight:600;color:var(--text)}
.pj-layout-hint{font-size:11px;color:var(--text3)}
.pj-layout-move{display:flex;gap:4px;flex-shrink:0}

/* Collapsible series groups inside pipeline columns */
.pj-series{border:1px solid var(--border);border-radius:var(--r-md);padding:4px;background:var(--bg3)}
.pj-series-head{display:flex;align-items:center;gap:5px;font-size:11px;font-weight:600;color:var(--text2);cursor:pointer;padding:2px 3px;border-radius:var(--r-xs);user-select:none}
.pj-series-head .n{margin-left:auto;font-family:var(--mono);color:var(--text3);font-weight:600}
.pj-series-chev{transition:transform .12s;flex-shrink:0}
.pj-series.collapsed .pj-series-chev{transform:rotate(-90deg)}
.pj-series.collapsed .pj-series-body{display:none}
.pj-series-body{display:flex;flex-direction:column;gap:6px;margin-top:5px}

/* Goal — free-text final objective, shown as a small callout above the
   pipeline section */
.pj-goal-text{font-size:13px;color:var(--text2);line-height:1.5;margin:2px 0 12px;padding:8px 10px;background:var(--bg2);border-left:2px solid var(--accent);border-radius:var(--r-xs)}

/* ── SAR matrix ── */
.pj-sar-wrap{overflow:auto;max-height:72vh;border:1px solid var(--border);border-radius:var(--r-lg);background:var(--bg2)}
.pj-sar{border-collapse:separate;border-spacing:0;font-size:12px;min-width:100%}
.pj-sar th,.pj-sar td{padding:6px 10px;border-bottom:1px solid var(--border);white-space:nowrap}
.pj-sar thead th{position:sticky;top:0;z-index:3;background:var(--bg3);font-size:var(--ui-label);font-weight:700;color:var(--text2);text-transform:uppercase;letter-spacing:.04em;text-align:left;border-bottom:1px solid var(--border2)}
.pj-sar thead th small{display:block;font-family:var(--mono);font-weight:500;text-transform:none;letter-spacing:0;color:var(--text3);font-size:10px;margin-top:1px}
.pj-sar tbody tr:hover td{background:color-mix(in srgb,var(--accent) 5%,transparent)}
.pj-sar .pj-sar-cpd{position:sticky;left:0;z-index:2;background:var(--bg2);font-family:var(--mono);font-weight:600;cursor:pointer}
.pj-sar thead .pj-sar-cpd{z-index:4;background:var(--bg3)}
.pj-sar tbody tr:hover .pj-sar-cpd{background:color-mix(in srgb,var(--accent) 8%,var(--bg2))}
.pj-sar-struct{width:74px;height:46px;background:var(--bg3);border-radius:var(--r-xs);display:flex;align-items:center;justify-content:center;overflow:hidden}
.pj-sar-struct svg{max-width:100%;max-height:100%}
.pj-sar-val{font-family:var(--mono);font-weight:600;padding:1px 6px;border-radius:var(--r-xs)}
.pj-sar-n{font-size:9px;color:var(--text3);margin-left:3px;font-family:var(--mono);font-weight:400}
.pj-sar-empty{color:var(--text3)}

/* ── Timeline ── */
.pj-time{position:relative;padding-left:22px}
.pj-time::before{content:'';position:absolute;left:5px;top:4px;bottom:4px;width:1px;background:var(--border)}
.pj-time-item{position:relative;padding:0 0 15px}
.pj-time-item::before{content:'';position:absolute;left:-20px;top:4px;width:9px;height:9px;border-radius:50%;background:var(--bg2);border:2px solid var(--border2)}
.pj-time-item[data-kind="stage"]::before,.pj-time-item[data-kind="verdict"]::before{border-color:var(--accent)}
.pj-time-item[data-kind="compound"]::before{border-color:var(--green-ink)}
.pj-time-item[data-kind="docking"]::before{border-color:var(--text2)}
.pj-time-title{font-size:12px;color:var(--text);font-weight:500}
.pj-time-meta{font-size:var(--ui-caption);color:var(--text3);margin-top:2px;font-family:var(--mono)}
.pj-time-detail{font-size:11px;color:var(--text2);margin-top:3px;line-height:1.45}


/* ── Documents ── */
.pj-doc{display:flex;align-items:center;gap:11px;padding:10px 12px;border:1px solid var(--border);border-radius:var(--r-md);background:var(--bg2);margin-bottom:6px;transition:border-color .12s}
.pj-doc:hover{border-color:var(--border2)}
.pj-doc-icon{width:30px;height:30px;border-radius:var(--r-sm);background:var(--bg3);display:flex;align-items:center;justify-content:center;flex-shrink:0;color:var(--text3)}
.pj-doc-main{flex:1;min-width:0}
.pj-doc-title{font-size:13px;font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pj-doc-meta{font-size:11px;color:var(--text3);font-family:var(--mono);margin-top:2px}

/* ── Team ── */
.pj-team-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(232px,1fr));gap:10px}
.pj-member{display:flex;gap:11px;align-items:center;padding:12px;border:1px solid var(--border);border-radius:var(--r-lg);background:var(--bg2)}
.pj-member .pj-av{width:34px;height:34px;font-size:12px}
.pj-member-name{font-size:13px;font-weight:600;color:var(--text)}
.pj-member-meta{font-size:11px;color:var(--text3);margin-top:2px}
.pj-load{height:5px;border-radius:99px;background:var(--bg3);overflow:hidden;margin-top:6px}
.pj-load span{display:block;height:100%;background:var(--accent);border-radius:99px}
/* Someone on an approved absence today: dimmed, with the reason spelled out. The
   card stays fully readable on hover so it never becomes an accessibility trap. */
.pj-member.away{opacity:.5;transition:opacity .15s}
.pj-member.away:hover{opacity:1}
.pj-member-profile{font:inherit;text-align:left;cursor:pointer;width:100%;transition:border-color .15s,box-shadow .15s}
.pj-member-profile:hover,.pj-member-profile:focus-visible{border-color:var(--accent);box-shadow:var(--shadow-sm);outline:2px solid transparent}
#person-profile-modal{padding:18px}
.person-card{width:720px;max-width:94vw;padding:22px;max-height:88vh}
.person-card-head{display:flex;align-items:center;gap:14px;margin-bottom:14px}
.person-card-head>div{flex:1;min-width:0}
.person-card-head h3{margin:0 0 4px;font-size:var(--ui-dialog);overflow-wrap:anywhere}
.person-card-head p{font-size:12px;color:var(--text3);margin:0}
.person-card-head>.av{flex:none}
.person-card .close-btn{flex:none;position:relative}
.person-links{display:flex;flex-wrap:wrap;gap:8px;margin:8px 0 14px}
.person-link{display:inline-flex;align-items:center;gap:6px;font-size:var(--ui-action);padding:5px 8px;border:1px solid var(--border);border-radius:var(--r-sm);color:var(--accent-ink);max-width:100%;text-decoration:none}
.person-link span{overflow-wrap:anywhere;min-width:0}
.person-link svg{flex:none}
.person-link:hover{background:var(--bg3)}
.person-tabs{display:flex;gap:4px;border-bottom:1px solid var(--border);margin:18px 0 16px}
.person-tabs button{font:inherit;font-size:var(--ui-action);border:0;border-bottom:2px solid transparent;background:none;padding:10px 12px;color:var(--text3);cursor:pointer}
.person-tabs button.active{color:var(--accent-ink);border-bottom-color:var(--accent);font-weight:600}
.person-tabs button:disabled{cursor:default}
.person-section{margin:18px 0}
.person-section h4{font-size:var(--ui-section);font-weight:600;color:var(--text);margin-bottom:8px}
.person-prose{font-size:var(--ui-reading);line-height:1.6;color:var(--text2);white-space:pre-wrap;overflow-wrap:anywhere;margin:5px 0}
.person-hint{font-size:var(--ui-caption);line-height:1.5;color:var(--text3);margin:7px 0}
.person-card form>label,.person-form-grid label{display:block;font-size:var(--ui-label);color:var(--text2);margin:12px 0 5px}
.person-card input,.person-card textarea{width:100%;font:inherit;font-size:var(--ui-input);padding:8px 10px;background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:var(--r-sm);min-width:0}
.person-card textarea{resize:vertical}
.person-form-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.person-link-row{display:grid;grid-template-columns:1fr 1.7fr auto;gap:8px;align-items:center;margin:8px 0}
.person-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:18px}
.person-career-form{padding:14px;background:var(--bg3);border-radius:var(--r-lg);margin-top:12px}
.person-timeline{margin:18px 0 0 7px;border-left:2px solid var(--border);padding-left:18px}
.person-stage{position:relative;padding:0 0 18px}
.person-stage::before{content:'';position:absolute;left:-24px;top:6px;width:10px;height:10px;border-radius:50%;background:var(--accent);border:2px solid var(--bg2)}
.person-stage-head{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:13px}
.person-stage-head>span{display:flex;gap:4px}
.person-result{padding:12px 0;border-bottom:1px solid var(--border)}
.person-result-title{font:inherit;font-size:var(--ui-body);font-weight:600;text-align:left;color:var(--accent-ink);background:none;border:0;padding:2px 0;cursor:pointer;overflow-wrap:anywhere}
.person-result-title:hover{text-decoration:underline}
.person-result .person-links{margin-bottom:0}
.person-empty{padding:22px 0;font-size:13px;color:var(--text3)}
.person-result-highlight{outline:2px solid var(--accent);outline-offset:3px;border-radius:var(--r-sm)}
.orcid-sync-action{display:flex;margin:12px 0 4px}
.orcid-mark{width:16px;height:16px;display:block;flex:none}
.orcid-sync-action .btn{display:inline-flex;align-items:center;gap:7px}
.diss-orcid-btn{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.orcid-sync{width:680px;max-width:94vw;max-height:86vh;overflow:auto;padding:22px}
.orcid-work-list{display:grid;gap:8px;margin:14px 0;max-height:52vh;overflow:auto}
.orcid-work{display:grid;grid-template-columns:auto minmax(0,1fr) auto;align-items:start;gap:10px;padding:11px 12px;border:1px solid var(--border);border-radius:var(--r-md);background:var(--bg2);cursor:pointer}
.orcid-work:hover{border-color:var(--border2)}
.orcid-work>input{margin-top:3px}
.orcid-work>span:nth-child(2){display:grid;gap:3px;min-width:0}
.orcid-work strong{font-size:var(--ui-body);line-height:1.35;overflow-wrap:anywhere}
.orcid-work small{font-size:var(--ui-caption);color:var(--text3);overflow-wrap:anywhere}
.orcid-work.is-existing{opacity:.68;cursor:default}
@media(max-width:600px){.orcid-sync{width:calc(100vw - 24px);max-width:none;padding:16px}.orcid-work{grid-template-columns:auto minmax(0,1fr)}.orcid-work>.diss-kind{grid-column:2;justify-self:start}}
@media(max-width:600px){
  #person-profile-modal{align-items:center;padding:8px}
  #person-profile-modal .person-card{position:static;padding:16px;max-height:90vh;max-width:96vw;border-radius:var(--r-xl)}
  .person-card-head h3{font-size:var(--ui-dialog)}
  .person-form-grid{grid-template-columns:1fr;gap:0}
  .person-tabs button{font-size:var(--ui-action);padding:9px 7px}
  .person-link-row{grid-template-columns:1fr auto}
  .person-link-row input:nth-child(2){grid-column:1;grid-row:2}
  .person-link-row button{grid-column:2;grid-row:1/3}
}
.pj-away{font-size:11px;font-weight:600;color:var(--warn-fg,var(--text2));margin-top:2px}

/* Shared small pieces */
.pj-milestone-actions{display:flex;gap:6px;flex-wrap:wrap}
.pj-milestone-summary{font-size:12px;color:var(--text3);margin-bottom:10px}
.pj-milestone-scroll{overflow-x:auto;overscroll-behavior-x:contain;padding:4px 0 12px;border:1px solid var(--border);border-radius:var(--r-lg);background:var(--bg2)}
.pj-milestones{display:flex;list-style:none;margin:0;padding:18px 18px 6px;min-width:100%}
.pj-milestone{position:relative;flex:1 0 155px;min-width:0}
.pj-milestone:not(:last-child)::after{content:'';position:absolute;top:13px;left:calc(50% + 15px);width:calc(100% - 30px);height:2px;background:var(--border)}
.pj-milestone.is-complete:not(:last-child)::after{background:var(--accent)}
.pj-milestone-node{display:flex;align-items:center;flex-direction:column;gap:6px;width:100%;min-width:0;padding:0 10px 6px;background:none;border:0;color:var(--text);font:inherit;text-align:center;border-radius:var(--r-sm)}
button.pj-milestone-node{cursor:pointer}
button.pj-milestone-node:hover .pj-milestone-title{color:var(--accent-ink)}
.pj-milestone-node:focus-visible,.pj-milestone-scroll:focus-visible{outline:2px solid var(--accent);outline-offset:2px}
.pj-milestone-dot{display:flex;align-items:center;justify-content:center;width:28px;height:28px;margin-bottom:5px;border:2px solid var(--border);border-radius:50%;background:var(--bg2);color:var(--text3);font-size:13px;flex-shrink:0}
.is-complete .pj-milestone-dot{background:var(--accent);border-color:var(--accent);color:#fff}
.is-boundary .pj-milestone-title{color:var(--text2);font-weight:500}
.pj-milestone-title{font-size:13px;font-weight:600;line-height:1.4;overflow-wrap:anywhere}
.pj-milestone-date{font-size:12px;color:var(--text2)}
.pj-milestone-state{font-size:11px;color:var(--text3)}
.pm-project-dates{display:grid;grid-template-columns:1fr 1fr;gap:8px 12px;min-width:0}
.form-row .pm-project-dates label,.pm-milestone-detail label{font-size:11px;color:var(--text2);font-weight:500;display:flex;flex-direction:column;gap:4px}
.pm-date-note{grid-column:1/-1;font-size:11px;color:var(--text3)}
.form-row .pm-project-dates label[hidden]{display:none}
.pm-milestones-form>div{width:100%;min-width:0}
.pm-milestone{padding:9px 10px;background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-sm)}
.pm-milestone-head{display:flex;align-items:center;gap:5px}
.pm-milestone-head input[type=checkbox]{width:auto;margin:0;flex-shrink:0}
.pm-milestone-head input[type=text]{flex:1;min-width:0;border:0;background:none;padding:3px;font-size:12px}
.pm-milestone-head button{padding:2px 5px;flex-shrink:0}
.pm-milestone-detail{margin:6px 0 0 23px;font-size:11px;color:var(--text3);display:flex;flex-wrap:wrap;gap:6px 16px;align-items:center}
.pm-overdue{color:var(--red);font-weight:600}
.pm-milestone-detail label{flex-direction:row;align-items:center;gap:8px}
.pm-milestone-detail input{max-width:160px}
@media(max-width:600px){.pj-milestone-actions .btn{font-size:11px}.pj-milestone{flex-basis:145px}.pm-project-dates{grid-template-columns:1fr}}
.pj-section{margin-bottom:26px}
.pj-section-head{display:flex;align-items:center;justify-content:space-between;gap:10px;margin-bottom:9px}
.pj-section-title{margin:0;font-size:var(--ui-section);font-weight:700;color:var(--text)}
.pj-section-collapsible>summary.pj-section-title{cursor:pointer;list-style:none;user-select:none}
.pj-section-collapsible>summary.pj-section-title::-webkit-details-marker{display:none}
.pj-section-collapsible>summary.pj-section-title::before{content:'▸';display:inline-block;margin-right:6px;font-size:10px;color:var(--text3);transition:transform .15s}
.pj-section-collapsible[open]>summary.pj-section-title::before{transform:rotate(90deg)}
.pj-card-box{border:1px solid var(--border);border-radius:var(--r-lg);background:var(--bg2);overflow:hidden}
.pj-row{display:flex;align-items:center;gap:9px;padding:8px 12px;border-bottom:1px solid var(--border);cursor:pointer;transition:background .1s}
.pj-row:last-child{border-bottom:none}
.pj-row:hover{background:var(--bg3)}
.pj-row-id{font-family:var(--mono);font-size:11px;color:var(--text3);flex-shrink:0}
.pj-row-title{font-size:12px;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}
.pj-row-when{font-size:11px;color:var(--text3);font-family:var(--mono);flex-shrink:0}
.pj-empty-sm{padding:16px 12px;text-align:center;color:var(--text3);font-size:12px}

@media (max-width:1100px){
  .pj-pipe{grid-template-columns:repeat(2,minmax(0,1fr))}
}
@media (max-width:760px){
  .pj-pipe{grid-template-columns:1fr}
  .pj-panel{padding:16px 14px 32px}
  .pj-hero{padding:16px 14px 0}
}

/* ── Avatar picker (profile modal) ── */
.av-picker{display:flex;gap:16px;align-items:flex-start;padding:14px;background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-lg);margin-bottom:14px}
.av-preview .pj-av{box-shadow:var(--shadow-sm)}
.av-picker-main{flex:1;min-width:0}
.av-tabs{display:flex;gap:2px;background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-sm);padding:2px;width:fit-content;margin-bottom:10px}
.av-tab{background:none;border:none;color:var(--text3);font-size:11px;font-weight:600;padding:4px 12px;border-radius:calc(var(--r-sm) - 2px);cursor:pointer}
.av-tab.active{background:var(--bg2);color:var(--text);box-shadow:var(--shadow-sm)}
.av-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(38px,1fr));gap:6px;margin-bottom:10px}
.av-grid.av-grid-grouped{display:block;max-height:330px;overflow-y:auto;padding-right:3px}
.av-pack+.av-pack{margin-top:11px}
.av-pack-title{margin:0 0 5px;color:var(--text3);font-size:10px;font-weight:700;letter-spacing:.07em;text-transform:uppercase}
.av-pack-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(38px,1fr));gap:6px}
.av-opt{width:38px;height:38px;border-radius:var(--r-md);border:1.5px solid var(--border);background:var(--bg3);color:var(--text2);display:flex;align-items:center;justify-content:center;cursor:pointer;transition:border-color .12s,transform .1s}
.av-opt:hover{transform:translateY(-1px);border-color:var(--border2)}
.av-opt.active{border-color:var(--accent);color:var(--accent-ink);background:var(--accent-light)}
/* The request-access picker is inside an already-tall public form (name/
   email/password above it, no page scroll of its own guaranteed on a
   short viewport) — a scrollable, smaller-tiled grid instead of every icon
   spread out at full size, so the card's height stays reasonable. */
.av-grid-compact{grid-template-columns:repeat(auto-fill,minmax(30px,1fr));gap:5px;max-height:120px;overflow-y:auto;padding-right:2px}
.av-grid-compact .av-opt{width:30px;height:30px}
.av-grid-compact .av-pack-grid{grid-template-columns:repeat(auto-fill,minmax(30px,1fr));gap:5px}
.av-colors{display:flex;gap:6px;flex-wrap:wrap}
.av-color{width:22px;height:22px;border-radius:999px;border:2px solid transparent;cursor:pointer;padding:0;transition:transform .1s}
.av-color:hover{transform:scale(1.12)}
.av-color.active{border-color:var(--text);box-shadow:0 0 0 2px var(--bg2) inset}
.av-edit-btn{background:none;border:none;padding:0;cursor:pointer;border-radius:999px;line-height:0;flex-shrink:0;box-shadow:0 0 0 0 var(--accent);transition:box-shadow .12s}
.av-edit-btn:hover{box-shadow:0 0 0 2px var(--accent)}

/* ── In-app back chip ── */
/* In-app history arrows, grouped so they read as one control next to the icons */
.nav-history{display:inline-flex;align-items:center;background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-sm);padding:1px;margin-right:2px}
.nav-history .nav-icon-btn{width:24px;height:24px;border-radius:calc(var(--r-xs) - 1px)}
.nav-icon-btn:disabled{opacity:.32;cursor:default}
.nav-icon-btn:disabled:hover{background:none;color:var(--text2)}
@media (max-width:820px){.nav-history{display:none}}

/* ══ Similar structures (Library) ═════════════════════════════════ */
.similar-struct-card{border:1px solid var(--border);border-radius:var(--r-md);padding:8px;cursor:pointer;text-align:center;transition:border-color .15s,box-shadow .15s;background:var(--bg2)}
.similar-struct-card:hover{border-color:var(--accent);box-shadow:0 0 0 2px var(--accent-light)}
.similar-struct-svg{width:100%;height:80px;display:flex;align-items:center;justify-content:center;color:var(--text)}
.similar-struct-svg svg{max-width:100%;max-height:100%}
.similar-struct-id{font-family:var(--mono);font-size:11px;font-weight:600;margin-top:4px;color:var(--text)}
.similar-struct-formula{font-size:10px;color:var(--text3)}
.similar-struct-pct{font-size:11px;font-weight:600;color:var(--accent-ink);margin-top:2px}

/* ══ Open relations graph ═══════════════════════════════════════ */
.rel-modal{display:none;position:fixed;inset:0;background:var(--overlay-bg);z-index:998;align-items:center;justify-content:center}
.rel-modal.show{display:flex}
.rel-modal-inner{width:min(1100px,96vw);height:min(760px,92vh);background:var(--bg2);border-radius:var(--r-xl);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;overflow:hidden}
.rel-header{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid var(--border);gap:16px;flex-wrap:wrap}
.rel-htitle{display:flex;flex-direction:column;gap:2px;min-width:0}
.rel-htitle h3{font-size:14px;font-weight:600;margin:0}
.rel-search{position:relative;display:flex;align-items:center;gap:6px;background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-sm);padding:5px 9px;width:180px;flex-shrink:0;color:var(--text3)}
.rel-search:focus-within{border-color:var(--accent)}
.rel-search input{flex:1;min-width:0;background:none;border:none;outline:none;color:var(--text);font-size:12px;font-family:var(--sans)}
.rel-search-results{display:none;position:absolute;top:calc(100% + 4px);left:0;right:0;max-height:280px;overflow-y:auto;background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-md);box-shadow:var(--shadow-md,0 4px 16px rgba(0,0,0,.18));z-index:20}
.rel-search-results.show{display:block}
.rel-search-result{display:flex;align-items:center;gap:7px;padding:6px 9px;font-size:12px;color:var(--text2);cursor:pointer}
.rel-search-result .dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}
.rel-search-result:hover,.rel-search-result.active{background:var(--bg3);color:var(--text)}
.rel-search-result-name{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rel-search-result-type{font-size:10px;color:var(--text3);flex-shrink:0}
.rel-sub{font-size:11px;color:var(--text3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.rel-crumbs{display:flex;align-items:center;gap:6px;font-size:12px;flex-wrap:wrap;flex:1;justify-content:center}
.rel-crumbs .crumb{display:flex;align-items:center;gap:6px;padding:4px 10px 4px 8px;border-radius:999px;background:var(--bg3);border:1px solid var(--border);cursor:pointer;color:var(--text2);transition:border-color .15s,color .15s}
.rel-crumbs .crumb:hover{border-color:var(--text3);color:var(--text)}
.rel-crumbs .crumb:last-child{color:var(--text);font-weight:600;cursor:default;border-color:var(--border)}
.rel-crumbs .crumb:last-child:hover{border-color:var(--border)}
.rel-crumbs .crumb .dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}
.rel-crumbs .crumb-sep{color:var(--text3);font-size:11px}

.rel-stage{position:relative;overflow:hidden;flex:1;background:var(--bg)}
.rel-stage svg{width:100%;height:100%;display:block;cursor:grab}
.rel-stage svg:active{cursor:grabbing}
.rel-loading-hint{position:absolute;inset:0;display:none;align-items:center;justify-content:center;font-size:12px;color:var(--text3);background:var(--bg);pointer-events:none}
.rel-stage.rel-loading .rel-loading-hint{display:flex}

.rel-legend{position:absolute;left:16px;bottom:16px;display:flex;flex-direction:column;gap:6px;background:color-mix(in srgb,var(--bg2) 88%,transparent);border:1px solid var(--border);border-radius:var(--r-md);padding:10px 12px;font-size:11px;color:var(--text2);backdrop-filter:blur(6px)}
.rel-legend-row{display:flex;align-items:center;gap:7px;cursor:pointer;user-select:none;border-radius:var(--r-sm);padding:2px 4px;margin:-2px -4px;transition:background .12s,opacity .12s}
.rel-legend-row:hover{background:var(--bg3)}
.rel-legend-row.off{opacity:.4;text-decoration:line-through}
.rel-legend .dot{width:8px;height:8px;border-radius:50%;flex-shrink:0}
.rel-legend .dot--square{border-radius:1px}
.rel-legend .dot--diamond{border-radius:1px;clip-path:polygon(50% 0%,100% 50%,50% 100%,0% 50%)}
.rel-legend .dot--triangle{border-radius:0;clip-path:polygon(50% 0%,100% 100%,0% 100%)}
.rel-legend .dot--hexagon{border-radius:0;clip-path:polygon(50% 0%,100% 25%,100% 75%,50% 100%,0% 75%,0% 25%)}
.rel-legend .dot--pentagon{border-radius:0;clip-path:polygon(50% 0%,100% 38%,82% 100%,18% 100%,0% 38%)}
.rel-legend .dot--dashed{width:12px;height:0;border-top:2px dashed var(--text3);border-radius:0;background:none}
.rel-legend-row--edge{border-top:1px solid var(--border);padding-top:6px;margin-top:2px}
.rel-depth-lbl{display:block;font-size:10px;color:var(--text3);margin-bottom:3px}
.rel-depth-select{width:100%;background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-xs);padding:3px 6px;font-size:11px;color:var(--text);outline:none}
.rel-depth-select:focus{border-color:var(--accent)}
.rel-legend-reset{cursor:pointer;font-size:10px;font-weight:600;color:var(--accent-ink);margin-top:2px;padding-top:6px;border-top:1px solid var(--border)}
.rel-legend-reset:hover{text-decoration:underline}

.rel-hint{position:absolute;left:16px;top:16px;font-size:11px;color:var(--text3);background:color-mix(in srgb,var(--bg2) 88%,transparent);border:1px solid var(--border);border-radius:var(--r-md);padding:8px 12px;max-width:220px;line-height:1.5}

.rel-zoom-ctl{position:absolute;right:16px;top:16px;display:flex;flex-direction:column;gap:1px;background:color-mix(in srgb,var(--bg2) 88%,transparent);border:1px solid var(--border);border-radius:var(--r-md);overflow:hidden;backdrop-filter:blur(6px)}
.rel-zoom-ctl button{width:30px;height:30px;border:none;background:transparent;color:var(--text2);font-size:15px;cursor:pointer;transition:background .15s,color .15s}
.rel-zoom-ctl button:hover{background:var(--bg3);color:var(--text)}
.rel-zoom-ctl button:first-child{border-bottom:1px solid var(--border)}
#rel2DToggle{font-size:11px;font-weight:700;letter-spacing:.02em}

/* A soft halo behind each project's directly-connected nodes — the visual
   "these belong together" grouping the spring physics alone only gets
   partway to (adjacent nodes end up near each other, but nothing actually
   shows the boundary). Purely cosmetic, drawn behind edges/nodes. */
.rel-cluster-halo{transition:opacity .2s}

.rel-edge{fill:none;stroke-width:2.2;opacity:.5;transition:opacity .15s,stroke-width .15s}
.rel-edge.dim{opacity:.1}
.rel-edge.hi{opacity:.95;stroke-width:3.2}
.rel-edge-similar{stroke-dasharray:1 6;stroke-linecap:round;stroke-width:2.2;opacity:.55}
.rel-edge-similar.hi{opacity:.9;stroke-width:2.8}

.rel-node{cursor:pointer}
.rel-node circle.halo{fill:none;stroke-width:2;opacity:0;transition:opacity .15s}
.rel-node:hover circle.halo,.rel-node.hovered circle.halo{opacity:.55}
.rel-node.dim{opacity:.28}
.rel-node .core{transition:filter .15s;animation:rel-breathe 3.6s ease-in-out infinite;transform-box:fill-box;transform-origin:center;stroke:none}
.rel-node:hover .core,.rel-node.hovered .core{filter:brightness(1.3) saturate(1.15);animation-play-state:paused}
.rel-node.center .core{animation-duration:2.4s}
@keyframes rel-breathe{0%,100%{opacity:1;transform:scale(1)}50%{opacity:.78;transform:scale(1.05)}}
@media (prefers-reduced-motion:reduce){.rel-node .core{animation:none}}
.rel-node text.label{font-size:11px;fill:var(--text2);font-family:var(--sans);pointer-events:none;text-anchor:middle}
.rel-node.center text.label{fill:var(--text);font-weight:600;font-size:12px}
.rel-node .rel-avatar-icon{pointer-events:none;filter:drop-shadow(0 0 1.5px rgba(0,0,0,.45))}
/* A pending-review ELN entry or a failed docking job — something that
   genuinely needs a person to act, not just "still in progress" — gets a
   pulsing ring on top of its normal type color, distinct from the plain
   hover halo (which needs a mouseover to appear at all). */
.rel-node .attention-ring{fill:none;stroke:var(--orange);stroke-width:1.6;opacity:.85;animation:rel-attention-pulse 1.8s ease-in-out infinite;pointer-events:none}
@keyframes rel-attention-pulse{0%,100%{opacity:.85;transform:scale(1)}50%{opacity:.25;transform:scale(1.35)}}
@media (prefers-reduced-motion:reduce){.rel-node .attention-ring{animation:none}}

/* Fixed bottom-right, always — never chases a node's constantly-drifting
   3D screen position (that per-frame tracking was the "un poco caótico"
   feeling). Hover = light preview; .locked (a click set it) = persistent,
   with a visible accent edge to distinguish it from a passing preview. */
.pin-card{position:absolute;z-index:20;right:16px;bottom:16px;width:260px;max-height:calc(100% - 32px);overflow-y:auto;background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-lg);padding:16px;display:flex;flex-direction:column;gap:14px;box-shadow:var(--shadow-lg);opacity:0;transform:translateY(6px);pointer-events:none;transition:opacity .15s,transform .15s}
.pin-card.show{opacity:1;transform:translateY(0);pointer-events:auto}
.pin-card.locked{border-color:color-mix(in srgb,var(--accent) 45%,var(--border))}
.pin-close{position:absolute;top:10px;right:10px;width:22px;height:22px;border-radius:50%;border:none;background:var(--bg3);color:var(--text2);font-size:12px;line-height:1;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:background .15s,color .15s}
.pin-close:hover{background:var(--bg4);color:var(--text)}

.pin-card .p-type{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--text2)}
.pin-card .p-type .dot{width:7px;height:7px;border-radius:50%}
.pin-card .p-name{font-size:17px;font-weight:600;letter-spacing:-.01em;margin:6px 0 2px;line-height:1.3}
.pin-card .p-id{font-family:var(--mono);font-size:12px;color:var(--text3)}
.pin-card .structure-box{background:var(--bg3);border:1px solid var(--border);border-radius:var(--r-lg);min-height:130px;display:flex;align-items:center;justify-content:center;margin-top:4px;padding:6px}
.pin-card .structure-box svg{max-width:100%;max-height:100%}
.pin-card .p-meta{display:flex;flex-direction:column;gap:9px;font-size:13px}
.pin-card .p-meta-row{display:flex;justify-content:space-between;gap:10px;color:var(--text2)}
.pin-card .p-meta-row b{color:var(--text);font-weight:500;text-align:right}
.pin-card .p-open{display:flex;align-items:center;justify-content:center;gap:7px;background:var(--text);color:var(--bg2);border:none;border-radius:9px;padding:10px 14px;font-size:13px;font-weight:600;cursor:pointer;margin-top:2px;transition:opacity .15s}
.pin-card .p-open:hover{opacity:.85}

.pin-card .p-isolate{background:var(--bg3);color:var(--text2);border:1px solid var(--border)}
.pin-card .p-isolate:hover{background:var(--bg4);color:var(--text);opacity:1}

.pin-card .p-hide{background:transparent;color:var(--text3);border:1px dashed var(--border);margin-top:-6px}
.pin-card .p-hide:hover{background:color-mix(in srgb,var(--red) 10%,transparent);color:var(--red);border-color:color-mix(in srgb,var(--red) 40%,transparent);opacity:1}

/* Reaction scheme — hover preview + pin card, for chemistry (ELN) nodes */
.rel-scheme{display:flex;align-items:center;gap:4px;flex-wrap:wrap;justify-content:center}
.rel-scheme-mol svg{max-width:64px;max-height:52px}
.rel-scheme-plus{color:var(--text3);font-size:12px}
.rel-scheme-arrow{color:var(--text2);font-size:13px;margin:0 2px}
.rel-scheme-fallback{font-family:var(--mono);font-size:9px;color:var(--text3);max-width:60px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.structure-box.rel-scheme-box{min-height:auto;padding:10px}

/* Zoom is the reveal mechanism, like a real map: zoomed all the way out,
   labels would just be noise, so only color/shape identify a node; at a
   middle zoom the focused node and its direct neighbors label themselves;
   zoomed in close, everything labels itself. */
.rel-lod-far .rel-node text.label{display:none}
.rel-lod-mid .rel-node text.label{display:none}
.rel-lod-mid .rel-node.center text.label,
.rel-lod-mid .rel-node.near-focus text.label,
.rel-lod-mid .rel-node.hovered text.label{display:block}

/* Manual override for the label-toggle button — wins over the zoom-based
   LOD rules above either way, since "always" and "hover only" are both a
   deliberate choice that shouldn't flip back just because you zoomed. */
.rel-labels-all .rel-node text.label{display:block !important}
.rel-labels-off .rel-node text.label{display:none !important}

#relFitAll,#relResetView{font-size:14px;border-bottom:1px solid var(--border)}
#relLabelToggle{font-size:10px;font-weight:700;font-family:var(--sans);border-bottom:1px solid var(--border)}

@media (max-width:820px){
  .rel-modal-inner{width:100vw;height:100dvh;border-radius:0}
  .rel-sub{display:none}
}

/* DVD screensaver easter egg — little radial pop on a perfect corner hit */
@keyframes dvd-corner-pop{
  0%{opacity:1;transform:scale(1)}
  100%{opacity:0;transform:scale(4)}
}

/* Footer flags (Galicia + Scotland), side by side — grayscale until hovered */
.footer-flag{
  display:inline-block;
  vertical-align:middle;
  filter:grayscale(1);
  opacity:.55;
  transition:filter .2s, opacity .2s;
  cursor:default;
}

/* ChemInventory location tree picker — collapsible-tree replacement for the
   flat, dot-indented <select> (see the same tree pattern in the Locations
   browser). */
.ci-loc-picker{position:relative}
.ci-loc-picker>button{background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-sm);padding:9px 12px;color:var(--text);font-size:13px;font-family:var(--sans);outline:none;transition:border .15s,box-shadow .15s;min-height:38px}
.ci-loc-picker>button:hover{border-color:var(--text3)}
.ci-loc-picker>button:focus{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-light)}
.ci-loc-picker-panel{display:none;position:absolute;top:calc(100% + 4px);left:0;right:0;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-md);box-shadow:var(--shadow-md);z-index:60}
.ci-loc-picker-panel.show{display:block}
.footer-flags:hover .footer-flag{filter:none;opacity:1}

/* ── Home: first-login guidance inside Waiting on you / Today ── */
.onboarding-inline-head{display:flex;align-items:center;gap:12px;padding:6px 0 9px;margin-bottom:1px;border-bottom:1px solid var(--border)}
.onboarding-inline-head>span{display:flex;align-items:baseline;gap:7px;white-space:nowrap}
.onboarding-inline-head b{font-size:var(--ui-body);font-weight:600;color:var(--text)}
.onboarding-inline-head small{font-size:var(--ui-caption);color:var(--text3)}
.onboarding-inline-head>i{display:block;height:3px;flex:1;min-width:40px;overflow:hidden;border-radius:999px;background:var(--bg4)}
.onboarding-inline-head>i>span{display:block;height:100%;border-radius:inherit;background:var(--accent);transition:width var(--mo-base) var(--mo-io)}
.onboarding-inline-step,.onboarding-today{width:100%;border:0;background:transparent;color:var(--text);font:inherit;text-align:left;cursor:pointer}
.onboarding-inline-row{display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:6px}
.onboarding-inline-head .btn{margin-left:auto;flex:none;white-space:nowrap}
.onboarding-inline-step{display:grid;grid-template-columns:24px minmax(0,1fr) auto 14px;align-items:center;gap:9px;padding:9px 4px;border-bottom:1px solid color-mix(in srgb,var(--border) 72%,transparent);transition:background-color var(--mo-fast) var(--mo-io),transform var(--mo-fast) var(--mo-io)}
.onboarding-inline-step:hover,.onboarding-inline-step:focus-visible{background:var(--accent-soft);outline:0}
.onboarding-inline-step:hover{transform:translateX(2px)}
.onboarding-inline-step>span:nth-child(2),.onboarding-today>span:nth-child(2){display:flex;flex-direction:column;min-width:0;gap:1px}
.onboarding-inline-step strong,.onboarding-today strong{font-size:var(--ui-body);font-weight:600;line-height:1.3}
.onboarding-inline-step small,.onboarding-today small{font-size:var(--ui-caption);line-height:1.35;color:var(--text2);white-space:normal}
.onboarding-inline-step em{font-size:var(--ui-caption);line-height:18px;font-style:normal;font-weight:600;color:var(--text3);padding:0 6px;border:1px solid var(--border);border-radius:999px}
.onboarding-inline-step.is-next em{color:var(--accent-ink);border-color:color-mix(in srgb,var(--accent) 35%,var(--border));background:var(--accent-soft)}
.onboarding-inline-step>svg,.onboarding-today>svg{width:14px;height:14px;color:var(--text3)}
.onboarding-step-dot{width:22px;height:22px;border:1px solid var(--border2);border-radius:50%;display:inline-flex;align-items:center;justify-content:center;font-size:10px;font-weight:650;color:var(--text2);background:var(--bg)}
.onboarding-inline-step.is-next .onboarding-step-dot{color:#fff;background:var(--accent);border-color:var(--accent);box-shadow:0 0 0 3px color-mix(in srgb,var(--accent) 12%,transparent)}
.onboarding-today{display:grid;grid-template-columns:27px minmax(0,1fr) 14px;align-items:center;gap:10px;padding:10px 9px;margin:2px 0 7px;border:1px solid color-mix(in srgb,var(--accent) 22%,var(--border));border-radius:var(--r-md);background:color-mix(in srgb,var(--accent-soft) 68%,var(--bg));transition:border-color var(--mo-fast) var(--mo-io),background-color var(--mo-fast) var(--mo-io),transform var(--mo-fast) var(--mo-io)}
.onboarding-today:hover,.onboarding-today:focus-visible{border-color:color-mix(in srgb,var(--accent) 48%,var(--border));background:var(--accent-soft);outline:0;transform:translateY(-1px)}
.onboarding-today-icon{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;border-radius:50%;color:var(--accent-ink);background:color-mix(in srgb,var(--accent) 14%,var(--bg))}
.onboarding-today-icon svg{width:14px;height:14px}
.onboarding-welcome-layer{position:fixed;inset:0;z-index:1000;display:grid;place-items:center;padding:20px;background:rgba(15,23,42,0);backdrop-filter:blur(0);opacity:0;transition:background-color var(--mo-base) var(--mo-io),backdrop-filter var(--mo-base) var(--mo-io),opacity var(--mo-base) var(--mo-io)}
.onboarding-welcome-layer.show{background:rgba(15,23,42,.24);backdrop-filter:blur(3px);opacity:1}
.onboarding-welcome{width:min(440px,100%);padding:28px;border:1px solid var(--border);border-radius:var(--r-xl);background:var(--bg);box-shadow:0 22px 58px rgba(15,23,42,.2);transform:translateY(10px) scale(.985);transition:transform var(--mo-base) var(--mo-out);text-align:left}
.onboarding-welcome-layer.show .onboarding-welcome{transform:none}
.onboarding-welcome-mark{display:inline-flex;align-items:center;justify-content:center;width:38px;height:38px;margin-bottom:18px;border-radius:12px;color:#fff;background:var(--accent);box-shadow:0 8px 20px color-mix(in srgb,var(--accent) 28%,transparent)}
.onboarding-welcome-mark svg{width:18px;height:18px}
.onboarding-kicker{font-size:var(--ui-caption);font-weight:650;letter-spacing:.06em;text-transform:uppercase;color:var(--accent-ink)}
.onboarding-welcome h2{margin:5px 0 8px;font-size:var(--ui-dialog);line-height:1.2;color:var(--text)}
.onboarding-welcome p{margin:0 0 22px;color:var(--text2);font-size:var(--ui-body);line-height:1.55}
.onboarding-welcome>div:nth-last-of-type(1){display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.onboarding-welcome>small{display:block;margin-top:14px;font-size:var(--ui-caption);color:var(--text3)}
#page-home.onboarding-guidance .home-hero,#page-home.onboarding-guidance #home-banners,#page-home.onboarding-guidance #home-widgets-root>*:not(#home-queue-tasks-row){opacity:.48;filter:blur(.7px);transition:opacity var(--mo-base) var(--mo-io),filter var(--mo-base) var(--mo-io)}
#page-home.onboarding-guidance #home-queue-tasks-row{position:relative;z-index:2}
@media(max-width:600px){
  .onboarding-inline-step{grid-template-columns:24px minmax(0,1fr) 14px}.onboarding-inline-step em{display:none}
  .onboarding-inline-head{align-items:flex-start}.onboarding-inline-head>span{display:block}.onboarding-inline-head small{display:block;margin-top:1px}
  .onboarding-welcome{padding:23px 20px;border-radius:var(--r-lg)}
  .onboarding-welcome>div:nth-last-of-type(1){align-items:stretch;flex-direction:column}.onboarding-welcome .btn{width:100%}
}
@media(prefers-reduced-motion:reduce){
  .onboarding-inline-head>i>span,.onboarding-inline-step,.onboarding-today,.onboarding-welcome-layer,.onboarding-welcome{transition:none!important}
  .onboarding-inline-step:hover,.onboarding-today:hover{transform:none}
}
.lib-empty-start{display:flex;flex-direction:column;align-items:center;padding-top:60px;grid-column:1/-1;width:100%}
#compound-grid > .empty{grid-column:1/-1}

/* ── Notification settings modal (openNotifPrefs) ───────────────────────── */
.np-modal{width:min(720px,96vw);max-height:90vh;display:flex;flex-direction:column}
#np-body{overflow-y:auto;flex:1;padding:2px 2px 8px}
.np-intro{margin:0 0 10px;font-size:13px;color:var(--text2)}
.np-note{margin:0 0 8px;padding:8px 10px;border-radius:var(--r-sm);font-size:12px;background:var(--warn-bg);border:1px solid var(--warn-border);color:var(--warn-fg)}
.np-group{margin-top:14px}
.np-group-title{font-size:11px;font-weight:600;letter-spacing:.04em;text-transform:uppercase;color:var(--text3);padding:0 0 6px;border-bottom:1px solid var(--border)}
.np-row{display:grid;grid-template-columns:1fr 96px 96px 96px;gap:8px;align-items:center;padding:8px 0;border-bottom:1px solid color-mix(in srgb,var(--border) 60%,transparent)}
.np-colhead{border-bottom:none;padding:0;font-size:11px;color:var(--text3);position:sticky;top:0;background:var(--bg);z-index:1}
.np-cell{text-align:center}
.np-cell.np-off{opacity:.5}
.np-cell.np-na{color:var(--text3)}
.np-label{font-size:13px;font-weight:500;color:var(--text)}
.np-desc{font-size:11px;color:var(--text3);margin-top:2px;line-height:1.45}
.np-lock{display:inline-flex;vertical-align:-2px;color:var(--text3)}
.np-field{display:grid;grid-template-columns:150px 1fr;gap:4px 12px;align-items:start;padding:10px 0;border-bottom:1px solid color-mix(in srgb,var(--border) 60%,transparent)}
.np-field>label{font-size:13px;font-weight:500;padding-top:4px}
.np-field .np-desc{grid-column:2}
.np-inline{display:inline-flex;align-items:center;gap:6px;font-size:13px}
.np-sound-controls{display:flex;align-items:center;gap:10px;min-height:30px;flex-wrap:wrap}
.np-sound-controls input[type="range"]{width:150px;accent-color:var(--accent)}
.np-sound-controls .np-desc{min-width:32px;margin:0;font-variant-numeric:tabular-nums}
.np-sound-controls .is-tested{border-color:var(--accent);color:var(--accent-ink)}
.np-tests{display:flex;align-items:center;gap:8px;padding-top:8px;flex-wrap:wrap}
.np-foot{display:flex;justify-content:flex-end;gap:8px;padding-top:10px;border-top:1px solid var(--border)}
.np-push-state{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:13px;color:var(--text2)}
.np-devices{display:flex;flex-direction:column;gap:2px}
.np-device{display:flex;align-items:center;gap:10px;font-size:13px}
.np-device-name{font-weight:500;color:var(--text)}
.np-device .np-desc{margin:0;flex:1}
@media (max-width:560px){.np-row{grid-template-columns:1fr 58px 58px 58px}.np-field{grid-template-columns:1fr}.np-field .np-desc{grid-column:1}}

/* Equipment favourites + Home "My bookings" */
.eq-star{background:none;border:0;padding:0 4px 0 0;margin-right:2px;cursor:pointer;color:var(--text3);vertical-align:middle;line-height:1}
.eq-star:hover{color:var(--warn-text, #b45309)}
.eq-star.on{color:var(--warn-text, #b45309)}
.equip-table-cat.equip-table-fav td{color:var(--warn-text, #b45309)}

/* Tasks: optional time of day */
.mq-add-time{width:88px;border:1px solid var(--border);border-radius:var(--r-sm);background:var(--bg);color:var(--text);font:inherit;font-size:var(--ui-input);padding:1px 4px;flex-shrink:0}
.mq-add-time[hidden]{display:none}
.pj-table-time-input{width:86px;border:1px solid transparent;border-radius:var(--r-sm);background:transparent;color:var(--text2);font:inherit;font-size:var(--ui-input);padding:1px 2px}
.pj-table-time-input:hover,.pj-table-time-input:focus{border-color:var(--border);background:var(--bg)}
.pj-due-time{font-family:var(--mono)}

/* Task page (side drawer) */
#task-page{position:fixed;inset:0;z-index:270;display:none}
#task-page.open{display:block}
body.task-page-open{overflow:hidden}
.task-page-backdrop{position:absolute;inset:0;background:rgba(15,23,42,.28)}
.task-page-panel{position:absolute;top:0;right:0;bottom:0;width:min(660px,100vw);background:var(--bg2);border-left:1px solid var(--border);box-shadow:-8px 0 30px rgba(15,23,42,.18);display:flex;flex-direction:column;animation:tp-in .16s ease-out}
@keyframes tp-in{from{transform:translateX(28px);opacity:.4}to{transform:none;opacity:1}}
.task-page-bar{display:flex;align-items:center;gap:12px;padding:10px 16px;border-bottom:1px solid var(--border);flex-shrink:0}
.task-page-crumb{font-size:var(--ui-body);color:var(--text2);font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.task-page-status{font-size:var(--ui-caption);color:var(--text3)}
.task-page-actions{margin-left:auto;display:flex;align-items:center;gap:6px}
.task-page-scroll{flex:1;overflow-y:auto}
.task-page-doc{padding:26px 28px 80px}
.tp-title{font-size:26px!important}
.tp-props{display:flex;flex-direction:column;gap:6px;margin:4px 0 18px;padding-bottom:14px;border-bottom:1px solid var(--border)}
.tp-prop{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-height:28px;position:relative}
.tp-prop-k{width:84px;font-size:12px;color:var(--text3);flex-shrink:0}
.tp-select{border:1px solid transparent;background:transparent;color:var(--text);font:inherit;font-size:13px;padding:3px 6px;border-radius:var(--r-sm);cursor:pointer}
.tp-select:hover,.tp-select:focus{border-color:var(--border);background:var(--bg)}
.tp-time{width:118px}
.tp-muted{color:var(--text3);font-size:12px}
.tp-assignees{display:inline-flex;gap:4px;flex-wrap:wrap}
.tp-assignee-pick{position:absolute;top:30px;left:92px;z-index:5;background:var(--bg);border:1px solid var(--border);border-radius:var(--r-md);padding:8px 10px;box-shadow:0 8px 24px rgba(15,23,42,.14);display:flex;flex-direction:column;gap:4px;max-height:220px;overflow:auto}
.tp-assignee-pick[hidden]{display:none}
.tp-assignee-pick label{font-size:var(--ui-body);display:flex;gap:6px;align-items:center;cursor:pointer}
.tp-editor .ql-editor{min-height:140px}
.tp-section{margin-top:26px}
.tp-section-h{font-size:11px;font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--text3);margin-bottom:6px}
.tp-parent-nav{display:flex;align-items:center;gap:6px;margin:0 0 10px;min-width:0}
.tp-parent-back{text-decoration:none;display:flex;align-items:baseline;gap:8px;min-width:0;flex:1;padding:6px 10px;border:1px solid var(--border2);border-radius:var(--r-sm);background:var(--bg2);color:var(--text);font:inherit;text-align:left;cursor:pointer}
.tp-parent-back:hover{border-color:var(--accent);background:var(--bg3)}
.tp-parent-k{font-size:var(--ui-caption);color:var(--text3);white-space:nowrap;text-transform:uppercase;letter-spacing:.04em}
.tp-parent-t{font-weight:600;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tp-nav-pos{font-size:var(--ui-caption);color:var(--text3);white-space:nowrap}
.tp-nav-step{text-decoration:none}
.tp-nav-step:disabled{opacity:.35;cursor:default}
.tp-crumb-sep{margin:0 5px;color:var(--text3)}
.tp-crumb-link{text-decoration:none;border:0;background:none;color:inherit;font:inherit;font-weight:600;padding:0;cursor:pointer}
.tp-crumb-link:hover{text-decoration:underline;color:var(--accent)}
.tp-work-period-modal{width:min(460px,calc(100vw - 24px))}

/* ── Task page (tpx): a document with properties, a subtask list and linked tasks ──
   Drawer by default; #task-page.full (full-screen preference, or any tab opened from a task link) gives
   the text a reading column and moves subtasks into a sticky side rail. Text/controls use the shared roles. */
.task-page-panel{background:var(--bg)}
.task-page-bar{background:var(--bg);gap:10px;padding:8px 14px;min-height:48px}
.tpx-back{display:inline-flex;align-items:center;gap:6px;max-width:34%;border:0;background:none;color:var(--text2);font:inherit;font-size:var(--ui-action);padding:4px 8px 4px 4px;border-radius:var(--r-sm);cursor:pointer}
.tpx-back span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tpx-back:hover{background:var(--bg3);color:var(--text)}
.tpx-menu-wrap{position:relative;display:inline-flex}
.tpx-menu{position:absolute;right:0;top:calc(100% + 6px);min-width:200px;background:var(--bg);border:1px solid var(--border);border-radius:var(--r-md);box-shadow:0 14px 36px rgba(15,23,42,.2);padding:4px;z-index:6}
.tpx-menu[hidden]{display:none}
.tpx-menu button{display:flex;align-items:center;gap:10px;width:100%;border:0;background:none;color:var(--text);font:inherit;font-size:var(--ui-body);text-align:left;padding:8px 10px;border-radius:var(--r-sm);cursor:pointer;min-height:36px}
.tpx-menu button:hover{background:var(--bg3)}
.tpx-menu .is-danger{color:var(--red)}

.tpx-doc{padding:0}
.tpx-layout{display:grid;grid-template-columns:minmax(0,1fr);max-width:780px;margin:0 auto;padding:26px 26px 96px}
.tpx-head{min-width:0}
.tpx-body,.tpx-body .ql-container{min-width:0;background:transparent!important}
.tpx-body{margin-top:4px}
.tpx-side{min-width:0;margin-top:30px}
.tpx-thread{min-width:0;margin-top:8px}
#task-page.full .task-page-backdrop{display:none}
#task-page.full .task-page-panel{width:100vw;border-left:0;box-shadow:none;animation:none}
#task-page.full .tpx-layout{max-width:1240px;padding:48px 56px 140px;column-gap:56px}
@media (min-width:1100px){
  #task-page.full .tpx-layout{grid-template-columns:minmax(0,1fr) 360px;grid-template-areas:"head side" "body side" "thread side";align-content:start}
  #task-page.full .tpx-head{grid-area:head}
  #task-page.full .tpx-body{grid-area:body}
  #task-page.full .tpx-thread{grid-area:thread}
  #task-page.full .tpx-side{grid-area:side;margin-top:0;position:sticky;top:8px;align-self:start;max-height:calc(100vh - 96px);overflow:auto;padding:2px 2px 2px 28px;border-left:1px solid var(--border)}
}

.tpx-titlerow{display:flex;align-items:flex-start;gap:12px}
.tpx-title{flex:1;min-width:0;border:0!important;background:transparent!important;box-shadow:none!important;padding:0 !important;font-size:26px!important;font-weight:700;letter-spacing:-.015em;line-height:1.25;color:var(--text);overflow:hidden;resize:none;font-family:inherit;display:block;white-space:pre-wrap;overflow-wrap:anywhere;outline:none;min-height:1.3em}
#task-page.full .tpx-title{font-size:32px!important}
.tpx-title.is-done{color:var(--text3);text-decoration:line-through;text-decoration-thickness:2px}
.tpx-done{flex-shrink:0;width:26px;height:26px;margin-top:3px;border-radius:50%;border:2px solid var(--border2);background:transparent;color:transparent;display:grid;place-items:center;cursor:pointer;transition:background var(--mo-fast) var(--mo-io),border-color var(--mo-fast) var(--mo-io),color var(--mo-fast) var(--mo-io)}
#task-page.full .tpx-done{width:30px;height:30px;margin-top:5px}
.tpx-done svg{width:15px;height:15px;stroke-width:3}
.tpx-done:hover{border-color:var(--green)}
.tpx-done[aria-checked="true"]{background:var(--green);border-color:var(--green);color:var(--on-accent)}

.tpx-props{display:flex;flex-direction:column;margin:14px 0 22px;padding-bottom:14px;border-bottom:1px solid var(--border)}
.tpx-prop{display:flex;align-items:center;gap:10px;min-height:34px;position:relative}
.tpx-prop-k{display:flex;align-items:center;gap:9px;width:132px;flex-shrink:0;color:var(--text3);font-size:var(--ui-label)}
.tpx-prop-k svg{width:14px;height:14px;flex-shrink:0;opacity:.85}
.tpx-prop-v{display:flex;align-items:center;gap:6px;flex-wrap:wrap;min-width:0;flex:1;font-size:var(--ui-body);color:var(--text)}
.tpx-prop-due .tpx-prop-v{flex-wrap:nowrap}
.tpx-plan{display:flex;flex-direction:column;gap:4px;min-width:0}
.tpx-field{border:1px solid transparent;background:transparent;color:var(--text);font:inherit;font-size:var(--ui-body);padding:4px 8px;border-radius:var(--r-sm);cursor:pointer;min-width:0;max-width:100%}
.tpx-field:hover,.tpx-field:focus{background:var(--bg3);border-color:var(--border)}
.tpx-field.tp-time{width:112px}
.tpx-pill{appearance:none;-webkit-appearance:none;border:1px solid var(--border2);background:var(--bg3);color:var(--text2);font:inherit;font-size:var(--ui-label);font-weight:600;padding:3px 26px 3px 12px;border-radius:999px;cursor:pointer;background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),linear-gradient(135deg,currentColor 50%,transparent 50%);background-position:calc(100% - 14px) 52%,calc(100% - 10px) 52%;background-size:4px 4px;background-repeat:no-repeat;transition:background-color var(--mo-fast) var(--mo-io),color var(--mo-fast) var(--mo-io)}
.tpx-st-doing{color:var(--accent-ink);border-color:color-mix(in srgb,var(--accent) 55%,transparent);background-color:color-mix(in srgb,var(--accent) 16%,transparent)}
.tpx-st-done{color:var(--green-ink);border-color:color-mix(in srgb,var(--green) 55%,transparent);background-color:color-mix(in srgb,var(--green) 16%,transparent)}
.tpx-pr-low{color:var(--text3)}
.tpx-pr-high{color:var(--red);border-color:color-mix(in srgb,var(--red) 50%,transparent);background-color:color-mix(in srgb,var(--red) 12%,transparent)}
.tpx-pill option{color:var(--text);background:var(--bg)}

.tpx-body .ql-editor{padding:8px 0;font-size:var(--ui-reading);line-height:1.7;min-height:200px}
.tpx-body .ql-editor.ql-blank::before{left:0;font-style:normal;color:var(--text3)}
#task-page.full .tpx-body .ql-editor{min-height:320px}
/* a subtask written into the text reads as a row of the note */
.note-task.nt-sub{display:flex;width:100%;box-sizing:border-box;margin:5px 0;padding:7px 12px 7px 10px;border-radius:var(--r-md);background:var(--bg2);font-size:inherit}
.note-task.nt-sub .nt-title{flex:1;min-width:0;font-weight:500}
.note-task.nt-sub::before{content:'';display:none}

.tpx-sec{margin-bottom:26px}
.tpx-sec-h{display:flex;align-items:center;gap:8px;margin-bottom:8px;color:var(--text3);font-size:var(--ui-label);font-weight:700;letter-spacing:.05em;text-transform:uppercase}
.tpx-sec-link{display:inline-flex;align-items:center;gap:7px;min-width:0;color:inherit;text-decoration:none}
.tpx-sec-link span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;letter-spacing:0;text-transform:none;font-size:var(--ui-body)}
.tpx-sec-link:hover{color:var(--accent-ink)}
.tpx-count{margin-left:auto;font-size:var(--ui-caption);font-weight:600;letter-spacing:0;color:var(--text2);background:var(--bg3);border-radius:999px;padding:1px 8px;font-variant-numeric:tabular-nums}
.tpx-progress{height:4px;margin:0 0 8px;border-radius:999px;background:var(--bg3);overflow:hidden}
.tpx-progress>span{display:block;height:100%;border-radius:inherit;background:var(--green);transition:width var(--mo-base) var(--mo-io)}
.tpx-subs{list-style:none;margin:0;padding:0}
.tpx-row{display:flex;flex-wrap:wrap;align-items:center;gap:0 6px;min-height:36px;padding:0 4px 0 0;border-radius:var(--r-sm);position:relative}
.tpx-row:hover,.tpx-row:focus-within{background:var(--bg3)}
.tpx-row.is-dragging{opacity:.45}
.tpx-row.is-current{background:var(--accent-light);box-shadow:inset 2px 0 0 var(--accent)}
.tpx-row.is-current .tpx-rowlink{font-weight:600}
.tpx-grip{flex-shrink:0;width:16px;height:24px;display:grid;place-items:center;border:0;background:none;color:var(--text3);cursor:grab;opacity:0;padding:0;transition:opacity var(--mo-fast) var(--mo-io)}
.tpx-grip svg{width:12px;height:12px}
.tpx-row:hover .tpx-grip,.tpx-row:focus-within .tpx-grip{opacity:.8}
.tpx-circle{flex-shrink:0;width:18px;height:18px;margin-left:2px;border-radius:50%;border:1.5px solid var(--border2);background:transparent;color:transparent;display:grid;place-items:center;cursor:pointer;padding:0;transition:background var(--mo-fast) var(--mo-io),border-color var(--mo-fast) var(--mo-io),color var(--mo-fast) var(--mo-io)}
.tpx-circle svg{width:11px;height:11px;stroke-width:3.2}
.tpx-circle:hover{border-color:var(--green)}
.tpx-circle[aria-checked="true"],.is-done>.tpx-circle{background:var(--green);border-color:var(--green);color:var(--on-accent)}
.tpx-circle.is-static{pointer-events:none}
.tpx-rowtitle{flex:1 1 9em;min-width:9em;border:0;background:transparent;color:var(--text);font:inherit;font-size:var(--ui-body);padding:6px 6px;border-radius:var(--r-xs);text-overflow:ellipsis;outline:none}
.tpx-rowtitle:focus{background:var(--bg);box-shadow:0 0 0 1.5px var(--accent)}
.tpx-row.is-done .tpx-rowtitle,.tpx-row.is-done .tpx-rowlink{color:var(--text3);text-decoration:line-through}
.tpx-rowlink{flex:1 1 9em;min-width:0;color:var(--text);text-decoration:none;font-size:var(--ui-body);padding:6px 6px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tpx-rowlink:hover{color:var(--accent-ink);text-decoration:underline}
.tpx-meta{display:inline-flex;align-items:center;gap:10px;flex-shrink:0;margin-left:auto;max-width:100%}
.tpx-due{flex-shrink:0;font-size:var(--ui-caption);color:var(--text3);white-space:nowrap}
.tpx-due.is-late{color:var(--red);font-weight:600}
.tpx-people{display:inline-flex;flex-shrink:0}
.tpx-people>*{margin-left:-5px;box-shadow:0 0 0 2px var(--bg)}
.tpx-people>*:first-child{margin-left:0}
.tpx-rowact{display:inline-flex;flex-shrink:0;opacity:0;transition:opacity var(--mo-fast) var(--mo-io)}
.tpx-row:hover .tpx-rowact,.tpx-row:focus-within .tpx-rowact{opacity:1}
.tpx-ico{width:var(--control-compact-size,24px);height:var(--control-compact-size,24px);display:grid;place-items:center;border:0;background:none;color:var(--text3);border-radius:var(--r-xs);cursor:pointer;text-decoration:none;padding:0}
.tpx-ico svg{width:13px;height:13px}
.tpx-ico:hover{background:var(--bg4,var(--bg3));color:var(--text)}
.tpx-subadd{display:flex;align-items:center;gap:8px;min-height:36px;padding-left:24px;color:var(--text3);cursor:text}
.tpx-subadd input{flex:1;min-width:0;border:0;background:transparent;color:var(--text);font:inherit;font-size:var(--ui-body);outline:none;padding:6px 0}
.tpx-subadd input::placeholder{color:var(--text3)}
.tpx-plus svg{width:14px;height:14px}
.tpx-adopt{margin:2px 0 0 24px;max-width:calc(100% - 24px);border:0;background:transparent;color:var(--text3);font:inherit;font-size:var(--ui-label);padding:4px 0;cursor:pointer}
.tpx-adopt:hover{color:var(--text)}
.tpx-hint{margin:10px 0 0 24px;color:var(--text3);font-size:var(--ui-caption)}
.tpx-hint kbd{font-family:inherit;font-size:inherit;background:var(--bg3);border:1px solid var(--border);border-radius:var(--r-xs);padding:0 5px}
.proj-subtask-head{display:flex;align-items:center;gap:8px;font-size:var(--ui-caption);color:var(--text3);font-variant-numeric:tabular-nums}
.proj-subtask-bar{flex:1;height:3px;border-radius:999px;background:var(--bg3);overflow:hidden}
.proj-subtask-bar>span{display:block;height:100%;background:var(--green);border-radius:inherit}
.dtc-parent{display:inline-flex;align-items:center;gap:4px;max-width:14em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text3)}
.dtc-parent svg{width:11px;height:11px;flex-shrink:0}
.dtc-subs{display:flex;flex-direction:column;gap:2px;margin-top:8px;padding-top:6px;border-top:1px solid var(--border)}
.dtc-subs-h{display:flex;align-items:center;gap:8px;font-size:var(--ui-caption);color:var(--text3);font-variant-numeric:tabular-nums;margin-bottom:2px}
.dtc-subs-bar{flex:1;height:3px;border-radius:999px;background:var(--bg3);overflow:hidden}
.dtc-subs-bar>span{display:block;height:100%;background:var(--green);border-radius:inherit}
.dtc-sub{display:flex;align-items:center;gap:8px;min-height:28px;padding:0 4px;border-radius:var(--r-xs)}
.dtc-sub:hover{background:var(--bg3)}
.dtc-sub-t{flex:1;min-width:0;color:var(--text);text-decoration:none;font-size:var(--ui-body);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.dtc-sub-t:hover{color:var(--accent-ink);text-decoration:underline}
.dtc-sub.done .dtc-sub-t{color:var(--text3);text-decoration:line-through}
.tpx-due-btn,.dtc-sub-due{border:0;background:transparent;font:inherit;cursor:pointer;padding:1px 6px;border-radius:var(--r-xs)}
.tpx-due-btn:hover,.dtc-sub-due:hover{background:var(--bg4,var(--bg3));color:var(--text)}
.dtc-sub-edit{width:24px;height:24px;display:grid;place-items:center;border:0;background:none;color:var(--text3);border-radius:var(--r-xs);cursor:pointer;opacity:0;padding:0}
.dtc-sub-edit svg{width:13px;height:13px}
.dtc-sub:hover .dtc-sub-edit,.proj-subtask-row:hover .dtc-sub-edit,.dtc-sub-edit:focus-visible{opacity:1}
@media (hover:none){.dtc-sub-edit{opacity:1}}
.sub-pop{position:fixed;z-index:420;width:min(330px,calc(100vw - 16px));max-height:calc(100vh - 24px);overflow:auto;background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:var(--r-lg);box-shadow:0 18px 48px rgba(15,23,42,.28);padding:12px;display:flex;flex-direction:column;gap:10px}
.sub-pop-load{padding:18px;color:var(--text3);font-size:var(--ui-body)}
.sub-pop-title{border:1px solid transparent;background:transparent;color:var(--text);font:inherit;font-size:var(--ui-section);font-weight:700;padding:4px 6px;border-radius:var(--r-sm);width:100%;box-sizing:border-box}
.sub-pop-title:hover,.sub-pop-title:focus{border-color:var(--border);background:var(--bg2);outline:none}
.sub-pop-grid{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.sub-pop-grid label,.sub-pop-people{display:flex;flex-direction:column;gap:4px;font-size:var(--ui-label);color:var(--text3);min-width:0}
.sub-pop-wide{grid-column:1/-1}
.sub-pop-grid select,.sub-pop-grid input,.sub-pop-time{font:inherit;font-size:var(--ui-input);color:var(--text);background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-sm);padding:4px 6px;min-width:0;max-width:100%}
.sub-pop-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.sub-pop-time{width:92px}
.sub-pop-x{width:24px;height:24px;display:grid;place-items:center;border:0;background:none;color:var(--text3);cursor:pointer;border-radius:var(--r-xs);padding:0}
.sub-pop-x[hidden]{display:none}
.sub-pop-x svg{width:12px;height:12px}
.sub-pop-people{max-height:130px;overflow:auto}
.sub-pop-person{display:flex;flex-direction:row!important;align-items:center;gap:8px;font-size:var(--ui-body);color:var(--text);cursor:pointer;padding:2px 0}
.sub-pop-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;border-top:1px solid var(--border);padding-top:8px}
.mc-wrap{width:252px;max-width:100%}
.mc-head{display:flex;align-items:center;gap:4px;margin:0 0 2px}
.mc-title{flex:1;border:0;background:none;color:var(--text);font:inherit;font-size:var(--ui-body);font-weight:700;text-align:center;cursor:pointer;text-transform:capitalize;padding:4px 8px;border-radius:var(--r-sm)}
.mc-title:hover{background:var(--bg3)}
.mc-nav{width:24px;height:24px;display:grid;place-items:center;border:0;background:none;color:var(--text2);border-radius:var(--r-sm);cursor:pointer;padding:0}
.mc-nav:hover{background:var(--bg3);color:var(--text)}
.mc-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:0}
.mc-wd{text-align:center;font-size:10px;color:var(--text3);padding:0 0 2px;text-transform:uppercase}
.mc-day{position:relative;height:28px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:2px;border:1px solid transparent;border-radius:var(--r-sm);background:transparent;color:var(--text);font:inherit;font-size:var(--ui-label);cursor:pointer;padding:0;font-variant-numeric:tabular-nums;line-height:1}
.mc-day.out{color:var(--text3);opacity:.55}
.mc-day:hover,.mc-day:focus-visible{background:var(--bg3);border-color:var(--border2);outline:none}
.mc-day.today{border-color:var(--accent-ink);font-weight:700;color:var(--accent-ink)}
.mc-day.today .mc-num{background:var(--accent-ink);color:var(--on-accent);border-radius:999px;min-width:18px;text-align:center;line-height:18px}
.mc-day.sel{background:var(--accent-light);border-color:var(--accent-ink)}
.mc-day.sel .mc-num{font-weight:700;color:var(--accent-ink)}
.mq-day-back{margin-left:6px;border:0;background:var(--accent-light);color:var(--accent-ink);font:inherit;font-size:var(--ui-caption);font-weight:600;text-transform:none;letter-spacing:0;padding:1px 10px;border-radius:999px;cursor:pointer}
.mq-day-back:hover{background:color-mix(in srgb,var(--accent) 24%,transparent)}
.mq-sec-day{margin-top:0}
.mc-dots{display:flex;gap:2px;height:4px}
.mc-dots i,.mc-legend i{display:inline-block;width:4px;height:4px;border-radius:50%}
.mc-foot{display:flex;align-items:center;justify-content:space-between;gap:8px;margin-top:6px;font-size:var(--ui-caption);color:var(--text3);flex-wrap:wrap}
.mc-legend{display:flex;gap:10px;flex-wrap:wrap}
.mc-legend span{display:inline-flex;align-items:center;gap:5px}
.mc-open,.mc-pop-open{border:0;background:none;color:var(--accent-ink);font:inherit;font-size:var(--ui-label);font-weight:600;cursor:pointer;padding:4px 6px;border-radius:var(--r-sm)}
.mc-open:hover,.mc-pop-open:hover{background:var(--accent-light)}
.mc-pop{position:fixed;z-index:440;width:min(340px,calc(100vw - 16px));background:var(--bg);color:var(--text);border:1px solid var(--border);border-radius:var(--r-md);box-shadow:0 14px 36px rgba(15,23,42,.24);padding:10px 12px;font-size:var(--ui-body)}
.mc-pop-h{font-weight:700;text-transform:capitalize;margin-bottom:6px}
.mc-row{display:grid;grid-template-columns:8px 78px minmax(0,1fr);column-gap:8px;row-gap:0;align-items:baseline;padding:3px 0}
.mc-row i{width:7px;height:7px;border-radius:50%;align-self:center}
.mc-when{color:var(--text3);font-size:var(--ui-caption);font-variant-numeric:tabular-nums;white-space:nowrap}
.mc-what{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mc-kind{grid-column:3;color:var(--text3);font-size:var(--ui-caption);margin-top:-1px}
.mc-empty,.mc-more{color:var(--text3);font-size:var(--ui-label);padding:2px 0}
.mc-pop-open{margin-top:6px;padding-left:0}
.proj-task-card.nest-over{outline:2px dashed var(--accent);outline-offset:-2px;background:var(--accent-light)}
.dtc-sub[draggable="true"]{cursor:grab}
.mq-stage{color:var(--text2);font-weight:600}
.mq-kids-chip{display:inline-flex;align-items:center;gap:5px;max-width:100%;border:0;background:var(--bg3);color:var(--text2);font:inherit;font-size:inherit;padding:0 8px;border-radius:999px;cursor:pointer;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mq-kids-chip:hover,.mq-kids-chip.open{background:var(--accent-light);color:var(--accent-ink)}
.mq-kids-chip svg{width:11px;height:11px;flex-shrink:0}
.mq-kids{margin:0 0 4px 22px;padding-left:10px;border-left:2px solid var(--border)}
.mq-ctx .mq-title{font-weight:600}
.mq-missed-plan{border:0;background:color-mix(in srgb,var(--orange) 16%,transparent);color:var(--orange-ink);font:inherit;font-size:inherit;font-weight:600;padding:0 8px;border-radius:999px;cursor:pointer}
.mq-missed-plan:hover{background:color-mix(in srgb,var(--orange) 28%,transparent)}
.mq-resched{position:fixed;z-index:430;min-width:210px;background:var(--bg);border:1px solid var(--border);border-radius:var(--r-md);box-shadow:0 14px 36px rgba(15,23,42,.24);padding:4px}
.mq-resched-h{padding:6px 10px 4px;font-size:var(--ui-caption);color:var(--text3);text-transform:uppercase;letter-spacing:.05em}
.mq-resched button{display:block;width:100%;text-align:left;border:0;background:none;color:var(--text);font:inherit;font-size:var(--ui-body);padding:8px 10px;border-radius:var(--r-sm);cursor:pointer;min-height:36px}
.mq-resched button:hover,.mq-resched-pick:hover{background:var(--bg3)}
.mq-resched .is-danger{color:var(--red)}
.mq-resched-pick{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:6px 10px;border-radius:var(--r-sm);font-size:var(--ui-body);color:var(--text)}
.mq-resched-pick input{font:inherit;font-size:var(--ui-input);background:var(--bg2);color:var(--text);border:1px solid var(--border);border-radius:var(--r-sm);padding:2px 6px}
.mq-work,.dtc-work{color:var(--accent-ink);font-weight:600}
.mq-parent{display:inline-flex;align-items:center;gap:4px;max-width:18em;vertical-align:bottom;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mq-parent svg{width:11px;height:11px;flex-shrink:0}
.tp-parent-nav{margin-bottom:14px}
.tp-parent-back{align-items:center;border-radius:999px;padding:4px 12px 4px 10px;background:var(--bg2)}
.tp-parent-back svg{width:13px;height:13px;color:var(--text3);flex-shrink:0}
@media (hover:none){.tpx-rowact,.tpx-grip{opacity:1}}
@media (max-width:820px){
  .tpx-layout{padding:18px 16px 80px}
  #task-page.full .tpx-layout{padding:20px 16px 90px}
  #task-page.full .tpx-title,.tpx-title{font-size:24px!important}
  .tpx-prop{align-items:center;padding:2px 0}
  .tpx-prop-k{width:104px}
  .tpx-field{min-height:44px}
  .tpx-pill{min-height:36px}
  .tpx-prop-due .tpx-prop-v{flex-wrap:wrap}
  .tpx-rowtitle,.tpx-subadd input{font-size:var(--ui-input)}
  .tpx-ico{width:44px;height:44px}
  .tpx-back{max-width:45%}
}


/* Work page — recurring tasks, bookings and approvals in the task drawer */
.wp-title-read{margin-bottom:10px}
.task-page-doc .tp-section-h{margin-top:8px}
.wp-normal{text-transform:none;letter-spacing:0;font-weight:500}
.wp-hint{font-size:12px;color:var(--text3);margin:0 0 6px 92px;line-height:1.4}
.wp-hint-rule{margin:0 0 8px;padding:7px 10px;border-radius:var(--r-sm);background:var(--warn-bg);border:1px solid var(--warn-border);color:var(--warn-fg)}
.wp-rule{border-bottom:none}
.wp-days{display:inline-flex;gap:4px;flex-wrap:wrap}
.wp-day{border:1px solid var(--border);background:var(--bg);color:var(--text2);font:inherit;font-size:12px;padding:3px 8px;border-radius:999px;cursor:pointer}
.wp-day:hover{border-color:var(--border2)}
.wp-day.on{background:var(--accent-ink);border-color:var(--accent-ink);color:var(--on-accent)}
.wp-num{width:64px}
.wp-person{gap:5px}
.wp-order{font-size:var(--ui-caption);color:var(--text3);font-variant-numeric:tabular-nums;min-width:10px;text-align:right}
.wp-person-x{border:none;background:none;color:var(--text3);padding:0 0 0 2px;cursor:pointer;display:inline-flex;align-items:center}
.wp-person-x svg{width:12px;height:12px}
.wp-person-x:hover{color:var(--red)}
.wp-desc-row{align-items:flex-start}
.wp-desc{flex:1;min-width:200px;font-size:13px;padding:6px 8px;resize:vertical}
.wp-desc-read{white-space:pre-wrap;font-size:13px;color:var(--text2)}
.wp-save-bar{position:sticky;bottom:0;display:flex;justify-content:flex-end;gap:8px;padding:12px 0 4px;margin-top:6px;background:var(--bg2);border-top:1px solid var(--border)}
.wp-save-bar[hidden]{display:none}
.wp-actions{display:flex;gap:8px;margin-top:6px}
.task-page-doc .btn svg{width:13px;height:13px;vertical-align:-2px}
.wp-stats-h{margin-top:22px}
.wp-stat-tiles{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;margin-bottom:14px}
.wp-stat-tiles>div{border:1px solid var(--border);border-radius:var(--r-md);padding:8px 10px;background:var(--bg)}
.wp-stat-tiles b{display:block;font-size:18px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--text)}
.wp-stat-tiles b.wp-bad{color:var(--red)}
.wp-stat-tiles span{font-size:11px;color:var(--text3)}
.wp-hm{margin-bottom:14px}
/* The drawer reuses Home's .pj-heat-* calendar, one size smaller. */
.wp-hm .pj-heat-grid,.wp-hm .pj-heat-col,.wp-hm .pj-heat-days,.wp-hm .pj-heat-wds{gap:2px}
.wp-hm .pj-heat-cell{width:8px;height:8px}
.wp-hm .pj-heat-wd{height:8px;line-height:8px;font-size:8px}
.wp-hm .pj-heat-month{font-size:8px;height:10px}
.wp-hm .pj-heat-clip{justify-content:flex-start}
.wp-hm .pj-heat-scale{flex-wrap:wrap;gap:10px}
.wp-hm-key{display:inline-flex;align-items:center;gap:4px}
.pj-heat-cell.wp-hm-done{background:var(--green)}
.pj-heat-cell.wp-hm-late{background:var(--yellow)}
.pj-heat-cell.wp-hm-missed{background:var(--red)}
.pj-heat-cell.wp-hm-pending{background:color-mix(in srgb,var(--accent) 45%,var(--bg3))}
.pj-heat-cell.wp-hm-future{background:color-mix(in srgb,var(--accent) 22%,var(--bg3))}
.pj-heat-cell.wp-hm-none{background:var(--bg3)}
.wp-bars-row{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.wp-bars-h{font-size:var(--ui-section);font-weight:600;color:var(--text2);margin-bottom:6px}
@media (max-width:560px){.wp-stat-tiles{grid-template-columns:repeat(2,1fr)}.wp-bars-row{grid-template-columns:1fr}}

/* Task chip inside a canvas */
.note-task{display:inline-flex;align-items:center;gap:6px;padding:1px 9px 1px 6px;margin:0 1px;border:1px solid var(--border);border-radius:999px;background:var(--bg);font-size:.92em;vertical-align:baseline;cursor:pointer;max-width:100%}
.note-task>span[contenteditable]{display:inline-flex;align-items:center;gap:6px;max-width:100%}
.note-task:hover{border-color:var(--border2);background:var(--bg3)}
.note-task .nt-check{width:14px;height:14px;border-radius:50%;border:1.5px solid var(--border2);background:var(--bg2);flex-shrink:0;display:inline-flex;align-items:center;justify-content:center}
.note-task .nt-check:hover{border-color:var(--green-ink)}
.note-task.nt-done .nt-check{background:var(--green);border-color:var(--green-ink)}
.note-task.nt-done .nt-check::after{content:'';width:4px;height:7px;border:solid #fff;border-width:0 1.6px 1.6px 0;transform:rotate(45deg) translate(-1px,-1px)}
.note-task.nt-done .nt-title{text-decoration:line-through;color:var(--text3)}
.note-task .nt-due{font-size:.82em;color:var(--text3);font-family:var(--mono)}
.note-task.nt-late .nt-due{color:var(--red);font-weight:600}
.note-task.nt-gone{opacity:.55;cursor:default}

/* Dashboard tasks: group-by, saved views, editable table cells */
.pj-groupby{display:inline-flex;align-items:center;gap:4px;font-size:var(--ui-label);color:var(--text3)}
.pj-views-wrap{position:relative}
.pj-views-menu{position:absolute;right:0;top:30px;z-index:20;min-width:230px;background:var(--bg);border:1px solid var(--border);border-radius:var(--r-md);box-shadow:0 8px 24px rgba(15,23,42,.14);padding:6px}
.pj-views-menu[hidden]{display:none}
.pj-views-h{font-size:var(--ui-caption);font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--text3);padding:4px 8px}
.pj-views-item{display:flex;align-items:center;gap:8px;padding:6px 8px;border-radius:var(--r-sm);font-size:13px;cursor:pointer}
.pj-views-item:hover{background:var(--bg3)}
.pj-views-item span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.pj-views-save{color:var(--accent-ink);font-weight:600;border-top:1px solid var(--border);margin-top:4px;border-radius:0 0 var(--r-sm) var(--r-sm)}
.pj-views-empty{font-size:12px;color:var(--text3);padding:6px 8px}
.pj-table-title-input{border:1px solid transparent;background:transparent;color:var(--text);font:inherit;font-weight:600;width:calc(100% - 4px);padding:2px 4px;border-radius:var(--r-sm)}
.pj-table-title-input:hover,.pj-table-title-input:focus{border-color:var(--border);background:var(--bg);outline:none}
.pj-table-assignees{display:inline-flex}.pj-table-assignees .pj-av+.pj-av{margin-left:-6px;box-shadow:0 0 0 2px var(--bg)}

/* Dashboard tasks: calendar view */
.pj-cal{margin-top:6px}
.pj-cal-bar{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.pj-cal-bar strong{min-width:150px;text-align:center;font-size:14px}
.pj-cal-head,.pj-cal-grid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr))}
.pj-cal-head div{font-size:var(--ui-label);font-weight:700;letter-spacing:.04em;text-transform:uppercase;color:var(--text3);padding:4px 6px}
.pj-cal-grid{border-top:1px solid var(--border);border-left:1px solid var(--border)}
.pj-cal-cell{min-height:98px;border-right:1px solid var(--border);border-bottom:1px solid var(--border);padding:3px 4px;background:var(--bg);min-width:0}
.pj-cal-cell.out{background:var(--bg2);opacity:.7}
.pj-cal-cell.today{background:color-mix(in srgb,var(--accent-ink) 7%,var(--bg))}
.pj-cal-cell.drop{outline:2px dashed var(--accent-ink);outline-offset:-2px}
.pj-cal-day{display:flex;align-items:center;justify-content:space-between;font-size:var(--ui-caption);color:var(--text3);margin-bottom:2px}
.pj-cal-cell.today .pj-cal-day span{color:var(--accent-ink);font-weight:700}
.pj-cal-add{border:none;background:none;color:var(--text3);cursor:pointer;opacity:0;font-size:14px;line-height:1;padding:0 3px}
.pj-cal-cell:hover .pj-cal-add{opacity:1}.pj-cal-add:hover{color:var(--accent-ink)}
.pj-cal-task{font-size:var(--ui-body);padding:1px 5px;margin-top:2px;border-radius:var(--r-xs);border-left:3px solid var(--border2);background:var(--bg3);cursor:pointer;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pj-cal-task b{font-family:var(--mono);font-weight:600;color:var(--text2);font-size:var(--ui-body)}
.pj-cal-task.prio-high{border-left-color:var(--red)}.pj-cal-task.prio-low{border-left-color:var(--text3)}
.pj-cal-task.late{color:var(--red)}
.pj-cal-task.done{text-decoration:line-through;color:var(--text3)}
.pj-cal-more{font-size:var(--ui-caption);color:var(--text3);cursor:pointer;padding:1px 5px}.pj-cal-more:hover{color:var(--accent-ink)}

/* Canvas images */
.ql-editor img{max-width:100%;height:auto;border-radius:var(--r-md);margin:6px 0;display:block}

.note-task-pop{width:330px;padding:6px}
.note-task-pop .nt-input{width:100%;border:1px solid var(--border);border-radius:var(--r-sm);background:var(--bg);color:var(--text);font:inherit;font-size:13px;padding:6px 8px;margin-bottom:4px;outline:none}
.note-task-pop .nt-input:focus{border-color:var(--accent-ink)}

/* Computational → ADME results table */
.adme-table{border-collapse:collapse}
.adme-table th{font-size:var(--ui-label);text-transform:uppercase;letter-spacing:.05em;color:var(--text3);font-weight:700;text-align:left;padding:6px 8px;border-bottom:1px solid var(--border2);white-space:nowrap}
.adme-table td{padding:6px 8px;border-bottom:1px solid var(--border);vertical-align:middle}
.adme-table td.num{font-family:var(--sans);font-variant-numeric:tabular-nums;text-align:right}
.adme-table th.num{text-align:right}
.adme-table tr.adme-row-bad td{background:color-mix(in srgb,var(--red) 6%,transparent)}
.adme-table tbody tr:hover{background:var(--bg2)}

/* applyPermGates (core.js): a control the user's role cannot use */
.perm-denied{display:none!important}

.pj-task-history{display:flex;flex-direction:column;gap:10px;border-top:1px solid var(--border);margin-top:8px;padding-top:10px}
.pj-task-history-title{font-size:11px;color:var(--text3)}
.pj-task-history-toggle{align-self:flex-start;font-size:11px;color:var(--text3);text-decoration:none}
.pj-task-history-toggle:hover{text-decoration:underline;color:var(--text)}
.pj-task-history-toggle:focus-visible{outline:2px solid var(--accent);outline-offset:3px}

/* Lab Brain coverage and evidence use the same panels and controls as records. */
.rel-coverage{position:absolute;left:190px;right:300px;bottom:42px;display:flex;align-items:center;gap:6px;flex-wrap:wrap;max-height:110px;overflow:auto;padding:8px 10px;background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-lg);font-size:11px;color:var(--text2);z-index:10}
.rel-coverage:empty{display:none}
.rel-coverage small{flex-basis:100%;color:var(--text3)}
.rel-connections{border-top:1px solid var(--border);padding-top:10px}
.rel-connections summary{cursor:pointer;font-size:12px;font-weight:600;color:var(--text2)}
.rel-connections .p-open{text-align:left;white-space:normal;margin-top:6px;width:100%}
.rel-connections small{font-size:10px;color:var(--text3)}
@media(max-width:760px){.rel-coverage{left:12px;right:12px;bottom:50px;max-height:68px}.rel-header{gap:8px}.rel-header .rel-htitle{flex-basis:100%}.pin-card{bottom:125px;width:240px;max-height:50%}}

.rel-header #relSavedViews{width:150px;flex:0 0 150px;margin-left:auto}
.rel-header .rel-search{flex:0 1 180px}
.rel-connections .p-open{background:transparent;color:var(--text);border:0;border-bottom:1px solid var(--border);border-radius:0;padding:8px 0;box-shadow:none}
.rel-connections .p-open:hover{color:var(--accent-ink);background:var(--bg)}
.rel-zoom-ctl #relPause{width:auto;min-width:32px;max-width:90px;padding:6px;font-size:10px}
@media(max-width:760px){.rel-header #relSavedViews{width:135px;flex-basis:135px;margin-left:0}.rel-header .rel-search{flex-grow:1}.rel-coverage{max-width:calc(100% - 24px)}}

/* Lab Brain fills the available window; coverage never overlays the scene. */
.rel-modal-inner{width:calc(100vw - 32px);height:calc(100dvh - 32px);max-width:none;max-height:none}
.rel-stage{min-height:0}
.rel-stage > #rel-graph{position:absolute;inset:0;width:100%;height:100%}
.rel-coverage{position:static;flex:0 0 auto;max-width:none;max-height:200px;overflow:auto;padding:8px 16px;border:0;border-top:1px solid var(--border);border-radius:0;z-index:auto;background:var(--bg2);justify-content:space-between}
.rel-coverage-details{margin-left:auto}
.rel-coverage-details summary{cursor:pointer;color:var(--accent-ink)}
.rel-coverage-details[open]{width:100%;margin-left:0}
.rel-coverage-details > div{display:flex;flex-wrap:wrap;gap:6px;padding-top:8px}
.rel-coverage-details small{width:100%}
.rel-zoom-ctl #relPause{width:30px;min-width:0;max-width:30px;padding:0;display:flex;align-items:center;justify-content:center}
.rel-zoom-ctl #relPause svg{width:14px;height:14px;cursor:pointer}
.rel-paused .rel-node .core,.rel-paused .attention-ring{animation-play-state:paused}
.rel-header{justify-content:flex-start;gap:10px}
.rel-header .rel-crumbs{justify-content:flex-start}
@media(max-width:760px){.rel-modal-inner{width:100vw;height:100dvh;border-radius:0}.rel-coverage{max-width:none;max-height:160px}.pin-card{bottom:16px}.rel-legend{max-height:65%;overflow:auto}.rel-sub{white-space:normal}}

#relViewSelect{width:100px;flex:0 0 100px}
.rel-space .rel-cluster-halo{display:none}
.rel-space .rel-node .core{stroke:var(--bg2);stroke-width:1.5;filter:drop-shadow(0 0 4px var(--text3))}

.rel-orbits path{fill:none;stroke:var(--border2);stroke-width:1;stroke-dasharray:3 6;opacity:.65;pointer-events:none}

.rel-stage .pin-card{right:64px}
@media(max-width:760px){.rel-stage .pin-card{right:54px;width:230px;max-height:60%}}

.feedback-footer-link{border:0;background:none;padding:0;color:inherit;font:inherit;cursor:pointer;text-decoration:underline;text-underline-offset:2px}
.feedback-footer-link:hover{color:var(--text)}
/* First-use placeholder over the Ketcher iframe (ketcher.js:_ensureKetcherIframe) — the editor area is always white, so fixed light colours */
.ketcher-loading{position:absolute;inset:0;z-index:1;display:flex;align-items:center;justify-content:center;background:#fff;color:#667085;font-size:13px}
/* "A new version is available" bar (ui-shell.js:_showNewVersionBar) */
.new-version-bar{position:fixed;left:50%;bottom:20px;transform:translateX(-50%);z-index:10001;display:flex;align-items:center;gap:12px;max-width:min(640px,calc(100vw - 32px));padding:10px 12px 10px 16px;background:var(--bg2);color:var(--text);border:1px solid var(--border2);border-radius:var(--r-lg);box-shadow:0 10px 30px color-mix(in srgb,var(--text) 18%,transparent);font-size:13px}
.new-version-bar span{flex:1}
.new-version-x{display:inline-flex;align-items:center;justify-content:center;width:24px;height:24px;border:none;background:none;border-radius:var(--r-sm);color:var(--text3);cursor:pointer}
.new-version-x:hover{background:var(--bg3);color:var(--text)}
.reac-list-loading{padding:24px;text-align:center;color:var(--text3);font-size:13px}
.mq-more{display:block;margin:2px 0 8px 26px;padding:2px 0;border:none;background:none;color:var(--accent-ink);font:inherit;font-size:12px;font-weight:600;cursor:pointer}
.mq-more:hover{text-decoration:underline}
a.mq-join{display:inline-flex;width:auto;padding:0 8px;font-size:var(--ui-caption);font-weight:600;text-decoration:none;color:var(--accent-ink);align-items:center}

/* Monospace is for identifiers, SMILES and formulas. Counts, KPIs, dates, roles, emails and
   status words read in the UI font with tabular figures (aligned numbers, no typewriter look). */
.user-role,.home-stat-main,.stat-val,.result-count,.fc-sub,.fc-count,.proj-compound-count,.log-action,
.bar-count,.role-badge,.pj-group-count,.pj-card-meta,.pj-ring-label,.pj-av-more,.pj-badge,.pj-metric-n,
.pj-pipe-head .n,.pj-mol-sub,.pj-due-over,.pj-table-date-input,.pj-series-head .n,.pj-sar-n,.pj-time-meta,
.pj-cmt-when,.pj-cmt-badge,.pj-doc-meta,.pj-row-when,.pj-due-time,.note-task .nt-due,.pj-cal-task b,
.bio-assay-tag,.bio-target-tag,.file-size,.equip-time-label,.equip-booking-time,.step-time-chip,
.cv-dd-menu button .cv-dd-count,.home-heat-tip-row span{font-family:var(--sans);font-variant-numeric:tabular-nums}
.pj-badge{text-transform:none;letter-spacing:0;font-size:11px}
/* Readable minimum for text chips (plate grids, well labels and avatar initials stay dense). */
.tag-pill,.file-type-badge,.browser-eln-role,.proj-team-chip-role,.proj-task-synth,.rxn-unlink-btn,.cln-mine-chip,
.pj-mol-mine-tag,.pj-prio,.pj-due-over,.pj-sar-n,.hz-badge{font-size:10px}
/* A link styled as a button is not a link: no underline (Projects Export PDF/Excel). */
a.btn,a.btn:hover{text-decoration:none}
/* A zero KPI is information, not a headline. */
.pj-metric-zero .pj-metric-n{color:var(--text3);font-weight:500}
/* A picker at the bottom of a sidebar opens upwards (Library's Import / Export menus). */
.cv-dd-up .cv-dd-menu{top:auto;bottom:calc(100% + 4px)}
.eln-list-footer .cv-dd-menu{min-width:240px}
/* Backlinks — "Mentioned in" (notes.js renderBacklinks) */
.backlink-n{font-weight:400;color:var(--text3);margin-left:4px}
.backlink-list{display:flex;flex-direction:column;gap:2px;margin-top:4px}
.backlink-row{display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:none;border:none;border-radius:var(--r-sm);padding:5px 6px;cursor:pointer;color:var(--text);font:inherit;font-size:12px}
.backlink-row:hover{background:var(--bg3)}
.backlink-row svg{flex-shrink:0;color:var(--text3)}
.backlink-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}
.backlink-meta{flex-shrink:0;font-size:var(--ui-caption);color:var(--text3);font-variant-numeric:tabular-nums}
.pj-backlinks{margin-top:14px}
.pj-backlinks .dp-stitle{font-size:12px;font-weight:600;color:var(--text2);margin-bottom:2px}
/* Keep compound deletion visible alongside the other header actions. */
.dp-header-actions .icon-btn.danger{color:var(--red);border-color:color-mix(in srgb,var(--red) 35%,var(--border2))}
.dp-header-actions .icon-btn.danger:hover{background:color-mix(in srgb,var(--red) 8%,transparent)}
.dashboard-cal-kind{display:inline-flex;vertical-align:-2px;margin-right:3px;color:var(--text3)}
.dashboard-cal-kind svg{width:11px;height:11px}
.equipment-recurring-links{padding:6px 12px;border-bottom:1px solid var(--border);font-size:11px;color:var(--text3);flex-wrap:wrap;gap:4px;align-items:center}
.equipment-recurring-links:not([hidden]){display:flex}

/* ── Projects gallery (Projects → Projects): cards; the sidebar only filters ── */
.pj-gal{padding:22px 26px 40px;max-width:1500px}
.pj-gal-head{display:flex;align-items:flex-end;justify-content:space-between;gap:12px;margin-bottom:18px}
.pj-gal-title{margin:0;font-size:var(--ui-title);font-weight:700;letter-spacing:-.01em}
.pj-gal-sub{font-size:var(--ui-body);color:var(--text3);margin-top:3px;font-variant-numeric:tabular-nums}
.pj-gal-head .btn svg{width:13px;height:13px;vertical-align:-2px}
.pj-gal-sec{margin-bottom:22px}
.pj-gal-sec-head{display:flex;align-items:center;gap:7px;width:100%;background:none;border:none;padding:0 0 8px;margin-bottom:10px;border-bottom:1px solid var(--border);font:inherit;font-size:11px;font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--text3);cursor:pointer;text-align:left}
.pj-gal-sec-head .pj-group-count{margin-left:4px}
.pj-gal-sec.collapsed .pj-group-chev{transform:rotate(-90deg)}
.pj-gal-sec-head:hover{color:var(--text2)}
.pj-gal-prog{display:flex;align-items:center;gap:7px;font-size:var(--ui-body);font-weight:600;color:var(--text2);margin:14px 0 8px}
.pj-gal-prog:first-of-type{margin-top:2px}
.pj-gal-prog .pj-group-count{margin-left:2px}
.pj-gal-prog.loose{color:var(--text3);font-style:italic;font-weight:500}
.pj-gal-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:12px}
.pj-gal-empty{padding:40px 12px;text-align:center;color:var(--text3);font-size:13px}
.pj-gal-fc-row{display:flex;align-items:center}
.pj-gal-fc-row .fc{flex:1;min-width:0}
.pj-gal-fc-row:hover .pj-subgroup-edit{opacity:1}
.pj-gal-fc-row .fc-left{display:inline-flex;align-items:center;gap:6px;min-width:0}

.pj-tile{position:relative;display:flex;flex-direction:column;gap:9px;padding:14px 15px 12px;background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-lg);cursor:pointer;overflow:hidden;transition:border-color .12s,box-shadow .12s,transform .12s}
.pj-tile::before{content:'';position:absolute;left:0;right:0;top:0;height:3px;background:var(--pj-color,var(--accent))}
.pj-tile:hover{border-color:var(--border2);box-shadow:0 6px 18px rgba(15,23,42,.08);transform:translateY(-1px)}
.pj-tile.last{border-color:color-mix(in srgb, var(--pj-color,var(--accent)) 55%, var(--border))}
.pj-tile.locked{cursor:default;opacity:.8}
.pj-tile.locked:hover{transform:none;box-shadow:none}
.pj-tile-top{display:flex;align-items:flex-start;gap:7px}
.pj-tile-name{flex:1;min-width:0;font-size:14px;font-weight:650;color:var(--text);line-height:1.3;overflow-wrap:anywhere}
.pj-tile-desc{font-size:12px;color:var(--text2);line-height:1.45;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.pj-tile-stages{display:flex;flex-direction:column;gap:4px;font-size:11px;color:var(--text3);font-variant-numeric:tabular-nums}
.pj-tile-stagebar{display:flex;height:5px;border-radius:999px;overflow:hidden;background:var(--bg3);gap:1px}
.pj-tile-stagebar i{display:block;min-width:3px}
.pj-tile-foot{display:flex;align-items:center;gap:8px;margin-top:auto;padding-top:9px;border-top:1px solid var(--border)}
.pj-tile-num{font-size:var(--ui-body);color:var(--text2);font-variant-numeric:tabular-nums;white-space:nowrap}
.pj-tile-num.muted{color:var(--text3)}
.pj-tile-team{margin-left:auto}
.pj-tile-team .pj-stack{margin-top:0}
.pj-tile-lock{margin-top:-2px}

/* An open project: a way back and a switcher above its title */
.pj-crumbs{display:flex;align-items:center;gap:6px;margin:-6px 0 10px;font-size:var(--ui-body)}
.pj-back{display:inline-flex;align-items:center;gap:5px;background:none;border:none;padding:3px 6px 3px 2px;font:inherit;font-size:var(--ui-body);font-weight:600;color:var(--accent-ink);cursor:pointer;border-radius:var(--r-sm)}
.pj-back:hover{background:var(--bg3)}
.pj-crumb-sep{color:var(--text3)}
.pj-switch{border:1px solid transparent;background:transparent;color:var(--text2);font:inherit;font-size:var(--ui-input);padding:3px 26px 3px 6px;border-radius:var(--r-sm);cursor:pointer;max-width:340px}
.pj-switch:hover,.pj-switch:focus{border-color:var(--border);background-color:var(--bg)}

/* Dashboard → Recurring rules: one list, each row opens the task drawer */
.pj-rr{flex:1;min-width:0;overflow-y:auto}
.pj-rr-actions{display:flex;align-items:center;gap:8px}
.pj-rr-actions .btn svg{width:13px;height:13px;vertical-align:-2px}
.pj-rr-table td{vertical-align:middle}
.pj-rr-name{font-weight:600;color:var(--text)}
.pj-rr-desc{font-size:var(--ui-body);color:var(--text3);margin-top:2px;max-width:52ch;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.pj-rr-table tbody tr{cursor:pointer}
/* Recurring rules modal: the list and a rule's editor share one dialog (recurring-rules-modal.js). */
.rr-modal{width:min(1040px,96vw);max-width:96vw;max-height:88vh;padding:0;overflow-y:auto}
.rr-modal .pj-gal{padding:20px 24px 28px}
.rr-edit-bar{position:sticky;top:0;z-index:2;display:flex;align-items:center;gap:10px;padding:10px 18px;background:var(--bg2);border-bottom:1px solid var(--border)}
.rr-edit-actions{margin-left:auto;display:flex;align-items:center;gap:8px}
.rr-edit-doc{padding:20px 26px 26px}
.rr-summary{margin:2px 0 14px;font-size:var(--ui-body);color:var(--text2);overflow-wrap:anywhere}
.rr-edit-cols{display:grid;grid-template-columns:minmax(0,1.7fr) minmax(220px,1fr);gap:28px;align-items:start}
.rr-edit-side{position:sticky;top:64px;min-width:0}
.rr-prev-row{display:flex;gap:12px;padding:6px 0;border-bottom:1px solid var(--border);font-size:var(--ui-body)}
.rr-prev-date{flex:none;width:104px;color:var(--text3);font-variant-numeric:tabular-nums}
.rr-prev-who{min-width:0;overflow-wrap:anywhere}
@media(max-width:820px){.rr-edit-cols{grid-template-columns:minmax(0,1fr)}.rr-edit-side{position:static}.rr-modal{width:100vw;max-width:100vw;max-height:94dvh;border-radius:var(--r-xl) var(--r-xl) 0 0}.rr-edit-doc{padding:16px 16px 22px}.rr-modal .pj-gal{padding:16px 14px 24px}}

.wp-status{display:inline-flex;align-items:center;gap:6px;flex-wrap:nowrap;white-space:nowrap;min-width:0}
.wp-doer{display:inline-flex;align-items:center;gap:2px;font-size:12px;color:var(--text3)}
.wp-doer .tp-select{max-width:160px}
.wp-person-up{padding:0 2px 0 0}

/* Guest access (Resources → Equipment) */
.ga-intro{font-size:13px;color:var(--text2);line-height:1.5;margin:0 0 12px}
.ga-code{border:1px solid var(--warn-border);background:var(--warn-bg);color:var(--warn-fg);border-radius:var(--r-md);padding:10px 12px;margin-bottom:12px;font-size:13px}
.ga-code-row{display:flex;align-items:center;gap:8px;margin-top:6px}
.ga-code code{font-family:var(--mono);font-size:17px;letter-spacing:.08em;color:var(--text);background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-sm);padding:4px 10px}
.ga-table td{vertical-align:middle}
.ga-path{font-size:11px;color:var(--text3)}
.ga-actions{white-space:nowrap;text-align:right}
.ga-hint{font-size:11px;color:var(--text3);margin-top:3px}
#guest-access-body .modal-actions{display:flex;justify-content:flex-end;gap:8px;margin-top:16px}

/* An open project's sidebar (Projects → Projects → a project) */
.pj-nav-body{flex:1;min-height:0;overflow-y:auto;padding:10px 10px 14px;display:flex;flex-direction:column;gap:12px}
.pj-nav.collapsed .pj-nav-body{display:none}
.pj-nav .pj-crumbs{flex-direction:column;align-items:stretch;gap:4px;margin:0}
.pj-nav .pj-back{align-self:flex-start}
.pj-nav .pj-switch{max-width:none;width:100%;border-color:var(--border);background-color:var(--bg);font-weight:600;color:var(--text)}
.pj-nav-sections{display:flex;flex-direction:column;gap:1px}
.pj-nav-item{display:flex!important;align-items:center;gap:9px;width:100%;text-align:left}
.pj-nav-ic{display:inline-flex;width:16px;justify-content:center;color:var(--text3);flex-shrink:0}
.pj-nav-ic svg{width:15px;height:15px}
.pj-nav-item.active .pj-nav-ic{color:var(--accent-ink)}
.pj-nav-label{flex:1;min-width:0}
.pj-nav-n{font-size:11px;color:var(--text3);font-variant-numeric:tabular-nums}
.pj-nav-team{margin-top:auto;padding-top:10px;border-top:1px solid var(--border)}
.pj-nav-team .sl{margin-bottom:6px}
/* Gallery sidebar: "+ New programme" sits on the Programme heading */
.pj-sl-row{display:flex;align-items:center;justify-content:space-between;gap:6px}
.pj-sl-add{width:22px;height:22px;padding:0}
.pj-sl-add svg{width:12px;height:12px}
.pj-sl-empty{font-size:var(--ui-body);color:var(--text3);line-height:1.4;padding:2px 8px 6px}

/* ── LC-MS viewer (static/js/lcms.js) — full-window, ChemLib tokens ── */
.lcms-inner{padding:0;gap:0}
.lc-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;padding:14px 18px 6px;flex-wrap:wrap}
.lc-title{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;min-width:0}
.lc-title h3{margin:0;font-family:var(--mono);font-weight:600;font-size:20px}
.lc-sub{font-size:var(--ui-caption);color:var(--text3)}
.lc-actions{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.lc-danger{color:var(--red)}
.lc-meta{display:flex;flex-wrap:wrap;gap:6px;padding:0 18px 8px}
.lc-chip{font-size:var(--ui-caption);background:var(--bg3);color:var(--text3);padding:2px 8px;border-radius:var(--r-xs);white-space:nowrap;font-variant-numeric:tabular-nums}
.lc-chip b{color:var(--text);font-weight:500}
.lc-warn{margin:0 18px 8px;font-size:12px;color:var(--warn-fg);background:var(--warn-bg);border:1px solid var(--warn-border);border-radius:var(--r-sm);padding:6px 10px}
.lc-warn summary{cursor:pointer;display:flex;align-items:center;gap:6px}
.lc-warn ul{margin:6px 0 0;padding-left:20px}
.lc-bar{display:flex;flex-wrap:wrap;gap:8px 16px;align-items:flex-end;padding:10px 18px;border-top:1px solid var(--border);border-bottom:1px solid var(--border);background:var(--bg)}
.lc-field{display:flex;flex-direction:column;gap:3px;font-size:var(--ui-label);color:var(--text3);font-weight:600;letter-spacing:.03em}
.lc-field>span{text-transform:uppercase}
.lc-field input[type=number]{width:84px;height:28px;font-variant-numeric:tabular-nums}
.lc-field select{height:28px}
.lc-seg{display:inline-flex;border:1px solid var(--border2);border-radius:var(--r-sm);overflow:hidden}
.lc-seg button{font:inherit;font-size:var(--ui-action);font-weight:500;border:0;background:transparent;color:var(--text2);padding:0 12px;height:28px;cursor:pointer}
.lc-seg button[aria-pressed=true]{background:var(--accent-ink);color:var(--on-accent)}
.lc-scroll{flex:1;min-height:0;overflow:auto;padding:14px 18px 22px;display:flex;flex-direction:column;gap:14px}
.lc-card{background:var(--bg2);border:1px solid var(--border);border-radius:var(--r-md);padding:10px 12px 8px;display:flex;flex-direction:column;gap:6px;min-width:0}
.lc-card h4{margin:0;font-size:var(--ui-section);font-weight:600;color:var(--text3);text-transform:uppercase;letter-spacing:.06em;display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap}
.lc-r{text-transform:none;letter-spacing:0;font-weight:400;font-variant-numeric:tabular-nums}
.lc-readout{font-size:var(--ui-body);display:flex;flex-wrap:wrap;gap:4px 16px;color:var(--text3);font-variant-numeric:tabular-nums}
.lc-readout b{color:var(--text);font-weight:500}
.lc-status{color:var(--text3)}
.lcms-modal canvas{display:block;width:100%;touch-action:none}
.lc-c-uv{height:230px}.lc-c-ms{height:170px}.lc-c-spec{height:240px}
.lc-hint{font-size:var(--ui-caption);color:var(--text3)}
.lc-tablewrap{overflow-x:auto}
.lc-table{border-collapse:collapse;width:100%;font-size:var(--ui-body)}
.lc-table th{font-size:var(--ui-label);text-transform:uppercase;letter-spacing:.05em;color:var(--text3);font-weight:600;text-align:right;padding:6px 8px;border-bottom:1px solid var(--border2);white-space:nowrap}
.lc-table td{text-align:right;padding:5px 8px;border-bottom:1px solid var(--border);font-variant-numeric:tabular-nums;white-space:nowrap}
.lc-table .lc-l{text-align:left}
.lc-table tr.sel td{background:color-mix(in srgb,var(--accent) 10%,transparent)}
.lc-table tr[data-k]{cursor:pointer}
.lc-table select{height:26px;font-size:var(--ui-input)}
.lc-table .lc-row-multi{height:auto;min-width:150px;padding:3px}
.lc-table .lc-row-multi option{padding:3px 6px}
.lc-pct{font-weight:600;color:var(--text)}
.lc-dot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:6px;vertical-align:middle}
.lc-dot-product{background:var(--green)}.lc-dot-reagent{background:var(--chip-purple-fg)}
.lc-dot-unknown{background:var(--text3)}.lc-dot-column_impurity{background:var(--yellow)}
.lc-muted{color:var(--text3);font-weight:400}
.lc-sum{display:flex;flex-wrap:wrap;align-items:flex-end;gap:10px 22px;padding-top:8px}
.lc-sum>div{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap}
.lc-k{font-size:var(--ui-caption);font-weight:600;color:var(--text3);text-transform:uppercase;letter-spacing:.05em}
.lc-big{font-size:20px;font-weight:600;font-variant-numeric:tabular-nums}
.lc-sum .lc-muted{font-size:var(--ui-caption)}
.lc-ions{font-size:var(--ui-body);display:flex;flex-wrap:wrap;gap:6px;align-items:center;padding-top:4px}
.lc-ion{padding:1px 7px;border-radius:var(--r-xs);background:var(--bg3);color:var(--text3);font-variant-numeric:tabular-nums}
.lc-ion.ok{background:var(--chip-green-bg);color:var(--chip-green-fg)}
.lc-saved{font-size:12px;padding-top:2px}
.lc-gone{background:var(--bg2);border:1px dashed var(--border2);border-radius:var(--r-md);padding:14px 16px;font-size:13px;display:flex;flex-direction:column;gap:8px;align-items:flex-start}
.lc-gone p{margin:0}
.lcms-tip{position:fixed;pointer-events:none;background:var(--text);color:var(--bg2);font-size:12px;padding:4px 7px;border-radius:var(--r-xs);z-index:1001;white-space:nowrap;font-variant-numeric:tabular-nums}
.lc-open-btn{font-size:11px;padding:1px 8px;height:auto;flex-shrink:0}
.lc-prod{border-top:1px solid var(--border);padding-top:10px;margin-top:8px;display:flex;flex-direction:column;gap:4px}
.lc-prod-h{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;font-size:13px}
.lc-prod-h .lc-k{margin-left:10px}

/* LC-MS retention and additional wavelength controls. */
.lc-extra-waves { display:flex; gap:10px; align-items:flex-end; flex-wrap:wrap; }
.lc-keep-choice { display:flex; align-items:center; gap:8px; margin:10px 0; color:var(--text); }
.lc-keep-fixed { color:var(--text2); }
.lc-keep-h { margin:16px 0 0; font-size:14px; }
.lc-keep-range { display:flex; align-items:center; flex-wrap:wrap; gap:6px; margin:10px 0; color:var(--text); }
.lc-keep-range input[type=number] { width:84px; }
.lc-keep-range > span { flex-basis:100%; }
#lc-retention-modal { z-index:1300; }
#lc-retention-modal .modal { max-width:580px; }
#lc-retention-modal .lc-muted { color:var(--text3); font-size:12px; }
.lc-ion .icon-btn { color:inherit; vertical-align:middle; }

#lc-extra-waves [hidden] { display:none; }

/* Keep the UV workflow prominent; secondary instrument controls stay compact. */
.lc-advanced{border-bottom:1px solid var(--border);background:var(--bg)}
.lc-advanced>summary{padding:8px 18px;cursor:pointer;font-size:12px;color:var(--text2)}
.lc-advanced .lc-bar{border:0;padding-top:4px}
.lc-workbar{display:flex;justify-content:space-between;align-items:flex-end;gap:12px;flex-wrap:wrap;padding-bottom:8px;border-bottom:1px solid var(--border)}
.lc-workbar h4{color:var(--text);margin-bottom:5px}
.lc-auto-controls{display:flex;align-items:flex-end;gap:8px;flex-wrap:wrap}
.lc-auto-controls .btn{min-height:30px}
.lc-auto-message{min-height:18px;padding:3px 0}
.lc-edit-status{margin-left:auto;align-self:center;font-size:12px;color:var(--text3);border:1px solid var(--border);border-radius:var(--r-sm);padding:3px 8px}
.lc-edit-status.dirty{color:var(--warn-fg);background:var(--warn-bg);border-color:var(--warn-border)}
.lc-window{display:flex;align-items:center;justify-content:flex-end;gap:4px}
.lc-window input{width:84px;height:28px;font-size:12px;font-variant-numeric:tabular-nums}
.lc-auto-badge{margin-left:6px;font-size:10px;border-radius:var(--r-xs);padding:2px 5px;background:var(--bg3);color:var(--text3)}
.lc-table .lc-empty{text-align:center;padding:24px 12px;color:var(--text3);white-space:normal}
.lc-table thead{position:sticky;top:0;background:var(--bg2);z-index:1}
.lc-table tr[data-k]:hover td{background:color-mix(in srgb,var(--accent) 5%,transparent)}
.lc-c-uv{height:280px}.lc-c-ms{height:130px}
@media(max-width:820px){.lc-bar{gap:8px 12px}.lc-workbar{align-items:stretch}.lc-auto-controls{width:100%}.lc-c-uv{height:230px}.lc-c-ms{height:110px}.lc-edit-status{margin-left:0}}

/* LC-MS: tall linked chromatograms beside a switchable spectrum and review. */
.lcms-inner .lc-head{align-items:center;padding-top:10px;flex-shrink:0}
.lc-report-name{margin-left:auto;min-width:160px;flex:0 1 240px}
.lc-report-name input{width:100%;height:28px;box-sizing:border-box}
.lc-metadata{flex-shrink:0}
.lc-metadata>summary{padding:3px 18px 6px;font-size:11px;color:var(--text3);cursor:pointer}
.lc-review-page{gap:10px;padding:10px 14px 14px}
.lc-workspace{flex:none;display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);grid-template-areas:"chromatograms spectra";gap:10px;width:100%;max-width:1600px;margin:0 auto;align-items:start}
.lc-chromatograms{grid-area:chromatograms;min-height:0}
.lc-chromatograms .lc-c-uv{flex:none;height:280px}
.lc-chromatograms .lc-c-ms{flex:none;height:240px}
.lc-spectra{grid-area:spectra;display:grid;gap:10px;min-height:0;align-content:start}
.lc-spectra .lc-card{min-height:0}
.lc-spectra .lc-c-spec{flex:none;height:300px}
.lc-spectrum-switch{align-self:flex-start;flex-shrink:0}
.lc-spectrum-panel{display:flex;flex-direction:column;gap:6px}
.lc-spectrum-panel[hidden]{display:none}
.lc-chromatograms .lc-workbar{gap:6px;padding-bottom:5px}
.lc-auto-settings>summary{cursor:pointer;font-size:12px;color:var(--text2);padding:6px 0}
.lc-auto-settings-fields{display:flex;gap:8px;flex-wrap:wrap;padding:5px 0}
.lc-chromatograms .lc-advanced{border:0;border-top:1px solid var(--border);background:transparent;flex-shrink:0}
.lc-chromatograms .lc-advanced>summary{padding:3px 0}
.lc-chromatograms .lc-advanced .lc-bar{padding:5px 0;gap:6px 12px;background:transparent}
.lc-review{min-height:0;overflow:hidden}
.lc-review .lc-tablewrap{min-height:0;overflow:auto}
.lc-review-summary{font-size:12px;min-height:0;flex-shrink:0}
.lc-review-summary>summary{cursor:pointer;color:var(--text2);padding:2px 0}
.lcms-inner kbd{font:inherit;font-size:10px;padding:0 3px;border:1px solid var(--border2);border-radius:3px;color:var(--text3)}
@media(max-width:1000px){.lc-report-name{flex-basis:180px}}
@media(max-width:820px){
  .lc-workspace{display:flex;flex-direction:column}
  .lc-workspace>.lc-card,.lc-spectra{width:100%;box-sizing:border-box}
  .lc-chromatograms .lc-c-uv{height:230px}
  .lc-chromatograms .lc-c-ms{height:220px}
  .lc-spectra .lc-c-spec{height:200px}
  .lc-report-name{margin-left:0;flex:1 1 160px}
}
.lcms-inner>.lc-bar{flex-shrink:0}
.lc-auto-message:empty{display:none}
.lc-ms-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.lc-ms-toolbar .lc-field{flex-direction:row;align-items:center;gap:6px}

.ms-extra-ion{display:flex;align-items:flex-end;gap:8px;margin:10px 0}
.ms-extra-ion select{max-width:170px}
.ms-extra-ion input{width:120px}
.ms-ions-help,.ms-file-ions{font-size:11px;color:var(--text3)}
.ms-file-ions{font-family:var(--mono);overflow-wrap:anywhere}
#ms-details-modal .modal{max-height:90dvh;overflow:auto}

.lc-report-choice { display:inline-flex; align-items:center; gap:3px; flex-shrink:0; font-size:var(--ui-caption); color:var(--text3); cursor:pointer; }
.lc-report-choice input { margin:0; accent-color:var(--accent); }
.lc-report-choice:has(input:checked) { color:var(--accent); }

/* Roles: one compact editor instead of two overlapping permission tables. */
.role-section{width:100%;margin:0}
.role-settings-back{display:none}
.role-page-heading,.role-editor-head{display:flex;align-items:center;justify-content:space-between;gap:16px}
.role-page-heading{padding-bottom:10px;margin-bottom:14px;border-bottom:2px solid var(--border)}
.role-section .role-page-heading h3{border:0;padding:0;margin:0;font-size:13px;font-weight:600}
.role-page-heading p,.role-editor-head p{margin:4px 0 0;color:var(--text3);font-size:12px;line-height:1.5}
.role-workspace{display:grid;grid-template-columns:215px minmax(0,1fr);gap:16px;align-items:start}
.role-roster{position:sticky;top:12px;display:flex;flex-direction:column;gap:6px;min-width:0}
.role-roster-label{font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;color:var(--text3);padding:8px 10px}
.role-roster-item{text-align:left;border:1px solid transparent;border-radius:var(--r-sm);background:transparent;color:var(--text);padding:10px;cursor:pointer;font-family:inherit;display:flex;flex-direction:column;gap:3px;width:100%}
.role-roster-item:hover{background:var(--bg3)}
.role-roster-item.selected{border-color:color-mix(in srgb,var(--accent) 30%,var(--border));background:var(--accent-light)}
.role-roster-name{font-size:13px;font-weight:600;display:flex;flex-wrap:wrap;gap:6px;align-items:center;overflow-wrap:anywhere}
.role-roster-name small{font-size:10px;font-weight:500;color:var(--text3)}
.role-roster-meta{font-size:11px;color:var(--text3);line-height:1.5}
.role-roster-note{font-size:11px;line-height:1.5;color:var(--text3);padding:12px 10px 0;margin:6px 0 0;border-top:1px solid var(--border)}
.role-editor{min-width:0;padding:16px;border:1px solid var(--border);border-radius:var(--r-md);background:var(--bg2)}
.role-editor-head h4{font-size:14px;margin:0;font-weight:600}
.role-settings{display:grid;grid-template-columns:minmax(125px,1fr) minmax(160px,2fr) 130px;gap:12px;margin:16px 0 12px}
.role-settings>label{display:flex;flex-direction:column;gap:5px;min-width:0;font-size:11px;font-weight:500;color:var(--text3)}
.role-settings>label input:not([type=checkbox]){width:100%;height:32px;font-size:12px;font-weight:400}
.role-settings .role-review-setting{grid-column:1/-1;flex-direction:row;align-items:center;gap:8px;font-size:12px;font-weight:500;cursor:pointer}
.role-review-setting input,.role-enabled-filter input,.role-permission input{accent-color:var(--accent);margin:0;flex-shrink:0;width:14px;height:14px}
.role-review-setting span{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.role-review-setting small{font-size:11px;color:var(--text3);font-weight:400}
.role-presets{border-bottom:1px solid var(--border);padding:0 0 12px;margin-bottom:12px;font-size:12px;color:var(--text2)}
.role-presets summary{cursor:pointer;user-select:none;line-height:1.5}
.role-presets summary svg{margin-right:3px}
.role-preset-content{display:flex;flex-wrap:wrap;align-items:center;gap:8px;padding-top:12px}
.role-preset-content select{max-width:250px}
.role-preset-hint{font-size:11px;color:var(--text3);line-height:1.5}
#rm-responsibilities{display:flex;flex-wrap:wrap;gap:5px;flex-basis:100%}
#rm-responsibilities .btn{font-size:11px;padding:4px 8px}
.role-permission-toolbar{display:flex;align-items:center;flex-wrap:wrap;gap:10px;margin:12px 0}
.role-permission-search{display:flex;align-items:center;gap:7px;height:32px;box-sizing:border-box;background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-sm);padding:0 9px;flex:1;min-width:155px;max-width:290px;color:var(--text3)}
.role-permission-search input{border:0;background:transparent;min-width:0;width:100%;padding:6px 0;font-size:12px}
.role-permission-search:focus-within{border-color:var(--accent);box-shadow:0 0 0 3px var(--accent-light)}
.role-enabled-filter{display:flex;align-items:center;gap:6px;cursor:pointer;white-space:nowrap;font-size:11px;color:var(--text2)}
#rm-summary{font-size:11px;color:var(--text3);margin-left:auto}
.role-permission-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:10px;align-items:start}
.role-perm-group{border:1px solid var(--border);border-radius:var(--r-md);overflow:hidden;background:var(--bg2)}
.role-group-heading{display:flex;align-items:center;gap:8px;padding:8px 10px;background:var(--bg3);border-bottom:1px solid var(--border)}
.role-group-heading h5{font-size:var(--ui-section);font-weight:700;letter-spacing:.05em;text-transform:uppercase;color:var(--text3);line-height:1.5;margin:0;flex:1;min-width:0}
.role-group-icon{color:var(--accent-ink);display:flex;align-items:center}
.role-group-icon svg{width:14px;height:14px;vertical-align:0!important}
.role-group-count{font-size:11px;color:var(--text3);font-variant-numeric:tabular-nums;white-space:nowrap}
.role-permission{display:flex;align-items:flex-start;gap:8px;padding:9px 10px;cursor:pointer;min-height:34px;box-sizing:border-box;font-size:12px;line-height:1.5;border-bottom:1px solid var(--border)}
.role-permission:last-child{border-bottom:0}
.role-permission:hover{background:var(--bg3)}
.role-permission:has(input:checked){background:color-mix(in srgb,var(--accent) 5%,var(--bg2))}
.role-permission:focus-within{outline:2px solid var(--accent);outline-offset:-2px}
.role-permission input{margin-top:2px}
.role-permission-text{min-width:0;flex:1;overflow-wrap:anywhere}
.role-permission-text>span{font-weight:500;color:var(--text)}
.role-permission-text small{display:block;font-size:11px;color:var(--text3);line-height:1.5;margin-top:2px}
.role-permission-kind{font-size:10px;line-height:1.5;background:var(--bg3);color:var(--text3);border-radius:var(--r-xs);padding:1px 5px;flex-shrink:0;white-space:nowrap;margin-top:1px}
.role-permission-kind.kind-manage,.role-permission-kind.kind-review{color:var(--accent-ink);background:var(--accent-light)}
.role-permission-kind.kind-delete{color:var(--red);background:color-mix(in srgb,var(--red) 8%,var(--bg2))}
.role-scope-note,.role-empty-search{font-size:11px;line-height:1.5;color:var(--text3);margin:12px 0}
.role-dependency-note{font-size:11px;color:var(--orange-ink);background:color-mix(in srgb,var(--orange) 8%,var(--bg2));padding:8px 10px;border-radius:var(--r-sm)}
.role-editor-footer{position:sticky;bottom:0;background:var(--bg2);display:flex;align-items:center;justify-content:space-between;gap:12px;margin:16px -16px -16px;padding:12px 16px;border-top:1px solid var(--border);border-radius:0 0 var(--r-md) var(--r-md);z-index:1}
.role-editor-footer>span{font-size:11px;color:var(--text3)}
.role-editor-footer>div{display:flex;gap:6px}
.role-permission[hidden],.role-perm-group[hidden],.role-empty-search[hidden],.role-dependency-note[hidden]{display:none!important}
@media(min-width:1550px){.role-permission-grid{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:1050px){.role-workspace{grid-template-columns:175px minmax(0,1fr);gap:12px}.role-settings{grid-template-columns:minmax(0,1fr) 125px}.role-settings>label:nth-child(2){grid-column:1/-1;grid-row:2}.role-permission-kind{display:none}}
@media(max-width:760px){.role-workspace{grid-template-columns:1fr}.role-roster{position:static;flex-direction:row;flex-wrap:wrap;gap:5px}.role-roster-label,.role-roster-note{flex-basis:100%}.role-roster-item{width:auto;max-width:100%;flex:1 1 140px}.role-roster-note{padding:8px;margin:0}.role-editor{padding:14px}.role-permission-grid{grid-template-columns:1fr}.role-editor-footer{margin:14px -14px -14px;padding:10px 14px;flex-wrap:wrap}.role-editor-footer>div{margin-left:auto}}
@media(max-width:760px){#page-admin:has(#admin-sidebar [data-adminview="roles"].active) #admin-sidebar{display:none}.role-settings-back{display:inline-flex;margin-bottom:12px}#page-admin:has(#admin-sidebar [data-adminview="roles"].active) #admin-content{min-width:0;padding:14px}}

/* Recurring rule search and day-by-day assignment details. */
.pj-rr-toolbar{display:flex;align-items:center;gap:8px;margin:0 0 16px;flex-wrap:wrap}
.pj-rr-toolbar .form-input{height:32px;width:auto;min-width:0;font-size:12px}
.pj-rr-toolbar input{flex:1;min-width:180px!important}
.pj-rr-toolbar select{max-width:200px}
.pj-rr-toolbar #rr-filter-count{font-size:11px;white-space:nowrap}
.wp-hm button.pj-heat-cell{border:0;padding:0;cursor:pointer;flex-shrink:0}
.wp-hm button.pj-heat-cell:hover,.wp-hm button.pj-heat-cell:focus-visible{outline:2px solid var(--accent-ink);outline-offset:1px}
.wp-hm-hint{margin-top:7px;color:var(--text3);font-size:10px}
#wp-history-tip{position:fixed;z-index:10000;width:320px;max-width:min(340px,calc(100vw - 16px));max-height:calc(100vh - 24px);overflow:auto;white-space:pre-line;overflow-wrap:anywhere;padding:12px 14px;background:var(--bg2);color:var(--text);border:1px solid var(--border);border-radius:var(--r-md);box-shadow:var(--shadow-lg);font-size:12px;line-height:1.5}
#wp-history-tip[hidden]{display:none}
#wp-history-tip.wp-history-editor{width:380px;max-width:calc(100vw - 16px);max-height:min(640px,calc(100vh - 24px));white-space:normal}
.wp-history-head,.wp-history-row{display:flex;align-items:center;justify-content:space-between;gap:10px}
.wp-history-head{font-size:13px;position:sticky;top:-12px;background:var(--bg2);padding:4px 0;z-index:1}
.wp-history-hint{color:var(--text3);font-size:11px;line-height:1.5;margin:6px 0 10px}
.wp-history-occurrence{border-top:1px solid var(--border);padding:10px 0}
.wp-history-row{margin-bottom:5px}
.wp-history-state{font-size:11px;font-weight:600}
.wp-history-state-done{color:var(--green-ink)}
.wp-history-state-late{color:var(--yellow-ink)}
.wp-history-state-missed,.wp-history-error{color:var(--red)}
.wp-history-state-pending{color:var(--text3)}
.wp-history-doer{display:flex;align-items:center;gap:10px;margin:8px 0}
.wp-history-doer .form-input{flex:1;min-width:0;width:auto;font-size:12px}
.wp-history-actions{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
.wp-history-error{margin-top:6px;font-size:11px}
.wp-history-notes{white-space:pre-wrap;overflow-wrap:anywhere;margin-top:4px}
@media(max-width:600px){.pj-rr-toolbar input{flex-basis:100%}.pj-rr-toolbar select{flex:1;max-width:none}.pj-rr-toolbar #rr-filter-count{margin-left:auto}}

/* Personal identity and account Configuration use the same compact modal. */
.account-section-title{font-size:var(--ui-section);font-weight:600;color:var(--text);border-top:1px solid var(--border);padding-top:14px;margin:16px 0 10px}
.account-section-first{border-top:0;padding-top:0;margin-top:0}
.account-hint{font-size:11px;line-height:1.5;color:var(--text3);margin:0 0 10px}
#profile-modal .account-hint{margin:0}

.role-audit-note{margin:0 0 14px;border:1px solid var(--warn-border,var(--border));border-radius:var(--r-md);padding:10px 12px;background:var(--warn-bg);color:var(--warn-fg);font-size:12px}
.role-audit-note summary{cursor:pointer;font-weight:600;display:flex;align-items:center;gap:6px}
.role-audit-note p{line-height:1.5;margin:10px 0}
.role-audit-row{display:flex;align-items:center;justify-content:space-between;gap:10px;border-top:1px solid var(--border);padding:8px 0}
.role-audit-row>div{min-width:0;overflow-wrap:anywhere}.role-audit-row>button{flex-shrink:0}

/* Shared desktop finish. Scientific canvases and dense plate/structure grids
   keep their own scales; mobile layout is a separate audit workstream. */
.ui-state{padding:24px 16px;max-width:560px;margin:auto;text-align:center;color:var(--text2);font-size:13px;line-height:1.6}
.ui-state strong{display:block;font-size:14px;color:var(--text);font-weight:600}
.ui-state p{margin:6px 0 12px}
.ui-state-actions{display:flex;justify-content:center;gap:8px;flex-wrap:wrap}
.admin-help{max-width:680px;margin:8px 0 16px;font-size:13px;color:var(--text2);line-height:1.6}
.admin-help summary{cursor:pointer;color:var(--accent-ink);font-weight:500}
.admin-help p{margin-top:8px}
.pj-member-role{font-size:12px;color:var(--text2);margin-top:3px;overflow-wrap:anywhere}
.pj-member-meta{font-variant-numeric:tabular-nums}
.pj-member-activity{margin-top:8px}
.person-disclosure{margin:12px 0;color:var(--text2);font-size:var(--ui-reading);line-height:1.6}
.person-disclosure summary{cursor:pointer;color:var(--accent-ink)}
.person-result-meta{display:flex;flex-wrap:wrap;gap:4px 10px;margin-top:6px;font-size:var(--ui-caption);color:var(--text2)}
.person-result-meta span+span{border-left:1px solid var(--border2);padding-left:10px}
.person-result-meta .person-result-kind{color:var(--accent-ink);font-weight:500}
.lc-window input{font-variant-numeric:tabular-nums}

@media(min-width:821px){
  .role-roster-meta,.role-roster-note,.role-roster-name small,.role-settings>label,
  .role-group-heading h5,.role-permission-kind,.role-review-setting small,
  .role-permission-text small,.role-scope-note,.role-editor-footer>span,
  .role-enabled-filter,#rm-summary{font-size:12px}
  .role-roster-label,.role-group-count{font-size:11px}
  .role-settings>label input:not([type=checkbox]){height:34px;font-size:13px}
  .role-permission{padding:10px 12px}
  .role-group-heading{padding:10px 12px}
  .role-roster-item.selected{--text3:var(--text2)}
  .pill,.badge,.status-badge,.eln-card-meta,.pj-doc-meta,.pj-mol-sub,
  .stock-pill,.home-stat-sub,.account-hint,.person-hint{font-size:12px}
  .icon-btn{width:var(--control-size);height:var(--control-size)}
  .icon-btn.icon-btn-sm{width:var(--control-size);height:var(--control-size)}
  .modal{max-height:calc(100dvh - 64px);scroll-padding-block:20px}
  .modal>.modal-actions:last-child,.modal>.modal-footer:last-child,.modal>div:last-child:has(>.btn){
    position:sticky;bottom:-24px;background:var(--bg2);padding:14px 0 4px;
    margin-top:20px;border-top:1px solid var(--border);z-index:2;gap:8px;
  }
  #configuration-modal>.modal{display:flex;flex-direction:column;overflow:hidden}
  #configuration-modal .modal-body{overflow:auto;min-height:0;padding-right:6px;scroll-padding:16px}
  #configuration-modal .modal-actions{position:static;flex-shrink:0;padding-bottom:0}
  #configuration-modal .modal-actions .btn{flex:none!important}
  #configuration-modal .account-section-title{font-size:var(--ui-section);margin-top:20px}
  #configuration-modal .account-section-first{margin-top:0}
  #prof-eln-start-row{display:grid;grid-template-columns:110px max-content;gap:8px;align-items:center}
  #prof-eln-start-row label,#prof-eln-start-row>span{grid-column:1/-1;margin:0!important}
  #prof-eln-start-row .btn{width:auto;margin:0!important;justify-self:start}
  .person-card{display:flex;flex-direction:column;overflow:hidden;padding:24px}
  .person-card-head,.person-card>.person-links,.person-tabs{flex-shrink:0}
  .person-card-body{min-height:0;overflow:auto;padding-right:6px;scroll-padding:16px}
  .modal :is(input,select,textarea){scroll-margin-block:40px}
  .person-card-head h3{font-size:var(--ui-dialog);line-height:1.4}
  .person-card-head p{font-size:13px;color:var(--text2)}
  .person-tabs button{font-size:var(--ui-action)}
  .person-section h4{font-size:var(--ui-section)}
  .person-link{font-size:var(--ui-action);padding:6px 10px}
  .person-actions{position:sticky;bottom:0;background:var(--bg2);padding:14px 0 2px;border-top:1px solid var(--border);z-index:1}
  .person-link-row{gap:10px;margin:10px 0}
  .person-stage{padding-bottom:24px}
  .person-stage-head{align-items:flex-start;line-height:1.5}
  .person-stage-head>span{flex-shrink:0;gap:6px}
  .person-result{padding:16px 0}
  .person-result-title{font-size:var(--ui-body);line-height:1.5}
  .pj-team-grid{grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px}
  .pj-member{align-items:flex-start;padding:16px;min-height:116px}
  .pj-member.away{opacity:1;background:var(--bg)}
  .pj-member-name{font-size:14px;line-height:1.5;overflow-wrap:anywhere}
  .pj-member-meta{font-size:12px}
  .pj-load{height:4px;margin-top:8px}
  .wp-stat-tiles{gap:10px;margin:12px 0 20px}
  .wp-stat-tiles>div{padding:12px}
  .wp-hm{padding:14px 0;border-block:1px solid var(--border);margin-bottom:20px}
  .wp-hm .pj-heat-grid,.wp-hm .pj-heat-col,.wp-hm .pj-heat-days,.wp-hm .pj-heat-wds{gap:3px}
  .wp-hm .pj-heat-cell{width:10px;height:10px}
  .wp-hm .pj-heat-wd{height:10px;line-height:10px;font-size:10px}
  .wp-hm .pj-heat-month{font-size:11px;height:16px}
  .wp-hm-hint,.wp-hm .pj-heat-scale{font-size:12px;line-height:1.5}
  .wp-bars-h{font-size:var(--ui-section)}
  .gs-sub,.gs-empty-sub,.gs-note{font-size:13px;color:var(--text2)}
  .gs-cat{font-size:12px;margin-top:14px;color:var(--text2)}
  .gs-foot{font-size:12px;padding:10px 16px;color:var(--text2)}
  .gs-foot kbd{font-size:11px;line-height:18px}
  .gs-result-row{padding:10px}
  .gs-result-row.active{--text3:var(--text2)}
  #integration-cheminventory,#integration-ftp,#integration-hpc-docking,#integration-api-tokens{max-width:760px}
  #admin-tab-lab .admin-section{max-width:620px}
  .admin-section>p{max-width:680px;line-height:1.6}
  #orders-center:has(#reac-section-add-request:not([style*="display: none"]):not([style*="display:none"])){
    width:min(720px,calc(100% - 260px))!important;flex:1 1 640px!important;
  }
  #orders-center:has(#reac-section-add-request:not([style*="display: none"]):not([style*="display:none"]))~#orders-detail-pane{display:none!important}
  #reac-section-add-request{max-width:720px;width:100%;margin:auto;padding:24px 32px!important}
  #reac-section-add-request>div:last-child{max-width:none!important}
  #bst-panel-bca table{width:auto!important;max-width:100%;table-layout:auto}
  #bst-panel-bca th,#bst-panel-bca td{padding:8px 12px;text-align:left}
  #bst-panel-bca input[type=number]{width:120px!important;text-align:right;font-variant-numeric:tabular-nums}
  #bst-panel-bca input[type=text]{width:180px!important}
  #bst-panel-bca h4{margin-bottom:12px}
  #page-reagents [style*="font-family:var(--mono)"][style*="text-align:right"],
  #page-orders [style*="font-family:var(--mono)"][style*="text-align:right"]{font-family:var(--sans)!important;font-variant-numeric:tabular-nums}
}

@media(prefers-reduced-motion:reduce){.home-card-icon *,.home-card-icon{animation:none!important;transition:none!important}.flask-boom,.lab-ufo{display:none!important}}

@media(min-width:821px){
  #page-admin [style*="font-size:10px"],#page-reagents [style*="font-size:10px"],
  #page-orders [style*="font-size:10px"],.pj-member [style*="font-size:10px"]{font-size:12px!important}
  .status-pill{font-size:12px;padding:2px 8px}
  .gs-sub{white-space:normal;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;line-height:1.45}
  #bst-panel-bca>div:has(#bst-bca-std-tbody){gap:24px!important}
  #bst-panel-bca>div:has(#bst-bca-std-tbody)>div{flex:0 1 auto!important;max-width:100%}
}

@media(min-width:821px){.numeric,.vol-badge,.pv.quantity{font-family:var(--sans);font-variant-numeric:tabular-nums}.vol-badge{font-size:12px}}

/* Dark selections stay on graphite surfaces, with a restrained accent tint. */
:root[data-theme="dark"]{
  --selection-bg:color-mix(in srgb,var(--accent) 12%,var(--bg2));
  --selection-border:color-mix(in srgb,var(--accent) 22%,var(--border));
}
:root[data-theme="dark"] :is(.nav-item.active,.subtab.active,.nav-icon-btn.active,.bio-subtab.active,.pj-nav-item.active,.role-roster-item.selected,.gs-result-row.active){
  background:var(--selection-bg);color:var(--accent-ink);
  box-shadow:inset 0 0 0 1px var(--selection-border);
}
:root[data-theme="dark"] .role-roster-item.selected .role-roster-name{color:var(--text)}
:root[data-theme="dark"] .role-roster-item.selected :is(.role-roster-meta,small){color:var(--text2)}
.sidebar-toggle-btn svg{display:block;flex-shrink:0}

/* My profile reuses the compact person card, with private personal fields. */
.my-profile-card .person-tabs{flex-wrap:wrap}
#my-profile-personal-body .av-picker{margin-top:4px}
#my-profile-personal-body .av-color{flex-shrink:0}

/* Computational uses the same sidebar shell and collapse handle as the notebooks. */
.comp-layout{display:flex;flex:1;min-height:0;overflow:hidden}
.comp-sidebar{position:relative;min-height:0}
.comp-sidebar.collapsed>:not(.sidebar-toggle-btn){display:none!important}
.comp-sidebar .eln-list-header{flex-shrink:0}
.comp-sidebar .eln-list-header h3{margin:0;flex:1;font-size:14px;font-weight:600}
.comp-sidebar-body{flex:1;min-height:0;overflow-y:auto;padding:0 14px 14px}
.comp-sidebar-section{padding-top:14px}
.comp-sidebar-section + .comp-sidebar-section{margin-top:14px;border-top:1px solid var(--border)}
.comp-sidebar-section h4{margin:0 0 10px;font-size:12px;font-weight:600;color:var(--text2)}
.comp-main{flex:1;min-width:0;min-height:0;overflow:auto;padding:16px 20px}
.comp-viewer-main{display:flex;flex-direction:column;gap:10px}
.comp-scene{flex:1;display:flex;min-height:420px;min-width:0}
#cv-viewport{min-width:0;overflow:hidden}
.comp-load-row input{flex:1;min-width:0}
.comp-appearance-row .cv-dd{flex:1 0 calc(50% - 8px);min-width:0}
.comp-appearance-row .cv-dd-btn{width:100%;justify-content:space-between}
.comp-sidebar .cv-dd-menu{position:static;margin-top:4px;min-width:0;width:100%;box-sizing:border-box;box-shadow:none}
.comp-sidebar .cv-dd-menu button{white-space:normal}
.comp-sidebar #cv-components{min-width:0}
.comp-empty{min-height:240px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;text-align:center;color:var(--text3);font-size:12px}
.comp-empty strong{font-size:14px;font-weight:500;color:var(--text2)}

/* Invoice item editor: one row per purchase, read across like the paper —
   tick · item · packs · unit price excl. VAT · VAT % · amount. */
#reac-invoice-modal #rim-coverage { gap:0 !important; border:1px solid var(--border); border-radius:var(--r-sm); overflow:hidden; }
#reac-invoice-modal .rim-items-head,
#reac-invoice-modal .rim-item-row { display:grid; grid-template-columns:20px minmax(0,1fr) 64px 100px 58px 92px; gap:8px; align-items:center; padding:6px 10px; }
#reac-invoice-modal .rim-items-head { font-size:11px; color:var(--text3); background:var(--bg2); padding-top:5px; padding-bottom:5px; }
#reac-invoice-modal .rim-item-row { border-top:1px solid var(--border); }
#reac-invoice-modal .rim-item-row:not(.rim-item-on) { color:var(--text3); }
#reac-invoice-modal .rim-item-row.rim-item-on { background:color-mix(in srgb, var(--accent) 5%, transparent); }
#reac-invoice-modal .rim-item-row input[type=checkbox] { margin:0; }
#reac-invoice-modal .rim-item-row .form-input { width:100%; min-width:0; padding:4px 6px; font-size:12px; text-align:right; font-variant-numeric:tabular-nums; }
#reac-invoice-modal .rim-item-row .form-input:disabled { background:transparent; border-color:transparent; color:var(--text3); }
#reac-invoice-modal .rim-item-name { font-size:12px; line-height:1.3; cursor:pointer; overflow-wrap:anywhere; margin:0; }
#reac-invoice-modal .rim-item-on .rim-item-name { color:var(--text); }
#reac-invoice-modal .rim-item-done .rim-item-name { cursor:default; }
#reac-invoice-modal .rim-item-note { display:block; font-size:11px; color:var(--text3); }
#reac-invoice-modal .rim-num { text-align:right; font-variant-numeric:tabular-nums; }
#reac-invoice-modal .rim-line-amount { font-size:12px; white-space:nowrap; }
#reac-invoice-modal #rim-coverage.rim-manual .rim-itemised-only { display:none; }
#reac-invoice-modal #rim-coverage.rim-manual .rim-items-head,
#reac-invoice-modal #rim-coverage.rim-manual .rim-item-row { grid-template-columns:20px minmax(0,1fr) 64px; }
#reac-invoice-modal .rim-printed { margin-top:10px; }
#reac-invoice-modal .rim-printed-line { display:flex; align-items:center; gap:10px; flex-wrap:wrap; }
#reac-invoice-modal #rim-printed { width:140px; text-align:right; font-variant-numeric:tabular-nums; }
#reac-invoice-modal .rim-printed-ok { font-size:12px; color:var(--green-ink, var(--green)); }
#reac-invoice-modal .rim-printed-bad { font-size:12px; color:var(--orange-ink, var(--orange)); }
#reac-invoice-modal .rim-summary { border:1px solid var(--border); border-radius:var(--r-sm); padding:10px 12px; background:var(--bg2); font-size:12px; }
#reac-invoice-modal .rim-summary-row { display:flex; justify-content:space-between; gap:12px; padding:3px 0; }
#reac-invoice-modal .rim-summary-total { border-top:1px solid var(--border); padding-top:8px; margin-top:5px; }
#reac-invoice-modal .rim-extra-row input, #reac-invoice-modal .rim-extra-row select { min-width:0; width:100%; }
#reac-invoice-modal [hidden] { display:none !important; }
@media (max-width:600px) {
  #reac-invoice-modal .rim-items-head,
  #reac-invoice-modal .rim-item-row { grid-template-columns:20px 56px minmax(0,1fr) 52px; row-gap:6px; }
  #reac-invoice-modal .rim-items-head span:nth-child(2),
  #reac-invoice-modal .rim-items-head span:nth-child(6) { display:none; }
  #reac-invoice-modal #rim-coverage.rim-manual .rim-items-head { grid-template-columns:20px minmax(0,1fr) 56px; }
  #reac-invoice-modal #rim-coverage.rim-manual .rim-items-head span:nth-child(2) { display:block; }
  #reac-invoice-modal .rim-item-name { grid-column:2 / -1; }
  #reac-invoice-modal .rim-units { grid-column:2; }
  #reac-invoice-modal .rim-line-amount { grid-column:2 / -1; }
  #reac-invoice-modal #rim-coverage.rim-manual .rim-item-row { grid-template-columns:20px minmax(0,1fr) 56px; }
  #reac-invoice-modal #rim-coverage.rim-manual .rim-item-name { grid-column:2; }
  #reac-invoice-modal #rim-coverage.rim-manual .rim-units { grid-column:3; }
  #reac-invoice-modal .rim-extra-row { grid-template-columns:minmax(80px,1fr) 80px 55px 24px !important; }
  #reac-invoice-modal .rim-extra-cat { grid-column:1 / 4; grid-row:2; }
}

#reac-invoice-modal label.chk { display:flex; align-items:center; gap:6px; }
#reac-invoice-modal .rim-extra-row.rim-manual-extra { grid-template-columns:minmax(90px,1fr) 95px 110px 24px !important; }
@media (max-width:600px) {
  #reac-invoice-modal .rim-extra-row.rim-manual-extra { grid-template-columns:1fr 80px 24px !important; }
  #reac-invoice-modal .rim-extra-row.rim-manual-extra .rim-extra-cat { grid-column:1 / 3; }
}

/* Order line: invoiced price on top, the order's own price kept underneath. */
.reac-line-ordered { font-size:10px; color:var(--text3); font-weight:400; white-space:nowrap; }

/* Computational — receptor preparation detail */
.cv-prep-inbox{font-size:12px;color:var(--warn-fg);background:var(--warn-bg);border:1px solid var(--warn-border);border-radius:var(--r-sm);padding:8px 10px;margin-top:8px;line-height:1.45}
.cv-prep-notes{margin-top:10px;font-size:11px;color:var(--text3)}
.cv-prep-notes summary{cursor:pointer;font-weight:600}
.cv-prep-notes pre{white-space:pre-wrap;font-family:var(--mono);font-size:11px;background:var(--bg2);border-radius:var(--r-sm);padding:8px 10px;margin:6px 0 0;max-height:220px;overflow:auto}
.cv-num{font-variant-numeric:tabular-nums;white-space:nowrap}
.cv-unit{font-weight:400;text-transform:none;letter-spacing:0;color:var(--text3)}
.cv-protein-table{max-height:320px;overflow:auto;border:1px solid var(--border2);border-radius:var(--r-sm)}
.cv-protein-table table{width:100%;font-size:12px}
.cv-protein-table thead th{position:sticky;top:0;background:var(--bg2);z-index:1}
.cv-protein-table tr.cv-excluded td{color:var(--text3);text-decoration:line-through}
.cv-protein-table tr.cv-excluded td:first-child{text-decoration:none}
.cv-protein-default-note{font-size:12px;color:var(--text2);background:var(--bg2);border-radius:var(--r-sm);padding:6px 10px}
.cv-prep-hint{font-size:11px;color:var(--text3);margin-top:6px}
.cv-stereo-note{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:11px;color:var(--warn-fg);background:var(--warn-bg);border:1px solid var(--warn-border);border-radius:var(--r-xs);padding:4px 8px;margin:-2px 0 2px}
.cv-stereo-flag{font-size:10px;color:var(--warn-fg);margin-top:2px}
.cv-grid-box-warn{font-size:10px;line-height:1.4;color:var(--warn-fg);background:var(--warn-bg);border-radius:var(--r-xs);padding:4px 6px;margin:-4px 0 8px}
/* Docking form — ligand sources and Library picker */
.cv-lig-tabs{display:flex;gap:4px;margin:6px 0 8px;border-bottom:1px solid var(--border2)}
.cv-lig-tabs .subtab{font-size:12px;padding:5px 10px}
.cv-lig-pane{margin-bottom:6px}
.cv-lib-pick{max-height:220px;overflow-y:auto;border:1px solid var(--border2);border-radius:var(--r-sm);margin-top:6px;background:var(--bg)}
.cv-lib-row{display:flex;align-items:center;gap:8px;padding:3px 8px;border-bottom:1px solid var(--border2);cursor:pointer;font-size:12px}
.cv-lib-row:last-child{border-bottom:none}
.cv-lib-row:hover{background:var(--bg2)}
.cv-lib-row img{width:72px;height:48px;object-fit:contain;background:#fff;border-radius:var(--r-xs);flex:none}
.cv-lib-row.is-added{opacity:.55;cursor:default}
.cv-lib-id{font-family:var(--mono);font-weight:600;flex:1;min-width:0;overflow-wrap:anywhere}
.cv-lib-meta{font-size:11px;color:var(--text3);display:flex;gap:6px;align-items:center}
.cv-lib-pick-bar{display:flex;align-items:center;gap:10px;margin-top:6px;font-size:12px}
.cv-lib-pick-bar label{display:flex;align-items:center;gap:5px;cursor:pointer}
.cv-lib-pick-bar span{flex:1;color:var(--text3)}
/* Computational — Ligand preparation */
#comp-ligand-sidebar .eln-list-header{display:flex;align-items:center;justify-content:space-between;gap:8px}
.cv-ligprep-list{display:flex;flex-direction:column;gap:6px;padding-top:10px}
.cv-ligprep-row{display:flex;flex-direction:column;gap:4px;width:100%;text-align:left;border:1px solid var(--border2);border-radius:var(--r-sm);background:var(--bg);color:var(--text);padding:8px 10px;cursor:pointer;font:inherit;font-size:12px}
.cv-ligprep-row:hover{background:var(--bg2)}
.cv-ligprep-row.is-active{border-color:var(--accent);background:color-mix(in srgb,var(--accent) 8%,var(--bg))}
.cv-ligprep-name{font-weight:600;overflow-wrap:anywhere}
.cv-ligprep-sub{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--text3)}
.cv-ligprep-form,.cv-ligprep-detail{max-width:760px}
.cv-ligprep-form h3,.cv-ligprep-head h3{margin:0;font-size:15px}
.cv-ligprep-lead{font-size:12px;color:var(--text2);margin:4px 0 16px}
.cv-ligprep-grid{display:grid;grid-template-columns:90px 140px minmax(0,1fr);gap:10px}
.cv-ligprep-check{display:flex;align-items:center;gap:6px;font-size:12px;margin:4px 0;cursor:pointer}
.cv-ligprep-file{position:relative;overflow:hidden;margin-top:6px;display:inline-flex}
.cv-ligprep-file input{position:absolute;inset:0;opacity:0;cursor:pointer}
.cv-ligprep-actions{display:flex;align-items:center;gap:10px;margin-top:14px}
.cv-ligprep-head{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:14px}
.cv-ligprep-scope{font-size:12px;color:var(--text3)}
.cv-ligprep-pair{display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:14px}
.cv-ligprep-card{border:1px solid var(--border2);border-radius:var(--r-md);background:var(--bg);padding:14px;min-width:0}
.cv-ligprep-card.is-changed{border-color:var(--warn-border)}
.cv-ligprep-card h4{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 10px;font-size:13px}
.cv-ligprep-card code{display:block;font-size:11px;color:var(--text2);overflow-wrap:anywhere;margin-top:8px}
.cv-ligprep-charge{font-weight:400;color:var(--text3);font-variant-numeric:tabular-nums}
.cv-ligprep-delta{font-size:11px;font-weight:600;color:var(--warn-fg);background:var(--warn-bg);border-radius:var(--r-xs);padding:1px 6px}
.cv-ligprep-facts{font-size:12px;color:var(--text2);margin:14px 0 6px}
.cv-ligprep-warnings{margin:0 0 6px;padding-left:18px;font-size:12px;color:var(--text2);line-height:1.5}
.form-row label.cv-ligprep-file{display:inline-flex;width:auto;margin-top:6px;font-size:11px;font-weight:600;color:var(--text2)}
/* Library import review: rows left out and warnings, above the table */
.bulk-issues{margin:0 0 10px;border:1px solid var(--border);border-radius:var(--r-sm);padding:6px 10px;font-size:12px}
.bulk-issues summary{cursor:pointer;font-weight:600}
.bulk-issues--error{background:color-mix(in srgb,var(--red) 7%,transparent);border-color:color-mix(in srgb,var(--red) 30%,transparent)}
.bulk-issues--error summary{color:var(--red)}
.bulk-issues--warn{background:var(--warn-bg);border-color:color-mix(in srgb,var(--warn-fg) 30%,transparent)}
.bulk-issues--warn summary{color:var(--warn-fg)}
.bulk-issues ul{margin:6px 0 2px;padding-left:18px;max-height:140px;overflow:auto;line-height:1.5;color:var(--text2)}
.bulk-issue-row{font-weight:600;color:var(--text);font-variant-numeric:tabular-nums}
/* Biology result cells: a value or a mean ± error (SD/SEM, n) */
.be-inline-input.be-result-value{width:62px;font-size:11px;font-variant-numeric:tabular-nums}
.be-inline-input.be-result-err{width:46px;font-size:11px;font-variant-numeric:tabular-nums}
.be-inline-input.be-result-n{width:28px;font-size:11px;font-variant-numeric:tabular-nums;text-align:center}
.be-result-pm{font-size:10px;color:var(--text3)}
.be-col-format{font-size:9px!important;color:var(--text3);background:none;border:none;padding:0 2px!important;max-width:84px;cursor:pointer}

/* LC-MS per-peak baseline controls; scoped to the existing viewer. */
.lc-baseline-tools{margin:4px 0 10px;padding:10px;border:1px solid var(--border);border-radius:var(--r-md);background:var(--bg2)}
.lc-baseline-tools[hidden]{display:none}
.lc-baseline-title{font-size:12px;font-weight:600;color:var(--text);margin-bottom:8px}
.lc-baseline-fields{display:flex;align-items:flex-end;gap:8px;flex-wrap:wrap;margin-bottom:6px}
.lc-baseline-fields .lc-field{flex:1 1 110px;min-width:0}
.lc-baseline-fields input{width:100%;min-width:0!important;max-width:none!important}
#lc-cuv{touch-action:none}
.browser-remote-error{padding:10px 16px;font-size:12px;color:var(--red);overflow-wrap:anywhere}
#browser-ftp-refresh{font-weight:400;white-space:normal;margin-left:8px}
#browser-ftp-section>.browser-section-hdr{flex-wrap:wrap;white-space:nowrap;row-gap:6px}
#browser-ftp-refresh{white-space:nowrap;flex:0 0 auto;max-width:100%}

/* Library record: scoped presentation; module-wide styles stay unchanged. */
#detail-panel .dp-header{align-items:center;gap:14px}
#detail-panel .dp-name{font-size:13px;color:var(--text2);margin-top:2px}
#detail-panel .dp-header-actions{gap:6px}
#detail-panel .icon-btn{width:var(--control-size);height:var(--control-size);min-width:var(--control-size);border-radius:var(--r-sm);flex-shrink:0}
#detail-panel .icon-btn svg{width:15px;height:15px;vertical-align:0;pointer-events:none}
#detail-panel a.icon-btn{text-decoration:none;display:inline-flex;align-items:center;justify-content:center}
#detail-panel .dp-header-actions>.close-btn{width:var(--control-size);height:var(--control-size)}
#detail-panel .lib-detail-tabs{display:flex;gap:4px;flex-shrink:0;padding:0 16px;border-bottom:1px solid var(--border);overflow-x:auto;scrollbar-width:thin}
#detail-panel .lib-detail-tabs>[role=tab]{flex:1 0 auto;display:flex;align-items:center;justify-content:center;gap:6px;border:0;border-bottom:2px solid transparent;background:none;color:var(--text3);padding:12px 8px 10px;font:500 12px var(--sans);cursor:pointer;white-space:nowrap}
#detail-panel .lib-detail-tabs>[aria-selected=true]{color:var(--accent-ink);border-bottom-color:var(--accent)}
#detail-panel .lib-detail-tabs>[role=tab]:hover{color:var(--text)}
#detail-panel .lib-detail-tabs [id^=lib-tab-count]{font-size:10px;min-width:17px;border-radius:8px;background:var(--bg3);color:var(--text3);padding:1px 4px}
#detail-panel .lib-detail-tabs [id^=lib-tab-count]:empty{display:none}
#detail-panel .lib-detail-panel[hidden]{display:none!important}
#detail-panel .lib-detail-panel>.dp-section{padding:16px 18px}
#detail-panel .lib-detail-panel>.dp-section:last-child{border-bottom:0}
#detail-panel .dp-stitle{font-size:var(--ui-section);color:var(--text2);margin:0 0 12px;font-weight:600}
#detail-panel .lib-detail-section-heading{display:flex;align-items:center;justify-content:space-between;gap:12px;margin-bottom:12px}
#detail-panel .lib-detail-section-heading>.dp-stitle{margin:0}
#detail-panel .lib-detail-count{font-size:11px;color:var(--text3);font-weight:400;margin-left:5px}
#detail-panel details.dp-section>summary.dp-stitle{margin:0;cursor:pointer}
#detail-panel details.dp-section[open]>summary.dp-stitle{margin-bottom:12px}
#detail-panel .lib-detail-structure{border:1px solid var(--border);border-radius:var(--r-md);background:var(--bg3);overflow:hidden;margin-bottom:16px}
#detail-panel .lib-detail-structure-bar{display:flex;align-items:center;justify-content:space-between;padding:8px 10px 0}
#detail-panel .lib-detail-structure-bar>.lib-detail-caption{margin:0}
#detail-panel .lib-detail-structure-actions{display:flex;gap:6px}
#detail-panel .dp-struct{height:172px;margin:0;border:0;border-radius:0;background:transparent}
#detail-panel .lib-detail-structure-trigger{width:100%;color:inherit;cursor:zoom-in;font:inherit}
#detail-panel .lib-detail-structure-trigger:hover{background:var(--bg4)}
#detail-panel .lib-detail-structure-trigger:focus-visible{outline:2px solid var(--accent);outline-offset:-3px}
#detail-panel .lib-detail-structure-trigger:disabled{cursor:default}
#detail-panel .lib-detail-facts{display:grid;gap:12px;margin:0}
#detail-panel .lib-detail-identity{grid-template-columns:minmax(0,2fr) minmax(0,1fr) minmax(0,1fr);margin-bottom:16px}
#detail-panel .lib-detail-descriptors{grid-template-columns:repeat(3,minmax(0,1fr))}
#detail-panel .lib-detail-facts dt,#detail-panel .lib-detail-caption{font-size:var(--ui-caption);color:var(--text3);margin-bottom:4px;display:block}
#detail-panel .lib-detail-facts dd{font-size:var(--ui-body);color:var(--text);margin:0;overflow-wrap:anywhere;font-variant-numeric:tabular-nums}
#detail-panel .lib-detail-facts dd>span{font-size:11px;color:var(--text3)}
#detail-panel .lib-detail-availability{display:flex;align-items:center;justify-content:space-between;gap:12px;width:100%;padding:11px 12px;border:1px solid var(--border);border-radius:var(--r-sm);background:var(--bg3);font:12px var(--sans);color:var(--text2);text-align:left;cursor:pointer}
#detail-panel .lib-detail-availability:hover{border-color:var(--accent)}
#detail-panel .lib-detail-availability strong{font-size:15px;font-weight:600;color:var(--text)}
#detail-panel .lib-detail-projects{display:flex;gap:6px;flex-wrap:wrap}
#detail-panel .lib-detail-notes{font-size:var(--ui-reading);line-height:1.6;white-space:pre-wrap;overflow-wrap:anywhere;color:var(--text)}
#detail-panel .lib-detail-smiles{font:11px/1.65 var(--mono);display:block;overflow-wrap:anywhere;margin-bottom:4px;color:var(--text2)}
#detail-panel .lib-detail-empty{font-size:12px;color:var(--text3);line-height:1.6}
#detail-panel .lib-detail-calculated{font-size:10px;color:var(--text3);font-weight:400;margin-left:8px}
#detail-panel .lib-detail-methods{margin-top:12px}
#detail-panel .lib-detail-more{position:relative}
#detail-panel .lib-detail-more>summary{list-style:none;cursor:pointer;user-select:none}
#detail-panel .lib-detail-more>summary::-webkit-details-marker{display:none}
#lib-detail-more-actions{position:absolute;right:0;top:calc(100% + 6px);min-width:175px;z-index:5;border:1px solid var(--border2);border-radius:var(--r-md);padding:4px;background:var(--bg2);box-shadow:var(--shadow-lg)}
#lib-detail-more-actions>button{display:flex;align-items:center;gap:9px;width:100%;border:0;border-radius:var(--r-sm);padding:10px;background:none;text-align:left;color:var(--text);font:12px var(--sans);cursor:pointer}
#lib-detail-more-actions>button:hover{background:var(--bg3)}
#lib-detail-more-actions>button.lib-detail-danger{color:var(--red)}
#detail-panel .lib-stock-card{border:1px solid var(--border);border-radius:var(--r-md);margin-bottom:12px;overflow:hidden}
#detail-panel .lib-stock-head{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:10px 12px;background:var(--bg3)}
#detail-panel .lib-stock-title{display:flex;align-items:center;gap:9px;min-width:0;flex-wrap:wrap}
#detail-panel .lib-stock-dot{width:7px;height:7px;border-radius:50%;flex-shrink:0}
#detail-panel .lib-stock-type{font:500 11px var(--sans);color:var(--text2);text-transform:capitalize}
#detail-panel .lib-stock-quantity{display:flex;align-items:center;gap:5px}
#detail-panel .lib-stock-quantity>input{font:500 14px var(--sans);font-variant-numeric:tabular-nums;width:82px;max-width:100%;border:1px solid var(--border2);border-radius:var(--r-sm);background:var(--bg2);padding:5px 7px}
#detail-panel .lib-stock-quantity>input[readonly]{border-color:transparent;background:transparent}
#detail-panel .lib-stock-quantity>span{font-size:11px;color:var(--text3)}
#detail-panel .lib-stock-actions{display:flex;gap:6px;flex-shrink:0}
#detail-panel .lib-stock-info{padding:8px 12px;font-size:var(--ui-caption);color:var(--text2)}
#detail-panel .lib-stock-meta{display:flex;flex-wrap:wrap;gap:5px 12px;line-height:1.6;color:var(--text3)}
#detail-panel .lib-stock-solution{margin-bottom:5px;color:var(--text2)}
#detail-panel .lib-stock-location{display:flex;align-items:center;gap:8px;margin-top:6px;color:var(--text3)}
#detail-panel .lib-stock-extra{border-top:1px solid var(--border);font-size:11px}
#detail-panel .lib-stock-extra>summary{padding:10px 12px;color:var(--text3);cursor:pointer}
#detail-panel .lib-stock-extra-body{padding:0 12px 12px}
#detail-panel .lib-stock-note{display:flex;gap:8px;align-items:flex-start;margin:10px 0}
#detail-panel .lib-stock-note>div{flex:1;min-width:0}
#detail-panel .lib-stock-note p{margin:0 0 4px;font-size:12px;overflow-wrap:anywhere}
#detail-panel .lib-stock-note span{font-size:var(--ui-caption);color:var(--text3)}
#detail-panel .lib-stock-add-note{display:flex;gap:6px;margin-top:10px}
#detail-panel .lib-stock-add-note input{flex:1;min-width:0;border:1px solid var(--border2);border-radius:var(--r-sm);background:var(--bg3);color:var(--text);padding:6px 9px;font:12px var(--sans)}
#detail-panel .lib-stock-upload,#detail-panel .lib-detail-upload-tools{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:12px;padding-top:12px;border-top:1px solid var(--border)}
#detail-panel :is(.lib-stock-upload,.lib-detail-upload-tools)>label{font-size:11px;color:var(--text3)}
#detail-panel :is(.lib-stock-upload,.lib-detail-upload-tools)>select{font:12px var(--sans);color:var(--text2);background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-sm);padding:6px 8px;max-width:100%}
#detail-panel [id*=upload-prog]{width:100%}
#detail-panel progress{width:100%;height:4px;accent-color:var(--accent)}
#detail-panel .lib-detail-file-group{margin:18px 0}
#detail-panel .lib-detail-file-group>h4{display:flex;gap:6px;font:600 12px var(--sans);color:var(--text);margin:0 0 6px}
#detail-panel .lib-detail-file-group>h4>span{font-size:10px;font-weight:400;color:var(--text3)}
#detail-panel .lib-detail-file{display:flex;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--divider)}
#detail-panel .lib-detail-file:last-child{border-bottom:0}
#detail-panel .lib-detail-file-content{flex:1;min-width:0}
#detail-panel .lib-detail-file-main{display:flex;align-items:flex-start;gap:8px;flex-wrap:wrap}
#detail-panel .lib-detail-file-main>strong{font-size:12px;font-weight:500;color:var(--text);overflow-wrap:anywhere;min-width:0}
#detail-panel .lib-detail-file-meta{font-size:11px;color:var(--text3);margin-top:5px;overflow-wrap:anywhere;line-height:1.5}
#detail-panel .lib-detail-file-actions{display:flex;gap:5px;align-items:center;flex-shrink:0}
#detail-panel .lib-detail-text-link{border:0;background:none;padding:0;font:inherit;color:var(--accent-ink);cursor:pointer;text-decoration:underline dotted;text-align:left}
#detail-panel .lib-detail-docking-row{display:grid;grid-template-columns:minmax(0,1fr) auto auto 32px;align-items:center;gap:12px;padding:12px 0;border-bottom:1px solid var(--divider)}
#detail-panel .lib-detail-docking-main{min-width:0}
#detail-panel .lib-detail-docking-main>strong{display:block;font-size:12px;font-weight:500;overflow-wrap:anywhere}
#detail-panel .lib-detail-docking-main>span{font-size:11px;color:var(--text3);display:block;margin-top:5px;overflow-wrap:anywhere}
#detail-panel .lib-detail-docking-score{text-align:right;font-variant-numeric:tabular-nums}
#detail-panel .lib-detail-docking-score>strong{font:500 14px var(--sans);display:block}
#detail-panel .lib-detail-docking-score>span{font-size:10px;color:var(--text3)}
#detail-panel .lib-detail-job-status{font-size:10px;color:var(--text3);text-transform:capitalize}
#detail-panel .lib-detail-job-status[data-status=done]{color:var(--green-ink)}
#detail-panel .lib-detail-job-status[data-status=failed]{color:var(--red)}
#detail-panel .lib-detail-history-day{font:500 11px var(--sans);color:var(--text3);margin:18px 0 12px}
#detail-panel .lib-detail-history-row{display:flex;gap:10px;padding:0 0 18px;position:relative}
#detail-panel .lib-detail-history-icon{display:flex;align-items:center;justify-content:center;flex-shrink:0;width:26px;height:26px;border:1px solid var(--border);border-radius:50%;color:var(--text3);background:var(--bg3)}
#detail-panel .lib-detail-history-row>div{flex:1;min-width:0}
#detail-panel .lib-detail-history-row strong{font-size:var(--ui-body);font-weight:500;line-height:1.6}
#detail-panel .lib-detail-history-row p{font-size:var(--ui-reading);color:var(--text2);line-height:1.6;overflow-wrap:anywhere;white-space:pre-wrap;margin:3px 0}
#detail-panel .lib-detail-history-row :is(div>span,time){font-size:var(--ui-caption);color:var(--text3)}
#detail-panel .lib-detail-history-row>div>span{display:block;margin-top:3px}
#detail-panel .lib-detail-history-row>time{margin-top:3px;white-space:nowrap}
#detail-panel .bio-row{padding:12px 0}
#detail-panel .bio-row-main{gap:7px}
#detail-panel .bio-row-actions{gap:5px}
#detail-panel .bio-row-actions>.icon-btn{padding:0;display:inline-flex;align-items:center;justify-content:center}
#detail-panel .dp-footer{display:flex;gap:8px;justify-content:flex-end;align-items:center}
#detail-panel #dp-footer-caption{margin:0 auto 0 0}
#detail-panel .dp-footer[hidden],#detail-panel .dp-footer [hidden],#detail-panel .dp-header [hidden]{display:none!important}
#detail-panel :is(button,a,summary,[role=tabpanel]):focus-visible{outline:2px solid var(--accent);outline-offset:2px}

/* Partial billing describes progress, not an error. */
.status-pill.invoice-partial{color:var(--text2);background:var(--bg3);border-color:var(--border);font-style:italic;font-weight:400}
#detail-panel .bio-value{font-family:var(--sans);font-variant-numeric:tabular-nums}
#detail-panel .lib-history-original{font-size:10px;color:var(--text3);margin:6px 0 10px}
#detail-panel .lib-history-original summary{cursor:pointer}
#detail-panel .lib-detail-upload-tools{margin:8px 0 18px;padding:0 0 14px;border-top:0;border-bottom:1px solid var(--border)}
.browser-remote-scope{font-size:11px;color:var(--text3);margin:8px 16px;line-height:1.5}
.lc-active-band{color:var(--accent-ink);font-weight:500}
.lc-active-band::before{content:"";display:inline-block;width:9px;height:9px;margin-right:5px;border:1px solid currentColor;background:color-mix(in srgb,var(--accent-ink) 20%,transparent);border-radius:2px}
#compound-grid .card-footer{gap:6px;flex-wrap:wrap}

/* Library: one compact, descriptive sort picker for cards and table. */
.lib-sort{min-width:0}
#lib-sort-trigger{width:100%;justify-content:space-between;text-align:left;gap:6px;min-height:30px;height:auto}
#lib-sort-label{min-width:0;white-space:normal;line-height:1.4}
#lib-sort-trigger svg{flex-shrink:0}
.lib-sort-menu{margin-top:5px;padding:6px;background:var(--bg2);border:1px solid var(--border2);border-radius:var(--r-md);box-shadow:var(--shadow-sm);max-height:min(430px,60dvh);overflow-y:auto}
.lib-sort-menu fieldset{border:0;padding:0;margin:0;min-width:0}
.lib-sort-menu fieldset+fieldset{border-top:1px solid var(--border);padding-top:6px;margin-top:6px}
.lib-sort-menu legend{font-size:10px;color:var(--text3);padding:4px 6px;text-transform:uppercase;letter-spacing:.04em}
.lib-sort-menu label{display:flex;align-items:center;gap:8px;padding:6px;border-radius:var(--r-sm);font-size:12px;cursor:pointer;line-height:1.4}
.lib-sort-menu label:hover,.lib-sort-menu label:focus-within{background:var(--bg3)}
.lib-sort-menu label:has(input:checked){color:var(--accent-ink);background:var(--accent-light)}
.lib-sort-menu input{margin:0;flex-shrink:0;accent-color:var(--accent)}
.lib-sort-save-state{font-size:11px;color:var(--text3);padding:0 6px}
.lib-sort-save-state:not(:empty){padding-top:6px}

/* Library grid density: scoped so other modules keep their existing cards. */
.lib-card-size-control{align-items:center;gap:3px;padding:2px;border:1px solid var(--border);border-radius:var(--r-md);background:var(--bg2)}
.lib-card-size-control:not([hidden]){display:flex}
.lib-card-size-control .icon-btn{border-color:transparent;box-shadow:none}
#compound-grid{--lib-card-min:190px;--lib-structure-height:125px;grid-template-columns:repeat(auto-fill,minmax(min(100%,var(--lib-card-min)),1fr))}
#compound-grid[data-card-size="small"]{--lib-card-min:150px;--lib-structure-height:100px}
#compound-grid[data-card-size="large"]{--lib-card-min:280px;--lib-structure-height:190px}
#compound-grid .card-struct{height:var(--lib-structure-height)}
#compound-grid[data-card-size="large"] .card-struct svg{width:100%;height:100%}
#compound-grid .card-id{overflow-wrap:anywhere}

/* LC-MS drag modes retain shared control sizing and wrap on narrow screens. */
.lc-mode-field{max-width:100%}
#lc-drag-modes{flex-wrap:wrap;max-width:100%}
/* TLC measurement overlay: photo geometry is independent of UI text sizing. */
.tlc-rf-dialog{max-width:760px}
.tlc-rf-toolbar{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px}
.tlc-rf-toolbar [aria-pressed=true]{background:var(--accent-ink);color:var(--on-accent)}
.tlc-rf-stage{text-align:center;background:var(--bg3);border:1px solid var(--border2);border-radius:var(--r-sm);overflow:hidden}
#tlc-rf-canvas{width:100%;max-height:50vh;display:block;touch-action:none;cursor:crosshair}
.tlc-rf-line{stroke:var(--accent-ink);stroke-width:2;vector-effect:non-scaling-stroke}
.tlc-rf-hit{stroke:transparent;stroke-width:20;vector-effect:non-scaling-stroke;cursor:ns-resize}
.tlc-rf-dot{fill:var(--accent-ink);stroke:white;stroke-width:2;vector-effect:non-scaling-stroke}
.tlc-rf-hit-circle{fill:transparent;cursor:move}
#tlc-rf-marks text{fill:white;stroke:#222;paint-order:stroke;stroke-width:2;font-family:var(--sans);pointer-events:none}
.tlc-rf-row{display:flex;align-items:center;gap:8px;margin-top:10px;font-size:var(--ui-body)}
.tlc-rf-row input{flex:1;min-width:0}
.tlc-rf-row [data-rf-value]{white-space:nowrap;font-variant-numeric:tabular-nums}
.pj-away svg{width:12px;height:12px;vertical-align:-2px;margin-right:2px}
.pj-milestone-dot svg{width:14px;height:14px;display:block}
/* left:50% halves the shrink-to-fit width, which wrapped the update notice word by word on phones. */
.new-version-bar{width:max-content}

/* Home's top row uses the same three equal columns as the row below it (My activity · Recent activity · People online):
   Today above My activity, Calendar above Recent activity, Waiting on you above People online. */
#home-queue-tasks-row{grid-template-columns:repeat(3,minmax(0,1fr));grid-template-areas:"today calendar waiting"}
#home-queue-tasks-row #home-my-queue-section{grid-area:today}
#home-queue-tasks-row #home-recurring-section{grid-area:calendar}
#home-queue-tasks-row #home-waiting-section{grid-area:waiting}
@media(max-width:900px){#home-queue-tasks-row,#home-queue-tasks-row.has-waiting{grid-template-columns:1fr;grid-template-areas:"today" "calendar" "waiting";gap:24px}}
/* Stacked (phone/narrow): the calendar takes the full width, with touch-sized days and arrows. The desktop size is unchanged. */
@media(max-width:900px){.mc-wrap{width:100%}.mc-day{height:44px;font-size:var(--ui-body)}.mc-nav{width:44px;height:44px}.mc-wd{font-size:var(--ui-caption)}.mc-title{font-size:var(--ui-section)}.mc-dots{height:5px;gap:3px}.mc-dots i,.mc-legend i{width:5px;height:5px}}

/* Subtask header: the parent link keeps a readable width; "Make top-level" and the sibling arrows go to a second line when the panel is narrow */
.tp-parent-nav{flex-wrap:wrap;row-gap:8px}
.tp-parent-back{flex:1 1 26rem}
.tp-promote{white-space:nowrap;margin-right:auto}
.tpx-due-time{display:inline-flex;align-items:center;gap:6px}

/* A new version was deployed while this tab stayed open */
.update-banner{position:fixed;left:50%;transform:translateX(-50%);bottom:calc(16px + env(safe-area-inset-bottom,0px));z-index:6200;display:flex;align-items:center;gap:10px;flex-wrap:wrap;justify-content:center;max-width:calc(100vw - 24px);padding:10px 14px;background:var(--bg2);color:var(--text);border:1px solid var(--border2);border-radius:var(--r-lg);box-shadow:var(--shadow-md);font-size:var(--ui-body);font-weight:500}

/* Home mini calendar: a day I am away is faded; an event that does not take my time is listed with a hollow marker */
.mc-day.away{opacity:.45}
.mc-day.away.today,.mc-day.away.sel{opacity:.75}
.mc-row i.mc-quiet{background:transparent;border:1.5px solid var(--text3);box-sizing:border-box}


.pj-av[data-uid]{cursor:pointer}
.home-section-title-btn{display:inline-flex;align-items:center;gap:6px;background:none;border:0;padding:0;margin:0;font:inherit;letter-spacing:inherit;text-transform:inherit;color:inherit;cursor:pointer;border-radius:var(--r-sm)}
.home-section-title-btn:hover,.home-section-title-btn:focus-visible{color:var(--accent-ink)}
.home-section-title-btn:focus-visible{outline:2px solid var(--accent);outline-offset:3px}
.people-modal-list{display:flex;flex-direction:column;max-height:min(60vh,520px);overflow-y:auto;margin-top:6px}
.people-row{display:flex;align-items:center;gap:10px;padding:7px 6px;border-radius:var(--r-sm);cursor:pointer;outline:none}
.people-row:hover,.people-row:focus-visible{background:var(--bg3)}
.people-row-text{flex:1;min-width:0}
.people-row-name{font-size:var(--ui-body);color:var(--text);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.people-row-name small{margin-left:4px;color:var(--text3);font-size:var(--ui-caption)}
.people-row-st{font-size:var(--ui-caption);color:var(--text2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.people-row.is-off .pj-av{filter:grayscale(.85);opacity:.7}
.people-row.is-off .people-row-name{color:var(--text2)}

/* Time: one quiet line under the Home summary, and a small timer in the top bar */
.home-time{display:flex;flex-wrap:wrap;align-items:center;gap:2px 10px;margin-top:4px;font-size:13px;color:var(--text3)}
.home-time[hidden]{display:none}

.home-time[data-state="work"] 
.home-time[data-state="break"] 
.home-time-clock{font-variant-numeric:tabular-nums;color:var(--text2)}
.home-time[data-state="out"] .home-time-clock{display:none}
.home-time-actions{display:inline-flex;gap:2px}
.home-time-btn{background:none;border:0;padding:1px 7px;font:inherit;color:var(--text2);cursor:pointer;border-radius:var(--r-xs)}
.home-time-btn:hover{background:var(--bg3);color:var(--text)}
.home-time-btn.is-primary{color:var(--accent-ink)}
.home-time-btn.is-off{opacity:.35;cursor:default;pointer-events:auto}
.home-time-btn.is-off:hover{background:none;color:var(--text2)}
.home-time-stats{opacity:.8}
.home-time-notes{flex:1 0 100%}
.home-time-notes:empty{display:none}
.home-time-warn{color:var(--orange);cursor:pointer}
.nav-timer{background:none;border:0;padding:2px 6px;margin-right:4px;font:inherit;font-size:12px;font-variant-numeric:tabular-nums;color:var(--text3);cursor:pointer;border-radius:var(--r-xs);display:inline-flex;align-items:center;gap:5px}
.nav-timer-compact-icon{display:none}
.nav-timer[hidden]{display:none}
.nav-timer::before{content:"";width:5px;height:5px;border-radius:50%;background:var(--green)}
.nav-timer[data-state="break"]::before{background:var(--orange)}
.nav-timer:hover{color:var(--text);background:var(--bg3)}
@media(max-width:700px){.home-time-stats{display:none}}
.home-heat-layer{margin-left:auto;display:inline-flex;gap:2px}
.home-heat-layer button{background:none;border:0;font:inherit;font-size:11px;color:var(--text3);cursor:pointer;padding:1px 7px;border-radius:var(--r-xs)}
.home-heat-layer button:hover{background:var(--bg3);color:var(--text)}
.home-heat-layer button.on{color:var(--accent-ink);background:var(--bg3)}

.nav-timer[data-state="out"]::before{background:var(--text3);opacity:.55}
.nav-timer.is-remind{color:var(--text2)}
.nav-timer.is-remind::before{background:var(--orange);opacity:1;animation:th-remind var(--mo-loop) var(--mo-io) infinite}
.nav-timer-pop{position:fixed;z-index:1200;min-width:260px;max-width:min(92vw,340px);padding:10px 12px;background:var(--bg);border:1px solid var(--border);border-radius:var(--r-sm);box-shadow:var(--shadow-md)}
.nav-timer-pop[hidden]{display:none}
.nav-timer-pop .th-body{display:flex;flex-wrap:wrap;align-items:center;gap:4px 10px;font-size:13px;color:var(--text3)}
.nav-timer-pop .home-time-actions{margin-left:0;flex:1 0 100%}
.nav-timer-pop .home-time-btn{flex:1;text-align:center;border:1px solid var(--border);padding:5px 8px}
.nav-timer-pop .home-time-btn.is-off{border-style:dashed}
.nav-timer-pop .home-time-clock{font-size:16px}
