/*
 * os.css — the Lumio OS V2 design system.
 *
 * Self-contained: V2 never imports from web/ (the two directories are
 * independently deployable — see docs/design/lumio-os-unification.md,
 * "V2 build strategy"). This file is the whole visual language, authored from
 * the approved prototype (docs/prototypes/lumio-os-unified-prototype.html):
 * white/silver ground, lime for progress, aqua for intelligence and sources,
 * coral for interventions.
 *
 * Light-first, with dark authored alongside it — the theme toggle survives
 * (preservation contract, "Shell / platform"). `html[data-theme]` is stamped by
 * each page's early <head> script and flipped live by the avatar menu.
 */

/* ---------------------------------------------------------------- tokens -- */

:root,
html[data-theme="light"] {
	--ink: #181a19;
	--ink-soft: #5d625e;
	--muted: #8e948f;
	--line: #e7eae5;
	--line-soft: #eef1ec;
	--paper: #ffffff;
	--paper-soft: #fbfcfa;
	--base: #f5f7f3;
	--silver: #f0f3ee;

	--lime: #82f213;
	--lime-deep: #50aa21;
	--lime-soft: #efffdf;
	--lime-line: #c9e8ba;
	--aqua: #00d8e0;
	--aqua-deep: #078c95;
	--aqua-soft: #e5fcfd;
	--aqua-line: #bfeef0;
	--coral: #ff6961;
	--coral-deep: #c94641;
	--coral-soft: #fff0ee;
	--coral-line: #ffd0ca;
	/* Fifth accent, Inbox only (docs approval: artifact 39aaa245-e34d-4f1c-ac6d-
	 * 59dfc8231498) — a drafted reply is neither progress (lime), a source
	 * (aqua) nor an intervention (coral); it is Lumi's own voice waiting on a
	 * human word. Values are the approved mockup's, verbatim. */
	--violet: #6b5bd2;
	--violet-deep: #5947b8;
	--violet-soft: #f1efff;
	--violet-line: #ddd8fb;

	/* Chart series identity — the four brand hues, re-stepped to clear the
	 * data-viz gates against THIS mode's paper. Derived, not picked: see
	 * web-v2/js/viz-palette.js for the checks and the numbers. Nothing but a
	 * chart mark may wear these; status keeps the tokens above. */
	--viz-1: #0a9aa4;
	--viz-2: #ad700c;
	--viz-3: #b12c2c;
	--viz-4: #4ca819;
	--viz-0: var(--ink-soft);
	--viz-soft: var(--aqua-soft);

	--screen: radial-gradient(circle at 98% 0%, #effaf5 0, transparent 26%),
		linear-gradient(115deg, #f8f9f6, #f4f6f1);
	--shadow: 0 18px 50px rgba(32, 42, 35, 0.08);
	--shadow-soft: 0 4px 10px rgba(26, 34, 27, 0.05);
	--radius: 18px;

	/* The rail is ink-dark in both themes — it is the OS chrome, not a page. */
	--rail-bg: #171918;
	--rail-ink: #e7ebe6;
	--rail-dim: #a3aaa4;
	--rail-hover: #2d302e;
	--rail-line: #343835;

	color-scheme: light;
}

html[data-theme="dark"] {
	--ink: #eaeee9;
	--ink-soft: #a9b1aa;
	--muted: #7e867f;
	--line: #2a2e2b;
	--line-soft: #232724;
	--paper: #1a1d1b;
	--paper-soft: #171a18;
	--base: #101210;
	--silver: #232723;

	--lime: #9cf53f;
	--lime-deep: #86d94a;
	--lime-soft: #1d2a15;
	--lime-line: #2f4423;
	--aqua: #35e3ea;
	--aqua-deep: #4fd8df;
	--aqua-soft: #0f2a2c;
	--aqua-line: #1d4448;
	--coral: #ff7d75;
	--coral-deep: #ff9a94;
	--coral-soft: #2c1815;
	--coral-line: #4a2622;
	--violet: #9c8cf0;
	--violet-deep: #b3a6f5;
	--violet-soft: #1e1c33;
	--violet-line: #35306a;

	/* Same four hues, stepped for the dark paper. Not an automatic flip of the
	 * light set — each step is validated against #1a1d1b on its own. */
	--viz-1: #10a6ad;
	--viz-2: #b68c3b;
	--viz-3: #ab504d;
	--viz-4: #5cab0b;
	--viz-0: var(--ink-soft);
	--viz-soft: var(--aqua-soft);

	--screen: radial-gradient(circle at 98% 0%, #16241f 0, transparent 26%),
		linear-gradient(115deg, #121513, #0f110f);
	--shadow: 0 18px 50px rgba(0, 0, 0, 0.45);
	--shadow-soft: 0 4px 10px rgba(0, 0, 0, 0.3);

	--rail-bg: #121413;
	--rail-ink: #e7ebe6;
	--rail-dim: #929a93;
	--rail-hover: #242725;
	--rail-line: #2a2e2b;

	color-scheme: dark;
}

/* ------------------------------------------------------------------ base -- */

* { box-sizing: border-box; }

html, body { min-height: 100%; }

html {
	background: var(--base);
	font-family: -apple-system, BlinkMacSystemFont, "SF Pro Text", "SF Pro Display",
		"Helvetica Neue", Inter, ui-sans-serif, sans-serif;
	-webkit-text-size-adjust: 100%;
}

/* os-config.js OS_FONT = "inter" flips the whole surface to the brand face. */
html[data-font="inter"] {
	font-family: Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont,
		"Helvetica Neue", sans-serif;
}

body {
	margin: 0;
	color: var(--ink);
	background: var(--base);
	letter-spacing: -0.02em;
	font-size: 14px;
	line-height: 1.45;
}

button, input, textarea, select { font: inherit; color: inherit; }
button { cursor: pointer; }
a { color: var(--aqua-deep); }
h1, h2, h3, h4, p { margin: 0; }
.hidden { display: none !important; }

/* `hidden` must mean hidden. Any class here that sets display (grid/flex) beats
 * the UA sheet's [hidden] rule, and we have now been bitten by that three times
 * (the login gate, the dock cue, and the Tracks first-day empty state rendering
 * underneath a full board). One rule, whole class of bug gone. */
[hidden] { display: none !important; }

:focus-visible {
	outline: 2px solid var(--aqua);
	outline-offset: 2px;
}

/* ------------------------------------------------------------- app shell -- */

body.os-shell {
	margin-left: 76px;
	transition: margin-left 0.22s cubic-bezier(0.22, 1, 0.36, 1);
}

body.os-shell.os-rail-collapsed { margin-left: 0; }

.os-rail {
	position: fixed;
	inset: 0 auto 0 0;
	width: 76px;
	z-index: 40;
	background: var(--rail-bg);
	color: var(--rail-ink);
	display: flex;
	flex-direction: column;
	align-items: center;
	gap: 6px;
	padding: 20px 11px 14px;
	overflow: visible;
	transition: transform 0.22s cubic-bezier(0.22, 1, 0.36, 1);
}

body.os-rail-collapsed .os-rail { transform: translateX(-100%); }

/* The Lumio mark is authored for a dark ground (lime bracket + white form), so
 * the rail shows it directly rather than on a light tile — on white the right
 * half of the mark disappears. */
.os-rail-logo {
	width: 46px;
	height: 46px;
	border-radius: 14px;
	display: grid;
	place-items: center;
	margin-bottom: 20px;
	flex: none;
}

.os-rail-logo img {
	width: 34px;
	height: auto;
	display: block;
}

.os-rail-link {
	position: relative;
	width: 46px;
	height: 46px;
	flex: none;
	border: 1px solid transparent;
	border-radius: 14px;
	background: transparent;
	color: var(--rail-dim);
	display: grid;
	place-items: center;
	text-decoration: none;
	transition: background 0.18s ease, color 0.18s ease;
}

.os-rail-link svg {
	width: 19px;
	height: 19px;
	fill: none;
	stroke: currentColor;
	stroke-width: 1.85;
	stroke-linecap: round;
	stroke-linejoin: round;
}

.os-rail-link:hover { background: var(--rail-hover); color: #fff; }

/* The Threads unread dot (rail-unread.js) — hidden until .is-on. Sits on the
 * icon's top-right corner; the ring matches the rail background so the dot
 * reads as punched-out rather than floating. */
.os-rail-dot {
	display: none;
	position: absolute;
	top: 9px;
	right: 9px;
	width: 9px;
	height: 9px;
	border-radius: 50%;
	background: #e5484d;
	box-shadow: 0 0 0 2px var(--rail-bg, #101114);
	pointer-events: none;
}
.os-rail-dot.is-on { display: block; }

.os-rail-link.active {
	background: #2e312f;
	color: #fff;
	box-shadow: inset 0 0 0 1px #ffffff18;
}

.os-rail-link.active::before {
	content: "";
	position: absolute;
	inset: -2px;
	border: 2px solid var(--aqua);
	border-radius: 16px;
}

/* The label doubles as the desktop tooltip — one string in the markup. */
.os-rail-t {
	position: absolute;
	left: calc(100% + 12px);
	top: 50%;
	transform: translateY(-50%);
	padding: 6px 10px;
	border-radius: 9px;
	background: #2b2f2c;
	color: #fff;
	font-size: 12px;
	font-weight: 700;
	white-space: nowrap;
	opacity: 0;
	pointer-events: none;
	transition: opacity 0.14s ease;
	box-shadow: 0 6px 18px #0000004d;
	z-index: 3;
}

.os-rail-link:hover .os-rail-t,
.os-rail-link:focus-visible .os-rail-t { opacity: 1; }

.os-rail-divider {
	height: 1px;
	width: 28px;
	flex: none;
	background: var(--rail-line);
	margin: 8px 0;
}

.os-rail-spacer { flex: 1 1 auto; min-height: 8px; }

.os-rail-record {
	background: var(--lime-soft);
	color: #285b2b;
	border-color: var(--lime-line);
}

html[data-theme="dark"] .os-rail-record { color: var(--lime); }
.os-rail-record:hover { background: #dff5cf; color: #1c4620; }

/* ------------------------------------- waiting on you (pending confirms) -- *
 * Aqua, matching the confirm card itself — an agent waiting for an approval is
 * the control plane working, not an alarm. Coral here would put a permanent
 * red mark on the rail for ordinary work. */

.os-rail-decisions {
	background: var(--aqua-soft);
	color: var(--aqua-deep);
	border-color: var(--aqua-line);
}

.os-rail-decisions:hover { background: var(--aqua-line); color: var(--aqua-deep); }

/* NOTHING IS WAITING, BUT THE TEXT YOU APPROVED IS STILL IN THERE. The control
   stays so the only human-readable copy of an approved draft has a door (see
   decisions-inbox.js's mount), and it goes QUIET — the aqua "something needs
   you" tone would be a standing false alarm over an empty queue. */
.os-rail-decisions--kept {
	background: transparent;
	color: var(--rail-dim);
	border-color: var(--rail-line);
}

.os-rail-decisions--kept:hover { background: var(--rail-hover); color: var(--rail-ink); }

/* AND IT SAYS SO WITHOUT A HOVER (round-5 review, 2026-08-26). Going quiet made
   the kept control visually identical to Threads / Tracks / Meetings: the only
   things that changed were a colour and the `.os-rail-t` label, which is a
   hover/focus-only tooltip. So the door to the only human-readable copy of an
   approved draft was, on desktop, an unremarkable dim icon. A small persistent
   dot — muted, not the aqua "something needs you" pill — restores the signal
   without restoring the alarm. */
.os-rail-decisions--kept::after {
	content: "";
	position: absolute;
	top: 1px;
	right: 1px;
	width: 7px;
	height: 7px;
	border-radius: 999px;
	background: var(--rail-dim);
	box-shadow: 0 0 0 2px var(--rail-bg);
}

.os-rail-badge {
	position: absolute;
	top: -3px;
	right: -3px;
	min-width: 17px;
	height: 17px;
	padding: 0 4px;
	border-radius: 999px;
	background: var(--aqua-deep);
	color: #fff;
	font-size: 10.5px;
	font-weight: 850;
	line-height: 17px;
	text-align: center;
	font-variant-numeric: tabular-nums;
	box-shadow: 0 0 0 2px var(--rail-bg);
}

/* The panel opens beside the rail. Fixed, because the rail is the shell's and
 * the pages live in a frame under it — an absolutely-positioned panel would be
 * clipped by the frame's bounds. */
.os-dec-panel {
	position: fixed;
	z-index: 60;
	width: min(340px, calc(100vw - 32px));
	max-height: min(60vh, 460px);
	overflow-y: auto;
	/* NO BOTTOM PADDING. `position: sticky; bottom: 0` pins to the bottom of the
	   SCROLLPORT, and a container's bottom padding is inside the scrollport — so
	   with padding here, a line of the draft scrolls through the gap UNDER the
	   action bar and reads as a rendering fault. The spacing lives on whatever is
	   last instead (`.os-dec-actions`, `.os-dec-list`). */
	padding: 14px 14px 0;
	border: 1px solid var(--line);
	border-radius: 16px;
	background: var(--paper);
	box-shadow: 0 22px 60px #00000026;
}

.os-dec-head { font-size: 13.5px; font-weight: 850; color: var(--ink); }

.os-dec-sub {
	margin: 3px 0 10px;
	font-size: 11.5px;
	font-weight: 600;
	color: var(--muted);
}

.os-dec-list { display: flex; flex-direction: column; gap: 6px; }

.os-dec-row {
	display: block;
	padding: 9px 11px;
	border: 1px solid var(--aqua-line);
	border-radius: 11px;
	background: var(--aqua-soft);
	text-decoration: none;
}

.os-dec-row:hover { border-color: var(--aqua-deep); }

.os-dec-title {
	font-size: 12.5px;
	font-weight: 750;
	color: var(--ink);
	overflow-wrap: anywhere;
}

.os-dec-meta {
	margin-top: 2px;
	font-size: 11px;
	font-weight: 650;
	color: var(--muted);
}

.os-dec-empty {
	padding: 10px 2px;
	font-size: 12px;
	font-weight: 650;
	color: var(--muted);
}

.os-rail-collapse {
	width: 30px;
	height: 26px;
	flex: none;
	border: 0;
	border-radius: 8px;
	background: transparent;
	color: #6d746e;
	font-size: 13px;
	line-height: 1;
	margin-top: 4px;
}

.os-rail-collapse:hover { background: var(--rail-hover); color: #fff; }

.os-rail-open {
	display: none;
	position: fixed;
	left: 12px;
	top: 12px;
	z-index: 45;
	width: 38px;
	height: 38px;
	border: 1px solid var(--line);
	border-radius: 12px;
	background: var(--paper);
	color: var(--ink);
	box-shadow: var(--shadow-soft);
}

body.os-rail-collapsed .os-rail-open { display: block; }

/* ------------------------------------------------------------ avatar / me -- */

.os-avatar {
	width: 38px;
	height: 38px;
	flex: none;
	border: 0;
	border-radius: 50%;
	background: linear-gradient(145deg, #e5fcfd, #a7edef);
	color: #244b4d;
	font-weight: 800;
	font-size: 13px;
	display: grid;
	place-items: center;
	overflow: hidden; /* your own photo, clipped to the circle */
	padding: 0;       /* a button's default padding would inset the photo */
}

.os-menu {
	position: fixed;
	left: 12px;
	bottom: 62px;
	z-index: 50;
	width: 232px;
	padding: 8px;
	border: 1px solid var(--line);
	border-radius: 15px;
	background: var(--paper);
	box-shadow: var(--shadow);
}

.os-menu[hidden] { display: none; }

.os-menu-email {
	display: block;
	padding: 7px 9px 9px;
	color: var(--muted);
	font-size: 12px;
	word-break: break-all;
	border-bottom: 1px solid var(--line);
	margin-bottom: 6px;
}

.os-menu-item {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
	width: 100%;
	padding: 9px 9px;
	border: 0;
	border-radius: 10px;
	background: transparent;
	color: var(--ink);
	font-size: 13px;
	font-weight: 650;
	text-align: left;
	text-decoration: none;
}

.os-menu-item:hover { background: var(--silver); }
.os-menu-item small { color: var(--muted); font-size: 11px; font-weight: 600; }

/* -------------------------------------------------------- content frame -- */

#os-frame {
	position: fixed;
	inset: 0 0 0 76px;
	width: calc(100vw - 76px);
	height: 100vh;
	border: 0;
	background: var(--base);
	transition: left 0.22s cubic-bezier(0.22, 1, 0.36, 1),
		width 0.22s cubic-bezier(0.22, 1, 0.36, 1);
}

body.os-rail-collapsed #os-frame { left: 0; width: 100vw; }

/* ------------------------------------------------------- mobile top bar -- */

.os-topbar {
	display: none;
	position: fixed;
	inset: 0 0 auto 0;
	z-index: 42;
	/* The notch is part of the layout on phones: viewport-fit=cover means the
	 * page draws under the status bar, so the bar carries the safe-area inset
	 * itself — without this, ☰ and the wordmark sit beneath the iPhone clock
	 * (found on the first real device run of the iOS shell, 2026-08-01). */
	height: calc(52px + env(safe-area-inset-top, 0px));
	padding-top: env(safe-area-inset-top, 0px);
	align-items: center;
	gap: 10px;
	padding-left: 12px;
	padding-right: 12px;
	background: var(--paper);
	border-bottom: 1px solid var(--line);
}

.os-topbar-burger,
.os-topbar-search {
	width: 36px;
	height: 36px;
	flex: none;
	border: 1px solid var(--line);
	border-radius: 11px;
	background: var(--silver);
	color: var(--ink-soft);
	font-size: 15px;
	line-height: 1;
}

.os-topbar-title {
	display: flex;
	align-items: center;
	gap: 6px;
	margin-right: auto;
	text-decoration: none;
	color: var(--ink);
}

.os-topbar-wordmark { height: 17px; width: auto; display: block; }
/* Dark theme swaps to the white-on-dark ORIGINAL rather than inverting the ink
 * one: invert(1) turns the letterforms white but it also turns the lime brand
 * dot magenta. Both assets already ship in web-v2/img/ — the ink file was
 * derived from this one (scripts/make_ink_wordmark.py), which is why the dot
 * survives here and cannot survive a filter. */
html[data-theme="dark"] .os-topbar-wordmark { content: url("/img/lumio-wordmark.png"); }
.os-topbar-title span { font-size: 12px; font-weight: 800; color: var(--muted); }

.os-scrim {
	display: none;
	position: fixed;
	inset: 0;
	z-index: 39;
	background: #0d130d66;
}

@media (max-width: 760px) {
	body.os-shell { margin-left: 0; padding-top: calc(52px + env(safe-area-inset-top, 0px)); }
	.os-topbar { display: flex; }
	.os-rail {
		width: 254px;
		align-items: stretch;
		/* Clear the fixed top bar, which sits above the drawer. */
		padding: 64px 12px 14px;
		transform: translateX(-100%);
		overflow-y: auto;
	}
	body.os-rail-mobile-open .os-rail { transform: none; }
	body.os-rail-mobile-open .os-scrim { display: block; }
	/* The top bar's wordmark is already the home button — one mark, not two. */
	.os-rail-logo { display: none; }
	/* The drawer owns the screen while it is open; the dock would float over it. */
	body.os-rail-mobile-open .os-dock { display: none; }
	.os-rail-link {
		width: 100%;
		height: 44px;
		grid-template-columns: 22px 1fr;
		display: grid;
		align-items: center;
		gap: 12px;
		padding: 0 11px;
		justify-items: start;
	}
	.os-rail-t {
		position: static;
		transform: none;
		opacity: 1;
		padding: 0;
		background: none;
		box-shadow: none;
		font-size: 14px;
		font-weight: 650;
		color: inherit;
	}
	.os-rail-divider { width: 100%; }
	/* The drawer row is full width, so a badge hung off the corner (as on the
	   narrow desktop rail) would sit outside it. Pin it to the row's right
	   edge instead, where a count belongs on a list row. */
	.os-rail-badge {
		top: 50%;
		right: 12px;
		transform: translateY(-50%);
		box-shadow: none;
	}
	.os-rail-collapse, .os-rail-open { display: none !important; }
	.os-avatar { align-self: flex-start; }
	.os-menu { left: 12px; right: 12px; width: auto; }
	#os-frame { display: none; }
}

@media (prefers-reduced-motion: reduce) {
	.os-rail, body.os-shell, #os-frame { transition: none; }
}

/* ----------------------------------------------------------------- login -- */

.os-login {
	min-height: 100vh;
	display: grid;
	place-items: center;
	padding: 24px;
	background: var(--screen);
}

/* display:grid beats the UA sheet's [hidden] rule; without this the signed-in
 * shell keeps a full-viewport empty gate in the layout. */
.os-login[hidden] { display: none; }

.os-login-card {
	width: min(420px, 100%);
	padding: 30px 28px 26px;
	border: 1px solid var(--line);
	border-radius: var(--radius);
	background: var(--paper);
	box-shadow: var(--shadow);
	text-align: center;
}

.os-login-mark {
	display: flex;
	align-items: center; /* an <img> has no text baseline — baseline-aligning sinks the tag */
	justify-content: center;
	gap: 7px;
	margin-bottom: 14px;
}

.os-login-mark img { height: 26px; width: auto; }
/* Same swap as the topbar wordmark — see the note there. */
html[data-theme="dark"] .os-login-mark img { content: url("/img/lumio-wordmark.png"); }
.os-login-mark span {
	font-size: 15px;
	font-weight: 800;
	color: var(--muted);
	line-height: 1;
	margin-top: 4px; /* optical: sit on the wordmark's baseline, not its box centre */
}

.os-login-sub {
	color: var(--ink-soft);
	font-size: 14px;
	line-height: 1.45;
	margin-bottom: 20px;
}

.os-login-btn {
	width: 100%;
	min-height: 44px;
	border: 0;
	border-radius: 12px;
	background: var(--ink);
	color: var(--base);
	font-size: 14px;
	font-weight: 750;
}

.os-login-btn:disabled { opacity: 0.6; cursor: default; }

.os-login-note { margin-top: 12px; color: var(--muted); font-size: 12px; }

.os-login-err {
	margin-bottom: 14px;
	padding: 10px 12px;
	border: 1px solid var(--coral-line);
	border-radius: 11px;
	background: var(--coral-soft);
	color: var(--coral-deep);
	font-size: 13px;
	text-align: left;
}

.os-login-rail {
	display: flex;
	flex-wrap: wrap;
	justify-content: center;
	gap: 6px;
	margin-top: 20px;
	padding-top: 16px;
	border-top: 1px solid var(--line);
}

.os-login-rail span {
	padding: 5px 9px;
	border-radius: 999px;
	background: var(--silver);
	color: var(--ink-soft);
	font-size: 11px;
	font-weight: 750;
}

/* ------------------------------------------------------- page primitives -- */

.os-screen {
	min-height: 100vh;
	padding: 24px 30px 120px;
	background: var(--screen);
}

.os-crumb {
	display: flex;
	align-items: center;
	gap: 8px;
	height: 34px;
	margin-bottom: 14px;
	color: var(--muted);
	font-size: 13px;
	font-weight: 600;
}

.os-crumb b { color: var(--ink); font-weight: 750; }

/* A crumb segment that navigates has to LOOK like it does — the trail read as
 * flat grey text, so nobody tried it (founder, 2026-07-29). Muted at rest so it
 * stays chrome, ink + underline on hover, and a visible focus ring. */
.os-crumb a {
	color: var(--muted);
	text-decoration: none;
	border-radius: 6px;
	padding: 2px 4px;
	margin: 0 -4px;
	cursor: pointer;
}

.os-crumb a:hover { color: var(--ink); background: var(--silver); }
.os-crumb a:focus-visible { outline: 2px solid var(--aqua); outline-offset: 1px; }

/* The last segment is where you already are. It keeps its href — ⌘-click and
 * "copy link" still work — but it is not dressed as somewhere to go. */
.os-crumb a[aria-current="page"] {
	color: var(--ink);
	font-weight: 750;
	cursor: default;
}

.os-crumb a[aria-current="page"]:hover { background: none; }

/* Plain names, no marketing slogans (design review, 2026-07-26). */
.os-page-head {
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
	gap: 16px;
	margin-bottom: 16px;
}

.os-page-head h1 {
	font-size: clamp(28px, 3vw, 39px);
	line-height: 1.02;
	letter-spacing: -0.05em;
}

.os-eyebrow {
	font-size: 11px;
	font-weight: 850;
	letter-spacing: 0.16em;
	text-transform: uppercase;
	color: var(--muted);
}

.os-sub { color: var(--ink-soft); font-size: 14px; line-height: 1.45; }

.os-panel {
	background: var(--paper);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	box-shadow: var(--shadow);
}

.os-panel-pad { padding: 20px; }

.os-pill {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	padding: 5px 9px;
	border-radius: 999px;
	background: var(--silver);
	color: var(--ink-soft);
	font-size: 12px;
	font-weight: 750;
}

.os-pill i { width: 7px; height: 7px; border-radius: 50%; background: currentColor; }
.os-pill.good { background: var(--lime-soft); color: var(--lime-deep); }
.os-pill.aqua { background: var(--aqua-soft); color: var(--aqua-deep); }
.os-pill.risk { background: var(--coral-soft); color: var(--coral-deep); }

.os-btn {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	gap: 7px;
	min-height: 36px;
	padding: 0 13px;
	border: 1px solid var(--line);
	border-radius: 10px;
	background: var(--paper);
	color: var(--ink);
	font-size: 13px;
	font-weight: 750;
	text-decoration: none;
	transition: transform 0.16s ease, box-shadow 0.16s ease;
}

.os-btn:hover { transform: translateY(-1px); box-shadow: var(--shadow-soft); }
.os-btn.primary { background: var(--ink); border-color: var(--ink); color: var(--base); }
.os-btn.lime { background: var(--lime-soft); border-color: var(--lime-line); color: var(--lime-deep); }
.os-btn.aqua { background: var(--aqua-soft); border-color: var(--aqua-line); color: var(--aqua-deep); }

/* The honest empty state: this surface exists, its work has not landed yet. */
.os-empty {
	display: grid;
	gap: 10px;
	justify-items: start;
	max-width: 620px;
	padding: 26px;
	border: 1px dashed var(--line);
	border-radius: var(--radius);
	background: var(--paper-soft);
}

.os-empty h2 { font-size: 19px; letter-spacing: -0.04em; }
.os-empty p { color: var(--ink-soft); font-size: 14px; line-height: 1.5; }

.os-list { display: grid; gap: 0; margin: 0; padding: 0; list-style: none; }

.os-list li {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 11px 0;
	border-top: 1px solid var(--line);
	font-size: 13px;
	color: var(--ink-soft);
}

.os-list li:first-child { border-top: 0; }
.os-list li b { color: var(--ink); font-weight: 750; }

@media (max-width: 760px) {
	.os-screen { padding: 18px 16px 150px; }
	.os-page-head { flex-direction: column; align-items: flex-start; }
	/* Side-by-side label + description wraps into a ragged two-column mess on a
	 * phone; stack it. */
	.os-list li { flex-direction: column; align-items: flex-start; gap: 2px; }
}

/* ------------------------------------------------------------- Lumi dock --
 * Lumi is a central operating presence: the dock rides every page EXCEPT the
 * two surfaces where Lumi is already native — /lumi (its own composer) and
 * Threads (invoked inline with @lumi). One entry point, no double inputs. */

.os-dock {
	position: fixed;
	bottom: 22px;
	left: calc(50% + 38px);
	transform: translateX(-50%);
	width: min(560px, calc(100vw - 150px));
	z-index: 44;
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 8px 8px 8px 11px;
	border: 1px solid #ffffff1f;
	border-radius: 16px;
	background: rgba(22, 24, 23, 0.9);
	backdrop-filter: blur(14px);
	-webkit-backdrop-filter: blur(14px);
	box-shadow: 0 20px 55px rgba(18, 24, 20, 0.32);
}

body.os-rail-collapsed .os-dock { left: 50%; }
.os-dock[hidden] { display: none; }

.os-dock-orb {
	position: relative;
	width: 32px;
	height: 32px;
	min-width: 32px;
	border: 0;
	border-radius: 11px;
	background: radial-gradient(circle at 34% 28%, #e2ffb4, #00d8e0 58%, #078c95);
	box-shadow: 0 0 0 1px #ffffff26, 0 4px 12px #00d8e04d;
}

.os-dock-orb::after {
	content: "";
	position: absolute;
	inset: 0;
	border-radius: inherit;
	animation: os-dock-pulse 2.6s infinite;
}

@keyframes os-dock-pulse {
	0% { box-shadow: 0 0 0 0 #00d8e066; }
	70% { box-shadow: 0 0 0 8px #00d8e000; }
	100% { box-shadow: 0 0 0 0 #00d8e000; }
}

@media (prefers-reduced-motion: reduce) {
	.os-dock-orb::after { animation: none; }
}

.os-dock-input {
	flex: 1;
	min-width: 0;
	border: 0;
	background: transparent;
	color: #fff;
	font-size: 13px;
	outline: 0;
}

.os-dock-input::placeholder { color: #a7ada6; }

.os-dock-hint {
	display: flex;
	align-items: center;
	gap: 6px;
	padding: 5px 9px;
	border: 1px solid #00d8e033;
	border-radius: 9px;
	background: #00d8e015;
	color: #8fe9ee;
	font-size: 11px;
	font-weight: 800;
	white-space: nowrap;
}

/* display:flex above beats the UA sheet's [hidden] rule — restore it, or an
 * empty cue renders as a stray pill on every surface. */
.os-dock-hint[hidden] { display: none; }

.os-dock-hint i {
	width: 6px;
	height: 6px;
	border-radius: 50%;
	background: var(--aqua);
	box-shadow: 0 0 0 3px #00d8e022;
}

.os-dock-send {
	width: 33px;
	height: 33px;
	min-width: 33px;
	border: 0;
	border-radius: 11px;
	background: var(--lime);
	color: #14260a;
	font-size: 15px;
	font-weight: 900;
}

@media (max-width: 760px) {
	.os-dock { left: 12px; right: 12px; transform: none; width: auto; bottom: 16px; }
	.os-dock-hint { display: none; }
}

/* ------------------------------------------------------- form primitives --
 * Shared by every V2 page that asks a person for something. Authored here
 * rather than in a page stylesheet so the second page that needs an input
 * inherits the same one instead of inventing its own. */

.os-input,
.os-select,
.os-textarea {
	width: 100%;
	border: 1px solid var(--line);
	border-radius: 10px;
	background: var(--paper-soft);
	color: var(--ink);
	padding: 9px 11px;
	font-size: 13px;
	outline: 0;
}

.os-input:focus,
.os-select:focus,
.os-textarea:focus {
	border-color: var(--aqua);
	box-shadow: 0 0 0 3px #00d8e01e;
}

.os-textarea { resize: vertical; min-height: 70px; }

label.os-field {
	display: grid;
	gap: 5px;
	font-size: 12px;
	font-weight: 750;
	color: var(--ink-soft);
}

label.os-field .os-optional { font-weight: 600; color: var(--muted); }

.os-btn.small { min-height: 32px; padding: 0 10px; font-size: 12px; }
.os-btn.coral { background: var(--coral-soft); border-color: var(--coral-line); color: var(--coral-deep); }
.os-btn:disabled { opacity: 0.55; cursor: default; transform: none; box-shadow: none; }

/* Segmented filters and tabs — same pill-in-a-tray shape, different jobs. */
.os-chips,
.os-tabs {
	display: flex;
	gap: 4px;
	padding: 4px;
	border-radius: 12px;
	background: var(--silver);
	width: max-content;
	max-width: 100%;
	flex-wrap: wrap;
}

.os-chips button,
.os-tabs button {
	border: 0;
	background: transparent;
	border-radius: 9px;
	padding: 8px 13px;
	color: var(--ink-soft);
	font-size: 12.5px;
	font-weight: 800;
}

.os-chips button.is-active,
.os-tabs button.is-active {
	background: var(--paper);
	color: var(--ink);
	box-shadow: 0 2px 7px #17201518;
}

.os-tabs { margin-bottom: 14px; }

/* ------------------------------------------------------------- dialogues --
 * Below the artifact panel and above the shell (rail 40, dock 44). */

.os-modal {
	position: fixed;
	inset: 0;
	z-index: 60;
	display: grid;
	place-items: center;
	padding: 20px;
	background: #0d130d59;
	overflow-y: auto;
}

.os-modal[hidden] { display: none; }

.os-modal-card {
	width: min(520px, 100%);
	max-height: calc(100vh - 40px);
	overflow-y: auto;
	background: var(--paper);
	border: 1px solid var(--line);
	border-radius: 18px;
	box-shadow: 0 25px 80px #0005;
}

.os-modal-head {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 10px;
	padding: 18px 20px 12px;
	border-bottom: 1px solid var(--line);
}

.os-modal-head h2 { font-size: 19px; letter-spacing: -0.04em; }
.os-modal-head p { font-size: 12.5px; color: var(--ink-soft); margin-top: 4px; line-height: 1.4; }

.os-modal-x {
	border: 0;
	background: var(--silver);
	width: 32px;
	height: 32px;
	min-width: 32px;
	border-radius: 9px;
	font-size: 15px;
	font-weight: 800;
	color: var(--ink-soft);
}

.os-modal-body { padding: 16px 20px 20px; display: grid; gap: 12px; }

.os-modal-foot {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	flex-wrap: wrap;
}

.os-modal-foot small { font-size: 11.5px; color: var(--muted); line-height: 1.35; max-width: 300px; }
.os-modal-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }

/* ---------------------------------------------------------------- toast -- */

.os-toast {
	position: fixed;
	right: 22px;
	bottom: 84px;
	z-index: 80;
	max-width: min(340px, calc(100vw - 32px));
	padding: 11px 14px;
	border-radius: 11px;
	background: #202522;
	color: #fff;
	font-size: 13px;
	font-weight: 700;
	box-shadow: 0 14px 35px #0004;
	opacity: 0;
	transform: translateY(12px);
	transition: opacity 0.2s ease, transform 0.2s ease;
	pointer-events: none;
}

.os-toast.is-shown { opacity: 1; transform: none; }

@media (prefers-reduced-motion: reduce) {
	.os-toast { transition: none; }
}

/* =============================================================== Tracks ==
 * The work the company is doing: the board, and one track's Plan / Story /
 * Actions. A Track is a thread doc — "Track" is the V2 name for it, so nothing
 * here implies a second data model. */

.trk-tools {
	display: flex;
	align-items: center;
	gap: 12px;
	flex-wrap: wrap;
	margin-bottom: 12px;
}

.trk-archived {
	display: inline-flex;
	align-items: center;
	gap: 7px;
	min-height: 36px;
	color: var(--muted);
	font-size: 12px;
	font-weight: 700;
	cursor: pointer;
	user-select: none;
}

.trk-archived input { accent-color: var(--lime-deep); width: 16px; height: 16px; }

.trk-fine { font-size: 12px; color: var(--muted); }

/* ------------------------------------------------------------ the board -- */

.trk-list { overflow: hidden; }

.trk-row {
	display: grid;
	grid-template-columns: 7px minmax(200px, 1.3fr) auto minmax(120px, 0.55fr) 108px 20px;
	align-items: center;
	gap: 14px;
	width: 100%;
	padding: 13px 20px;
	border: 0;
	border-top: 1px solid var(--line);
	background: transparent;
	color: inherit;
	text-align: left;
	transition: background 0.14s ease;
}

.trk-row:first-child { border-top: 0; }
.trk-row:hover { background: var(--paper-soft); }

.trk-stripe { height: 36px; border-radius: 9px; background: var(--lime); }
.trk-stripe.aqua { background: var(--aqua); }
.trk-stripe.coral { background: var(--coral); }
.trk-stripe.grey { background: #bac0ba; }

.trk-name { font-size: 15px; font-weight: 800; letter-spacing: -0.02em; overflow-wrap: anywhere; }
.trk-meta { display: block; color: var(--muted); font-size: 12px; margin-top: 3px; overflow-wrap: anywhere; }

.trk-flags { display: flex; gap: 5px; flex-wrap: wrap; }

.trk-flag {
	display: inline-flex;
	align-items: center;
	border-radius: 7px;
	padding: 3px 7px;
	font-size: 10.5px;
	font-weight: 850;
}

.trk-flag.quiet { background: var(--coral-soft); color: var(--coral-deep); border: 1px solid var(--coral-line); }
.trk-flag.alldone { background: var(--lime-soft); color: var(--lime-deep); border: 1px solid var(--lime-line); }
.trk-flag.archived { background: var(--silver); color: var(--ink-soft); border: 1px solid var(--line); }

.trk-progress { height: 6px; background: var(--line-soft); border-radius: 99px; overflow: hidden; }
.trk-progress b { display: block; height: 100%; border-radius: inherit; background: var(--lime-deep); }
.trk-count { display: block; margin-top: 5px; font-size: 11px; color: var(--muted); }
.trk-updated { font-size: 12px; color: var(--muted); text-align: right; white-space: nowrap; }
.trk-arrow { color: var(--aqua-deep); font-size: 19px; }
.trk-note { padding: 14px 20px; color: var(--muted); font-size: 13px; }

/* --------------------------------------------------------- one track -- */

.trk-top {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 16px;
	margin-bottom: 12px;
}

.trk-id { display: flex; gap: 12px; align-items: flex-start; min-width: 0; }

.trk-back {
	flex: none;
	width: 36px;
	height: 36px;
	margin-top: 3px;
	display: grid;
	place-items: center;
	border: 1px solid var(--line);
	border-radius: 10px;
	background: var(--paper);
	color: var(--ink-soft);
	font-size: 15px;
}

.trk-mark {
	flex: none;
	width: 46px;
	height: 46px;
	display: grid;
	place-items: center;
	border-radius: 15px;
	background: linear-gradient(140deg, #d9ffae, #7be823);
	color: #213026;
	font-size: 19px;
	font-weight: 850;
	box-shadow: inset 0 1px 1px #fff9;
}

.trk-mark.aqua { background: linear-gradient(140deg, #c9f6f8, #3fd6dd); color: #0b3a3d; }
.trk-mark.coral { background: linear-gradient(140deg, #ffd8d4, #ff8b83); color: #3d1512; }
.trk-mark.grey { background: linear-gradient(140deg, #e6e9e5, #c2c8c2); color: #2c302c; }

.trk-headings { min-width: 0; position: relative; }
.trk-headings h1 { font-size: clamp(23px, 2.4vw, 31px); line-height: 1.05; letter-spacing: -0.05em; overflow-wrap: anywhere; }

.trk-meta-line {
	display: flex;
	align-items: center;
	gap: 8px;
	flex-wrap: wrap;
	margin-top: 7px;
	color: var(--ink-soft);
	font-size: 12.5px;
}

.trk-meta-line .trk-fact::before { content: "·"; margin-right: 8px; color: var(--muted); opacity: 0.6; }
.trk-goal { margin-top: 6px; color: var(--ink-soft); font-size: 13px; max-width: 60ch; overflow-wrap: anywhere; }

.trk-status-pill { border: 1px solid transparent; }
button.trk-status-pill:hover { border-color: currentColor; }

.trk-head-actions { display: flex; gap: 8px; align-items: center; flex: none; }
.trk-menu-wrap { position: relative; }

.trk-menu {
	position: absolute;
	right: 0;
	top: calc(100% + 6px);
	z-index: 9;
	width: 216px;
	padding: 6px;
	border: 1px solid var(--line);
	border-radius: 13px;
	background: var(--paper);
	box-shadow: var(--shadow);
}

.trk-menu button {
	display: block;
	width: 100%;
	min-height: 40px;
	text-align: left;
	border: 0;
	background: transparent;
	border-radius: 8px;
	padding: 9px;
	font-size: 13px;
	font-weight: 650;
	color: var(--ink);
}

.trk-menu button:hover { background: var(--silver); }
.trk-menu button.danger { color: var(--coral-deep); }

.trk-status-pop {
	position: absolute;
	z-index: 12;
	top: calc(100% + 8px);
	left: 0;
	width: min(310px, calc(100vw - 40px));
	padding: 14px;
	border: 1px solid var(--line);
	border-radius: 14px;
	background: var(--paper);
	box-shadow: var(--shadow);
}

.trk-status-pop b { font-size: 13px; }
.trk-status-pop .seg { display: grid; grid-template-columns: 1fr 1fr; gap: 5px; margin: 9px 0; }

.trk-status-pop .seg button {
	min-height: 38px;
	border: 1px solid var(--line);
	background: var(--paper-soft);
	border-radius: 9px;
	font-size: 12px;
	font-weight: 800;
	color: var(--ink-soft);
}

.trk-status-pop .seg button.is-sel { border-color: var(--aqua-line); background: var(--aqua-soft); color: var(--aqua-deep); }
.trk-status-pop footer { display: flex; justify-content: flex-end; gap: 7px; margin-top: 9px; }

.trk-view { display: none; }
.trk-view.is-active { display: block; }

/* ------------------------------------------------------------ plan tab -- */

.trk-plan-empty { display: grid; gap: 12px; justify-items: start; padding: 26px; max-width: 640px; }
.trk-plan-empty h2 { font-size: 19px; letter-spacing: -0.04em; }
.trk-plan-empty p { color: var(--ink-soft); font-size: 13.5px; line-height: 1.5; max-width: 520px; }
.trk-steps { display: grid; width: 100%; }

.trk-steps div {
	display: flex;
	gap: 10px;
	align-items: baseline;
	padding: 9px 0;
	border-top: 1px solid var(--line);
	font-size: 13px;
	color: var(--ink-soft);
}

.trk-steps div:first-child { border-top: 0; }
.trk-steps b { color: var(--ink); white-space: nowrap; }

.trk-jump {
	display: inline-flex;
	align-items: center;
	gap: 7px;
	min-height: 38px;
	border: 1px solid var(--aqua-line);
	background: var(--aqua-soft);
	color: var(--aqua-deep);
	border-radius: 10px;
	padding: 8px 11px;
	font-size: 12px;
	font-weight: 750;
	text-align: left;
}

/* ----------------------------------------------------------- story tab -- */

.trk-story-wrap { display: grid; grid-template-columns: minmax(0, 1fr) 300px; gap: 14px; align-items: start; }
.trk-story { padding: 18px 22px; }

.trk-event { display: grid; grid-template-columns: 66px 20px minmax(0, 1fr); gap: 11px; position: relative; padding-bottom: 20px; }
.trk-event:not(:last-child)::after { content: ""; position: absolute; left: 75px; top: 22px; bottom: -2px; width: 1px; background: var(--line); }

.trk-date { font-size: 11.5px; font-weight: 800; color: var(--muted); padding-top: 3px; }
.trk-dot { width: 13px; height: 13px; margin-top: 3px; border-radius: 50%; background: var(--aqua); border: 3px solid var(--aqua-soft); z-index: 1; }
.trk-dot.lime { background: var(--lime-deep); border-color: var(--lime-soft); }
.trk-dot.coral { background: var(--coral); border-color: var(--coral-soft); }
.trk-dot.grey { background: var(--muted); border-color: var(--silver); }

.trk-event-title { font-size: 13.5px; font-weight: 800; overflow-wrap: anywhere; }
.trk-event-copy { font-size: 12.5px; color: var(--ink-soft); line-height: 1.42; margin: 4px 0 7px; overflow-wrap: anywhere; }
.trk-event-by { font-size: 11px; color: var(--muted); margin-top: 6px; }

.trk-src {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	margin: 2px 5px 0 0;
	padding: 5px 8px;
	border: 1px solid var(--aqua-line);
	border-radius: 8px;
	background: var(--aqua-soft);
	color: var(--aqua-deep);
	font-size: 11px;
	font-weight: 750;
	text-decoration: none;
	overflow-wrap: anywhere;
}

.trk-note-composer { display: flex; gap: 8px; padding: 12px 22px; border-top: 1px solid var(--line); }
.trk-note-composer input { flex: 1; min-width: 0; }

.trk-side { padding: 16px; display: grid; gap: 12px; align-content: start; }
.trk-side h3 { font-size: 15px; letter-spacing: -0.03em; }

.trk-linked { display: flex; align-items: center; gap: 9px; padding: 9px 0; border-top: 1px solid var(--line); }
.trk-linked:first-of-type { border-top: 0; }

.trk-lm-icon {
	flex: none;
	width: 30px;
	height: 30px;
	display: grid;
	place-items: center;
	border-radius: 9px;
	background: var(--aqua-soft);
	color: var(--aqua-deep);
	font-size: 13px;
	font-weight: 900;
}

.trk-linked b { display: block; font-size: 12.5px; line-height: 1.25; overflow-wrap: anywhere; }
.trk-linked span { font-size: 11px; color: var(--muted); }

.trk-unlink {
	margin-left: auto;
	width: 30px;
	height: 30px;
	flex: none;
	border: 0;
	border-radius: 8px;
	background: transparent;
	color: var(--muted);
	font-size: 14px;
}

.trk-unlink:hover { background: var(--coral-soft); color: var(--coral-deep); }

/* --------------------------------------------------------- actions tab -- */

.trk-actions-wrap { overflow: hidden; }

.trk-bar {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
	flex-wrap: wrap;
	padding: 14px 18px;
	border-bottom: 1px solid var(--line);
}

.trk-bar h2 { font-size: 17px; letter-spacing: -0.03em; }
.trk-bar .os-sub { font-size: 12px; margin-top: 2px; }

.trk-group-head {
	display: flex;
	align-items: center;
	gap: 10px;
	flex-wrap: wrap;
	padding: 11px 18px;
	background: var(--paper-soft);
	border-bottom: 1px solid var(--line);
}

.trk-group-head b { font-size: 12.5px; }
.trk-group-head span { font-size: 11.5px; color: var(--muted); }

.trk-action-row {
	display: grid;
	grid-template-columns: 24px minmax(0, 1fr) auto;
	gap: 12px;
	align-items: center;
	padding: 10px 18px;
	border-top: 1px solid var(--line-soft);
}

.trk-action-row b { font-size: 12.5px; font-weight: 750; overflow-wrap: anywhere; }
.trk-action-row.is-done b { color: var(--muted); text-decoration: line-through; }
.trk-a-meta { display: block; margin-top: 2px; font-size: 11px; color: var(--muted); overflow-wrap: anywhere; }
.trk-due { font-size: 11px; font-weight: 850; color: var(--ink-soft); text-align: right; white-space: nowrap; }
.trk-due.late { color: var(--coral-deep); }
.trk-due.done { color: var(--lime-deep); }

.trk-check {
	width: 24px;
	height: 24px;
	min-width: 24px;
	padding: 0;
	display: grid;
	place-items: center;
	border: 1.5px solid var(--line);
	border-radius: 7px;
	background: var(--paper);
	color: #fff;
	font-size: 14px;
	line-height: 1;
	font-weight: 850;
	transition: border-color 0.16s ease, box-shadow 0.16s ease;
}

.trk-check:hover { border-color: var(--aqua); box-shadow: 0 0 0 3px #00d8e01c; }
.trk-check.is-done { background: var(--lime-deep); border-color: var(--lime-deep); }
.trk-check.is-done::after { content: "✓"; }

.trk-suggest-row { display: flex; align-items: center; gap: 10px; padding: 10px 0; border-top: 1px solid var(--line); flex-wrap: wrap; }
.trk-suggest-row:first-child { border-top: 0; }
.trk-suggest-row b { font-size: 12.5px; display: block; overflow-wrap: anywhere; }
.trk-suggest-row span { display: block; margin-top: 2px; font-size: 11px; color: var(--muted); }
.trk-suggest-row .os-btn { margin-left: auto; }

/* ------------------------------------------------------------ responsive -- */

@media (max-width: 1000px) {
	.trk-story-wrap { grid-template-columns: 1fr; }
}

@media (max-width: 760px) {
	.trk-row { grid-template-columns: 7px minmax(0, 1fr) 20px; padding: 14px; }
	.trk-row .trk-flags,
	.trk-row .trk-progress-cell,
	.trk-row .trk-updated { display: none; }
	.trk-top { flex-direction: column; align-items: stretch; }
	.trk-head-actions { flex-wrap: wrap; }
	.trk-story { padding: 16px 14px; }
	.trk-note-composer { padding: 12px 14px; }
	.trk-event { grid-template-columns: 56px 16px minmax(0, 1fr); gap: 8px; }
	.trk-event:not(:last-child)::after { left: 63px; }
	.os-modal-grid { grid-template-columns: 1fr; }
	.os-toast { right: 12px; left: 12px; bottom: 92px; max-width: none; }
}

/* No hover on touch: nothing may be hover-only, and every target is thumb-sized. */
@media (hover: none) {
	.trk-check { width: 30px; height: 30px; min-width: 30px; }
	.trk-action-row { padding-top: 13px; padding-bottom: 13px; }
	.trk-unlink { width: 40px; height: 40px; }
	.trk-back { width: 42px; height: 42px; }
	.os-btn.small { min-height: 40px; padding: 0 12px; }
	.os-chips button, .os-tabs button { min-height: 40px; }
	.os-modal-x { width: 40px; height: 40px; min-width: 40px; }
}

/* ─────────────────────────────────────────────────── meetings (lane D) ── *
 * Meetings is its own landing (layout signed off 2026-07-27): the library IS
 * the page, and one meeting opens across the WHOLE width. There is no
 * persistent rail — the breadcrumb's ▾ opens a switcher popover holding the
 * same library on demand, which is the only place the old left column's job
 * survives. Two views, one at a time: `.mt-workbench[data-pane]`.
 *
 * Authored from the approved prototype's `.meeting-*` block, on the tokens
 * above so both themes come out of the same rules. This lane touches nothing
 * else in this file (docs/V2-DELIVERY-WORKFLOW.md).
 */

.mt-screen { padding-bottom: 120px; }

/* Anchors the switcher popover to the breadcrumb it drops out of. */
.mt-crumb-wrap { position: relative; }

/* The crumb carries real buttons now, so it grows with them (and with the
 * bigger touch padding below) instead of letting them spill out of a fixed
 * 34px row. */
.mt-crumb { height: auto; min-height: 34px; min-width: 0; }

.mt-crumb-home,
.mt-crumb-switch {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	/* min-width:0 is load-bearing: without it a flex item refuses to shrink
	 * below its text, and a long meeting name pushed the crumb 4px past a
	 * 390px screen — a whole page that scrolls sideways for one button. The
	 * name ellipsises instead (render gate, 2026-07-27). */
	min-width: 0;
	max-width: 460px;
	padding: 4px 7px;
	margin: 0 -3px;
	border: 1px solid transparent;
	border-radius: 8px;
	background: transparent;
	color: var(--ink);
	font: inherit;
	font-weight: 750;
	text-align: left;
}

.mt-crumb-home:not(:disabled) { color: var(--muted); }
.mt-crumb-home:not(:disabled):hover,
.mt-crumb-switch:hover { background: var(--silver); color: var(--ink); }
.mt-crumb-home:disabled { padding-left: 4px; padding-right: 4px; }

/* Only the meeting's name gives ground. "Meetings" is the way back — clipping
 * it to "Meetin" to save room for a title is the wrong trade. */
.mt-crumb-home { flex: none; }
.mt-crumb-switch { flex: 0 1 auto; }

.mt-crumb-switch span {
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* A caret drawn in CSS: no icon font, no SVG to size wrongly. */
.mt-caret {
	flex: none;
	width: 7px;
	height: 7px;
	margin-top: -3px;
	border-right: 1.6px solid currentColor;
	border-bottom: 1.6px solid currentColor;
	transform: rotate(45deg);
	opacity: 0.55;
}

.mt-crumb-switch[aria-expanded="true"] {
	border-color: var(--line);
	background: var(--silver);
}

/* -------------------------------------------------------- the two views -- */

.mt-workbench { display: block; }
.mt-workbench[data-pane="library"] .mt-detail { display: none; }
.mt-workbench[data-pane="detail"] .mt-landing { display: none; }

/* ------------------------------------------------------------- library -- */

.mt-landing { padding: 16px 18px 8px; }

.mt-library-head {
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
	gap: 12px;
	padding-bottom: 14px;
}

.mt-library-head h2 { font-size: 25px; letter-spacing: -0.05em; }

.mt-btn-sm { min-height: 30px; padding: 0 10px; font-size: 12px; }

/* ---- Mine · Everyone on the meeting library (#325, 2026-09-11) ----------
   Founders only, hidden until navIsFounder answers. Sits above the search box
   because it changes WHICH meetings the search searches. Sizing follows
   .act-who (Actions' own Mine/Everyone) so the two read as one control. */
.mt-who { padding-bottom: 8px; }
.mt-who[hidden] { display: none; }

/* The Everyone list is capped; this is what says so. Muted, not alarming — it
   is a fact about the list, not a failure. */
.mt-lib-cap {
  padding: 0 10px 10px;
  color: var(--ink-soft);
  font-size: 12px;
  line-height: 1.5;
  max-width: 46em;
}
.mt-lib-cap.hidden { display: none; }

.mt-search {
	width: 100%;
	margin-bottom: 9px;
	padding: 9px 11px;
	border: 1px solid var(--line);
	border-radius: 10px;
	background: var(--paper-soft);
	color: var(--ink);
	font-size: 13px;
	outline: 0;
}

.mt-search:focus { border-color: var(--aqua); box-shadow: 0 0 0 3px #00d8e01c; }

.mt-filters { display: flex; flex-wrap: wrap; gap: 4px; padding-bottom: 8px; }

.mt-filters button {
	flex: none;
	padding: 6px 8px;
	border: 0;
	border-radius: 8px;
	background: transparent;
	color: var(--muted);
	font-size: 11px;
	font-weight: 800;
	white-space: nowrap;
}

.mt-filters button.active { background: var(--aqua-soft); color: var(--aqua-deep); }

.mt-stream { border-top: 1px solid var(--line); padding-top: 4px; }

.mt-stream-label {
	padding: 14px 7px 5px;
	color: var(--muted);
	font-size: 10px;
	font-weight: 850;
	letter-spacing: 0.13em;
	text-transform: uppercase;
}

.mt-entry {
	display: grid;
	grid-template-columns: minmax(0, 1fr) auto;
	align-items: center;
	gap: 6px 16px;
	width: 100%;
	margin: 2px 0;
	padding: 12px 11px;
	border: 1px solid transparent;
	border-radius: 12px;
	background: transparent;
	color: var(--ink);
	text-align: left;
}

.mt-entry:hover { background: var(--silver); }

.mt-entry.active {
	background: var(--lime-soft);
	border-color: var(--lime-line);
	box-shadow: inset 3px 0 0 var(--lime-deep);
}

.mt-entry-main { min-width: 0; }
.mt-entry b { display: block; font-size: 14px; line-height: 1.3; font-weight: 750; }

/* Each part of a row is styled by its own class rather than by `.mt-entry span`.
 * That blanket rule out-specified `.mt-entry-status`, so the status line was
 * display:block and its 6px dot — an inline box — collapsed to zero width: the
 * lime/aqua/coral state signal had never actually painted. The old
 * `!important`s here were patches on the same fight; with the blanket rule gone
 * they are unnecessary (render gate, 2026-07-27). */
.mt-entry-when { display: block; margin-top: 4px; color: var(--muted); font-size: 11.5px; }

.mt-entry-kind {
	display: inline-block;
	margin-left: 6px;
	padding: 1px 5px;
	border-radius: 6px;
	background: var(--silver);
	color: var(--ink-soft);
	font-size: 10px;
	font-weight: 800;
	vertical-align: 1px;
}

/* The state reads at the end of the row, where the eye lands after the name. */
.mt-entry-status {
	display: flex;
	align-items: center;
	justify-self: end;
	gap: 6px;
	white-space: nowrap;
	color: var(--ink-soft);
	font-size: 11.5px;
	font-weight: 700;
}

.mt-dot { width: 6px; height: 6px; flex: none; border-radius: 50%; background: var(--muted); }
.mt-dot.lime { background: var(--lime-deep); }
.mt-dot.aqua { background: var(--aqua); }
.mt-dot.coral { background: var(--coral); }
.mt-dot.spin { animation: mt-pulse 1.4s ease-in-out infinite; }

@keyframes mt-pulse { 50% { opacity: 0.35; } }
@media (prefers-reduced-motion: reduce) { .mt-dot.spin { animation: none; } }

.mt-lib-note { padding: 18px 10px 22px; color: var(--ink-soft); font-size: 13px; }
.mt-lib-note b { display: block; color: var(--ink); font-size: 15px; }
.mt-lib-note p { max-width: 42em; margin: 6px 0 12px; line-height: 1.5; }

/* ------------------------------------------------------ switcher popover --
 * The same library block (#mt-lib), moved here by js while a meeting is open.
 * Everything below is scoped to `[data-host="switcher"]` so the landing's own
 * rules are the defaults and this is the exception, not a second copy. */

.mt-switcher {
	position: absolute;
	z-index: 40;
	top: 100%;
	left: 0;
	width: min(420px, calc(100vw - 32px));
	margin-top: -4px;
	padding: 12px 12px 6px;
	border: 1px solid var(--line);
	border-radius: 16px;
	background: var(--paper);
	box-shadow: 0 18px 44px #0f231a24;
}

:root[data-theme="dark"] .mt-switcher { box-shadow: 0 18px 44px #00000066; }

.mt-lib[data-host="switcher"] { display: flex; flex-direction: column; max-height: min(66vh, 520px); }
.mt-lib[data-host="switcher"] .mt-stream {
	flex: 1 1 auto;
	min-height: 0;
	overflow-y: auto;
	overscroll-behavior: contain;
}

/* Compact rows: this is a jump list, not the library page. */
.mt-lib[data-host="switcher"] .mt-entry {
	grid-template-columns: minmax(0, 1fr);
	gap: 3px;
	padding: 9px 9px;
}

.mt-lib[data-host="switcher"] .mt-entry b { font-size: 13px; }
.mt-lib[data-host="switcher"] .mt-entry-when,
.mt-lib[data-host="switcher"] .mt-entry-status { font-size: 11px; }
.mt-lib[data-host="switcher"] .mt-entry-status { justify-self: start; font-weight: 600; }
.mt-lib[data-host="switcher"] .mt-stream-label { padding-top: 10px; }
.mt-lib[data-host="switcher"] .mt-lib-note { padding: 12px 6px 16px; }

/* -------------------------------------------------------------- detail -- */

.mt-detail { min-width: 0; overflow: hidden; }

.mt-detail-top { padding: 18px 21px 14px; border-bottom: 1px solid var(--line); }

.mt-title-row { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; }
.mt-title-block { min-width: 0; }

.mt-title {
	font-size: 28px;
	line-height: 1.03;
	letter-spacing: -0.05em;
	cursor: text;
	border-radius: 8px;
}

.mt-title:hover { background: var(--silver); box-shadow: 0 0 0 5px var(--silver); }

.mt-title-input {
	width: 100%;
	padding: 4px 8px;
	border: 1px solid var(--aqua);
	border-radius: 9px;
	background: var(--paper);
	color: var(--ink);
	font-size: 26px;
	font-weight: 750;
	letter-spacing: -0.05em;
	outline: 0;
}

.mt-meta {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 7px;
	margin-top: 8px;
	color: var(--ink-soft);
	font-size: 12px;
}

.mt-sep { color: var(--line); }

.mt-stack { display: flex; }

.mt-stack span {
	display: grid;
	place-items: center;
	width: 22px;
	height: 22px;
	margin-left: -5px;
	border: 2px solid var(--paper);
	border-radius: 50%;
	background: var(--aqua-soft);
	color: var(--aqua-deep);
	font-size: 9px;
	font-weight: 850;
}

.mt-stack span:first-child { margin-left: 0; }

.mt-top-actions { display: flex; flex-wrap: wrap; gap: 7px; flex: none; }
.mt-top-actions .os-btn { min-height: 32px; padding: 0 11px; font-size: 12px; }

.mt-share-row {
	display: flex;
	align-items: center;
	flex-wrap: wrap;
	gap: 8px;
	margin-top: 12px;
	padding: 10px 11px;
	border: 1px solid var(--aqua-line);
	border-radius: 12px;
	background: var(--aqua-soft);
}

.mt-share-row input {
	flex: 1 1 240px;
	min-width: 0;
	padding: 7px 9px;
	border: 1px solid var(--aqua-line);
	border-radius: 8px;
	background: var(--paper);
	color: var(--ink);
	font-size: 12px;
}

/* The processing strip: visible, compact, never the whole page. */
.mt-strip {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 10px 21px;
	border-bottom: 1px solid var(--line);
	background: var(--paper-soft);
	color: var(--ink-soft);
	font-size: 11px;
}

.mt-strip strong { color: var(--ink); font-size: 11px; font-weight: 850; }
.mt-strip.failed { background: var(--coral-soft); color: var(--coral-deep); }
.mt-strip.failed strong { color: var(--coral-deep); }

.mt-strip-btn {
	margin-left: auto;
	padding: 0;
	border: 0;
	background: transparent;
	color: var(--aqua-deep);
	font-size: 11px;
	font-weight: 850;
	white-space: nowrap;
}

.mt-strip.failed .mt-strip-btn { color: var(--coral-deep); }

.mt-tabs {
	display: flex;
	gap: 2px;
	padding: 10px 15px 0;
	border-bottom: 1px solid var(--line);
	overflow-x: auto;
}

.mt-tabs button {
	flex: none;
	padding: 0 9px 10px;
	border: 0;
	border-bottom: 2px solid transparent;
	background: transparent;
	color: var(--muted);
	font-size: 12px;
	font-weight: 820;
}

.mt-tabs button.active { color: var(--ink); border-bottom-color: var(--aqua); }
.mt-tabs button span[data-count]:not(:empty) { color: var(--aqua-deep); }

.mt-view { display: none; padding: 17px 20px 22px; }
.mt-view.active { display: block; }

.mt-section-head {
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
	gap: 12px;
	margin: 4px 0 10px;
}

.mt-section-head h3 { font-size: 16px; letter-spacing: -0.035em; }
.mt-hint { display: block; color: var(--muted); font-size: 11px; line-height: 1.4; }

.mt-card {
	padding: 14px;
	border: 1px solid var(--line);
	border-radius: 13px;
	background: var(--paper);
}

.mt-card + .mt-card { margin-top: 12px; }
.mt-card h3 { font-size: 15px; letter-spacing: -0.03em; }
.mt-soft { background: var(--paper-soft); }

.mt-empty-note {
	padding: 13px;
	border: 1px dashed var(--line);
	border-radius: 11px;
	background: var(--paper-soft);
	color: var(--ink-soft);
	font-size: 12px;
	line-height: 1.45;
}

/* --------------------------------------------------------------- brief -- */

.mt-brief { color: var(--ink); font-size: 13.5px; line-height: 1.6; }

/* The panel is full width; the READING column is not. Across 1300px a brief's
 * paragraphs ran ~190 characters per line — the eye loses its place returning
 * to the next line. Prose and headings cap at a normal measure; tables, code
 * and images keep the whole width, because that is where the room helps. */
.mt-brief > p,
.mt-brief > ul,
.mt-brief > ol,
.mt-brief > blockquote,
.mt-brief > h1,
.mt-brief > h2,
.mt-brief > h3,
.mt-brief > h4 { max-width: 78ch; }
.mt-brief h1 { font-size: 22px; margin: 22px 0 8px; letter-spacing: -0.045em; }
.mt-brief h1:first-child { margin-top: 0; }
.mt-brief h2 { font-size: 18px; margin: 22px 0 7px; letter-spacing: -0.04em; }
.mt-brief h3 { font-size: 15px; margin: 18px 0 6px; }
.mt-brief h4 {
	margin: 16px 0 7px;
	color: var(--muted);
	font-size: 11px;
	font-weight: 850;
	letter-spacing: 0.06em;
	text-transform: uppercase;
}
.mt-brief p { margin: 8px 0; color: var(--ink-soft); }
.mt-brief strong { color: var(--ink); font-weight: 800; }
.mt-brief ul, .mt-brief ol { margin: 8px 0 12px; padding-left: 20px; }
.mt-brief li { margin: 5px 0; color: var(--ink-soft); }
.mt-brief li b, .mt-brief li strong { color: var(--ink); }
.mt-brief code {
	padding: 1px 5px;
	border-radius: 4px;
	background: var(--silver);
	font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
	font-size: 0.92em;
}
.mt-brief pre {
	margin: 10px 0;
	padding: 11px 12px;
	border: 1px solid var(--line);
	border-radius: 10px;
	background: var(--paper-soft);
	overflow-x: auto;
}
.mt-brief pre code { padding: 0; background: none; }
.mt-brief blockquote {
	margin: 10px 0;
	padding: 8px 13px;
	border-left: 3px solid var(--aqua);
	background: var(--aqua-soft);
	color: var(--ink-soft);
}
.mt-brief hr { border: 0; border-top: 1px solid var(--line); margin: 20px 0; }
.mt-table-wrap { overflow-x: auto; margin: 12px 0; }
.mt-brief table { border-collapse: collapse; width: 100%; font-size: 12.5px; }
.mt-brief th, .mt-brief td {
	padding: 8px 10px;
	border-bottom: 1px solid var(--line);
	text-align: left;
	vertical-align: top;
}
.mt-brief th { background: var(--paper-soft); font-weight: 800; }

.mt-docs { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin-top: 16px; }
.mt-docs .mt-hint { display: inline; }

.mt-doc-link {
	padding: 5px 9px;
	border: 1px solid var(--line);
	border-radius: 8px;
	background: var(--paper-soft);
	color: var(--aqua-deep);
	font-size: 11px;
	font-weight: 800;
	text-decoration: none;
	white-space: nowrap;
}

.mt-doc-link:hover { border-color: var(--aqua-line); background: var(--aqua-soft); }

.mt-editor textarea {
	width: 100%;
	min-height: 55vh;
	margin-top: 8px;
	padding: 12px;
	border: 1px solid var(--line);
	border-radius: 10px;
	background: var(--paper-soft);
	color: var(--ink);
	font: 13px/1.6 ui-monospace, SFMono-Regular, Menlo, monospace;
	resize: vertical;
	outline: 0;
}

.mt-editor-actions { display: flex; align-items: center; gap: 8px; margin-top: 10px; flex-wrap: wrap; }
.mt-editor-actions .mt-hint { display: inline; }

/* ------------------------------------------------------------- actions -- */

.mt-action {
	display: grid;
	grid-template-columns: 24px minmax(0, 1fr);
	gap: 11px;
	align-items: start;
	padding: 12px 2px;
	border-top: 1px solid var(--line);
}

.mt-action:first-child { border-top: 0; }
.mt-action-body { min-width: 0; }
.mt-action-body > .mt-edit:first-child { font-size: 13px; font-weight: 750; }
.mt-action-meta { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; margin-top: 3px; font-size: 11px; }

.mt-check {
	display: grid;
	place-items: center;
	width: 22px;
	height: 22px;
	margin-top: 1px;
	padding: 0;
	border: 1.5px solid var(--line);
	border-radius: 7px;
	background: var(--paper);
	color: #fff;
	font-size: 14px;
	font-weight: 850;
	line-height: 1;
}

.mt-check:hover { border-color: var(--aqua); box-shadow: 0 0 0 3px #00d8e01a; }
.mt-check.done { background: var(--lime-deep); border-color: var(--lime-deep); }

/* Click-to-edit: the value IS the affordance, with a dotted underline so it
 * reads as changeable rather than as plain text. */
.mt-edit {
	border-bottom: 1px dotted var(--muted);
	color: var(--ink-soft);
	cursor: text;
}

.mt-edit:hover { border-bottom-color: var(--aqua-deep); color: var(--aqua-deep); }
.mt-edit.empty { color: var(--muted); font-style: italic; }
.mt-edit.overdue { color: var(--coral-deep); font-weight: 800; }

.mt-edit-input {
	min-width: 120px;
	max-width: 100%;
	padding: 3px 6px;
	border: 1px solid var(--aqua);
	border-radius: 7px;
	background: var(--paper);
	color: var(--ink);
	font-size: 12px;
	outline: 0;
}

.mt-quote {
	display: block;
	margin-top: 6px;
	color: var(--muted);
	font-size: 11.5px;
	font-style: italic;
	line-height: 1.45;
}

/* ---------------------------------------------------------- transcript -- */

.mt-recording-head { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; margin-bottom: 8px; }
.mt-recording-head .mt-hint { display: inline; text-align: right; }
.mt-recording p { margin-bottom: 8px; }

.mt-speakers { display: flex; align-items: center; flex-wrap: wrap; gap: 7px; }

.mt-speaker {
	display: inline-flex;
	align-items: center;
	gap: 7px;
	padding: 6px 9px;
	border: 1px solid var(--line);
	border-radius: 999px;
	background: var(--paper-soft);
	font-size: 12px;
	cursor: pointer;
}

.mt-speaker b { font-weight: 750; }
.mt-speaker-role { color: var(--muted); font-size: 11px; }

.mt-speaker-x, .mt-ref-x {
	padding: 0 2px;
	border: 0;
	background: transparent;
	color: var(--muted);
	font-size: 14px;
	line-height: 1;
}

.mt-speaker-x:hover, .mt-ref-x:hover { color: var(--coral-deep); }

.mt-speaker-add {
	padding: 6px 10px;
	border: 1px dashed var(--line);
	border-radius: 999px;
	background: transparent;
	color: var(--ink-soft);
	font-size: 12px;
	font-weight: 750;
}

.mt-speaker-add:hover { border-color: var(--aqua); color: var(--aqua-deep); }

.mt-speaker-form { position: relative; display: inline-flex; gap: 5px; }

.mt-speaker-form input {
	width: 130px;
	padding: 6px 9px;
	border: 1px solid var(--aqua);
	border-radius: 9px;
	background: var(--paper);
	color: var(--ink);
	font-size: 12px;
	outline: 0;
}

.mt-suggest {
	position: absolute;
	top: calc(100% + 4px);
	left: 0;
	z-index: 20;
	width: 262px;
	max-height: 240px;
	overflow-y: auto;
	border: 1px solid var(--line);
	border-radius: 11px;
	background: var(--paper);
	box-shadow: var(--shadow);
}

.mt-suggest-row {
	display: block;
	width: 100%;
	padding: 8px 10px;
	border: 0;
	border-bottom: 1px solid var(--line-soft);
	background: transparent;
	color: var(--ink);
	text-align: left;
}

.mt-suggest-row:last-child { border-bottom: 0; }
/* The keyboard's place in the list reads exactly like the mouse's — one look,
 * one meaning. (Arrow keys set .is-active; Enter takes that person.) */
.mt-suggest-row:hover, .mt-suggest-row.is-active { background: var(--silver); }
.mt-suggest-row b { display: block; font-size: 12px; font-weight: 750; }
.mt-suggest-row span { display: block; color: var(--muted); font-size: 11px; }

/* ------------------------------------------------------------- context -- */

.mt-context-grid { display: grid; grid-template-columns: minmax(0, 1fr) 250px; gap: 14px; align-items: start; }

.mt-ref { padding: 11px 0; border-top: 1px solid var(--line); }
.mt-ref:first-child { border-top: 0; padding-top: 2px; }
.mt-ref-row { display: flex; align-items: center; gap: 10px; }
.mt-ref-body { min-width: 0; flex: 1; }
.mt-ref-body b { display: block; font-size: 12px; font-weight: 750; }
.mt-ref-body span { display: block; color: var(--muted); font-size: 11px; }

.mt-ref-icon {
	display: grid;
	place-items: center;
	flex: none;
	width: 34px;
	height: 30px;
	border-radius: 8px;
	background: var(--aqua-soft);
	color: var(--aqua-deep);
	font-size: 9px;
	font-weight: 850;
	letter-spacing: 0.04em;
}

.mt-ref-focus { display: flex; align-items: baseline; gap: 6px; margin: 7px 0 0 44px; font-size: 11px; }
.mt-ref-focus .mt-hint { display: inline; flex: none; }

.mt-focus-input {
	width: 100%;
	padding: 7px 9px;
	border: 1px solid var(--aqua);
	border-radius: 9px;
	background: var(--paper);
	color: var(--ink);
	font: inherit;
	font-size: 11.5px;
	resize: vertical;
	outline: 0;
}

.mt-card textarea:not(.mt-focus-input) {
	width: 100%;
	min-height: 76px;
	margin-top: 9px;
	padding: 9px 10px;
	border: 1px solid var(--line);
	border-radius: 10px;
	background: var(--paper);
	color: var(--ink);
	font: inherit;
	font-size: 12px;
	resize: vertical;
	outline: 0;
}

.mt-card textarea:focus { border-color: var(--aqua); box-shadow: 0 0 0 3px #00d8e01c; }
.mt-card .os-btn { margin-top: 9px; }

.mt-radio { display: flex; align-items: center; gap: 7px; margin-top: 8px; color: var(--ink-soft); font-size: 12px; }
.mt-radio input { accent-color: var(--aqua-deep); }

/* ------------------------------------------------------------- improve -- */

.mt-improve-grid { display: grid; grid-template-columns: minmax(0, 1.1fr) minmax(0, 0.9fr); gap: 14px; align-items: start; }
.mt-improve-grid > .mt-card + .mt-card { margin-top: 0; }
.mt-improve-grid > .mt-card:first-child { grid-row: span 2; }

.mt-corr-history { max-height: 260px; overflow-y: auto; margin-top: 10px; display: grid; gap: 8px; }

.mt-corr-turn {
	padding: 9px 11px;
	border: 1px solid var(--line);
	border-radius: 11px;
	background: var(--paper-soft);
	font-size: 12px;
	line-height: 1.5;
}

.mt-corr-turn p { white-space: pre-wrap; }
.mt-corr-turn.you { background: var(--silver); }
.mt-corr-turn.lime, .mt-corr-turn.lumi { border-color: var(--aqua-line); background: var(--aqua-soft); }

.mt-proposal {
	margin-top: 11px;
	padding: 11px;
	border: 1px solid var(--aqua-line);
	border-radius: 12px;
	background: var(--aqua-soft);
}

.mt-proposal b { font-size: 12px; }

.mt-proposal pre {
	max-height: 220px;
	margin: 8px 0;
	padding: 9px;
	overflow: auto;
	border: 1px solid var(--aqua-line);
	border-radius: 9px;
	background: var(--paper);
	color: var(--ink-soft);
	font: 11.5px/1.5 ui-monospace, SFMono-Regular, Menlo, monospace;
	white-space: pre-wrap;
}

.mt-proposal ul { margin: 0; padding-left: 18px; font-size: 12px; color: var(--ink-soft); }
.mt-proposal li { margin: 4px 0; }

.mt-repair {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
	padding: 12px 0;
	border-top: 1px solid var(--line);
}

.mt-repair:first-of-type { border-top: 0; }
.mt-repair b { display: block; font-size: 12px; font-weight: 750; }
.mt-repair .os-btn { margin-top: 0; flex: none; }
.mt-repair-stack { display: block; }
.mt-repair-stack .mt-hint { margin-bottom: 8px; }
.mt-danger b { color: var(--coral-deep); }

.mt-btn-coral { background: var(--coral-soft); border-color: var(--coral-line); color: var(--coral-deep); }

.mt-gf-row { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; }
.mt-gf-row input {
	flex: 1 1 110px;
	min-width: 0;
	padding: 7px 9px;
	border: 1px solid var(--line);
	border-radius: 9px;
	background: var(--paper);
	color: var(--ink);
	font-size: 12px;
	outline: 0;
}
.mt-gf-row input:focus { border-color: var(--aqua); }
.mt-gf-row .mt-hint { display: inline; flex: none; }
.mt-gf-row .os-btn { margin-top: 0; }

.mt-reprocess { display: flex; flex-wrap: wrap; gap: 7px; }
.mt-reprocess .os-btn { margin-top: 0; }

.mt-step { display: flex; align-items: center; gap: 8px; padding: 6px 0; color: var(--muted); font-size: 11.5px; }
.mt-live-progress {
	display: grid;
	gap: 6px;
	margin: 2px 0 10px;
	padding: 10px;
	border: 1px solid var(--aqua-line);
	border-radius: 10px;
	background: var(--aqua-soft);
}
.mt-live-progress strong { color: var(--ink); font-size: 12px; }
.mt-live-detail { color: var(--ink-soft); font-size: 11.5px; }
.mt-progress-bar { width: 100%; height: 6px; accent-color: var(--aqua-deep); }
.mt-step i {
	display: grid;
	place-items: center;
	flex: none;
	width: 16px;
	height: 16px;
	border-radius: 50%;
	background: var(--silver);
	color: var(--muted);
	font-size: 10px;
	font-style: normal;
}
.mt-step.done { color: var(--ink-soft); }
.mt-step.done i { background: var(--lime-soft); color: var(--lime-deep); }

.mt-why { margin-top: 10px; font-size: 11.5px; color: var(--ink-soft); }
.mt-why summary { color: var(--aqua-deep); font-weight: 800; cursor: pointer; }
.mt-why p { margin-top: 6px; word-break: break-word; }

/* --------------------------------------------------------- toast/sheet -- */

.mt-toasts {
	position: fixed;
	top: 16px;
	right: 16px;
	z-index: 60;
	display: grid;
	gap: 8px;
	pointer-events: none;
}

.mt-toast {
	max-width: 340px;
	padding: 10px 13px;
	border: 1px solid var(--line);
	border-radius: 12px;
	background: var(--paper);
	color: var(--ink);
	font-size: 12.5px;
	line-height: 1.45;
	box-shadow: var(--shadow);
	opacity: 0;
	transform: translateY(-6px);
	transition: opacity 0.18s ease, transform 0.18s ease;
	pointer-events: auto;
}

.mt-toast.in { opacity: 1; transform: none; }
.mt-toast.success { border-color: var(--lime-line); background: var(--lime-soft); color: var(--lime-deep); }
.mt-toast.warn { border-color: var(--aqua-line); background: var(--aqua-soft); color: var(--aqua-deep); }
.mt-toast.error { border-color: var(--coral-line); background: var(--coral-soft); color: var(--coral-deep); }

.mt-scrim {
	position: fixed;
	inset: 0;
	z-index: 61;
	display: grid;
	place-items: center;
	padding: 20px;
	background: #0d130d59;
}

.mt-sheet {
	width: min(420px, 100%);
	padding: 20px;
	border: 1px solid var(--line);
	border-radius: 16px;
	background: var(--paper);
	box-shadow: var(--shadow);
}

.mt-sheet h3 { font-size: 17px; letter-spacing: -0.035em; }
.mt-sheet p { margin-top: 8px; color: var(--ink-soft); font-size: 13px; line-height: 1.5; }
.mt-sheet-actions { display: flex; justify-content: flex-end; gap: 8px; margin-top: 16px; }

/* ---------------------------------------------------------- narrow/touch --
 * The desktop model already is one pane at a time, so a phone changes almost
 * nothing here — which was the point of removing the second column. What is
 * left is the popover, which anchors to the screen instead of the breadcrumb
 * so it can be full-bleed. */

@media (max-width: 1080px) {
	.mt-context-grid, .mt-improve-grid { grid-template-columns: minmax(0, 1fr); }
	.mt-improve-grid > .mt-card:first-child { grid-row: auto; }
}

@media (max-width: 900px) {
	.mt-landing { padding: 14px 14px 6px; }
	.mt-library-head { align-items: flex-start; }
	.mt-library-head h2 { font-size: 22px; }
	/* Name over state: 390px cannot hold both on one line honestly. */
	.mt-entry { grid-template-columns: minmax(0, 1fr); gap: 4px; }
	.mt-entry-status { justify-self: start; }

	/* Full-bleed, but still hanging off the breadcrumb. A fixed panel pinned
	 * near the top of the screen covered the ▾ that opened it — and a phone has
	 * no Escape key, so the trigger has to stay reachable to close it again. */
	.mt-switcher {
		left: 0;
		right: 0;
		width: auto;
		padding: 10px 10px 4px;
	}

	.mt-lib[data-host="switcher"] { max-height: min(70vh, 460px); }
	.mt-title-row { flex-direction: column; }
	.mt-top-actions { width: 100%; }
	.mt-view { padding: 15px 15px 20px; }
	.mt-detail-top { padding: 15px 15px 13px; }
	/* Five tabs measured 387px inside a 356px strip at 390px wide, so "Improve"
	 * was sliced in half — while the empty-brief copy says "Try again from
	 * Improve." overflow-x:auto made it reachable, not visible. Tighter gutters
	 * fit all five (real-data pass, 2026-07-27). */
	.mt-tabs { padding: 10px 8px 0; }
	.mt-tabs button { padding: 0 5px 10px; }
	.mt-strip { padding: 10px 15px; flex-wrap: wrap; }
	.mt-strip-btn { margin-left: 0; }
	.mt-title { font-size: 24px; }
	.mt-speaker-form { flex-wrap: wrap; }
	.mt-speaker-form input { width: 100%; }
	.mt-suggest { width: 100%; }
	.mt-toasts { left: 12px; right: 12px; }
	.mt-toast { max-width: none; }
}

/* ── meetings: thumb-sized targets (lane M, real-data pass 2026-07-27) ──
 * A link-styled button carries padding:0, so on a phone "Try again" — the only
 * way to rescue a meeting that didn't finish — was 16px tall. The padding grows
 * the hit area and an equal negative margin keeps the layout where the design
 * put it, so nothing on screen moves. (The old "‹ All meetings" button this
 * also covered is gone: the breadcrumb is the way back now, and its buttons
 * carry real padding of their own.) */
@media (hover: none) {
	.mt-crumb-home, .mt-crumb-switch { padding-top: 9px; padding-bottom: 9px; }
	.mt-strip-btn { padding: 14px 6px; margin: -14px -6px; }
}

/* ────────────────────────────────────────── meeting media (lane F) ── *
 * The Transcript tab's two live pieces: a small player for the recording and
 * the speaker rows you can search. Authored from the approved prototype's
 * `.audio-player` / `.transcript-row` block, on the tokens above so both
 * themes come out of the same rules. Append-only section — this lane touches
 * nothing else in this file (docs/V2-DELIVERY-WORKFLOW.md).
 */

.mt-player {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 9px 11px;
	border: 1px solid var(--line);
	border-radius: 11px;
	background: var(--paper-soft);
}

.mt-play {
	flex: none;
	width: 34px;
	height: 34px;
	border: 1px solid var(--aqua-line);
	border-radius: 999px;
	background: var(--aqua-soft);
	color: var(--aqua-deep);
	font-size: 12px;
	line-height: 1;
	cursor: pointer;
}

.mt-play:disabled, .mt-speed:disabled { opacity: 0.45; cursor: default; }
.mt-play:not(:disabled):hover { border-color: var(--aqua); }

.mt-seek {
	flex: 1;
	min-width: 0;
	height: 4px;
	appearance: none;
	border-radius: 999px;
	background: var(--line);
	cursor: pointer;
}

.mt-seek::-webkit-slider-thumb {
	appearance: none;
	width: 13px;
	height: 13px;
	border: 0;
	border-radius: 999px;
	background: var(--aqua-deep);
	cursor: pointer;
}

.mt-seek::-moz-range-thumb {
	width: 13px;
	height: 13px;
	border: 0;
	border-radius: 999px;
	background: var(--aqua-deep);
	cursor: pointer;
}

.mt-seek:disabled { opacity: 0.5; cursor: default; }

.mt-player-time {
	flex: none;
	color: var(--muted);
	font-size: 11px;
	font-variant-numeric: tabular-nums;
	font-weight: 700;
}

.mt-speed {
	flex: none;
	padding: 4px 8px;
	border: 1px solid var(--line);
	border-radius: 8px;
	background: var(--paper);
	color: var(--ink-soft);
	font-size: 11px;
	font-weight: 800;
	cursor: pointer;
}

.mt-player-note { margin-top: 8px; }
.mt-player-docs:not(:empty) { margin-top: 9px; }

/* ------------------------------------------------------- find in words -- */

.mt-tsearch {
	display: flex;
	align-items: center;
	gap: 8px;
	margin: 11px 0 4px;
}

.mt-tsearch input {
	flex: 1;
	min-width: 0;
	padding: 8px 11px;
	border: 1px solid var(--line);
	border-radius: 10px;
	background: var(--paper);
	color: var(--ink);
	font: inherit;
	font-size: 12px;
}

.mt-tsearch input:focus {
	border-color: var(--aqua);
	box-shadow: 0 0 0 3px #00d8e01c;
	outline: 0;
}

.mt-tsearch-count {
	flex: none;
	color: var(--muted);
	font-size: 11px;
	font-weight: 700;
}

.mt-tsearch-next {
	flex: none;
	border: 0;
	background: transparent;
	color: var(--aqua-deep);
	font-size: 11px;
	font-weight: 800;
	cursor: pointer;
}

.mt-tsearch-next:disabled { color: var(--muted); cursor: default; }

/* ---------------------------------------------------------- the words -- */

.mt-transcript-card .mt-transcript-status { margin-top: 4px; }

.mt-trow {
	display: grid;
	grid-template-columns: 52px minmax(0, 1fr);
	gap: 10px;
	padding: 11px 0;
	border-top: 1px solid var(--line-soft);
}

.mt-trow:first-child { border-top: 0; }

/* No timestamps in the document → no clock column (see meetings-media.js). */
.mt-transcript.no-times .mt-trow { grid-template-columns: minmax(0, 1fr); }
.mt-transcript.no-times .mt-trow-at { display: none; }

.mt-trow-at {
	padding-top: 2px;
	color: var(--muted);
	font-size: 10px;
	font-weight: 800;
}

.mt-trow-at.seekable { color: var(--aqua-deep); cursor: pointer; }
.mt-trow-at.seekable:hover { text-decoration: underline; }
.mt-trow b { font-size: 12px; font-weight: 750; }

.mt-trow p {
	margin-top: 3px;
	color: var(--ink-soft);
	font-size: 12.5px;
	line-height: 1.5;
}

.mt-trow mark {
	border-radius: 3px;
	background: var(--lime-soft);
	color: var(--ink);
}

.mt-trow.hit { background: var(--aqua-soft); border-radius: 9px; }
.mt-trow.hit, .mt-trow.current { padding-left: 8px; padding-right: 8px; margin: 0 -8px; }
.mt-trow.current { box-shadow: inset 0 0 0 1px var(--aqua-line); }

.mt-transcript-plain {
	color: var(--ink-soft);
	font-size: 12.5px;
	line-height: 1.55;
	white-space: pre-wrap;
}

.mt-transcript-plain mark { border-radius: 3px; background: var(--lime-soft); color: var(--ink); }

@media (max-width: 900px) {
	.mt-player { flex-wrap: wrap; }
	.mt-seek { order: 3; flex-basis: 100%; }
	.mt-trow { grid-template-columns: 44px minmax(0, 1fr); }
	.mt-tsearch { flex-wrap: wrap; }
	.mt-tsearch input { flex-basis: 100%; }
}

/* ────────────────────────────────────── tracks plan (lane G — 1b/1c) ── *
 * The Plan tab's timeline, the plan editors, and the hierarchy lens on the
 * Actions tab. Everything here is token-driven so both themes come free; the
 * grid is ONE CSS grid (column 1 = the workstream, columns 2..n+1 = the phases)
 * so the header, the row labels and the initiative bars cannot drift apart. */

.trk-plan { overflow: hidden; }

/* The timeline is the only thing that scrolls sideways — never the page. */
.trk-plan-scroll {
	overflow-x: auto;
	overflow-y: hidden;
	padding: 0 0 4px;
	-webkit-overflow-scrolling: touch;
}

.trk-grid {
	display: grid;
	grid-template-columns: 168px repeat(var(--phases), minmax(150px, 1fr));
	align-items: stretch;
	min-width: max-content;
	row-gap: 8px;
	padding: 0 18px 16px;
}

.trk-corner {
	position: sticky;
	left: 0;
	z-index: 3;
	display: flex;
	align-items: flex-end;
	padding: 12px 12px 9px 0;
	background: var(--paper);
	font-size: 11px;
	font-weight: 850;
	letter-spacing: 0.04em;
	text-transform: uppercase;
	color: var(--muted);
}

.trk-phase {
	padding: 12px 12px 9px;
	border-bottom: 1px solid var(--line);
}

.trk-phase b { display: block; font-size: 12.5px; font-weight: 850; letter-spacing: -0.01em; overflow-wrap: anywhere; }
.trk-phase span { display: block; margin-top: 2px; font-size: 10.5px; font-weight: 800; color: var(--lime-deep); }
.trk-phase.is-now { border-bottom-color: var(--lime-deep); }

/* The column washes sit under the bars and draw the phase boundaries. */
.trk-col { border-left: 1px dashed var(--line); pointer-events: none; }
.trk-col.is-now { background: var(--lime-soft); border-left-color: var(--lime-line); }

.trk-ws {
	position: sticky;
	left: 0;
	z-index: 2;
	display: flex;
	flex-direction: column;
	justify-content: center;
	gap: 2px;
	padding: 8px 12px 8px 0;
	background: var(--paper);
	border-top: 1px solid var(--line-soft);
}

.trk-ws b { font-size: 12.5px; font-weight: 800; overflow-wrap: anywhere; }
.trk-ws span { font-size: 10.5px; color: var(--muted); }

.trk-lane-empty {
	display: flex;
	align-items: center;
	padding: 8px 6px;
	border-top: 1px solid var(--line-soft);
	font-size: 11.5px;
	color: var(--muted);
}

.trk-lane-add {
	border: 1px dashed var(--line);
	border-radius: 10px;
	background: transparent;
	color: var(--muted);
	min-height: 34px;
	padding: 0 11px;
	font-size: 11.5px;
	font-weight: 750;
}

.trk-lane-add:hover { border-color: var(--lime-line); background: var(--lime-soft); color: var(--lime-deep); }

/* ------------------------------------------------------ initiative bars -- */

.trk-init {
	position: relative;
	z-index: 1;
	display: flex;
	align-items: center;
	min-height: 44px;
	margin: 2px 5px;
	padding: 7px 13px;
	border: 1px solid var(--aqua-line);
	border-radius: 12px;
	background: var(--aqua-soft);
	color: var(--ink);
	text-align: left;
	touch-action: pan-x;
	transition: box-shadow 0.14s ease, border-color 0.14s ease;
}

.trk-init:hover { border-color: var(--aqua); box-shadow: var(--shadow-soft); }
.trk-init.is-open { border-color: var(--aqua-deep); box-shadow: 0 0 0 3px #00d8e01f; }
.trk-init.is-dragging { opacity: 0.85; box-shadow: var(--shadow); cursor: grabbing; }

.trk-init-body { min-width: 0; }
.trk-init-body b { display: block; font-size: 12.5px; font-weight: 800; overflow-wrap: anywhere; }
.trk-init-body span { display: block; margin-top: 2px; font-size: 10.5px; color: var(--ink-soft); overflow-wrap: anywhere; }

/* Edge grips: only meaningful with a fine pointer, so they are hidden where
 * drag is not offered at all (the forms are the fallback there). */
.trk-init-grip {
	position: absolute;
	top: 4px;
	bottom: 4px;
	width: 12px;
	border-radius: 8px;
	cursor: ew-resize;
}

.trk-init-grip.start { left: 1px; }
.trk-init-grip.end { right: 1px; }
.trk-init:hover .trk-init-grip { background: var(--aqua-line); }

/* --------------------------------------------- the open initiative's work -- */

.trk-init-detail { border-top: 1px solid var(--line); padding-bottom: 6px; }

.trk-init-head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
	flex-wrap: wrap;
	padding: 13px 18px;
	background: var(--paper-soft);
}

.trk-init-head b { font-size: 13.5px; }
.trk-init-head > div > span { display: block; margin-top: 2px; font-size: 11.5px; color: var(--muted); }
.trk-init-detail > .trk-fine { padding: 14px 18px; margin: 0; }

/* --------------------------------------------------- the hierarchy lens -- */

.trk-sub-head {
	display: flex;
	align-items: baseline;
	gap: 8px;
	flex-wrap: wrap;
	padding: 9px 18px 7px 30px;
	border-top: 1px solid var(--line-soft);
}

.trk-sub-head b { font-size: 12px; font-weight: 800; }
.trk-sub-head span { font-size: 10.5px; color: var(--muted); }

.trk-a-right { display: flex; align-items: center; gap: 8px; justify-content: flex-end; }
.trk-src.small { margin-top: 4px; padding: 3px 7px; font-size: 10.5px; }
/* Where work came FROM matters; "someone typed it in" is only context, so the
 * meeting chip keeps the accent and the by-hand one steps back. */
.trk-src.hand { border-color: var(--line); background: var(--silver); color: var(--muted); }
.trk-action-row .trk-src.small { display: inline-flex; }

/* --------------------------------------------------------- plan editors -- */

.trk-editor { display: grid; gap: 6px; padding-bottom: 4px; }
.trk-editor > b { font-size: 13px; }
.trk-editor > .trk-fine { margin: -2px 0 4px; }
.trk-editor > .os-btn { justify-self: start; }
.trk-editor-rows { display: grid; gap: 6px; }

.trk-editor-row { display: grid; grid-template-columns: minmax(0, 1fr) 34px 34px 34px; gap: 5px; }

.trk-move {
	min-height: 38px;
	border: 1px solid var(--line);
	border-radius: 9px;
	background: var(--paper-soft);
	color: var(--ink-soft);
	font-size: 13px;
	font-weight: 800;
}

.trk-move:hover { background: var(--silver); }
.trk-move.danger:hover { background: var(--coral-soft); border-color: var(--coral-line); color: var(--coral-deep); }

.trk-warn {
	margin: 2px 0 0;
	padding: 10px 12px;
	border: 1px solid var(--coral-line);
	border-radius: 11px;
	background: var(--coral-soft);
	color: var(--coral-deep);
	font-size: 12px;
	line-height: 1.45;
}

/* ------------------------------------------------------------ responsive -- */

@media (max-width: 760px) {
	.trk-grid { grid-template-columns: 132px repeat(var(--phases), minmax(132px, 1fr)); padding: 0 14px 14px; }
	.trk-init-head { padding: 12px 14px; }
	.trk-sub-head { padding-left: 22px; }
	.trk-init-detail > .trk-fine { padding: 12px 14px; }
	.trk-action-row { grid-template-columns: 24px minmax(0, 1fr); }
	.trk-a-right { grid-column: 1 / -1; justify-content: flex-start; padding-left: 36px; }
	.trk-editor-row { grid-template-columns: minmax(0, 1fr) 40px 40px 40px; }
}

/* Touch: the forms are the whole story here (Decision D3), so nothing hints at
 * a drag, and every target is thumb-sized. */
@media (hover: none) {
	.trk-init-grip { display: none; }
	.trk-init { min-height: 52px; }
	.trk-move { min-height: 44px; }
	.trk-lane-add { min-height: 44px; }
}


/* ══════════════════════════════ business · people · me (lane K) ══════════════
 *
 * The three secondary destinations, forked from V1's dashboard, leave and
 * settings pages into the V2 visual language. One local token first: the
 * palette is lime / aqua / coral, and none of them means "watch this, but it
 * is not an intervention" — which is exactly what an amber exception or an
 * optional-holiday accent is. Authored in both themes like everything else.
 */

:root,
html[data-theme="light"] {
	--amber: #f5ad3f;
	--amber-deep: #a86c05;
	--amber-soft: #fff6e6;
	--amber-line: #f2ddb4;
}

html[data-theme="dark"] {
	--amber: #f0b757;
	--amber-deep: #f5c877;
	--amber-soft: #2c2214;
	--amber-line: #4a3a1d;
}

/* ═══════════════════════════════════════════════════════════════ Business ══
 * Exceptions first, then the numbers this person may see. Every rule here is
 * presentation only — what is shown, and how fresh it is, is the server's. */

.biz-layout {
	display: grid;
	grid-template-columns: minmax(0, 1.45fr) minmax(270px, 0.55fr);
	gap: 16px;
	align-items: start;
}

.biz-layout.is-loading { opacity: 0.55; }

/* The left column stacks whatever is on screen: the live-tile Overview, or a
 * published Mission Control view's blocks. Only one of the two is ever shown. */
.biz-main { display: grid; gap: 16px; min-width: 0; }

.biz-overview { overflow: hidden; }
.biz-sec-head { padding: 17px 20px 12px; }

.biz-flash {
	margin: 0 20px 12px;
	padding: 9px 11px;
	border: 1px solid var(--amber-line);
	border-radius: 10px;
	background: var(--amber-soft);
	color: var(--amber-deep);
	font-size: 12.5px;
	font-weight: 750;
}

#biz-note.is-tappable { cursor: pointer; text-decoration: underline; }

/* ----------------------------------------------------------- exceptions -- */

.biz-exc {
	display: grid;
	grid-template-columns: 8px minmax(0, 1fr) auto;
	gap: 11px;
	align-items: center;
	padding: 12px 20px;
	border-top: 1px solid var(--line);
	color: inherit;
	text-decoration: none;
}

.biz-exc i { height: 28px; border-radius: 7px; background: var(--coral); }
.biz-exc.is-amber i { background: var(--amber); }
.biz-exc b { font-size: 13px; font-weight: 750; line-height: 1.35; }
.biz-exc-go { color: var(--aqua-deep); font-size: 12px; font-weight: 800; white-space: nowrap; }
a.biz-exc:hover { background: var(--paper-soft); }

/* ---------------------------------------------------------------- tiles -- */

.biz-grid {
	display: grid;
	grid-template-columns: repeat(3, 1fr);
	border-top: 1px solid var(--line);
}

.biz-kpi {
	position: relative;
	min-height: 140px;
	padding: 15px 17px 34px;
	border-right: 1px solid var(--line);
	color: inherit;
	text-decoration: none;
}

.biz-kpi:nth-child(3n) { border-right: 0; }
.biz-kpi:nth-child(n + 4) { border-top: 1px solid var(--line); }
a.biz-kpi:hover { background: var(--paper-soft); }

.biz-kpi-label {
	display: flex;
	align-items: center;
	gap: 6px;
	font-size: 11px;
	font-weight: 850;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--muted);
}

.biz-kpi-tag {
	padding: 1px 6px;
	border-radius: 999px;
	background: var(--silver);
	color: var(--ink-soft);
	font-size: 9.5px;
	letter-spacing: 0.06em;
}

.biz-kpi-value {
	margin: 9px 0 5px;
	font-size: 28px;
	font-weight: 850;
	letter-spacing: -0.06em;
	line-height: 1.05;
}

.biz-kpi.is-unavailable .biz-kpi-value { color: var(--muted); font-size: 19px; }
.biz-kpi.is-unavailable { background: var(--paper-soft); }

.biz-kpi-note,
.biz-kpi-sub {
	font-size: 11px;
	color: var(--ink-soft);
	line-height: 1.4;
}

.biz-kpi-sub {
	position: absolute;
	left: 17px;
	right: 17px;
	bottom: 12px;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

.biz-kpi-sub.is-stale { color: var(--amber-deep); font-weight: 750; }

.biz-delta { font-size: 11px; font-weight: 800; color: var(--ink-soft); }
.biz-delta.is-good { color: var(--lime-deep); }
.biz-delta.is-bad { color: var(--coral-deep); }

.biz-spark {
	display: block;
	width: 100%;
	height: 30px;
	margin-top: 8px;
	overflow: visible;
}

/* A sparkline is a one-series chart, so it takes chart slot 1 — the same hue
 * the first series of every graph on the page takes. */
.biz-spark polyline { fill: none; stroke: var(--viz-1); stroke-width: 1.6; vector-effect: non-scaling-stroke; }
.biz-spark .spark-area { fill: var(--viz-soft); stroke: none; }
.biz-spark .spark-dot { fill: var(--viz-1); stroke: var(--paper); stroke-width: 1.4; }

.biz-kpi-rows { margin-top: 8px; display: grid; gap: 3px; }

.biz-kpi-row {
	display: flex;
	align-items: baseline;
	gap: 8px;
	font-size: 11.5px;
	color: var(--ink-soft);
}

.biz-kpi-row-k { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.biz-kpi-row-v { white-space: nowrap; color: var(--ink); }
.biz-kpi-row-pct { color: var(--muted); font-weight: 600; }

/* The Mission Control feed's own accent, whitelisted server-side to these four
 * and re-checked in business.js before it becomes a class. */
.biz-kpi-acc-red { box-shadow: inset 3px 0 0 var(--coral); }
.biz-kpi-acc-amber { box-shadow: inset 3px 0 0 var(--amber); }
.biz-kpi-acc-green { box-shadow: inset 3px 0 0 var(--lime-deep); }
.biz-kpi-acc-grey { box-shadow: inset 3px 0 0 var(--line); }

/* ------------------------------------------------------------ functions -- */

.biz-side-note { font-size: 12px; margin-top: 6px; }
.biz-side-note + div { margin-top: 12px; }

.biz-fn {
	display: flex;
	align-items: center;
	gap: 9px;
	width: 100%;
	padding: 10px 0;
	border: 0;
	border-top: 1px solid var(--line);
	background: transparent;
	color: var(--ink);
	font-size: 13px;
	font-weight: 750;
	text-align: left;
}

.biz-fn:first-child { border-top: 0; }
.biz-fn i { width: 8px; height: 8px; min-width: 8px; border-radius: 50%; background: var(--line); }
.biz-fn.is-active i { background: var(--aqua); }
.biz-fn.is-active { color: var(--aqua-deep); }
.biz-fn-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
.biz-fn-n { color: var(--muted); font-size: 11px; font-weight: 600; white-space: nowrap; }

.biz-nav-sec {
	margin: 16px 0 2px;
	font-size: 10px;
	font-weight: 850;
	letter-spacing: 0.11em;
	text-transform: uppercase;
	color: var(--muted);
}

.biz-nav-sec:first-child { margin-top: 4px; }
.biz-nav-sec + .biz-fn { border-top: 0; }
.biz-fn-n.is-stale { color: var(--amber-deep); font-weight: 800; }

/* ----------------------------------------------------- the freshness stamp --
 * A published Mission Control view is a snapshot of the run that produced it,
 * so it states BOTH the day its numbers describe and when the pipeline last
 * managed to publish. A view that stopped updating says so here and in the nav. */

.biz-stamp {
	display: flex;
	align-items: center;
	gap: 10px;
	flex-wrap: wrap;
	font-size: 11.5px;
	color: var(--ink-soft);
}

.biz-stamp b { font-weight: 800; color: var(--ink); }

.biz-stale-badge {
	padding: 2px 8px;
	border-radius: 999px;
	background: var(--amber-soft);
	color: var(--amber-deep);
	font-size: 10.5px;
	font-weight: 850;
	letter-spacing: 0.05em;
	text-transform: uppercase;
}

.biz-stamp-link { color: var(--aqua-deep); font-weight: 800; text-decoration: none; }
.biz-stamp-link:hover { text-decoration: underline; }
.biz-h1-sub { margin-top: 4px; max-width: 70ch; }

@media (max-width: 1050px) {
	.biz-layout { grid-template-columns: 1fr; }
	.biz-side { order: -1; }
}

@media (max-width: 760px) {
	.biz-grid { grid-template-columns: 1fr; }
	.biz-kpi, .biz-kpi:nth-child(3n) { border-right: 0; }
	.biz-kpi:nth-child(n + 2) { border-top: 1px solid var(--line); }
}

/* ═══════════════════════════════════════════ Mission Control views (.mcv) ══
 *
 * Mission Control's ~17 pages, published as documents of typed blocks and
 * rendered by js/business-blocks.js. Everything here is presentation for a
 * block TYPE — the document never names a colour, only a meaning, so a page
 * added on zion next month inherits this design with no CSS.
 *
 * The tone scale is the OS palette, not Mission Control's Apple blues. That
 * substitution is the difference between porting a product and embedding one. */

/* Mission Control's own rhythm, in the OS palette. Read side by side, MC wins on
 * four things and this section adopts all four:
 *
 *   1. The NUMBER carries the verdict. 74/100 is amber, 62% is green, ₹4.10 is
 *      red. A 3px accent bar beside a near-black number says the same thing an
 *      order of magnitude more quietly.
 *   2. Section titles are TITLES — 19px, semibold, sentence case. A 12px
 *      uppercase grey micro-label recedes, and a page of those has no spine.
 *   3. A finding is a TINTED PANEL, not a white row with a coloured tab.
 *      Severity is the whole card.
 *   4. One column, generous padding, bigger type. Two columns made everything
 *      narrow and busy — denser is not the same as better organised.
 */

.mcv {
	display: grid;
	grid-template-columns: minmax(0, 1fr);
	gap: 16px;
	align-items: start;
}

.mcv-block {
	grid-column: 1 / -1;
	min-width: 0;
	padding: 20px 22px 16px;
	border: 1px solid var(--line);
	border-radius: 18px;
	background: var(--paper);
	box-shadow: var(--shadow);
	overflow: hidden;
}

/* A publisher may still pair two genuinely small blocks. */
.mcv-block.is-half { grid-column: span 1; }
.mcv:has(> .is-half) { grid-template-columns: repeat(auto-fit, minmax(340px, 1fr)); }
.mcv-block.is-full { grid-column: 1 / -1; }

/* The opening strip is the answer the page exists to give — no box around it. */
.mcv-block.is-lead {
	padding: 0;
	border: 0;
	background: none;
	box-shadow: none;
	/* The card's overflow:hidden exists to keep content inside a rounded
	   corner. The lead strip has no card and no padding, so text sits flush at
	   x=0 and that same clip shaved the left side-bearing off the first glyph
	   of every line — "you" rendered as "ou". Nothing here needs clipping. */
	overflow: visible;
}

.mcv-block.is-lead .mcv-kpis { gap: 12px; }
.mcv-block.is-lead .mcv-kpi-value { font-size: 31px; }

.mcv-head { margin-bottom: 12px; }

.mcv-title {
	margin: 0;
	font-size: 19px;
	font-weight: 700;
	letter-spacing: -0.012em;
	color: var(--ink);
}

/* Several KPI groups under one title — "Efficiency: Meta / Search / YouTube"
 * was always one idea in three parts. */
.mcv-kpi-group { padding-bottom: 20px; }
.mcv-kpi-cols { display: grid; gap: 4px; }
.mcv-kpi-col + .mcv-kpi-col { margin-top: 12px; }

.mcv-kpi-col-t {
	margin: 0 0 8px;
	font-size: 15px;
	font-weight: 650;
	color: var(--ink);
}

.mcv-sub, .mcv-note {
	margin: 5px 0 0;
	font-size: 12px;
	line-height: 1.5;
	color: var(--ink-soft);
	max-width: 78ch;
}

.mcv-note { margin-top: 12px; color: var(--muted); }

/* ------------------------------------------------------------- the tones --
 * A MEANING scale — good, watch, bad, neutral — applied as a fill (bars), or a
 * text colour (table cells) depending on where it lands. Every value is an OS
 * token: a tone that had to invent its own hex was a tone carrying no meaning.
 *
 * `purple` and `teal` were exactly that. They existed only to give a chart
 * series a different colour, which is identity, not status — and identity now
 * has its own scale below. They stay legal on the wire (a publisher still sends
 * them) and simply read as neutral, so no view breaks and no off-brand hue
 * survives. */

.mcv-t-neutral { --mcv-c: var(--ink-soft); }
.mcv-t-blue    { --mcv-c: var(--aqua-deep); }
.mcv-t-green   { --mcv-c: var(--lime-deep); }
.mcv-t-amber   { --mcv-c: var(--amber-deep); }
.mcv-t-red     { --mcv-c: var(--coral-deep); }

td.mcv-t-blue, td.mcv-t-green,
td.mcv-t-amber, td.mcv-t-red { color: var(--mcv-c); font-weight: 750; }

/* ---------------------------------------------------- chart series slots --
 * Identity, not meaning: which series this is. Assigned in a fixed order by
 * web-v2/js/viz-palette.js — see that file for how the four hues were derived
 * and which checks they clear. A fifth series reuses hue 1 with a hatch, so the
 * class carries the treatment too and the legend swatch wears the same one. */

.viz-s0 { --mcv-c: var(--viz-0); }
.viz-s1 { --mcv-c: var(--viz-1); }
.viz-s2 { --mcv-c: var(--viz-2); }
.viz-s3 { --mcv-c: var(--viz-3); }
.viz-s4 { --mcv-c: var(--viz-4); }

/* The hatch is cut in the paper colour, so one pattern serves every hue and a
 * theme flip needs no re-render. */
.viz-hatch-line { stroke: var(--paper); stroke-width: 3; opacity: 0.6; }

/* ------------------------------------------------------------------ kpis -- */

.mcv-kpis {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(178px, 1fr));
	gap: 12px;
	margin: 2px 0 4px;
}

.mcv-kpi {
	padding: 16px 18px;
	border: 1px solid var(--line);
	border-radius: 16px;
	background: var(--paper);
	box-shadow: var(--shadow);
	color: inherit;
	text-decoration: none;
}

a.mcv-kpi:hover { background: var(--paper-soft); }

.mcv-kpi-value {
	margin: 0 0 4px;
	font-size: 28px;
	font-weight: 750;
	letter-spacing: -0.02em;
	line-height: 1.12;
	/* The verdict lives in the number. */
	color: var(--mcv-c, var(--ink));
}

.mcv-kpi.mcv-t-neutral .mcv-kpi-value { color: var(--ink); }

.mcv-kpi-label {
	font-size: 11.5px;
	color: var(--muted);
	line-height: 1.35;
}

.mcv-kpi-sub { margin-top: 7px; font-size: 11px; line-height: 1.4; color: var(--ink-soft); }
.mcv-kpi-rows { margin-top: 8px; display: grid; gap: 3px; }

.mcv-kpi-row {
	display: flex;
	align-items: baseline;
	gap: 8px;
	font-size: 11.5px;
	color: var(--ink-soft);
}

.mcv-kpi-row-k { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.mcv-kpi-row-v { white-space: nowrap; color: var(--ink); }
.mcv-kpi-row-pct { color: var(--muted); font-weight: 600; }

.mcv-delta { display: inline-block; font-size: 11px; font-weight: 800; color: var(--ink-soft); }
.mcv-delta.is-good { color: var(--lime-deep); }
.mcv-delta.is-bad { color: var(--coral-deep); }

.mcv-spark { display: block; width: 100%; height: 28px; margin-top: 8px; overflow: visible; }
.mcv-spark polyline { fill: none; stroke: var(--viz-1); stroke-width: 1.6; vector-effect: non-scaling-stroke; }
.mcv-spark .spark-area { fill: var(--viz-soft); stroke: none; }
.mcv-spark .spark-dot { fill: var(--viz-1); stroke: var(--paper); stroke-width: 1.4; }

/* ------------------------------------------------- exceptions + findings -- */

.mcv-excs, .mcv-finds { display: grid; gap: 10px; }

.mcv-exc, .mcv-find {
	display: grid;
	grid-template-columns: minmax(0, 1fr) auto;
	gap: 10px 14px;
	align-items: start;
	padding: 13px 16px;
	border: 1px solid var(--line);
	border-radius: 14px;
	background: var(--paper-soft);
	color: inherit;
	text-decoration: none;
}

/* Severity is the whole card. */
.mcv-exc.is-red, .mcv-find.is-red { background: var(--coral-soft); border-color: var(--coral-line); }
.mcv-exc.is-amber, .mcv-find.is-amber { background: var(--amber-soft); border-color: var(--amber-line); }
.mcv-exc.is-green, .mcv-find.is-green { background: var(--lime-soft); border-color: var(--lime-line); }
a.mcv-exc:hover, a.mcv-find:hover { filter: brightness(0.985); }
.mcv-exc i { display: none; }

.mcv-exc-body { min-width: 0; }
.mcv-exc b { display: block; font-size: 14px; font-weight: 650; line-height: 1.45; }
.mcv-exc-sub, .mcv-exc-age { font-size: 12px; color: var(--ink-soft); }
.mcv-go { color: var(--aqua-deep); font-size: 12.5px; font-weight: 700; white-space: nowrap; }

.mcv-find-main { min-width: 0; }
.mcv-find-text { margin: 0; font-size: 14.5px; font-weight: 650; line-height: 1.45; }

.mcv-find-meta {
	display: flex;
	gap: 6px;
	align-items: center;
	flex-wrap: wrap;
	justify-content: flex-end;
	max-width: 40%;
}

.mcv-owner, .mcv-amount {
	padding: 3px 10px;
	border-radius: 999px;
	font-size: 11px;
	font-weight: 650;
	/* The amount carries the ₹ AND the status ("6d open · 2 fixed"), which is
	 * long enough to be clipped by a nowrap pill. Let it wrap. */
	white-space: normal;
}

.mcv-owner { white-space: nowrap; }

.mcv-owner { background: var(--amber-soft); color: var(--amber-deep); }
.mcv-amount { background: var(--silver); color: var(--ink-soft); }
.mcv-find.is-red .mcv-amount { background: var(--coral-soft); color: var(--coral-deep); }

.mcv-find-why {
	margin: 4px 0 0;
	font-size: 13.5px;
	line-height: 1.5;
	color: var(--ink-soft);
	font-weight: 400;
}

.mcv-find-do {
	margin: 5px 0 0;
	font-size: 13.5px;
	line-height: 1.45;
	color: var(--lime-deep);
	font-weight: 650;
}

.mcv-find-still {
	margin: 5px 0 0;
	font-size: 12.5px;
	line-height: 1.5;
	color: var(--muted);
}

.mcv-find-still b { color: var(--ink-soft); font-weight: 650; }

/* ----------------------------------------------------------------- table -- */

/* The scroll lives here, never on the page: a 14-column campaign table must not
 * make the whole document scroll sideways. */
.mcv-tablewrap { overflow-x: auto; -webkit-overflow-scrolling: touch; }

.mcv-table { width: 100%; border-collapse: collapse; font-size: 12.5px; }

.mcv-table th {
	position: sticky;
	top: 0;
	padding: 0;
	background: var(--paper);
	border-bottom: 1px solid var(--line);
	white-space: nowrap;
	text-align: left;
}

/* Sorting is a button, not a click handler on a <th> — a table you can only
 * reorder with a mouse is a table half the team can't reorder. */
.mcv-th {
	width: 100%;
	padding: 8px 10px;
	border: 0;
	background: transparent;
	color: var(--muted);
	font: inherit;
	font-size: 10.5px;
	font-weight: 850;
	letter-spacing: 0.07em;
	text-transform: uppercase;
	text-align: inherit;
	cursor: pointer;
}

.mcv-th:hover { color: var(--ink); }
.mcv-th.is-asc::after { content: " ▲"; font-size: 8px; }
.mcv-th.is-desc::after { content: " ▼"; font-size: 8px; }
.mcv-table th.is-right .mcv-th { text-align: right; }
.mcv-table th.is-center .mcv-th { text-align: center; }

.mcv-table td {
	padding: 8px 10px;
	border-bottom: 1px solid var(--line);
	color: var(--ink-soft);
	/* Numbers stay on one line; prose wraps. `nowrap` everywhere truncated the
	 * whole meaning column of the "how to read this" table. */
	white-space: normal;
}

.mcv-table td.is-right, .mcv-table td.is-center { white-space: nowrap; }

.mcv-table tbody tr:hover td { background: var(--paper-soft); }
.mcv-table .is-right { text-align: right; }
.mcv-table .is-center { text-align: center; }
.mcv-table td:first-child { color: var(--ink); font-weight: 700; white-space: normal; min-width: 180px; }

/* ----------------------------------------------------------------- chart -- */

.mcv-chart-holder { position: relative; }

/* The picture stretches to fill its box; the labels live in HTML beside it
 * (.mcv-yticks), so nothing readable is ever scaled. */
.mcv-chart { display: block; width: 100%; height: 250px; }

.mcv-yticks {
	position: absolute;
	inset: 0;
	pointer-events: none;
}

.mcv-ytick {
	position: absolute;
	left: 0;
	width: 50px;
	transform: translateY(-50%);
	text-align: right;
	font-size: 10px;
	line-height: 1;
	color: var(--muted);
	white-space: nowrap;
}
.mcv-chart .mcv-grid { stroke: var(--line); stroke-width: 1; }
.mcv-chart .mcv-grid.is-zero { stroke: var(--ink-soft); stroke-opacity: 0.28; }
.mcv-chart .mcv-line { fill: none; stroke: var(--mcv-c); stroke-width: 2; vector-effect: non-scaling-stroke; stroke-linejoin: round; stroke-linecap: round; }
.mcv-chart .mcv-bar { fill: var(--mcv-c); }
.mcv-chart .mcv-cursor { stroke: var(--ink-soft); stroke-opacity: 0.45; stroke-width: 1; stroke-dasharray: 3 3; }
.mcv-chart .mcv-bar-hatch { pointer-events: none; }

.mcv-legend { display: flex; flex-wrap: wrap; gap: 14px; margin-bottom: 8px; }
.mcv-legend-item { display: inline-flex; align-items: center; gap: 6px; font-size: 11.5px; color: var(--ink-soft); }
.mcv-sw { width: 9px; height: 9px; border-radius: 3px; background: var(--mcv-c); flex: 0 0 auto; }

/* The swatch wears the mark's treatment, not just its hue — otherwise the key
 * for series 5 and the bar for series 5 look like different things. */
.mcv-sw.is-hatch-a,
.mcv-sw.is-hatch-b {
	background-image: repeating-linear-gradient(
		var(--viz-hatch-angle, 45deg),
		transparent 0 2px, var(--paper) 2px 3.6px);
}
.mcv-sw.is-hatch-b { --viz-hatch-angle: 135deg; }

.mcv-axis { display: flex; justify-content: space-between; margin-top: 4px; font-size: 10.5px; color: var(--muted); }
.mcv-note.is-warn { color: var(--amber-deep); }

/* The hover readout. A static site can't answer "what was the 14th?" — this is
 * one of the things porting buys over embedding. */
.mcv-tip {
	position: absolute;
	top: 8px;
	min-width: 150px;
	padding: 8px 10px;
	border: 1px solid var(--line);
	border-radius: 10px;
	background: var(--paper);
	box-shadow: var(--shadow);
	font-size: 11.5px;
	pointer-events: none;
	z-index: 3;
}

.mcv-tip > b { display: block; margin-bottom: 5px; font-size: 11px; color: var(--muted); }
.mcv-tip-row { display: flex; align-items: center; gap: 7px; padding: 1px 0; }
.mcv-tip-row > span { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--ink-soft); }
.mcv-tip-row > b { font-weight: 800; white-space: nowrap; }
.mcv-tip-row.is-total { margin-top: 4px; padding-top: 5px; border-top: 1px solid var(--line); }

/* --------------------------------------------------------------- scatter -- */

.mcv-scatter { display: block; width: 100%; height: auto; aspect-ratio: 960 / 400; }
.mcv-scatter text { font-size: 10px; fill: var(--muted); }
.mcv-scatter .mcv-mean { stroke: var(--ink-soft); stroke-opacity: 0.35; stroke-width: 1; stroke-dasharray: 4 4; }
.mcv-scatter .mcv-dot { fill: var(--mcv-c); fill-opacity: 0.75; stroke: var(--paper); stroke-width: 1.2; }
.mcv-scatter .mcv-dot:hover { fill-opacity: 1; }

/* ------------------------------------------------------------------ bars -- */

.mcv-bars { display: grid; gap: 2px; }

.mcv-bar-row {
	display: grid;
	grid-template-columns: minmax(120px, 190px) minmax(0, 1fr) auto;
	gap: 10px;
	align-items: center;
	padding: 5px 0;
	font-size: 12.5px;
}

.mcv-bar-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; color: var(--ink); }
.mcv-bar-track { display: block; width: 100%; }
.mcv-bar-fill { display: block; height: 13px; border-radius: 4px; background: var(--mcv-c); }
/* An untoned bar is not "neutral status", it is a bar with no status at all —
 * so it wears the first chart slot, same as a lone series anywhere else. */
.mcv-bar-fill.mcv-t-neutral { background: var(--viz-1); }
.mcv-bar-value { font-weight: 800; white-space: nowrap; }
.mcv-bar-note { grid-column: 2 / -1; font-size: 11px; color: var(--muted); margin-top: -3px; }

/* ----------------------------------------------------------------- cards -- */

.mcv-cards { display: grid; gap: 9px; }

.mcv-card-group {
	margin: 14px 0 2px;
	font-size: 12px;
	font-weight: 850;
	letter-spacing: 0.02em;
	color: var(--ink-soft);
}

.mcv-cards > :first-child { margin-top: 0; }

.mcv-card {
	padding: 11px 13px;
	border: 1px solid var(--line);
	border-radius: 12px;
	background: var(--paper);
	color: inherit;
	text-decoration: none;
}

.mcv-card.is-red { box-shadow: inset 3px 0 0 var(--coral); }
.mcv-card.is-amber { box-shadow: inset 3px 0 0 var(--amber); }
.mcv-card.is-green { box-shadow: inset 3px 0 0 var(--lime); }
a.mcv-card:hover { background: var(--paper-soft); }

.mcv-card-top { display: flex; align-items: baseline; justify-content: space-between; gap: 10px; flex-wrap: wrap; }
.mcv-card-title { font-size: 13.5px; font-weight: 800; min-width: 0; overflow-wrap: anywhere; }
.mcv-card-sub { margin: 4px 0 0; font-size: 12px; color: var(--ink-soft); line-height: 1.45; }

.mcv-badges { display: inline-flex; gap: 5px; flex-wrap: wrap; }

.mcv-badge {
	padding: 2px 8px;
	border-radius: 999px;
	background: var(--silver);
	color: var(--ink-soft);
	font-size: 10.5px;
	font-weight: 800;
	white-space: nowrap;
}

.mcv-badge.is-red { background: var(--coral-soft); color: var(--coral-deep); }
.mcv-badge.is-amber { background: var(--amber-soft); color: var(--amber-deep); }
.mcv-badge.is-green { background: var(--lime-soft); color: var(--lime-deep); }

.mcv-stats { display: flex; flex-wrap: wrap; gap: 12px; margin-top: 8px; }
.mcv-stat { display: inline-flex; align-items: baseline; gap: 5px; font-size: 11.5px; }
.mcv-stat i { font-style: normal; color: var(--muted); }
.mcv-stat b { font-weight: 800; color: var(--ink); }

/* ----------------------------------------------------------------- media -- */

.mcv-media {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
	gap: 12px;
}

.mcv-shot {
	display: flex;
	flex-direction: column;
	border: 1px solid var(--line);
	border-radius: 14px;
	background: var(--paper);
	overflow: hidden;
	color: inherit;
	text-decoration: none;
}

.mcv-shot.is-red { box-shadow: inset 0 3px 0 var(--coral); }
.mcv-shot.is-green { box-shadow: inset 0 3px 0 var(--lime); }

.mcv-shot-img { display: block; width: 100%; aspect-ratio: 4 / 5; object-fit: cover; background: var(--silver); }
.mcv-shot-body { padding: 11px 13px 13px; }
.mcv-shot-title { display: block; font-size: 13px; font-weight: 800; overflow-wrap: anywhere; }
.mcv-shot-sub { margin: 3px 0 0; font-size: 11px; color: var(--muted); }
.mcv-shot-read { margin: 7px 0 0; font-size: 12px; line-height: 1.5; color: var(--ink-soft); }

/* ------------------------------------------------------------------ text -- */

.mcv-text p { margin: 0 0 9px; font-size: 13px; line-height: 1.55; color: var(--ink-soft); max-width: 78ch; }
.mcv-text p:last-child { margin-bottom: 0; }

/* Prose is prose. A methodology note framed like a metric card reads as one
 * more number, which is the opposite of what it is for. */
.mcv-block:has(> .mcv-text) {
	border: 0;
	background: var(--paper-soft);
}

.mcv-kpi-target { margin-top: 5px; font-size: 10.5px; color: var(--muted); }
.mcv-more { display: inline-block; margin-top: 8px; color: var(--aqua-deep); font-size: 11.5px; font-weight: 800; }
.has-detail { cursor: pointer; }
.has-detail:hover { background: var(--paper-soft); }
.has-detail:focus-visible { outline: 2px solid var(--aqua); outline-offset: 2px; }

/* ------------------------------------------------------------ the drawer --
 * The long-form read behind a card. Mission Control opens a sheet per ad with
 * the written analysis, the creative's features, the shot list and the
 * transcript — that IS the page, and a grid of thumbnails without it would be
 * a worse product than the one being ported. */

.mcv-drawer-back {
	position: fixed;
	inset: 0;
	z-index: 60;
	display: flex;
	justify-content: flex-end;
	background: rgba(0, 0, 0, 0.28);
	backdrop-filter: blur(2px);
}

.mcv-drawer {
	display: flex;
	flex-direction: column;
	width: min(560px, 100%);
	background: var(--paper);
	border-left: 1px solid var(--line);
	box-shadow: -20px 0 60px rgba(0, 0, 0, 0.18);
	overflow: hidden;
}

.mcv-drawer-top {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 14px;
	padding: 18px 20px 14px;
	border-bottom: 1px solid var(--line);
}

.mcv-drawer-title { margin: 0; font-size: 16px; font-weight: 850; letter-spacing: -0.02em; overflow-wrap: anywhere; }
.mcv-drawer-sub { margin: 4px 0 0; font-size: 12px; color: var(--muted); }

.mcv-drawer-x {
	flex: 0 0 auto;
	width: 30px;
	height: 30px;
	border: 1px solid var(--line);
	border-radius: 9px;
	background: var(--paper);
	color: var(--ink-soft);
	font-size: 13px;
	cursor: pointer;
}

.mcv-drawer-x:hover { background: var(--paper-soft); color: var(--ink); }
.mcv-drawer-body { flex: 1; min-height: 0; overflow-y: auto; padding: 16px 20px 26px; }
.mcv-drawer-img { display: block; width: 100%; border-radius: 12px; margin-bottom: 16px; }
.mcv-drawer-sec { margin-bottom: 18px; }

.mcv-drawer-sec h3 {
	margin: 0 0 7px;
	font-size: 10.5px;
	font-weight: 850;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--muted);
}

.mcv-drawer-sec p { margin: 0 0 8px; font-size: 13px; line-height: 1.6; color: var(--ink-soft); }
.mcv-drawer-rows { display: grid; gap: 4px; }

.mcv-drawer-row {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 12px;
	padding: 5px 0;
	border-bottom: 1px solid var(--line);
	font-size: 12.5px;
}

.mcv-drawer-row > span { color: var(--muted); }
.mcv-drawer-row > b { text-align: right; overflow-wrap: anywhere; }
.mcv-drawer-steps { margin: 0; padding: 0; list-style: none; display: grid; gap: 7px; }

.mcv-drawer-steps li {
	display: grid;
	grid-template-columns: 44px minmax(0, 1fr);
	gap: 10px;
	font-size: 12.5px;
	line-height: 1.5;
	color: var(--ink-soft);
}

.mcv-drawer-steps i { font-style: normal; font-weight: 800; color: var(--aqua-deep); }

/* ------------------------------------------------------- the range filter --
 * Mission Control needs a whole HTTP service to answer a custom range. Here the
 * view carries its days and this bar re-aggregates them. */

.biz-range {
	display: flex;
	align-items: center;
	gap: 12px;
	flex-wrap: wrap;
	margin: 0 0 14px;
	padding: 11px 14px;
	border: 1px solid var(--line);
	border-radius: 14px;
	background: var(--paper);
}

.biz-range-custom { display: flex; align-items: center; gap: 7px; margin: 0; flex-wrap: wrap; }
.biz-range-lab { font-size: 11px; font-weight: 800; color: var(--muted); text-transform: uppercase; letter-spacing: 0.06em; }

.biz-range-custom input[type="date"] {
	padding: 5px 8px;
	border: 1px solid var(--line);
	border-radius: 9px;
	background: var(--paper);
	color: var(--ink);
	font: inherit;
	font-size: 12.5px;
}

.biz-range-custom .os-btn { padding: 5px 14px; font-size: 12.5px; }
.biz-range-said { flex: 1 1 100%; font-size: 11.5px; color: var(--muted); }

/* A half-width block holds a smaller picture — a 240px-tall chart in a column
 * half the page wide is mostly whitespace. */
.mcv-block:not(.is-full) .mcv-kpis { grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); }

@media (max-width: 1180px) {
	.mcv { grid-template-columns: minmax(0, 1fr); }
	.mcv-block, .mcv-block.is-full { grid-column: 1 / -1; }
}

@media (max-width: 760px) {
	.mcv-block { padding: 15px 14px 16px; }
	.mcv-block.is-lead .mcv-kpi { padding: 12px 12px 13px 0; }
	.mcv-block.is-lead .mcv-kpi-value { font-size: 27px; }
	.mcv-bar-row { grid-template-columns: minmax(0, 1fr) auto; }
	.mcv-bar-track { grid-column: 1 / -1; }
	.mcv-bar-note { grid-column: 1 / -1; margin-top: 0; }
	.mcv-exc, .mcv-find { grid-template-columns: 6px minmax(0, 1fr); }
	.mcv-find-meta { grid-column: 2; justify-items: start; text-align: left; }
	.mcv-scatter { aspect-ratio: 500 / 420; }
	.mcv-drawer { width: 100%; border-left: 0; }
	.mcv-drawer-back { align-items: flex-end; }
	.biz-range { gap: 9px; }
	.biz-range-custom { flex: 1 1 100%; }
	.biz-range-custom input[type="date"] { flex: 1 1 0; min-width: 0; }
}

/* ═════════════════════════════════════════════════════════════════ People ══
 * My time, then who is around. Everything is read live from the leave portal;
 * nothing on this page writes. */

.ppl-layout {
	display: grid;
	grid-template-columns: minmax(0, 1.3fr) minmax(270px, 0.7fr);
	gap: 16px;
	align-items: start;
}

.ppl-main { overflow: hidden; }

.ppl-sec {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	padding: 17px 20px 11px;
}

.ppl-sec.is-divided { border-top: 1px solid var(--line); margin-top: 4px; }
.ppl-body { padding: 0 20px 18px; }
.ppl-pad { padding: 0 20px 16px; }

.ppl-summary {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
	border-block: 1px solid var(--line);
}

.ppl-cell { padding: 15px 17px; border-right: 1px solid var(--line); }
.ppl-cell:last-child { border-right: 0; }
.ppl-cell strong { display: block; font-size: 24px; font-weight: 850; letter-spacing: -0.055em; margin: 4px 0 2px; }
.ppl-cell-k { font-size: 11px; font-weight: 850; letter-spacing: 0.1em; text-transform: uppercase; color: var(--muted); }
.ppl-cell-s { font-size: 11px; color: var(--ink-soft); }

/* --------------------------------------------------------------- table -- */

.ppl-tbl-wrap { overflow-x: auto; margin-top: 16px; }

.ppl-tbl {
	width: 100%;
	min-width: 520px;
	border-collapse: collapse;
	font-size: 12.5px;
}

.ppl-tbl th {
	padding: 8px 10px;
	border-bottom: 1px solid var(--line);
	color: var(--muted);
	font-size: 10.5px;
	font-weight: 850;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	text-align: right;
	white-space: nowrap;
}

.ppl-tbl th:first-child, .ppl-tbl td:first-child { text-align: left; }
.ppl-tbl td { padding: 9px 10px; border-bottom: 1px solid var(--line-soft); text-align: right; color: var(--ink-soft); }
.ppl-tbl td strong { color: var(--ink); font-weight: 800; }
.ppl-tbl tr:last-child td { border-bottom: 0; }

.ppl-fine { font-size: 11.5px; color: var(--muted); line-height: 1.45; }
.ppl-tbl td.ppl-fine { text-align: left; }
.ppl-body .ppl-fine { margin-top: 9px; }

.ppl-subsec { margin-top: 18px; padding-top: 14px; border-top: 1px solid var(--line); }
.ppl-subsec .os-eyebrow { margin-bottom: 7px; }

.ppl-mine-row {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 12px;
	padding: 8px 0;
	border-top: 1px solid var(--line-soft);
	font-size: 12.5px;
	color: var(--ink-soft);
}

.ppl-mine-row:first-child { border-top: 0; }
.ppl-mine-row b { color: var(--ink); font-weight: 750; }

/* ------------------------------------------------------- who is around -- */

.ppl-away {
	display: grid;
	grid-template-columns: 34px minmax(0, 1fr) auto;
	align-items: center;
	gap: 11px;
	padding: 11px 20px;
	border-top: 1px solid var(--line);
}

.ppl-face {
	display: grid;
	place-items: center;
	width: 32px;
	height: 32px;
	border-radius: 11px;
	background: var(--aqua-soft);
	color: var(--aqua-deep);
	font-size: 13px;
	font-weight: 850;
}

.ppl-away-who { min-width: 0; }
.ppl-away-who b { font-size: 13px; font-weight: 750; }
.ppl-away-who small { display: block; margin-top: 2px; font-size: 11px; color: var(--ink-soft); }
.ppl-away-n { font-size: 11px; font-weight: 800; color: var(--coral-deep); white-space: nowrap; }

/* --------------------------------------------------------------- side -- */

.ppl-side .os-sub { font-size: 12.5px; margin-top: 6px; }
.ppl-side-gap { margin-top: 20px; }

.ppl-holiday {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
	padding: 10px 0;
	border-top: 1px solid var(--line);
}

.ppl-holiday:first-of-type { border-top: 0; }
.ppl-holiday b { font-size: 12.5px; font-weight: 750; }
.ppl-holiday small { display: block; font-size: 11px; color: var(--ink-soft); margin-top: 1px; }

@media (max-width: 1050px) {
	.ppl-layout { grid-template-columns: 1fr; }
}

@media (max-width: 760px) {
	.ppl-cell { border-right: 0; border-top: 1px solid var(--line); }
	.ppl-cell:first-child { border-top: 0; }
	.ppl-away { grid-template-columns: 34px minmax(0, 1fr); }
	.ppl-away-n { grid-column: 2; margin-top: -4px; }
}

/* ═════════════════════════════════════════════════════════════════════ Me ══
 * Personal choices, one card per thing. Nothing on this page changes anything
 * for anybody else — the org-wide controls live on Manage. */

.me-grid {
	display: grid;
	grid-template-columns: repeat(auto-fit, minmax(330px, 1fr));
	gap: 16px;
	align-items: start;
}

.me-card h2 { font-size: 19px; letter-spacing: -0.04em; margin: 3px 0 6px; }
.me-card .os-sub { font-size: 12.5px; }
.me-card-wide { grid-column: 1 / -1; }

.me-fine { margin-top: 10px; font-size: 11.5px; color: var(--muted); line-height: 1.45; }
.me-field { margin-top: 14px; }
.me-sub { margin-top: 16px; padding-top: 13px; border-top: 1px solid var(--line); }
.me-sub .os-eyebrow { margin-bottom: 4px; }

/* Key caps in the shortcuts panel. The first `me-sub` there has no rule above it
 * — the card's own heading already separates it, and a border directly under the
 * intro paragraph reads as a stray line. */
.me-sub:first-child { margin-top: 10px; padding-top: 0; border-top: 0; }

.me-keys { display: inline-flex; align-items: center; gap: 4px; flex: none; }

.me-keys kbd {
	min-width: 22px;
	padding: 2px 6px;
	border: 1px solid var(--line);
	border-bottom-width: 2px;
	border-radius: 6px;
	background: var(--paper-soft);
	color: var(--ink-soft);
	font-family: inherit;
	font-size: 11px;
	font-weight: 750;
	line-height: 1.5;
	text-align: center;
	white-space: nowrap;
}

.me-toggle {
	display: flex;
	align-items: center;
	gap: 9px;
	margin-top: 14px;
	font-size: 13.5px;
	font-weight: 700;
}

.me-toggle input { width: 18px; height: 18px; min-width: 18px; accent-color: var(--lime-deep); }
.me-toggle.small { margin: 0; font-size: 12px; font-weight: 750; color: var(--ink-soft); white-space: nowrap; }
.me-toggle.small input { width: 16px; height: 16px; min-width: 16px; }

.me-row {
	display: flex;
	align-items: center;
	gap: 12px;
	padding: 10px 0;
	border-top: 1px solid var(--line);
}

.me-row:first-child { border-top: 0; }
.me-row.is-off { opacity: 0.55; }
.me-row-main { flex: 1; min-width: 0; font-size: 13px; }
.me-row-main b { font-weight: 750; }
.me-row-main small { display: block; margin-top: 2px; font-size: 11px; color: var(--ink-soft); }
.me-row-main span { overflow-wrap: anywhere; }

.me-group {
	margin-top: 14px;
	font-size: 11px;
	font-weight: 850;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--muted);
}

.me-actions { margin-top: 14px; }
.me-row-actions { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 14px; }
/* A two-word action ("Appearance · Light") broke onto two lines at 390px and
 * made the row half a card tall. Let the group wrap; never the label. */
.me-row-actions .os-btn { white-space: nowrap; }
.os-btn.is-danger { background: var(--coral-soft); border-color: var(--coral-line); color: var(--coral-deep); }

.me-file { color: inherit; text-decoration: none; overflow-wrap: anywhere; }
a.me-file { color: var(--aqua-deep); }
a.me-file:hover { text-decoration: underline; }

/* ------------------------------------------------------------- tokens -- */

.me-mint { display: flex; gap: 8px; align-items: center; margin-top: 14px; }
.me-mint .os-input { flex: 1; min-width: 0; }

.me-raw {
	margin-top: 12px;
	padding: 13px;
	border: 1px solid var(--amber-line);
	border-radius: 12px;
	background: var(--amber-soft);
}

.me-raw b { display: block; font-size: 12.5px; color: var(--amber-deep); }

.me-raw code {
	display: block;
	margin: 8px 0;
	padding: 10px;
	border-radius: 9px;
	background: var(--paper);
	font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
	font-size: 12.5px;
	word-break: break-all;
}

/* ------------------------------------------------------------ account -- */

.me-account {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 16px;
	flex-wrap: wrap;
	margin-top: 6px;
}

.me-account-who { display: flex; align-items: center; gap: 11px; min-width: 0; }
.me-account-who b { font-size: 14px; font-weight: 750; overflow-wrap: anywhere; }
.me-account-who small { display: block; font-size: 11px; color: var(--muted); }

.me-face {
	display: grid;
	place-items: center;
	width: 38px;
	height: 38px;
	min-width: 38px;
	border-radius: 13px;
	background: var(--silver);
	color: var(--ink-soft);
	font-size: 15px;
	font-weight: 850;
}

@media (max-width: 760px) {
	.me-grid { grid-template-columns: 1fr; }
	.me-mint { flex-wrap: wrap; }
	.me-mint .os-btn { width: 100%; }
	.me-account { align-items: flex-start; }
}

/* ────────────────────────────────────── home + actions (lane J) ── *
 *
 * Home is the directory — every destination as one row, grouped by what you
 * came to do (docs/prototypes/home-launcher-B.html, approved 2026-07-29).
 * Actions is the same work seen three ways (docs/design/V2-HOME-ACTIONS-BUILD-
 * SPEC.md §6). Two prefixes: `hm-` for Home, `act-` for the Actions page — and
 * the row furniture both share (`.act-chip`, `.act-due`) sits with the actions
 * half. `.hm-linky` and `.hm-snack*` are shared: Actions uses both.
 *
 * Home's seven dashboard modules — moves, in-review, what-changed, decisions,
 * business tiles, Lumi starters, the tracks board — left with the redesign, and
 * their rules with them. Each one's content lives on the page that owns it. */

/* ------------------------------------------------------------------ head -- */

.hm-head {
	display: flex;
	align-items: flex-end;
	justify-content: space-between;
	gap: 14px;
	margin-bottom: 16px;
	flex-wrap: wrap;
}

.hm-head h1 {
	font-size: clamp(27px, 2.8vw, 36px);
	letter-spacing: -0.055em;
	line-height: 1;
}

.hm-head .os-sub { margin-top: 6px; font-size: 13.5px; }

/* ------------------------------------------------------------- directory -- *
 *
 * Two columns of grouped cards on a laptop, one on a phone — settings-style
 * rows so the whole OS fits above the fold without shouting. `align-items:
 * start` keeps a three-row card its own height instead of stretching it to
 * match its neighbour. */

.hm-dir {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 14px;
	align-items: start;
}

.hm-dir-card {
	overflow: hidden;
	box-shadow: var(--shadow-soft);
}

.hm-dir-h {
	padding: 13px 18px 9px;
	font-size: 11px;
	font-weight: 850;
	letter-spacing: 0.16em;
	text-transform: uppercase;
	color: var(--muted);
}

/* The row is an anchor, so it re-states the colour and decoration the base
 * sheet gives links — the name reads as a name, not as a link in a paragraph. */
.hm-dir-row {
	display: flex;
	align-items: center;
	gap: 12px;
	min-height: 56px;
	padding: 9px 18px;
	border-top: 1px solid var(--line-soft);
	color: inherit;
	text-decoration: none;
	transition: background 0.14s ease;
}

.hm-dir-row:hover { background: var(--paper-soft); }
.hm-dir-row:active { background: var(--silver); }

.hm-dir-ic {
	display: grid;
	place-items: center;
	width: 34px;
	height: 34px;
	flex: none;
	border-radius: 10px;
	background: var(--silver);
	color: var(--ink-soft);
}

.hm-dir-ic svg {
	width: 18px;
	height: 18px;
	fill: none;
	stroke: currentColor;
	stroke-width: 1.85;
	stroke-linecap: round;
	stroke-linejoin: round;
}

.hm-dir-row:hover .hm-dir-ic { background: var(--lime-soft); color: var(--lime-deep); }

/* Lumi and Record carry the accents they already wear in the rail, so the two
 * things you can do from anywhere look like themselves here too. */
.hm-dir-row.aqua .hm-dir-ic { background: var(--aqua-soft); color: var(--aqua-deep); }
.hm-dir-row.lime .hm-dir-ic { background: var(--lime-soft); color: var(--lime-deep); }

.hm-dir-mid { flex: 1 1 auto; min-width: 0; display: grid; gap: 1px; }
.hm-dir-mid b { font-size: 14px; font-weight: 800; letter-spacing: -0.02em; }

/* One line on a laptop (the name carries it; the sentence is the reassurance),
 * wrapping on a phone where there is no room to clip gracefully. */
.hm-dir-mid small {
	font-size: 12px;
	line-height: 1.35;
	color: var(--ink-soft);
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* Empty until a count arrives — and an empty badge must not draw its pill. */
.hm-dir-n {
	flex: none;
	padding: 3px 8px;
	border-radius: 999px;
	background: var(--aqua-soft);
	color: var(--aqua-deep);
	font-size: 11.5px;
	font-weight: 800;
	white-space: nowrap;
}

.hm-dir-n:empty { display: none; }

.hm-dir-arrow { flex: none; color: var(--muted); font-weight: 750; }

/* One column below 900px. Higher than it looks: the rail already takes 76px off
 * the viewport, so two columns here are narrower than two columns of the same
 * page without a shell, and the sentence is the first thing to suffer. Once a
 * row has the full width, the sentence wraps instead of clipping — on a phone
 * that line is the whole point of the row. */
@media (max-width: 900px) {
	.hm-dir { grid-template-columns: 1fr; gap: 12px; }
	.hm-dir-mid small { white-space: normal; }
}

/* ------------------------------------------------------ shared with Actions -- */

.hm-linky {
	border: 0;
	background: transparent;
	padding: 0;
	color: var(--aqua-deep);
	font-size: 12px;
	font-weight: 800;
	white-space: nowrap;
}

.hm-linky:hover { text-decoration: underline; }

/* ---------------------------------------------------------------- undo -- */

.hm-snack {
	position: fixed;
	right: 22px;
	bottom: 96px;
	z-index: 80;
	display: flex;
	align-items: center;
	gap: 14px;
	max-width: 340px;
	padding: 11px 14px;
	border-radius: 11px;
	background: #202522;
	color: #fff;
	font-size: 13px;
	font-weight: 700;
	box-shadow: 0 14px 35px rgba(0, 0, 0, 0.28);
}

.hm-snack { overflow: hidden; }
.hm-snack-msg { flex: 1; min-width: 0; }
.hm-snack-btn { border: 0; background: transparent; padding: 6px 2px; color: var(--lime); font-size: 13px; font-weight: 850; }

/* The window closing, drawn. Undo is on offer for five seconds either way — the
 * hairline just means you don't have to know that to feel it. */
.hm-snack-bar {
	position: absolute;
	left: 0;
	bottom: 0;
	height: 2px;
	width: 100%;
	background: var(--lime);
	transform-origin: left center;
	animation: hm-snack-drain 5s linear forwards;
}

@keyframes hm-snack-drain {
	from { transform: scaleX(1); }
	to { transform: scaleX(0); }
}

/* A completed row leaves the list rather than blinking out of it. Kept short:
 * this plays AFTER the undo window, so it is punctuation, not a wait. */
.act-row.is-leaving {
	opacity: 0;
	transform: translateX(10px);
	transition: opacity 0.22s ease, transform 0.22s ease;
	pointer-events: none;
}

@media (prefers-reduced-motion: reduce) {
	.hm-snack-bar { animation: none; transform: scaleX(0); }
	.act-row.is-leaving { transition: none; transform: none; }
}

/* ================================================================ Actions == */

.act-head { align-items: center; flex-wrap: wrap; }
.act-tools { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.act-tools .os-tabs { margin-bottom: 0; }

/* Mine · Everyone. The count rides inside the chip, quieter than the word — it
 * is the evidence for the choice, not the choice itself. */
.act-who[hidden] { display: none; }
.act-who button { display: inline-flex; align-items: center; gap: 6px; }

.act-who-n {
	font-variant-numeric: tabular-nums;
	font-size: 11.5px;
	font-weight: 700;
	color: var(--ink-soft);
	opacity: 0.72;
}

.act-who button.is-active .act-who-n { opacity: 0.85; }
.act-who-n[hidden] { display: none; }

.act-badge {
	display: inline-grid;
	place-items: center;
	min-width: 17px;
	height: 17px;
	margin-left: 6px;
	padding: 0 5px;
	border-radius: 99px;
	background: var(--aqua-soft);
	color: var(--aqua-deep);
	font-size: 10.5px;
	font-weight: 850;
}

.act-summary { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 12px; margin: 4px 0 14px; }

.act-card {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 10px;
	padding: 13px 16px;
}

.act-card h3 { font-size: 13.5px; letter-spacing: -0.02em; }
.act-card p { margin-top: 3px; font-size: 11.5px; line-height: 1.4; color: var(--ink-soft); }
.act-card .hm-linky { margin-top: 5px; }
.act-card-n { font-size: 26px; font-weight: 880; letter-spacing: -0.06em; }
.act-card.aqua { background: linear-gradient(135deg, var(--paper), var(--aqua-soft)); border-color: var(--aqua-line); }
.act-card.coral { background: linear-gradient(135deg, var(--paper), var(--coral-soft)); border-color: var(--coral-line); }

/* ------------------------------------------------------- Sort / Group / Hide --
 * The controls above the status/search filterbar on "By date". Dropdowns share
 * the .act-pick anchoring pattern (position:relative wrap, position:absolute
 * menu) already used for the owner autocomplete just below. */

.act-controlbar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 0 0 10px; }

.act-drop { position: relative; }

.act-drop-btn {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	border: 1px solid var(--line);
	background: var(--paper);
	color: var(--ink);
	font: inherit;
	font-size: 12.5px;
	font-weight: 700;
	padding: 7px 11px;
	border-radius: 10px;
	cursor: pointer;
}
.act-drop-btn:hover { border-color: var(--ink-soft); }
.act-drop-lbl { color: var(--muted); font-weight: 600; }
.act-drop-btn::after { content: "▾"; color: var(--muted); font-size: 10px; margin-left: 2px; }

.act-drop-menu {
	position: absolute;
	left: 0;
	top: calc(100% + 5px);
	z-index: 30;
	min-width: 190px;
	padding: 5px;
	border: 1px solid var(--line);
	border-radius: 12px;
	background: var(--paper);
	box-shadow: var(--shadow);
}
.act-drop-menu[hidden] { display: none; }

.act-drop-item {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
	width: 100%;
	border: 0;
	background: transparent;
	color: var(--ink);
	font: inherit;
	font-size: 13px;
	font-weight: 650;
	padding: 8px 9px;
	border-radius: 8px;
	cursor: pointer;
	text-align: left;
}
.act-drop-item:hover { background: var(--silver); }
.act-drop-tick { color: var(--lime-deep); font-weight: 900; width: 14px; text-align: center; }

.act-hide-toggle {
	display: inline-flex;
	align-items: center;
	gap: 9px;
	border: 1px solid var(--line);
	background: var(--paper);
	color: var(--ink);
	font: inherit;
	font-size: 12.5px;
	font-weight: 700;
	padding: 7px 12px;
	border-radius: 10px;
	cursor: pointer;
}
.act-hide-sw {
	width: 32px;
	height: 19px;
	border-radius: 999px;
	background: var(--line);
	position: relative;
	flex: 0 0 auto;
	transition: background 0.15s;
}
.act-hide-sw::after {
	content: "";
	position: absolute;
	top: 2px;
	left: 2px;
	width: 15px;
	height: 15px;
	border-radius: 50%;
	background: #fff;
	box-shadow: var(--shadow-soft);
	transition: transform 0.15s;
}
.act-hide-toggle[aria-pressed="true"] .act-hide-sw { background: var(--lime-deep); }
.act-hide-toggle[aria-pressed="true"] .act-hide-sw::after { transform: translateX(13px); }
.act-hide-sub { color: var(--muted); font-weight: 600; }

/* -------------------------------------------------- owner-or-team search --
 * The suggestion list reuses .act-pick / .act-pick-row (the owner-picker
 * pattern already shipped for editing an action's owner) with a type tag and
 * an open-count added to each row. */

.act-owner-wrap { position: relative; display: inline-flex; }
.act-owner-wrap .os-input { width: auto; }

.act-pick-row-tagged { display: flex; flex-direction: column; gap: 2px; }
.act-pick-row-top { display: flex; align-items: center; gap: 7px; }
.act-pick-cnt { font-size: 11px; color: var(--muted); font-weight: 650; }

.act-pick-tag {
	font-size: 9.5px;
	font-weight: 850;
	text-transform: uppercase;
	letter-spacing: 0.04em;
	padding: 2px 6px;
	border-radius: 6px;
}
.act-pick-tag.team { color: var(--coral-deep); background: var(--coral-soft); }
.act-pick-tag.person { color: var(--aqua-deep); background: var(--aqua-soft); }

.act-filter-chip-row[hidden] { display: none; }
.act-filter-chip-row { margin: -3px 0 12px; }

.act-filter-chip {
	display: inline-flex;
	align-items: center;
	gap: 7px;
	border: 1px solid var(--coral-line);
	background: var(--coral-soft);
	color: var(--coral-deep);
	font-size: 11.5px;
	font-weight: 750;
	padding: 5px 10px;
	border-radius: 999px;
}
.act-filter-chip-x {
	border: 0;
	background: transparent;
	color: inherit;
	font: inherit;
	font-size: 13px;
	line-height: 1;
	padding: 0;
	cursor: pointer;
}

/* A quiet per-row hint of which team an action belongs to — omitted when the
 * list is already grouped by team (redundant with the section header). */
.act-team-badge {
	font-size: 10px;
	font-weight: 800;
	color: var(--coral-deep);
	background: var(--coral-soft);
	border: 1px solid var(--coral-line);
	padding: 1px 7px;
	border-radius: 6px;
}

.act-filterbar { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin: 0 0 12px; }
.act-filterbar .os-input,
.act-filterbar .os-select { width: auto; min-width: 130px; padding: 7px 10px; font-size: 12.5px; }

.act-wrap { display: grid; grid-template-columns: minmax(0, 1fr) 300px; gap: 14px; align-items: start; }
.act-main { min-width: 0; display: grid; gap: 14px; }
.act-view { overflow: hidden; }

/* ------------------------------------------------------------- the rows -- */

.act-row {
	display: grid;
	grid-template-columns: 24px minmax(0, 1fr) auto;
	gap: 11px;
	align-items: center;
	padding: 11px 18px;
	border-top: 1px solid var(--line-soft);
	cursor: pointer;
	transition: background 0.14s ease;
}

.act-row:hover { background: var(--paper-soft); }
.act-row.is-sel { background: linear-gradient(90deg, var(--lime-soft), var(--paper)); box-shadow: inset 3px 0 0 var(--lime-deep); }
.act-row-mid { min-width: 0; }
.act-row-mid b { display: block; font-size: 13.5px; font-weight: 750; overflow-wrap: anywhere; }
.act-row.is-done b { color: var(--muted); text-decoration: line-through; }

.act-meta { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; margin-top: 4px; }
.act-path { max-width: 280px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 11px; color: var(--muted); }

/* Who ticked it, when it wasn't the person it belongs to. Lime because it is
 * finished work, small because it is a footnote — the action still leads. */
.act-doneby { font-size: 10.5px; font-weight: 800; color: var(--lime-deep); white-space: nowrap; }

.act-cmts { display: inline-flex; align-items: center; gap: 4px; font-size: 10.5px; font-weight: 750; color: var(--ink-soft); }
.act-cmts i { display: none; width: 6px; height: 6px; border-radius: 50%; background: var(--aqua); }
.act-cmts.unseen i { display: block; }

.act-due { font-size: 11.5px; font-weight: 850; color: var(--ink-soft); text-align: right; white-space: nowrap; }
.act-due.late { color: var(--coral-deep); }
.act-due.done { color: var(--lime-deep); }

/* Where an action came from. A label, not a link: opening a meeting follows
 * your own meeting access, and a chip that looks clickable and isn't is worse. */
.act-chip {
	display: inline-flex;
	align-items: center;
	gap: 5px;
	max-width: 200px;
	padding: 3px 7px;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	border: 1px solid var(--aqua-line);
	border-radius: 7px;
	background: var(--aqua-soft);
	color: var(--aqua-deep);
	font-size: 10.5px;
	font-weight: 800;
}

.act-chip.plain { border-color: var(--line); background: var(--silver); color: var(--ink-soft); }

.trk-group-head b.late { color: var(--coral-deep); }
.act-note { padding: 14px 18px; color: var(--muted); font-size: 12.5px; line-height: 1.5; }
.act-fine { font-size: 11.5px; color: var(--muted); line-height: 1.45; }

/* ------------------------------------------------------------- by track -- */

.act-track { border-top: 1px solid var(--line); }
.act-track:first-of-type { border-top: 0; }

.act-track-head {
	display: flex;
	align-items: center;
	gap: 10px;
	flex-wrap: wrap;
	padding: 13px 18px;
	border-bottom: 1px solid var(--line);
	background: linear-gradient(90deg, var(--lime-soft), var(--paper));
}

.act-track-stripe { width: 5px; height: 26px; border-radius: 6px; background: var(--lime-deep); }
.act-track-head b { font-size: 14px; overflow-wrap: anywhere; }
.act-track-head span { font-size: 11.5px; color: var(--ink-soft); }
.act-track-head .trk-progress { width: 90px; margin-left: auto; }
.act-track-head .os-btn { margin-left: 10px; }

.act-ws {
	display: flex;
	align-items: center;
	gap: 8px;
	padding: 10px 18px 7px;
	border-bottom: 1px solid var(--line-soft);
	background: var(--paper-soft);
}

.act-ws i { display: block; width: 7px; height: 20px; border-radius: 6px; background: var(--aqua); }
.act-ws b { font-size: 12.5px; }
.act-ws span { margin-left: auto; font-size: 11px; color: var(--muted); }

.act-init { padding: 9px 18px 5px 32px; color: var(--ink-soft); font-size: 11.5px; font-weight: 800; }
.act-init span { font-weight: 650; color: var(--muted); }
.act-flat-note { padding: 9px 18px; border-bottom: 1px solid var(--line-soft); color: var(--muted); font-size: 12px; }

.act-tree-row {
	display: grid;
	grid-template-columns: 24px minmax(0, 1fr) auto;
	gap: 10px;
	align-items: center;
	padding: 9px 18px 9px 32px;
	border-top: 1px solid var(--line-soft);
	cursor: pointer;
}

.act-tree-row:hover { background: var(--paper-soft); }
.act-tree-row.is-sel { box-shadow: inset 3px 0 0 var(--lime-deep); }
.act-tree-row b { display: block; font-size: 12.5px; font-weight: 750; overflow-wrap: anywhere; }
.act-tree-row.is-done b { color: var(--muted); text-decoration: line-through; }
.act-tree-row small { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-top: 3px; font-size: 11px; color: var(--muted); }
.act-tree-right { display: flex; align-items: center; gap: 8px; justify-content: flex-end; }

/* ---------------------------------------------------------------- inbox -- */

.act-inbox-intro { padding: 15px 18px 13px; border-bottom: 1px solid var(--line); }
.act-inbox-intro h2 { font-size: 17px; letter-spacing: -0.03em; }
.act-inbox-intro p { max-width: 56ch; margin-top: 5px; font-size: 12.5px; line-height: 1.45; color: var(--ink-soft); }

.act-inbox-explain {
	margin: 12px 18px;
	padding: 11px 13px;
	border: 1px dashed var(--line);
	border-radius: 11px;
	background: var(--paper-soft);
}

.act-inbox-explain b { font-size: 12px; }
.act-inbox-explain p { margin-top: 3px; font-size: 11.5px; line-height: 1.4; color: var(--ink-soft); }

.act-zero-buttons { display: flex; gap: 8px; flex-wrap: wrap; }

/* --------------------------------------------------------- context pane -- */

.act-pane { position: sticky; top: 16px; padding: 15px; }
.act-pane .os-eyebrow { color: var(--aqua-deep); }
.act-pane h3 { margin-top: 5px; font-size: 17px; letter-spacing: -0.03em; overflow-wrap: anywhere; }
.act-pane-meta { margin: 5px 0 4px; font-size: 12px; color: var(--ink-soft); }
.act-pane-meta.is-late { color: var(--coral-deep); }

.act-pane-close {
	position: absolute;
	top: 12px;
	right: 12px;
	display: none;
	width: 30px;
	height: 30px;
	border: 0;
	border-radius: 9px;
	background: var(--silver);
	color: var(--ink-soft);
	font-size: 15px;
	font-weight: 850;
}

.act-pane-block { padding: 12px 0; border-top: 1px solid var(--line-soft); }

.act-pane-block h4 {
	margin: 0 0 8px;
	font-size: 10.5px;
	font-weight: 850;
	letter-spacing: 0.1em;
	text-transform: uppercase;
	color: var(--muted);
}

.act-pane-wide { width: 100%; margin-top: 8px; }
.act-plan-path { margin-left: 5px; border-left: 1px solid var(--line); }

.act-plan-path div {
	position: relative;
	padding: 3px 0 3px 12px;
	font-size: 11.5px;
	color: var(--ink-soft);
	overflow-wrap: anywhere;
}

.act-plan-path div::before { content: ""; position: absolute; left: 0; top: 11px; width: 8px; border-top: 1px solid var(--line); }
.act-plan-path div:first-child { color: var(--ink); font-weight: 750; }

.act-kv { display: flex; justify-content: space-between; align-items: baseline; gap: 8px; padding: 4px 0; font-size: 12px; }
.act-kv > span:first-child { color: var(--ink-soft); flex: none; }
.act-edit-host { min-width: 0; text-align: right; }
.act-edit-wrap { position: relative; display: block; }

.act-edit {
	max-width: 100%;
	padding: 0;
	border: 0;
	border-bottom: 1px dotted var(--muted);
	background: transparent;
	color: var(--ink);
	font-size: 12px;
	font-weight: 750;
	text-align: right;
	overflow-wrap: anywhere;
}

.act-edit:hover { color: var(--aqua-deep); border-bottom-color: var(--aqua-deep); }
.act-edit-input { min-width: 0; padding: 5px 8px; font-size: 12px; }

/* The roster suggestion menu — anchored to the field it belongs to. */
.act-pick-wrap { position: relative; }

.act-pick {
	position: absolute;
	top: 100%;
	left: 0;
	right: 0;
	z-index: 70;
	max-height: 220px;
	margin-top: 4px;
	overflow-y: auto;
	border: 1px solid var(--line);
	border-radius: 10px;
	background: var(--paper);
	box-shadow: var(--shadow);
}

.act-pick-row { padding: 8px 10px; cursor: pointer; text-align: left; }
.act-pick-row:hover { background: var(--silver); }
.act-pick-row b { display: block; font-size: 12.5px; font-weight: 750; }
.act-pick-row span { display: block; font-size: 11px; color: var(--muted); }

.act-quote {
	padding: 11px;
	border: 1px solid var(--aqua-line);
	border-radius: 11px;
	background: linear-gradient(135deg, var(--paper), var(--aqua-soft));
}

.act-quote b { display: block; font-size: 12px; overflow-wrap: anywhere; }
.act-quote p { margin: 5px 0 8px; font-size: 11.5px; font-style: italic; line-height: 1.45; color: var(--ink-soft); overflow-wrap: anywhere; }
.act-quote-link { border: 0; background: transparent; padding: 0; color: var(--aqua-deep); font-size: 11.5px; font-weight: 850; }
.act-pane-origin { font-size: 11.5px; line-height: 1.45; color: var(--muted); }

.act-cmt { margin-bottom: 8px; padding: 2px 0 2px 9px; border-left: 2px solid var(--lime-deep); }
.act-cmt.is-pending { opacity: 0.55; }
.act-cmt-meta { display: flex; align-items: baseline; gap: 7px; font-size: 10.5px; color: var(--muted); }
.act-cmt-meta b { font-size: 11.5px; color: var(--ink); }
.act-cmt p { margin-top: 2px; font-size: 11.5px; line-height: 1.45; color: var(--ink-soft); overflow-wrap: anywhere; }
.act-cmt-del { margin-left: auto; border: 0; background: transparent; padding: 0; color: var(--muted); font-size: 10.5px; font-weight: 750; }
.act-cmt-del:hover { color: var(--coral-deep); }

.act-cmt-compose { display: flex; gap: 7px; margin-top: 9px; }
.act-cmt-input { flex: 1; min-width: 0; }

.act-cmt-send {
	width: 34px;
	flex: none;
	border: 0;
	border-radius: 9px;
	background: var(--ink);
	color: var(--base);
	font-weight: 900;
}

.act-cmt-send:disabled { opacity: 0.55; cursor: default; }

/* --------------------------------------------------------------- modals -- */

.act-give-home { display: grid; gap: 10px; padding-top: 12px; border-top: 1px dashed var(--line); }

.act-give-home-toggle {
	border: 0;
	background: transparent;
	padding: 0;
	color: var(--aqua-deep);
	font-size: 12.5px;
	font-weight: 800;
	text-align: left;
}

.act-modal-buttons { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }

/* ----------------------------------------------------------- voice note -- */

.act-vp {
	display: flex;
	align-items: center;
	gap: 11px;
	padding: 13px;
	border: 1px solid var(--aqua-line);
	border-radius: 12px;
	background: var(--aqua-soft);
}

.act-vp-orb {
	display: grid;
	place-items: center;
	width: 34px;
	height: 34px;
	flex: none;
	border-radius: 12px;
	background: var(--aqua);
	color: #053c3f;
	font-size: 15px;
	font-weight: 900;
}

.act-vp-lines { flex: 1; min-width: 0; }
.act-vp-lines b { display: block; font-size: 12.5px; }
.act-vp-lines span { display: block; margin-top: 2px; font-size: 11.5px; color: var(--ink-soft); }
.act-vp-timer { font-size: 12px; font-weight: 800; color: var(--muted); }
.act-vp.is-recording { border-color: var(--coral-line); background: var(--coral-soft); }
.act-vp.is-recording .act-vp-orb { background: var(--coral); color: #6f1714; animation: act-vp-pulse 1.3s infinite; }
@keyframes act-vp-pulse { 50% { transform: scale(0.88); opacity: 0.75; } }
@media (prefers-reduced-motion: reduce) { .act-vp.is-recording .act-vp-orb { animation: none; } }

.act-vp-buttons { display: flex; gap: 8px; }
.act-vp-result { padding: 12px; border: 1px solid var(--line); border-radius: 12px; background: var(--paper-soft); font-size: 12.5px; }
.act-vp-result ul { margin: 6px 0 0; padding-left: 18px; }
.act-vp-result li { margin-top: 5px; color: var(--ink-soft); }

/* ------------------------------------------------------------ responsive -- */

@media (max-width: 1080px) {
	.act-wrap { grid-template-columns: 1fr; }
	/* The pane becomes a sheet over the list — the list is the page on a phone. */
	.act-pane {
		position: fixed;
		left: 0;
		right: 0;
		bottom: 0;
		top: auto;
		z-index: 50;
		max-height: 64vh;
		overflow-y: auto;
		border-radius: 18px 18px 0 0;
		box-shadow: 0 -20px 60px rgba(0, 0, 0, 0.25);
	}
	.act-pane-close { display: grid; place-items: center; }
}

@media (max-width: 760px) {
	.act-summary { display: none; }
	/* Two per row rather than four squeezed into one — a 60px-wide "Search
	 * actions" box is a control nobody can read. */
	.act-filterbar .os-input,
	.act-filterbar .os-select { flex: 1 1 140px; min-width: 140px; }
	.act-filterbar .os-chips { flex: 1 0 100%; }
	.act-owner-wrap { flex: 1 1 140px; min-width: 140px; }
	.act-owner-wrap .os-input { width: 100%; }
	.act-controlbar { width: 100%; }
	.act-controlbar .act-drop { flex: 1 1 auto; }
	.act-controlbar .act-drop-btn { width: 100%; justify-content: space-between; }
	.act-hide-toggle { flex: 1 0 100%; justify-content: center; }
	/* Whose, then how — each on its own line, both full width. */
	.act-tools { width: 100%; }
	.act-who,
	.act-tools .os-tabs { flex: 1 0 100%; }
	.act-path { max-width: 150px; }
	.act-head { align-items: flex-start; flex-direction: column; }
	.act-track-head .trk-progress { display: none; }
	.act-tree-row { padding-left: 18px; }
	.hm-snack { right: 12px; left: 12px; bottom: 100px; max-width: none; }
	.hm-dir-h,
	.hm-dir-row,
	.act-row { padding-left: 14px; padding-right: 14px; }
}

/* Touch: nothing is hover-only and every target is thumb-sized. */
@media (hover: none) {
	.act-row,
	.act-tree-row { padding-top: 13px; padding-bottom: 13px; }
	.act-edit { min-height: 32px; }
	.act-who button { min-height: 44px; }
	.mt-who button { min-height: 44px; }
	.act-drop-btn,
	.act-hide-toggle { min-height: 44px; }
	.act-cmt-send { min-height: 40px; }
	.act-pane-close { width: 40px; height: 40px; }
	.hm-linky { min-height: 32px; }
}

/* ═════════════════════════════════════════════ record (lane U) ═══════════ *
 * Capturing a meeting: record here, add a recording you already have, or send
 * Lumi to a live one. One focused column — this is a task, not a dashboard —
 * with the record button as the only thing that looks like a decision.
 *
 * Forked from V1 /new (web/new.html's page-local <style>), re-authored in the
 * V2 vocabulary: panels instead of cards, lime for progress, coral for the one
 * destructive control, aqua for what Lumi is doing.
 * ═══════════════════════════════════════════════════════════════════════════ */

.rec-screen { max-width: 760px; margin: 0 auto; }

/* ------------------------------------------------------------- the offers --
 * A recording that never got sent, and the older local copy. Aqua: this is
 * something Lumi is holding for you, not an alarm. */

.rec-banner {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 14px;
	flex-wrap: wrap;
	margin-bottom: 14px;
	padding: 13px 15px;
	border: 1px solid var(--aqua-line);
	border-radius: 14px;
	background: var(--aqua-soft);
}

.rec-banner-lines { min-width: 0; }
.rec-banner-lines b { display: block; font-size: 13px; color: var(--ink); }
.rec-banner-lines span { display: block; margin-top: 2px; font-size: 12.5px; color: var(--ink-soft); }
.rec-banner-buttons { display: flex; gap: 8px; flex: none; }

/* --------------------------------------------------------------- the tabs -- */

.rec-modes { margin-bottom: 14px; }

/* --------------------------------------------------------- the record stage -- */

.rec-stage {
	display: flex;
	flex-direction: column;
	align-items: center;
	text-align: center;
	padding: 26px 20px 24px;
}

/* -------------------------------------------------------- what it listens to --
 * A microphone alone cannot hear a call running in this same browser: the
 * browser's echo remover subtracts whatever the speakers are playing, and on a
 * browser call that IS the other people (CLAUDE.md #27). So the source is a
 * choice, and it sits above the button — the right answer changes per meeting,
 * which is exactly why it can't live in a settings page. */

.rec-source-pick {
	display: grid;
	grid-template-columns: 1fr 1fr;
	gap: 8px;
	width: 100%;
	max-width: 380px;
	margin-bottom: 18px;
}

.rec-source-pick button {
	display: grid;
	gap: 2px;
	padding: 10px 11px;
	min-height: 58px;
	text-align: left;
	border: 1px solid var(--line);
	border-radius: 13px;
	background: var(--paper-soft);
	color: var(--ink);
	font: inherit;
	transition: border-color 0.14s ease, background 0.14s ease;
	-webkit-tap-highlight-color: transparent;
}

.rec-source-pick button:hover:not(:disabled) { border-color: var(--muted); }
.rec-source-pick button[aria-pressed="true"] { border-color: var(--ink); background: var(--silver); }
.rec-source-pick button:disabled { cursor: default; opacity: 0.5; }
.rec-source-pick .t { font-size: 13px; font-weight: 750; letter-spacing: -0.01em; }
.rec-source-pick .s { font-size: 11.5px; line-height: 1.35; color: var(--muted); }

/* Chrome's share dialog is Chrome's — we can't restyle it, only make it
 * expected, and name the one tick box that decides whether this works. */
.rec-source-prep {
	width: 100%;
	max-width: 380px;
	margin: -8px 0 16px;
	padding: 10px 12px;
	text-align: left;
	border: 1px solid var(--aqua-line);
	border-radius: 12px;
	background: var(--aqua-soft);
	color: var(--ink-soft);
	font-size: 12px;
	line-height: 1.45;
}

.rec-source-prep b { color: var(--ink); }

.rec-stage .rec-source-note { margin-bottom: 16px; }
.rec-source-note.warn { border-color: var(--amber-line); background: var(--amber-soft); }
.rec-source-note-actions { display: flex; gap: 8px; margin-top: 10px; }
.rec-source-note-actions .os-btn { flex: 1; min-height: 40px; }

/* While it runs, this states what is actually being heard. It is the line that
 * would have caught the 29 Jul call: it would have said "Your mic" and nothing
 * else, next to a meeting everyone believed was being recorded in full. */
.rec-source-live {
	max-width: 340px;
	margin-top: 4px;
	padding: 4px 11px;
	border-radius: 999px;
	background: var(--lime-soft);
	color: var(--lime-deep);
	font-size: 12px;
	font-weight: 800;
}

/* The call's sound went away mid-recording. The mic keeps going — losing the
 * meeting would be worse — but a failure has to look different from success. */
.rec-source-live.warn {
	background: var(--amber-soft);
	color: var(--amber-deep);
	font-weight: 750;
	line-height: 1.45;
	border-radius: 12px;
	padding: 7px 11px;
}

/* ---- an interrupted recording (2026-08-06) --------------------------------
 * Louder than the source pill on purpose. The pill answers "what am I hearing";
 * this answers "part of this meeting is already gone", which is the sentence a
 * person has to be able to act on WHILE there is still a meeting to re-start.
 * It never clears itself for the rest of the take — a warning that disappears
 * once things look fine again is how the founder's screen went on saying
 * "Recording" over a dead microphone. */
.rec-gap {
	width: 100%;
	max-width: 460px;
	margin: 10px auto 0;
	padding: 10px 13px;
	border-radius: 12px;
	border: 1px solid var(--amber-line);
	background: var(--amber-soft);
	color: var(--amber-deep);
	font-size: 13px;
	font-weight: 750;
	line-height: 1.45;
	text-align: left;
}

/* Capture is gone and could not be re-opened. This is not a caution about the
 * recording — it is the end of it, so it does not wear caution's colours. */
.rec-gap.is-lost {
	border-color: var(--coral-line);
	background: var(--coral-soft);
	color: var(--coral-deep);
}

.rec-big {
	display: flex;
	flex-direction: column;
	align-items: center;
	justify-content: center;
	gap: 12px;
	width: 168px;
	height: 168px;
	border: 0;
	border-radius: 50%;
	background: var(--ink);
	color: var(--base);
	font-size: 15px;
	font-weight: 800;
	letter-spacing: -0.01em;
	box-shadow: 0 14px 34px rgba(24, 26, 25, 0.24);
	transition: transform 0.14s ease, box-shadow 0.14s ease, background 0.14s ease;
	-webkit-tap-highlight-color: transparent;
	touch-action: manipulation;
}

.rec-big-dot {
	width: 30px;
	height: 30px;
	border-radius: 50%;
	background: var(--lime);
	transition: border-radius 0.16s ease, width 0.16s ease, height 0.16s ease, background 0.16s ease;
}

.rec-big:hover:not(:disabled) { transform: scale(1.03); }
.rec-big:active:not(:disabled) { transform: scale(0.98); }
.rec-big:disabled { cursor: default; }

.rec-big.is-recording {
	background: var(--coral-deep);
	color: #fff;
	box-shadow: 0 0 0 0 rgba(255, 105, 97, 0.45);
	animation: rec-pulse 1.6s infinite;
}

.rec-big.is-recording .rec-big-dot { width: 26px; height: 26px; border-radius: 7px; background: #fff; }

@keyframes rec-pulse {
	0% { box-shadow: 0 0 0 0 rgba(255, 105, 97, 0.42); }
	70% { box-shadow: 0 0 0 22px rgba(255, 105, 97, 0); }
	100% { box-shadow: 0 0 0 0 rgba(255, 105, 97, 0); }
}

@media (prefers-reduced-motion: reduce) {
	.rec-big.is-recording { animation: none; }
	.rec-big, .rec-big-dot { transition: none; }
}

.rec-timer {
	margin: 18px 0 4px;
	font-size: 30px;
	font-weight: 700;
	letter-spacing: 0.02em;
	font-variant-numeric: tabular-nums;
	color: var(--ink);
}

.rec-hint { max-width: 340px; color: var(--ink-soft); font-size: 13px; }
.rec-quiet { color: var(--muted); font-size: 12px; line-height: 1.45; }
.rec-stage .rec-quiet { margin-top: 6px; }

/* The only reassurance this page gives, and only once it is TRUE: the audio is
 * safely somewhere other than this window. */
.rec-safe {
	margin-top: 8px;
	padding: 4px 10px;
	border-radius: 999px;
	background: var(--lime-soft);
	color: var(--lime-deep);
	font-size: 12px;
	font-weight: 800;
}

/* Saving has fallen behind. The one piece of reassurance on this page has to
 * stop reassuring — quietly showing an old time while nothing lands is how a
 * live meeting went 40 minutes unsaved (2026-07-28). */
.rec-safe.warn {
	background: var(--amber-soft);
	color: var(--amber-deep);
	line-height: 1.45;
}

.rec-level {
	display: block;
	width: 100%;
	max-width: 340px;
	height: 40px;
	margin: 16px auto 0;
	border-radius: 8px;
	background: var(--silver);
}

.rec-controls {
	display: flex;
	gap: 10px;
	justify-content: center;
	width: 100%;
	max-width: 340px;
	margin-top: 18px;
}

.rec-controls .os-btn { flex: 1; min-height: 44px; }

.rec-preview {
	width: 100%;
	max-width: 420px;
	margin-top: 20px;
	padding: 14px;
	border: 1px solid var(--line);
	border-radius: 14px;
	background: var(--paper-soft);
	text-align: left;
}

.rec-preview-head {
	display: flex;
	align-items: baseline;
	justify-content: space-between;
	gap: 10px;
	margin-bottom: 8px;
	font-size: 13px;
}

.rec-preview-head b { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.rec-preview-len { color: var(--muted); font-size: 12px; font-variant-numeric: tabular-nums; flex: none; }
.rec-preview audio { width: 100%; margin-bottom: 10px; }

/* A statement of fact about this browser, not a warning. */
.rec-note {
	padding: 11px 13px;
	border: 1px solid var(--line);
	border-radius: 12px;
	background: var(--paper-soft);
	color: var(--ink-soft);
	font-size: 12.5px;
	text-align: left;
}

.rec-stage .rec-note { margin-bottom: 16px; width: 100%; }

/* ------------------------------------------------ a recording you have -- */

.rec-drop {
	display: grid;
	gap: 4px;
	justify-items: center;
	padding: 30px 20px;
	border: 1px dashed var(--line);
	border-radius: 14px;
	background: var(--paper-soft);
	text-align: center;
	cursor: pointer;
}

.rec-drop b { font-size: 13.5px; }
.rec-drop span { color: var(--muted); font-size: 12px; }
.rec-drop input[type="file"] { display: none; }
.rec-drop:hover, .rec-drop.is-drag { border-color: var(--aqua); background: var(--aqua-soft); }
.rec-drop.has-file { border-style: solid; }

.rec-chosen {
	margin-top: 12px;
	padding: 13px;
	border: 1px solid var(--line);
	border-radius: 12px;
	background: var(--paper-soft);
}

.rec-parts { margin: 4px 0 6px; padding-left: 20px; font-size: 12.5px; color: var(--ink-soft); }
.rec-parts li { padding: 2px 0; }
.rec-chosen .os-btn { margin-top: 10px; }

/* --------------------------------------------------------------- send Lumi -- */

.rec-bot-head { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; }
.rec-bot-head b { font-size: 14px; }
.rec-bot-desc { margin: 6px 0 14px; font-size: 13px; }
.rec-bot-row { display: flex; gap: 9px; flex-wrap: wrap; }
.rec-bot-row .os-input { flex: 1 1 220px; min-width: 0; min-height: 40px; }
.rec-bot-row .os-btn { flex: 0 0 auto; min-height: 40px; }
.rec-bot-title { margin-top: 9px; min-height: 40px; }

.rec-status {
	margin-top: 13px;
	padding: 11px 13px;
	border: 1px solid var(--line);
	border-radius: 12px;
	background: var(--paper-soft);
	font-size: 12.5px;
	line-height: 1.45;
}

.rec-status.is-ok { border-color: var(--lime-line); background: var(--lime-soft); color: var(--lime-deep); }
.rec-status.is-info { border-color: var(--aqua-line); background: var(--aqua-soft); color: var(--aqua-deep); }
.rec-status.is-warn { border-color: var(--coral-line); background: var(--coral-soft); color: var(--coral-deep); }
.rec-status.is-err { border-color: var(--coral-line); background: var(--coral-soft); color: var(--coral-deep); }
.rec-status a { color: inherit; font-weight: 800; }

/* ---------------------------------------------------------- the details -- */

.rec-details { margin-top: 16px; overflow: hidden; }

.rec-summary {
	display: flex;
	align-items: baseline;
	gap: 10px;
	flex-wrap: wrap;
	padding: 15px 18px;
	list-style: none;
	font-size: 13.5px;
	font-weight: 800;
	cursor: pointer;
	-webkit-tap-highlight-color: transparent;
}

.rec-summary::-webkit-details-marker { display: none; }

.rec-summary::before {
	content: "›";
	display: inline-block;
	font-size: 17px;
	line-height: 1;
	color: var(--muted);
	transition: transform 0.16s ease;
}

.rec-details[open] .rec-summary::before { transform: rotate(90deg); }
@media (prefers-reduced-motion: reduce) { .rec-summary::before { transition: none; } }
.rec-summary-opt { color: var(--muted); font-size: 12px; font-weight: 600; }

.rec-details-body { padding: 4px 18px 20px; border-top: 1px solid var(--line); }
.rec-section { margin-top: 20px; }
.rec-section:first-child { margin-top: 16px; }

.rec-section-title {
	margin-bottom: 8px;
	font-size: 11px;
	font-weight: 850;
	letter-spacing: 0.14em;
	text-transform: uppercase;
	color: var(--muted);
}

.rec-field-hint { margin: 6px 0 10px; }
.rec-grid-2 { display: grid; grid-template-columns: 2fr 1fr; gap: 12px; }
.rec-templates { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; }
.rec-templates .os-select { flex: 1 1 190px; min-width: 0; }

/* people ------------------------------------------------------------------- */

.rec-speaker {
	display: grid;
	grid-template-columns: 1fr 1fr auto;
	gap: 9px;
	align-items: center;
	margin-bottom: 8px;
}

.rec-speaker-name { position: relative; min-width: 0; }

.rec-ac {
	position: absolute;
	top: 100%;
	left: 0;
	z-index: 30;
	min-width: 240px;
	max-height: 240px;
	margin-top: 4px;
	overflow-y: auto;
	border: 1px solid var(--line);
	border-radius: 11px;
	background: var(--paper);
	box-shadow: var(--shadow);
}

.rec-ac-item { padding: 8px 10px; cursor: pointer; border-bottom: 1px solid var(--line-soft); }
.rec-ac-item:last-child { border-bottom: 0; }
.rec-ac-item:hover { background: var(--silver); }
.rec-ac-name { font-size: 12.5px; font-weight: 750; }
.rec-ac-sub { margin-top: 1px; font-size: 11px; color: var(--muted); }

.rec-speaker-x {
	min-height: 38px;
	padding: 0 11px;
	border: 1px solid var(--line);
	border-radius: 10px;
	background: transparent;
	color: var(--muted);
	font-size: 12px;
	font-weight: 750;
}

.rec-speaker-x:hover { border-color: var(--coral-line); background: var(--coral-soft); color: var(--coral-deep); }

.rec-add-speaker {
	margin-top: 4px;
	padding: 9px 12px;
	border: 1px dashed var(--line);
	border-radius: 10px;
	background: transparent;
	color: var(--ink-soft);
	font-size: 12.5px;
	font-weight: 750;
}

.rec-add-speaker:hover { border-color: var(--aqua); color: var(--aqua-deep); background: var(--aqua-soft); }

/* --------------------------------------------------------------- sending -- */

/* Deliberately NOT sticky. V1 pinned this bar to the bottom of the viewport;
 * here the Lumi dock already lives there — and on a phone the dock spans the
 * full width, so a pinned send button would sit underneath it. The screen
 * reserves bottom room for the dock, so the end of the form is reachable and
 * nothing overlaps. */
.rec-submit { margin-top: 18px; padding: 14px 0 0; }

.rec-statusline { margin-bottom: 10px; text-align: center; font-size: 12.5px; color: var(--muted); }
.rec-statusline strong { color: var(--ink); font-variant-numeric: tabular-nums; }

.rec-error {
	margin-bottom: 12px;
	padding: 11px 13px;
	border: 1px solid var(--coral-line);
	border-radius: 12px;
	background: var(--coral-soft);
	color: var(--coral-deep);
	font-size: 12.5px;
}

.rec-submit .rec-note { margin-bottom: 12px; }
.rec-tip { margin-top: 8px; }
.rec-tip summary { cursor: pointer; font-size: 12px; font-weight: 750; color: var(--ink-soft); }

.rec-tip-code {
	display: block;
	margin-top: 7px;
	padding: 8px 10px;
	border: 1px solid var(--line);
	border-radius: 8px;
	background: var(--paper);
	color: var(--ink-soft);
	font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
	font-size: 11.5px;
	word-break: break-all;
}

.rec-progress {
	height: 6px;
	margin: 4px 0 12px;
	border-radius: 999px;
	background: var(--silver);
	overflow: hidden;
}

.rec-progress-bar { width: 0%; height: 100%; background: var(--lime); transition: width 0.2s ease; }
@media (prefers-reduced-motion: reduce) { .rec-progress-bar { transition: none; } }

.rec-submit-actions {
	display: flex;
	align-items: center;
	justify-content: center;
	gap: 12px;
	flex-wrap: wrap;
}

.rec-send { min-height: 46px; min-width: 220px; font-size: 14px; }

/* ------------------------------------------------------------ responsive -- */

@media (max-width: 760px) {
	.rec-grid-2 { grid-template-columns: 1fr; }
	/* Name across the top, what-they-do and Remove sharing the line below —
	 * four stacked blocks per person is a lot of screen for two fields. */
	.rec-speaker { grid-template-columns: 1fr auto; }
	.rec-speaker-name { grid-column: 1 / -1; }
	.rec-ac { min-width: 0; width: 100%; }
	.rec-banner { align-items: flex-start; }
	.rec-banner-buttons { width: 100%; }
	.rec-banner-buttons .os-btn { flex: 1; }
	.rec-modes { width: 100%; }
	/* Three tabs across a 390px phone: tighten them rather than let the middle
	 * label wrap onto two lines. */
	.rec-modes button { flex: 1; padding-left: 6px; padding-right: 6px; font-size: 12px; }
	.rec-stage { padding: 22px 14px 20px; }
	.rec-details-body { padding: 4px 14px 18px; }
	.rec-summary { padding: 14px; }
	.rec-submit-actions { flex-direction: column; align-items: stretch; }
	.rec-send { width: 100%; min-width: 0; }
	.rec-bot-row .os-btn { flex: 1 1 auto; }
}

/* Touch: every control is thumb-sized, nothing depends on hover. */
@media (hover: none) {
	.rec-speaker-x, .rec-add-speaker { min-height: 42px; }
	.rec-templates .os-btn, .rec-chosen .os-btn, .rec-preview .os-btn { min-height: 40px; }
	.rec-banner-buttons .os-btn { min-height: 40px; }
	.rec-ac-item { padding: 11px 12px; }
	.rec-modes button { min-height: 40px; }
}

/* ── touch targets + track-goal clamp (lane V) ─────────────────────────────
 * Measured at 390×844 in a real touch-emulated Chrome across Home, Tracks,
 * Threads, Actions and Meetings: twenty-odd interactive elements sat between
 * 16px and 40px. 44px is the floor a thumb actually hits (WCAG 2.5.8 sets 24px
 * as the bare minimum; 44 is the size people don't miss).
 *
 * Scoped to `(hover: none)` rather than a width, because the question is "is
 * this a finger?" not "is this narrow": a tablet is wide AND touch-only, a
 * small desktop window is narrow and has a mouse. Nothing below reaches a
 * pointer device — desktop density is untouched.
 *
 * Two techniques, picked per control:
 *   · grow the box, where the container has room and bigger is simply better
 *     (bars, buttons, fields, chips);
 *   · grow only the HIT AREA with a transparent ::before, where the small box
 *     IS the design — a dense list's tick. The visual stays exactly as signed
 *     off; the region that answers a thumb does not.
 *
 * The `(hover: none)` block above already claimed "every target is thumb-sized"
 * while setting 32px and 40px. Those four are re-stated at the end here (this
 * file is append-only per lane) so the comment is finally true. */
@media (hover: none) {
	/* --- shell chrome: on every page, so wrong here is wrong everywhere --- */
	.os-topbar-burger,
	.os-topbar-search { width: 44px; height: 44px; }
	.os-topbar-title { min-height: 44px; }   /* wordmark stays 17px; the tap area grows */
	.os-avatar { width: 44px; height: 44px; }

	/* The dock's pill grows with its controls (8px padding + 44 = 60px tall).
	 * That is a normal height for a bottom bar on a phone, and it beats three
	 * 32px targets sitting in a 48px pill. */
	.os-dock-orb,
	.os-dock-send { width: 44px; height: 44px; min-width: 44px; }
	.os-dock-input { min-height: 44px; }

	/* --- shared primitives: every page inherits these --- */
	.os-btn,
	.os-btn.small { min-height: 44px; }
	.os-input,
	.os-select,
	.os-textarea { min-height: 44px; }
	/* min-width too: a chip labelled "All" is only as wide as the word. */
	.os-chips button,
	.os-tabs button { min-height: 44px; min-width: 44px; }

	/* --- the stragglers the sweep found --- */
	.trk-archived { min-height: 44px; }
	.trk-archived input { width: 20px; height: 20px; }
	/* A 44px tick would rewrite a dense list's rhythm — reach, not size. Sized
	 * explicitly rather than with a negative inset: the tick carries a 1.5px
	 * border, and inset arithmetic off the padding box lands at 42px. */
	.trk-check { position: relative; }
	.trk-check::before {
		content: "";
		position: absolute;
		top: 50%;
		left: 50%;
		width: 44px;
		height: 44px;
		transform: translate(-50%, -50%);
	}
	/* "Who is in the recording": the same controls on /record were given a
	 * thumb in PR #102 and the meeting page's copies were missed — the × was
	 * 13x14. The chip itself is a target (tapping it opens the row), so it
	 * takes the floor; the × grows its REACH inside that chip and no wider
	 * than the gap between chips, or it eats its neighbour's tap. */
	.mt-speaker { min-height: 44px; }
	.mt-speaker-x { position: relative; }
	.mt-speaker-x::before {
		content: "";
		position: absolute;
		top: 50%;
		left: 50%;
		width: 26px;
		height: 44px;
		transform: translate(-50%, -50%);
	}
	.mt-speaker-add { min-height: 44px; }
	.mt-speaker-form input { min-height: 44px; }
	.mt-suggest-row { min-height: 44px; }
	.mt-crumb,
	.mt-crumb-home,
	.mt-crumb-switch,
	.mt-btn-sm,
	.mt-search { min-height: 44px; }
	.mt-filters button { min-height: 44px; min-width: 44px; }
	.mt-top-actions .os-btn { min-height: 44px; }

	/* Re-stated from the block above: 32 and 40 are not thumb-sized. */
	.act-edit,
	.act-cmt-send,
	.hm-linky { min-height: 44px; }
	.act-pane-close { width: 44px; height: 44px; }

	/* Absorbed when this lane rebased onto lane U's record fork (PR #102),
	 * which landed with its own touch block at 40–42px. Same floor, or the
	 * sweep would have been true everywhere except the newest page. */
	.rec-speaker-x,
	.rec-add-speaker,
	.rec-templates .os-btn,
	.rec-chosen .os-btn,
	.rec-preview .os-btn,
	.rec-banner-buttons .os-btn,
	.rec-modes button { min-height: 44px; }
}

/* A track's goal is context in a list row, not the reading surface — the whole
 * goal lives on the track's own page. On the stress seed a 330-character goal
 * turned one row into a seven-line paragraph (139px tall at 390px wide) and the
 * list stopped being scannable. Two lines, then an ellipsis, at every width:
 * a long goal breaks the desktop row's rhythm just as surely, only later. */
.trk-meta {
	display: -webkit-box;
	-webkit-box-orient: vertical;
	-webkit-line-clamp: 2;
	line-clamp: 2;
	overflow: hidden;
}

/* A phone has no ⌘ key, so the drawer's Search row read "Search ⌘K" as an
 * instruction nobody could follow. The row itself already opens the palette
 * (os-shell.js wires [data-os-search]) — only the shortcut hint goes. */
.os-rail-kbd { opacity: 0.55; font-weight: 700; }

@media (hover: none) {
	.os-rail-kbd { display: none; }
}

/* ────────────────────────── in-review queue (lane X — Phase 4) ── *
 *
 * The Source → work review band on a meeting's Brief tab, plus its edit sheet.
 * Aqua is the intelligence/source accent throughout: a proposal is Lumi reading,
 * and the quote card is the evidence. Applied cards go lime (work that now
 * exists), a failed read goes coral (something to retry).
 *
 * The layout carries the argument (spec §8.1): while anything is pending the
 * band is full width at the TOP of the tab and the Brief prose sits below it;
 * once the queue is cleared the same band collapses to a single line. Both
 * themes come out of the same token rules — nothing here hardcodes a colour.
 * Append-only section: this lane touches no rule above. */

.rv-band {
	border: 1px solid var(--aqua-line);
	background: linear-gradient(135deg, var(--paper) 55%, var(--aqua-soft));
	border-radius: var(--radius);
	box-shadow: var(--shadow-soft);
	padding: 20px 22px;
	margin-bottom: 18px;
}

.rv-bandhead {
	display: flex;
	align-items: flex-start;
	justify-content: space-between;
	gap: 14px;
	flex-wrap: wrap;
	margin-bottom: 15px;
}

.rv-eyebrow { color: var(--aqua-deep); }
.rv-bandhead h3 { font-size: 20px; letter-spacing: -0.04em; margin: 4px 0 0; }
.rv-note { font-size: 12.5px; color: var(--ink-soft); margin: 6px 0 0; max-width: 540px; }

.rv-bandside { display: flex; flex-direction: column; align-items: flex-end; gap: 9px; }

.rv-grid {
	display: grid;
	grid-template-columns: repeat(2, minmax(0, 1fr));
	gap: 12px;
}

.rv-item {
	border: 1px solid var(--line);
	background: var(--paper);
	border-radius: 14px;
	box-shadow: var(--shadow-soft);
	padding: 15px 16px;
	display: flex;
	flex-direction: column;
	gap: 8px;
	min-width: 0;
}

.rv-item.is-busy { opacity: 0.6; }
.rv-title { font-size: 14.5px; letter-spacing: -0.02em; }
.rv-detail { font-size: 12.5px; line-height: 1.5; color: var(--ink-soft); margin: 0; }

.rv-target {
	display: inline-flex;
	align-items: baseline;
	gap: 5px;
	font-size: 11.5px;
	font-weight: 750;
	color: var(--ink-soft);
	min-width: 0;
}
.rv-target i { font-style: normal; color: var(--muted); overflow-wrap: anywhere; }

/* The evidence. Always on screen, never truncated to a teaser — a proposal you
 * can't check the source of is the thing this whole surface exists to avoid. */
.rv-quote {
	border: 1px solid var(--aqua-line);
	background: var(--aqua-soft);
	border-radius: 10px;
	padding: 9px 11px;
	font-size: 12px;
	line-height: 1.5;
	color: var(--aqua-deep);
	overflow-wrap: anywhere;
}
.rv-quote::before { content: "“ "; font-weight: 850; }

.rv-wait,
.rv-error {
	display: flex;
	align-items: center;
	gap: 8px;
	flex-wrap: wrap;
	font-size: 12px;
	font-weight: 700;
	border-radius: 8px;
	padding: 8px 10px;
}
.rv-wait { color: var(--muted); background: var(--silver); }
.rv-error { color: var(--coral-deep); background: var(--coral-soft); border: 1px solid var(--coral-line); }

.rv-actions {
	display: flex;
	gap: 7px;
	flex-wrap: wrap;
	margin-top: auto;
	padding-top: 2px;
}
.rv-actions .os-btn { min-height: 34px; padding: 0 12px; font-size: 12.5px; }

.rv-item.is-done {
	background: var(--lime-soft);
	border-color: var(--lime-line);
	box-shadow: none;
}
.rv-done { display: flex; align-items: center; gap: 8px; font-size: 12.5px; font-weight: 750; }
.rv-tick { color: var(--lime-deep); }
.rv-done-text {
	flex: 1;
	min-width: 0;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: var(--ink-soft);
	font-weight: 700;
}

/* A link that is a button, because it navigates the shell rather than the page. */
.rv-open {
	border: 0;
	background: none;
	padding: 0;
	color: var(--aqua-deep);
	font-size: 12px;
	font-weight: 750;
	white-space: nowrap;
	text-decoration: underline;
	text-underline-offset: 2px;
}
.rv-open:hover { color: var(--ink); }

.rv-gen { font-size: 11px; color: var(--muted); margin-top: 12px; }

/* Cleared: the band steps back to one line and the Brief takes the stage. */
.rv-band.is-cleared { padding: 13px 20px; }
.rv-cleared {
	display: flex;
	align-items: center;
	gap: 10px;
	flex-wrap: wrap;
	font-size: 13.5px;
	font-weight: 750;
	color: var(--lime-deep);
}
.rv-cleared .os-eyebrow { color: var(--aqua-deep); }
.rv-cleared small { font-weight: 600; color: var(--ink-soft); }
.rv-cleared .rv-open { margin-left: auto; }

/* Nothing in review: one quiet line, no chrome at all. */
.rv-quietline { font-size: 12.5px; color: var(--muted); margin: 0 0 14px; }

.rv-failedband {
	display: flex;
	align-items: center;
	gap: 12px;
	flex-wrap: wrap;
	border: 1px solid var(--coral-line);
	background: var(--coral-soft);
	border-radius: 14px;
	padding: 13px 16px;
	margin-bottom: 16px;
	font-size: 12.5px;
	line-height: 1.5;
	color: var(--coral-deep);
}
.rv-failedband .os-btn { margin-left: auto; }

/* ── the edit sheet ── */

.rv-sheet { width: min(520px, 100%); }
.rv-sheet-sub { font-size: 12.5px; color: var(--ink-soft); margin: 4px 0 12px; }
.rv-sheet-target { font-size: 11.5px; font-weight: 750; color: var(--muted); margin: 8px 0 0; }
.rv-sheet-grid { display: grid; gap: 11px; margin-top: 14px; }
.rv-opt { font-style: normal; color: var(--muted); font-weight: 600; }
.rv-place { display: grid; gap: 7px; }
.rv-hint { font-size: 11.5px; color: var(--muted); font-weight: 600; }

/* The dismiss toast carries its own way back. */
.mt-toast-action { display: flex; align-items: center; gap: 12px; }
.mt-toast-action button {
	border: 0;
	background: none;
	padding: 0;
	color: var(--lime);
	font-weight: 850;
	font-size: 13px;
}

@media (max-width: 1050px) {
	.rv-grid { grid-template-columns: 1fr; }
}

/* A text-styled button is still a button: on touch it needs a real target,
 * which the type size alone (17px tall) does not give it. */
@media (hover: none) {
	.rv-open {
		display: inline-flex;
		align-items: center;
		min-height: 44px;
	}
}

@media (max-width: 760px) {
	.rv-band { padding: 16px 15px; }
	.rv-bandhead { flex-direction: column; }
	/* At this width the pill and the hero action read as the head's own row
	 * rather than a right-hand column that has nowhere to sit. */
	.rv-bandside { flex-direction: row; align-items: center; width: 100%; }
	.rv-bandside .os-btn { flex: 1; }
	.rv-cleared .rv-open { margin-left: 0; }
	.rv-actions .os-btn { min-height: 40px; }
}

/* ══════════════════════════════════ lumi workspaces (lane W — Phase 3) ══════
 *
 * The Lumi surface's own styles live in css/lumi.css. What belongs HERE is the
 * handful of tokens it introduces, because tokens are the shared language and
 * a second surface will want them (Threads already draws member faces, and
 * People will).
 *
 * FACE TINTS — member avatars rotate deterministically by member index
 * (aqua → lime → coral, repeating) so a group of people reads as a group at a
 * glance instead of a row of identical grey discs (founder, 2026-07-27). Each
 * pairing is authored for BOTH themes and must keep the initial clearly
 * legible; the plain pairing is the defensive fallback for an unclassed face
 * and holds contrast too.
 *
 * BUBBLE — a person's own message in a Lumi conversation is the one place the
 * surface inverts: ink ground, paper text. It is a token because "what my own
 * words look like" should not be decided twice.
 */

:root,
html[data-theme="light"] {
	--face-aqua-bg: #c8f1f4;
	--face-aqua-ink: #05555c;
	--face-lime-bg: #ddf3c4;
	--face-lime-ink: #2b6612;
	--face-coral-bg: #ffdcd8;
	--face-coral-ink: #96302a;
	--face-plain-bg: #dfe3de;
	--face-plain-ink: #181a19;

	--bubble-user: #1d211f;
	--bubble-user-ink: #ffffff;
}

html[data-theme="dark"] {
	--face-aqua-bg: #12474c;
	--face-aqua-ink: #93ecf1;
	--face-lime-bg: #2c4818;
	--face-lime-ink: #c3f68d;
	--face-coral-bg: #522925;
	--face-coral-ink: #ffbcb6;
	--face-plain-bg: #3a3e39;
	--face-plain-ink: #f0f3ee;

	--bubble-user: #2a2f2c;
	--bubble-user-ink: #f2f5f1;
}

/* The Workspaces block on a track's Story rail (spec §5.5). It shares the
 * linked-meetings row style; only the section break between the two is new —
 * without it the two lists read as one. */
.trk-ws-head { border-top: 1px solid var(--line); padding-top: 12px; }

/* ── thumb-sized controls, round two (lane Z) ──────────────────────────────
 * Lane V's sweep (#103) measured Home, Tracks, Threads, Actions and Meetings
 * as they stood then, and its `(hover: none)` block is still the floor. This
 * one covers what that sweep could not: the controls added since, plus the
 * ones a harness that never flipped `hover: none` had been quietly measuring
 * against the DESKTOP stylesheet. Every size below was measured at 390×844 in
 * a Chrome with hover:none / pointer:coarse actually emulated.
 *
 * Same two techniques as lane V, chosen per control: grow the box where there
 * is room, and grow only the HIT AREA with a transparent ::before where the
 * small box IS the design (a tick in a dense table, an × inside a pill, a
 * status pill sitting in a line of text). Nothing here reaches a mouse. */
@media (hover: none) {
	/* The back link out of a drill-in — 48×19, and it is the only way back on
	 * a phone. Inline-flex so the min-height is a box, not a line-height. */
	.os-crumb a {
		display: inline-flex;
		align-items: center;
		min-height: 44px;
	}

	/* The meeting workbench's tab strip: 29px tall on every meeting. */
	.mt-tabs button { min-height: 44px; }

	/* The track status pill sits inside a meta LINE, so growing its box would
	 * push the line apart — reach, not size. */
	.trk-status-pill { position: relative; }
	.trk-status-pill::before {
		content: "";
		position: absolute;
		top: 50%;
		left: 50%;
		width: 100%;
		min-width: 44px;
		height: 44px;
		transform: translate(-50%, -50%);
	}
}

/* ── a chip that says it ellipsises, and now does (lane Z) ────────────────
 * `.act-chip` (os.css:3694) carries `text-overflow: ellipsis` — and threw it
 * away by also being `display: inline-flex`. Ellipsis is a property of an
 * inline/block box's line, not of a flex container, so a long meeting title
 * was cut mid-word with a hard edge and no "…": measured on Home at 390px,
 * 392px of text hard-clipped inside a 198px chip. Every one of these chips is
 * a single run of text (`sourceChip()` in actions-kit.js builds nothing else),
 * so an inline-block is the honest box for it.
 *
 * This overrides two declarations in a block another lane owns rather than
 * editing them in place — os.css is append-only per the delivery workflow.
 * `min()` because the cap has two jobs: never wider than the column it sits
 * in, and never wider than 200px even when the column is huge. */
.act-chip {
	display: inline-block;
	max-width: min(200px, 100%);
	vertical-align: middle;
}

/* ── the breadcrumb on a phone (lane Z) ────────────────────────────────────
 * `.os-crumb` is a fixed-height 34px flex row. Give it a long current-page
 * name — a track title runs to 60+ characters — and at 390px every segment
 * shrinks and wraps: "Lumio OS" broke across two lines, and the title was
 * printed in full immediately above an <h1> that printed it again.
 *
 * So on a narrow screen the trail keeps its one line and the current segment
 * ellipsises. Nothing is lost: the full name is the heading right below it. */
@media (max-width: 760px) {
	.os-crumb {
		height: auto;
		min-height: 34px;
	}

	.os-crumb > span,
	.os-crumb > a { flex: 0 0 auto; white-space: nowrap; }

	.os-crumb b {
		min-width: 0;
		white-space: nowrap;
		overflow: hidden;
		text-overflow: ellipsis;
	}
}

/* ══════════════════════════════════════════ the strip the Lumi dock owns ══
 * Kailash pressed "Save the plan" in the Tracks plan editor and nothing
 * happened — the dock was standing on the button. That is not a Tracks bug.
 * The dock is `position: fixed` in the SHELL document, above the <iframe> the
 * page lives in, and an iframe is a single element in its parent's stacking
 * order. So NO z-index inside any page can ever climb over the dock. A page
 * can only avoid it by ending above it.
 *
 * Every page was remembering that separately, and each remembered a different
 * number: 120px of scroll floor here, 150px there, a toast lifted to 84px, a
 * snack to 96px — while `.os-modal-card` and `.act-pane` remembered nothing at
 * all and shipped controls underneath it. One number every surface reads,
 * instead of five numbers four surfaces knew about:
 *
 *     --os-dock-inset   the strip at the foot of the screen that Lumi owns.
 *
 * Anything anchored to the bottom of the viewport measures from it. os-dock.js
 * zeroes it on the two routes with no dock (/lumi, /threads) so they don't hold
 * room for something that isn't there. If that script never runs, the CSS
 * default stands and the room stays reserved — the safe way to fail is a strip
 * of unused space, never a button nobody can press.
 *
 * The height: the dock is 49px tall (8px padding + a 33px send button) sitting
 * 22px up = 71px, and 76 gives it 5px of air. On a phone its controls grow to
 * 44px (the `hover: none` block above), so 16 + 60 = 76 — the same number —
 * plus whatever the home indicator takes.
 *
 * Appended, per this file's own append-only rule: every selector below is
 * re-stated from its original block rather than edited in place. */

:root { --os-dock-inset: 76px; }

@media (max-width: 760px) {
	:root { --os-dock-inset: calc(76px + env(safe-area-inset-bottom, 0px)); }
}

/* The scroll floor of every page. Same totals as before (44 + 76 = 120,
 * 74 + 76 = 150) — but now they are one fact plus a margin, not two guesses. */
.os-screen { padding: 24px 30px calc(44px + var(--os-dock-inset)); }

@media (max-width: 760px) {
	.os-screen { padding: 18px 16px calc(74px + var(--os-dock-inset)); }
}

/* The bug itself. A dialog taller than the screen hits its max-height, so its
 * footer — where Save lives — lands 20px off the viewport floor, squarely
 * inside the dock's strip. The padding and the cap both have to give it back. */
.os-modal { padding: 20px 20px calc(20px + var(--os-dock-inset)); }
.os-modal-card { max-height: calc(100vh - 40px - var(--os-dock-inset)); }

/* Bottom-anchored transients: one expression instead of 84px and 96px and
 * 92px, three numbers that had to be kept in sync by hand and were not. */
.os-toast,
.hm-snack { bottom: calc(var(--os-dock-inset) + 8px); }

@media (max-width: 760px) {
	.os-toast { bottom: calc(var(--os-dock-inset) + 8px); }
}

/* The Actions detail sheet on a narrow screen: anchored at `bottom: 0`, with
 * its buttons at the foot, so its last 76px shared the dock's strip.
 *
 * Which way that hurts depends on which document the dock is in, and it is
 * worth being exact about it. In a NARROW SHELL WINDOW (761–1080px) the sheet
 * is inside the content frame and the dock is outside it, so the dock wins and
 * the sheet's buttons genuinely cannot be pressed — the reported bug wearing
 * different clothes. On a phone the page owns the whole document, so `.act-pane`
 * (z 50) paints OVER the dock (z 44) instead: the buttons work, and Lumi is the
 * thing that gets buried. Anchoring the sheet to the strip settles both. */
@media (max-width: 1080px) {
	.act-pane {
		bottom: var(--os-dock-inset);
		max-height: calc(64vh - var(--os-dock-inset));
	}
}

/* The account menu opens upward from the rail foot. On a phone the dock spans
 * the full width, and the menu's bottom edge landed inside it. */
@media (max-width: 760px) {
	.os-menu { bottom: calc(var(--os-dock-inset) + 8px); }
}

/* ══════════════════════════════════════════ Lumi, parked in the corner ══
 * The bar used to stand at the bottom-centre of every screen, which is also
 * where every page puts its Save button, its bottom sheet and its undo. It
 * could not be climbed over — on a computer the dock is painted by the app
 * frame, above the window the page is shown in, and to the app frame that
 * window is a single object, so nothing inside a page at any priority can come
 * out above it. The page had to end above the bar, or the bar had to stop
 * standing there. This is the second one, signed off at the mock-up gate:
 *
 *   Lumi collapses to a pill in the bottom-right corner carrying what it is
 *   reading. "/" or ⌘J grows it into the ask-anything bar; Esc puts it back.
 *
 * The strip drops from 76px to 68px, because a pill is shorter than a bar —
 * and both are far less than the 120–150px pages were giving away one number
 * at a time before any of this existed.
 *
 * Appended, per this file's append-only rule: every selector below is
 * re-stated from its original block rather than edited in place. */

/* The pill is 50px tall (34px orb + 7px padding top and bottom + 1px border
 * each side) and stands 16px up: 66px, and 68 gives it 2px of air. On a phone
 * it stands 14px up, above whatever the home indicator takes: 64 + 2 = 66 plus
 * the safe area. A device with no home indicator reports 0 and gets 66px, which
 * is exactly the room the pill needs. */
:root { --os-dock-inset: 68px; }

@media (max-width: 760px) {
	:root { --os-dock-inset: calc(66px + env(safe-area-inset-bottom, 0px)); }
}

/* The root is now just an anchor in the corner — the bar's own look moved to
 * `.os-dock-panel`, which is the thing that is still a bar when it is open.
 * `--os-kbd-inset` is 0 except on a phone with the keyboard up: a fixed element
 * otherwise stays pinned to the window's floor and is buried under the
 * keyboard, so Lumi steps up on top of it instead (os-dock.js measures it). */
.os-dock {
	left: auto;
	right: 26px;
	bottom: calc(16px + var(--os-kbd-inset, 0px));
	transform: none;
	width: auto;
	max-width: calc(100vw - 52px);
	display: block;
	padding: 0;
	border: 0;
	background: none;
	backdrop-filter: none;
	-webkit-backdrop-filter: none;
	box-shadow: none;
	transition: opacity 0.18s ease;
}

/* The old centred bar shifted with the rail. A corner has nothing to shift. */
body.os-rail-collapsed .os-dock { left: auto; right: 26px; }

/* While a dialog owns the screen the orb dims into the background rather than
 * competing with it. It never has to hide: the strip it stands in is already
 * its own, so it is not covering anything to begin with. */
.os-dock[data-dimmed="true"] { opacity: 0.55; }

.os-dock[data-open="true"] .os-dock-pill,
.os-dock[data-open="false"] .os-dock-panel { display: none; }

/* ---- collapsed: the pill ------------------------------------------------ */

.os-dock-pill {
	display: flex;
	align-items: center;
	gap: 9px;
	max-width: 100%;
	padding: 7px 13px 7px 7px;
	border: 1px solid #ffffff1f;
	border-radius: 999px;
	background: rgba(22, 24, 23, 0.94);
	backdrop-filter: blur(14px);
	-webkit-backdrop-filter: blur(14px);
	box-shadow: 0 14px 34px rgba(18, 24, 20, 0.34);
	color: #eef2ec;
	font: inherit;
	font-size: 12.5px;
	font-weight: 750;
	cursor: pointer;
}

/* The collapsed pill carries what Lumi is reading, so the promise is legible
 * before you open anything — a bare dot keeps Lumi's awareness of where you
 * are a secret until you click. Track names run past 60 characters (the same
 * fact that forced the phone breadcrumb to ellipsise), so it is capped and
 * clipped: the pill holds its width instead of growing across the screen. */
.os-dock-ctx {
	min-width: 0;
	max-width: 150px;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
	color: #8fe9ee;
	font-weight: 800;
}

.os-dock-ctx i {
	display: inline-block;
	width: 6px;
	height: 6px;
	border-radius: 50%;
	background: var(--aqua);
	margin-right: 6px;
	vertical-align: 1px;
}

/* What the pill says when Lumi is reading nothing on this surface. */
.os-dock-say { white-space: nowrap; }
.os-dock-ctx[hidden],
.os-dock-say[hidden] { display: none; }

.os-dock-key {
	flex: none;
	padding: 2px 6px;
	border-radius: 6px;
	background: #ffffff14;
	color: #c9d0c8;
	font-family: inherit;
	font-size: 10.5px;
	font-weight: 800;
}

/* The live dot rides the orb in both states — carrying the workspace name on
 * the pill is an addition to the presence cue, never a replacement for it. */
.os-dock-watch {
	position: absolute;
	top: -1px;
	right: -1px;
	width: 10px;
	height: 10px;
	border-radius: 50%;
	background: var(--aqua);
	box-shadow: 0 0 0 2px #171918;
}

.os-dock-pill .os-dock-orb {
	width: 34px;
	height: 34px;
	min-width: 34px;
	border-radius: 50%;
	flex: none;
}

/* ---- expanded: the same ask-anything bar -------------------------------- */

.os-dock-panel {
	display: flex;
	align-items: center;
	gap: 10px;
	width: min(520px, calc(100vw - 52px));
	padding: 8px 8px 8px 11px;
	border: 1px solid #ffffff1f;
	border-radius: 16px;
	background: rgba(22, 24, 23, 0.96);
	backdrop-filter: blur(16px);
	-webkit-backdrop-filter: blur(16px);
	box-shadow: 0 26px 70px rgba(18, 24, 20, 0.42);
}

.os-dock-panel .os-dock-orb { border-radius: 50%; }

/* The panel's orb is a real button now — the fold-back control — so it needs
 * the UA chrome stripped that `.os-dock-orb` never had to fight as a <span>. */
.os-dock-collapse {
	display: block;
	padding: 0;
	margin: 0;
	appearance: none;
	-webkit-appearance: none;
}
.os-dock-collapse:hover { filter: brightness(1.08); }
.os-dock-collapse:focus-visible {
	outline: 2px solid #eef2ec;
	outline-offset: 2px;
}

/* ---- on a phone --------------------------------------------------------- */

@media (max-width: 760px) {
	/* Above the home indicator, and out of the way of a composer or a save bar
	 * — which is the whole point of the corner. */
	.os-dock {
		left: auto;
		right: 14px;
		width: auto;
		max-width: calc(100vw - 28px);
		bottom: calc(14px + env(safe-area-inset-bottom, 0px) + var(--os-kbd-inset, 0px));
	}

	/* Open, it takes the full width — there is no room for a 520px bar, and a
	 * question deserves the whole line. */
	.os-dock[data-open="true"] {
		left: 12px;
		right: 12px;
		max-width: none;
	}

	.os-dock-panel { width: 100%; }

	/* The cue beside the input is already dropped on a phone (there is no room
	 * for it next to the input) by the rule above this section. The pill is
	 * where it stays legible — which is a thing the old bar could not do at
	 * all on a phone, and the pill can. */
}

/* Two things the design pass caught on the rendered page.
 *
 * The "/" on the pill is a promise about a keyboard. A phone has none, so on a
 * touch device it is a small grey box that means nothing — the pill says
 * "Ask Lumi" and is tapped. (⌘J and "/" both still work if a keyboard is
 * attached; this hides the advertisement, not the shortcut.) */
@media (hover: none) {
	.os-dock-key { display: none; }
}

/* And the pill is a real control, so tabbing to it has to show. The rest of the
 * shell rings focus in aqua; this was inheriting the browser's default. */
.os-dock-pill:focus-visible {
	outline: 2px solid var(--aqua);
	outline-offset: 3px;
}

/* ── tracks: the board is the editor (lane tracks-plan-gantt) ──────────────
   Appended, never edited above: every rule here is new, and the one override
   (.trk-grid.is-board) adds the trailing column a phase is born in rather than
   changing the shared grid. */

.trk-grid.is-board {
	grid-template-columns: 168px repeat(var(--phases), minmax(150px, 1fr)) 128px;
}

/* the name line inside a phase header or a workstream label */
.trkb-nm { display: flex; align-items: center; gap: 4px; min-width: 0; }
.trkb-nm > b { min-width: 0; overflow-wrap: anywhere; }
.trk-phase .trkb-nm > b,
.trk-ws .trkb-nm > b { cursor: text; }

.trkb-grip {
	flex: none;
	cursor: grab;
	color: var(--muted);
	font-size: 11px;
	line-height: 1;
	letter-spacing: -2px;
	opacity: 0;
	transition: opacity 0.12s;
}
.trk-phase:hover .trkb-grip,
.trk-ws:hover .trkb-grip { opacity: 0.7; }
.trkb-grip:active { cursor: grabbing; }

.trkb-x, .trkb-dots {
	flex: none;
	margin-left: auto;
	width: 22px;
	height: 22px;
	display: grid;
	place-items: center;
	border: 0;
	border-radius: 7px;
	background: transparent;
	color: var(--muted);
	font-size: 13px;
	line-height: 1;
	opacity: 0;
	transition: opacity 0.12s, background 0.12s, color 0.12s;
}
.trk-phase:hover .trkb-x, .trk-phase:hover .trkb-dots,
.trk-ws:hover .trkb-x, .trk-ws:hover .trkb-dots,
.trkb-x:focus-visible, .trkb-dots:focus-visible { opacity: 1; }
.trkb-x:hover { background: var(--coral-soft); color: var(--coral-deep); }
.trkb-dots:hover { background: var(--silver); color: var(--ink); }

.trkb-menu-wrap { position: relative; margin-left: auto; display: flex; }
/* Positioned by JS on <body>: the timeline scroller clips overflow-y, so a menu
   anchored inside a phase header opened invisibly. */
.trkb-menu {
	position: fixed;
	z-index: 70;
	min-width: 210px;
	display: grid;
	gap: 2px;
	padding: 5px;
	background: var(--paper);
	border: 1px solid var(--line);
	border-radius: 12px;
	box-shadow: var(--shadow);
}
.trkb-menu button {
	border: 0;
	background: transparent;
	border-radius: 8px;
	padding: 9px 10px;
	min-height: 38px;
	text-align: left;
	font-size: 12.5px;
	font-weight: 750;
	color: var(--ink);
}
.trkb-menu button:hover:not([disabled]) { background: var(--silver); }
.trkb-menu button[disabled] { opacity: 0.45; cursor: default; }
.trkb-menu button.is-danger { color: var(--coral-deep); }
.trkb-menu button.is-danger:hover { background: var(--coral-soft); }

/* where a phase and a workstream are born */
.trkb-add-col { display: flex; align-items: flex-end; padding: 12px 8px 9px; }
.trkb-add-row { display: flex; align-items: center; padding: 6px 8px 6px 0; }
.trkb-add-btn {
	width: 100%;
	min-height: 38px;
	padding: 0 10px;
	border: 1px dashed var(--line);
	border-radius: 11px;
	background: transparent;
	color: var(--muted);
	font-size: 12px;
	font-weight: 800;
	text-align: left;
}
.trkb-add-btn:hover {
	border-color: var(--lime-line);
	background: var(--lime-soft);
	color: var(--lime-deep);
}

.trkb-namebox {
	display: flex;
	align-items: center;
	gap: 5px;
	width: 100%;
	min-width: 0;
	padding: 3px 4px 3px 8px;
	background: var(--paper);
	border: 1px solid var(--aqua);
	border-radius: 11px;
	box-shadow: var(--shadow-soft);
}
.trkb-namebox input, .trkb-namebox input.os-input {
	flex: 1 1 auto;
	min-width: 0;
	border: 0;
	outline: none;
	padding: 0;
	background: transparent;
	font-size: 12.5px;
	font-weight: 800;
	color: var(--ink);
}
.trkb-go {
	flex: none;
	border: 0;
	border-radius: 8px;
	min-height: 28px;
	padding: 0 9px;
	background: var(--lime-soft);
	color: var(--lime-deep);
	font-size: 11px;
	font-weight: 850;
}

/* every free square is somewhere to add */
.trkb-cell { display: flex; padding: 2px; min-height: 34px; }
.trkb-cell-add {
	width: 100%;
	border: 1px dashed transparent;
	border-radius: 10px;
	background: transparent;
	color: var(--muted);
	font-size: 15px;
	font-weight: 700;
	line-height: 1;
	transition: border-color 0.12s, background 0.12s, color 0.12s;
}
.trkb-cell-add:hover, .trkb-cell-add:focus-visible {
	border-color: var(--lime-line);
	background: var(--lime-soft);
	color: var(--lime-deep);
}

/* work that is on the track but has no square yet */
.trkb-tray {
	display: flex;
	align-items: center;
	gap: 8px;
	flex-wrap: wrap;
	padding: 10px 18px 12px;
	border-bottom: 1px solid var(--line);
}
.trkb-tray > b {
	font-size: 10.5px;
	font-weight: 850;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--muted);
}
.trkb-fine { font-size: 11.5px; color: var(--muted); }
.trkb-chip {
	display: inline-flex;
	align-items: center;
	gap: 7px;
	min-height: 38px;
	padding: 0 12px;
	border: 1px solid var(--aqua-line);
	border-radius: 11px;
	background: var(--aqua-soft);
	color: var(--aqua-deep);
	font-size: 12.5px;
	font-weight: 800;
	touch-action: none;
}
.trkb-chip:hover { border-color: var(--aqua); }
.trkb-chip.is-dragging { opacity: 0.3; border-style: dashed; }
.trkb-hand { opacity: 0.55; font-size: 11px; font-weight: 700; }

/* drag feedback */
.trkb-slot-v, .trkb-slot-h {
	position: fixed;
	z-index: 60;
	pointer-events: none;
	background: var(--aqua);
	border-radius: 2px;
	box-shadow: 0 0 0 3px rgba(0, 216, 224, 0.19);
}
.trkb-slot-v { width: 3px; }
.trkb-slot-h { height: 3px; }
.trkb-ghost {
	position: fixed;
	z-index: 62;
	pointer-events: none;
	padding: 7px 12px;
	border: 1px solid var(--aqua);
	border-radius: 12px;
	background: var(--paper);
	box-shadow: var(--shadow);
	transform: rotate(-0.5deg);
}
.trkb-ghost b { display: block; font-size: 12.5px; font-weight: 800; }
.trkb-ghost span { display: block; margin-top: 1px; font-size: 10.5px; color: var(--ink-soft); }
body.trkb-dragging { cursor: grabbing; user-select: none; }
.trk-phase.is-lifted, .trk-ws.is-lifted { opacity: 0.35; }
.trk-init.is-lifted { box-shadow: 0 10px 26px rgba(0, 0, 0, 0.22); transform: scale(1.02); }
.trk-col.is-drop { background: var(--aqua-soft); }
.trk-ws.is-drop { background: var(--aqua-soft); }

/* the way back, in the toast that reports what a removal cost */
.os-toast .trkb-undo {
	flex: none;
	margin-left: 12px;
	border: 0;
	border-radius: 9px;
	min-height: 34px;
	padding: 0 12px;
	background: rgba(255, 255, 255, 0.17);
	color: inherit;
	font-size: 12px;
	font-weight: 850;
}
.os-toast .trkb-undo:hover { background: rgba(255, 255, 255, 0.27); }

/* the touch sheets — every board move, tap-sized */
.trkb-rename { display: flex; gap: 6px; margin-bottom: 4px; }
.trkb-rename input { flex: 1 1 auto; min-width: 0; }
.trkb-sec {
	display: block;
	margin: 14px 0 8px;
	font-size: 10.5px;
	font-weight: 850;
	letter-spacing: 0.08em;
	text-transform: uppercase;
	color: var(--muted);
}
.trkb-acts { display: grid; gap: 2px; margin-top: 12px; }
.trkb-act {
	display: flex;
	align-items: center;
	gap: 11px;
	width: 100%;
	min-height: 52px;
	padding: 12px 6px;
	border: 0;
	border-top: 1px solid var(--line);
	background: transparent;
	text-align: left;
	font-size: 14px;
	font-weight: 750;
	color: var(--ink);
}
.trkb-act[disabled] { opacity: 0.35; }
.trkb-act.is-danger { color: var(--coral-deep); }
.trkb-ic { width: 24px; text-align: center; font-size: 15px; flex: none; }
.trkb-chips { display: flex; gap: 7px; flex-wrap: wrap; }
.trkb-chip-pick {
	min-height: 42px;
	padding: 0 14px;
	border: 1px solid var(--line);
	border-radius: 999px;
	background: var(--paper);
	font-size: 12.5px;
	font-weight: 750;
	color: var(--ink);
}
.trkb-chip-pick.is-on {
	background: var(--aqua-soft);
	border-color: var(--aqua-line);
	color: var(--aqua-deep);
	font-weight: 850;
}
.trkb-stepper { display: flex; align-items: center; gap: 9px; margin-bottom: 9px; }
.trkb-lab { width: 52px; flex: none; font-size: 12px; font-weight: 750; color: var(--muted); }
.trkb-stepper button {
	width: 52px;
	min-height: 44px;
	flex: none;
	border: 1px solid var(--line);
	border-radius: 11px;
	background: var(--paper);
	font-size: 16px;
	font-weight: 800;
	color: var(--ink);
}
.trkb-stepper button[disabled] { opacity: 0.32; }
.trkb-val {
	flex: 1 1 auto;
	min-height: 44px;
	display: grid;
	place-items: center;
	border: 1px solid var(--line);
	border-radius: 11px;
	background: var(--paper-soft);
	font-size: 13px;
	font-weight: 800;
	text-align: center;
}

/* Touch has no hover to reveal anything with, so the add targets are simply
   always there — and the drag-only controls are never rendered at all. */
@media (hover: none) {
	.trkb-grip, .trkb-x, .trkb-dots { display: none; }
	.trkb-cell-add { border-color: var(--line); opacity: 0.75; }
}

/* The toast grows a second child only when it carries an Undo.
   .os-toast is `pointer-events: none` — it was always click-through, because
   until now it only ever reported. An Undo button inside it therefore could not
   be clicked at all, so the button (and only the button, so the toast still does
   not block the board under it) takes pointer events back. */
.os-toast:has(.trkb-undo) { display: flex; align-items: center; }
.os-toast .trkb-undo { pointer-events: auto; }

/* A 168px label column and 150px phases leave room for barely one phase on a
   390px screen. The board variant tightens both so two columns and their row
   labels read at once; the read-only grid above is untouched. */
@media (max-width: 640px) {
	.trk-grid.is-board {
		grid-template-columns: 112px repeat(var(--phases), minmax(124px, 1fr)) 104px;
	}
	.trk-grid.is-board .trk-corner { font-size: 9px; letter-spacing: 0.02em; }
	.trk-grid.is-board .trkb-add-col,
	.trk-grid.is-board .trkb-add-row { padding-left: 4px; padding-right: 4px; }
	.trk-grid.is-board .trkb-add-btn { font-size: 11px; padding: 0 7px; }
}

/* ── tracks: the timeline is fluid ─────────────────────────────────────────
   A bar's edges are continuous positions inside its phases, drawn as
   percentage margins inside the whole-column grid area it keeps (web-v2/js/
   tracks.js placeBar). Three rules is all that costs. */

/* The 5px side margins above are what the percentages replace — and a bar
   dragged down near its minimum has to clip its own words rather than push the
   column it is standing in wider. */
.trk-init { overflow: hidden; }

/* No transition on the bar being dragged: an eased bar arrives after the
   pointer, and that lag IS the clunk this replaces. */
.trk-init.is-dragging { transition: none; }

/* What the drag is saying, in words, while it is happening. It goes solid for
   exactly as long as a boundary has hold — so the magnet is visible, and so is
   the moment it lets go. */
.trkb-pill {
	position: fixed;
	z-index: 66;
	pointer-events: none;
	max-width: 60vw;
	padding: 6px 10px;
	border-radius: 10px;
	background: var(--ink);
	color: var(--paper);
	font-size: 11.5px;
	font-weight: 800;
	white-space: nowrap;
	overflow: hidden;
	text-overflow: ellipsis;
	box-shadow: var(--shadow);
}
.trkb-pill.is-on { background: var(--aqua-deep); color: var(--paper); }
html[data-theme="dark"] .trkb-pill { background: var(--paper-soft); color: var(--ink); }
html[data-theme="dark"] .trkb-pill.is-on { background: var(--aqua-deep); color: #04191b; }

/* ── tracks: importing a plan from a spreadsheet ───────────────────────────
   Three deliberate steps above the board — pick the file, pick the tab, check
   the whole board it would produce. The preview itself is drawn by the board
   below this panel (web-v2/js/tracks.js previewBoard), so nothing here draws a
   second picture of a plan that could disagree with the first. */

.trk-imp { margin-bottom: 12px; }

.trk-imp-head {
	display: flex;
	align-items: center;
	gap: 12px;
	flex-wrap: wrap;
	padding: 13px 18px;
	border-bottom: 1px solid var(--line);
}

.trk-imp-steps { display: flex; gap: 12px; flex-wrap: wrap; flex: 1 1 auto; }

.trk-imp-step {
	display: inline-flex;
	align-items: center;
	gap: 7px;
	font-size: 11.5px;
	font-weight: 800;
	color: var(--muted);
	opacity: 0.5;
}
.trk-imp-step.is-on, .trk-imp-step.is-done { opacity: 1; }
.trk-imp-step.is-on { color: var(--ink); }
.trk-imp-step i {
	width: 18px;
	height: 18px;
	flex: none;
	border-radius: 50%;
	display: grid;
	place-items: center;
	border: 1px solid var(--line);
	background: var(--paper);
	font-style: normal;
	font-size: 10px;
}
.trk-imp-step.is-done i {
	background: var(--lime-deep);
	border-color: var(--lime-deep);
	color: var(--paper);
}

.trk-imp-note {
	padding: 12px 18px 0;
	font-size: 12.5px;
	line-height: 1.55;
	color: var(--ink-soft);
	max-width: 74ch;
}

.trk-imp-list { display: grid; gap: 6px; padding: 12px 18px 0; }

.trk-imp-row {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	width: 100%;
	min-height: 52px;
	padding: 10px 13px;
	border: 1px solid var(--line);
	border-radius: 12px;
	background: var(--paper);
	color: inherit;
	text-align: left;
	font: inherit;
}
.trk-imp-row:hover { border-color: var(--aqua); background: var(--aqua-soft); }
.trk-imp-row[disabled] { opacity: 0.5; }
.trk-imp-row b { font-size: 13px; font-weight: 800; }
.trk-imp-row span { font-size: 11.5px; color: var(--muted); }

/* What the sheet would put on the board, said in numbers before it is said in
   squares. Lime, because a preview is a good state — the refusal below is the
   one that has to look different from it at a glance. */
.trk-imp-banner {
	margin: 12px 18px 0;
	padding: 12px 14px;
	border: 1px solid var(--lime-line);
	border-radius: 12px;
	background: var(--lime-soft);
}
.trk-imp-banner b { display: block; font-size: 12.5px; font-weight: 850; color: var(--lime-deep); }
.trk-imp-banner span {
	display: block;
	margin-top: 4px;
	font-size: 12px;
	line-height: 1.5;
	color: var(--ink-soft);
}

/* A refusal. It stands where the board would have been, carrying the sentence
   the server refused with — never a truncated import that looks like a clean
   one (backend/sheet_import.py). */
.trk-imp-stop {
	margin: 12px 18px 0;
	padding: 12px 14px;
	border: 1px solid var(--coral-line);
	border-radius: 12px;
	background: var(--coral-soft);
}
.trk-imp-stop b { display: block; font-size: 12.5px; font-weight: 850; color: var(--coral-deep); }
.trk-imp-stop span {
	display: block;
	margin-top: 4px;
	font-size: 12px;
	line-height: 1.5;
	color: var(--ink-soft);
}

.trk-imp-box {
	margin: 12px 18px 0;
	padding: 12px 14px;
	border: 1px solid var(--line);
	border-radius: 12px;
	background: var(--paper-soft);
}
.trk-imp-box > b { font-size: 12.5px; font-weight: 850; }
.trk-imp-box .trk-imp-note { padding: 3px 0 4px; }

.trk-imp-row-split {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 12px;
	flex-wrap: wrap;
	padding: 9px 0;
	border-top: 1px solid var(--line-soft);
}
.trk-imp-row-split > span { font-size: 12.5px; min-width: 0; }
/* The reason an item could not be placed travels WITH it — an unplaced thing
   with no reason is the silent skip this whole flow exists to avoid. */
.trk-imp-why { font-size: 11.5px; color: var(--muted); }

.trk-imp-foot {
	display: flex;
	gap: 8px;
	flex-wrap: wrap;
	justify-content: flex-end;
	padding: 14px 18px;
}

/* The preview board reads as a proposal, not as the plan: it keeps a dashed
   edge for as long as nothing has been saved. */
.trk-plan.is-preview { border-style: dashed; border-color: var(--lime-line); }

@media (max-width: 640px) {
	.trk-imp-head, .trk-imp-note, .trk-imp-list, .trk-imp-foot { padding-left: 13px; padding-right: 13px; }
	.trk-imp-banner, .trk-imp-stop, .trk-imp-box { margin-left: 13px; margin-right: 13px; }
	/* Two buttons per line beats three ragged ones, and the primary action must
	   not be the one that wraps alone off the bottom. */
	.trk-imp-foot { justify-content: flex-start; }
}

/* ============================================================ Business board
 *
 * The Business page as a board: one tile per destination this person holds,
 * carrying its own numbers rather than its name (design:
 * docs/design/V2-BUSINESS-LAYOUT-REWORK.md, founder's pick 2026-07-29).
 *
 * Append-only, and nothing above is touched — the older `.biz-*` rules still
 * dress the page header, the crumb and the freshness stamp, which are unchanged.
 * Severity here is the OS's own scale; a block still names a MEANING and this
 * file decides what that looks like.
 */

/* -- banners: the two questions worth answering before anything is tapped -- */
.bzb-banner {
	display: flex;
	align-items: center;
	gap: 10px;
	width: 100%;
	padding: 13px 15px;
	margin-bottom: 10px;
	min-height: 52px;
	border-radius: 14px;
	border: 1px solid var(--line);
	background: var(--paper);
	text-align: left;
	font: inherit;
	color: inherit;
	cursor: pointer;
}
.bzb-banner b { flex: 1; min-width: 0; font-size: 13.5px; font-weight: 640; }
.bzb-banner > i {
	width: 8px; height: 8px; border-radius: 50%;
	flex: 0 0 auto; background: currentColor;
}
.bzb-banner.is-red { background: var(--coral-soft); border-color: var(--coral-line); color: var(--coral-deep); }
.bzb-banner.is-stale { background: var(--amber-soft); border-color: var(--amber-line); }
.bzb-banner.is-stale b { color: var(--amber-deep); font-weight: 600; }
/* Calm is not a button. Nothing to open, so it does not offer to be pressed. */
.bzb-banner.is-calm {
	background: var(--lime-soft); border-color: var(--lime-line);
	color: var(--lime-deep); cursor: default;
}
.bzb-go { font-size: 12.5px; font-weight: 620; color: var(--aqua-deep); white-space: nowrap; }
.bzb-go::after { content: " ›"; }

/* -- the phone-only jump row ------------------------------------------------
 * A founder holding seventeen views scrolls several screens to reach Product.
 * On a desktop the sections are close enough that a second navigation would
 * just be the list of names this page deleted, so it is hidden there. */
.bzb-jump { display: none; }
@media (max-width: 720px) {
	.bzb-jump {
		display: flex;
		gap: 6px;
		overflow-x: auto;
		scrollbar-width: none;
		-webkit-overflow-scrolling: touch;
		position: sticky;
		top: 0;
		z-index: 3;
		margin: 2px -16px 10px;
		padding: 8px 16px 10px;
		background: var(--base);
		border-bottom: 1px solid var(--line-soft);
		/* A hard clip at the edge reads as a broken layout; the fade says
		   "there is more this way". */
		-webkit-mask-image: linear-gradient(to right, #000 calc(100% - 26px), transparent);
		mask-image: linear-gradient(to right, #000 calc(100% - 26px), transparent);
	}
	.bzb-jump::-webkit-scrollbar { display: none; }
	.bzb-jump button {
		display: inline-flex;
		align-items: center;
		gap: 6px;
		white-space: nowrap;
		min-height: 44px;
		padding: 0 14px;
		border-radius: 999px;
		border: 1px solid var(--line);
		background: var(--paper);
		color: var(--ink-soft);
		font-size: 12.5px;
		font-weight: 600;
	}
	.bzb-dot {
		width: 7px; height: 7px; border-radius: 50%;
		background: var(--coral-deep); flex: 0 0 auto;
	}
}

/* -- sections -------------------------------------------------------------- */
.bzb-sec { margin-bottom: 22px; }
.bzb-sec-head { display: flex; align-items: center; gap: 8px; margin: 0 2px 10px; flex-wrap: wrap; }
.bzb-sec-head h2 {
	font-size: 13px; font-weight: 660; text-transform: uppercase;
	letter-spacing: 0.07em; margin: 0;
}
.bzb-sec-n { font-size: 11.5px; color: var(--muted); }
.bzb-sec-head .os-chips { margin-left: auto; }

/* -- the tile -------------------------------------------------------------- */
.bzb-grid {
	display: grid;
	grid-template-columns: repeat(auto-fill, minmax(168px, 1fr));
	gap: 10px;
}
@media (min-width: 721px) {
	.bzb-grid { grid-template-columns: repeat(auto-fill, minmax(232px, 1fr)); gap: 12px; }
}
.bzb-tile {
	display: flex;
	flex-direction: column;
	gap: 8px;
	min-height: 132px;
	padding: 13px 14px 11px;
	border-radius: 16px;
	border: 1px solid var(--line);
	background: var(--paper);
	box-shadow: var(--shadow-soft);
	text-align: left;
	font: inherit;
	color: inherit;
	cursor: pointer;
	text-decoration: none;
	transition: box-shadow 0.15s, transform 0.15s;
}
.bzb-tile:hover { box-shadow: var(--shadow); transform: translateY(-1px); }
.bzb-tile:focus-visible { outline: 2px solid var(--aqua-deep); outline-offset: 2px; }
/* A live tile is a reading, not a destination — it does not lift or pretend. */
.bzb-tile.is-live { cursor: default; }
.bzb-tile.is-live:hover { box-shadow: var(--shadow-soft); transform: none; }
a.bzb-tile.is-live { cursor: pointer; }
.bzb-tile.is-unavailable { background: var(--paper-soft); }
/* One tile per crowded domain leads: a board of identical rectangles gives the
   eye nowhere to start. */
.bzb-tile.is-lead { grid-column: 1 / -1; }
@media (min-width: 721px) { .bzb-tile.is-lead { grid-column: span 2; } }

.bzb-top { display: flex; align-items: center; gap: 7px; }
.bzb-name {
	flex: 1; min-width: 0; font-size: 13.5px; font-weight: 660;
	overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.bzb-tag {
	font-size: 10px; font-weight: 640; padding: 1px 7px; border-radius: 999px;
	background: var(--silver); color: var(--ink-soft); white-space: nowrap;
}
.bzb-nums { display: flex; flex-wrap: wrap; gap: 10px 16px; flex: 1; align-content: flex-start; }
.bzb-num { min-width: 0; }
.bzb-num > b {
	display: block; font-size: 20px; font-weight: 680;
	letter-spacing: -0.035em; line-height: 1.15;
}
@media (min-width: 721px) { .bzb-tile.is-lead .bzb-num > b { font-size: 25px; } }
.bzb-num > i {
	display: block; font-style: normal; font-size: 10.5px; color: var(--muted);
	margin-top: 1px; max-width: 148px;
	overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.bzb-sub { font-size: 11.5px; color: var(--ink-soft); margin: 0; }
/* A tile whose view has not landed yet: present, legible, obviously provisional. */
.bzb-waiting { color: var(--muted); }

.bzb-delta { font-size: 11px; font-weight: 640; color: var(--muted); display: inline-block; margin-top: 3px; }
.bzb-delta.is-good { color: var(--lime-deep); }
.bzb-delta.is-bad { color: var(--coral-deep); }
/* The board's tile sparks stay monochrome ON PURPOSE — seventeen tiles in one
 * grid, each with its own hue, is a colour chart, not a board. You pick a tile
 * by its number; the colour scale starts inside the view you open. */
.bzb-spark { width: 100%; height: 24px; display: block; margin-top: 5px; }
.bzb-spark polyline { fill: none; stroke: var(--muted); stroke-width: 1.6; vector-effect: non-scaling-stroke; }
.bzb-spark .spark-area { fill: var(--silver); stroke: none; }
.bzb-spark .spark-dot { fill: var(--ink-soft); }

.bzb-rows { width: 100%; margin-top: 2px; border-top: 1px solid var(--line-soft); padding-top: 6px; }
.bzb-row { display: flex; justify-content: space-between; gap: 8px; font-size: 11px; padding: 1.5px 0; }
.bzb-row-k { color: var(--ink-soft); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.bzb-row-v { white-space: nowrap; }
.bzb-row-pct { color: var(--muted); }

.bzb-foot {
	display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
	padding-top: 8px; border-top: 1px solid var(--line-soft);
}
.bzb-ago { margin-left: auto; font-size: 10.5px; color: var(--muted); white-space: nowrap;
	overflow: hidden; text-overflow: ellipsis; max-width: 100%; }
.bzb-pill {
	display: inline-flex; align-items: center; border-radius: 999px;
	padding: 2px 9px; font-size: 11.5px; font-weight: 640; line-height: 1.7; white-space: nowrap;
}
.bzb-pill.is-red { background: var(--coral-soft); color: var(--coral-deep); border: 1px solid var(--coral-line); }
.bzb-pill.is-amber { background: var(--amber-soft, #fff6e6); color: var(--amber-deep, #a8681a); border: 1px solid var(--amber-line, #f2dcb4); }
.bzb-pill.is-clear { background: var(--lime-soft); color: var(--lime-deep); border: 1px solid var(--lime-line); }

/* Freshness speaks only when it is a problem: the tile footer already carries
   the date, and a green "current" dot beside a red count would put two
   different meanings on one colour scale. */
.bzb-stale {
	background: var(--coral-soft); color: var(--coral-deep); border: 1px solid var(--coral-line);
	border-radius: 999px; padding: 1px 8px; font-size: 10.5px; font-weight: 640; white-space: nowrap;
}

/* The way back out of a view. First thing in the panel, and a real control. */
/* `.mcv` is a grid, so this stretched to the full page width and read as an
 * empty bar with a word floating in the middle of it. It is a button; it should
 * be the size of its label. */
.bzb-back { margin-bottom: 12px; min-height: 44px; justify-self: start; }

.is-loading { opacity: 0.55; pointer-events: none; }

/* The amber scale the board leans on. Defined here rather than in :root above
   so this block stays append-only; the fallbacks in `.bzb-pill.is-amber` cover
   any surface that renders before this rule. */
:root, html[data-theme="light"] {
	--amber-soft: #fff6e6;
	--amber-line: #f2dcb4;
	--amber-deep: #a8681a;
}
html[data-theme="dark"] {
	--amber-soft: #2b2113;
	--amber-line: #4a3a1d;
	--amber-deep: #f3c377;
}

/* ── meeting references: the two ways into Google Drive (lane v2-meeting-drive-refs) ──
 *
 * The card head used to hold one button. Three of them need room to wrap on a
 * phone rather than squeeze the heading, so they live in their own row that
 * stays right-aligned on a wide screen and falls under the heading on a narrow
 * one. `.mt-btn-sm` already grows to 44px on a touch device (lane V's block).
 */
.mt-refs-head { flex-wrap: wrap; }

.mt-ref-actions {
	display: flex;
	flex-wrap: wrap;
	justify-content: flex-end;
	gap: 6px;
}

/* The pasted-link row: one line on a laptop, stacked on a phone. It sits
 * between the card head and the file list, where the file it is about to add
 * will appear. */
.mt-ref-linkbar {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
	gap: 6px;
	margin: 0 0 11px;
}

.mt-ref-linkbar input {
	flex: 1 1 190px;
	min-width: 0;
	min-height: 30px;
	padding: 0 10px;
	border: 1px solid var(--aqua);
	border-radius: 9px;
	background: var(--paper);
	color: var(--ink);
	font: inherit;
	font-size: 12px;
	outline: 0;
}

.mt-ref-linkbar input:focus { box-shadow: 0 0 0 3px #00d8e01c; }

@media (hover: none) {
	.mt-ref-linkbar input { min-height: 44px; }
}

/* On a narrow screen the row drops under the heading. Right-aligned there it
 * left two buttons stranded on one line and a third alone under them, reading
 * as three unrelated chips; given the whole width it reads as one set of
 * choices. */
@media (max-width: 900px) {
	.mt-ref-actions { flex: 1 1 100%; justify-content: flex-start; }
	/* A long link needs the width more than the two buttons do: box on its own
	 * line, Add it / Cancel together underneath — rather than the box, Add it,
	 * and a stranded Cancel on three ragged lines. */
	.mt-ref-linkbar input { flex: 1 1 100%; }
}

/* ── meeting access requests: "may I see these notes?" (lane meeting-access-request) ──
 *
 * Two surfaces from docs/prototypes/meeting-access-request-prototype.html:
 * the requester's ask/waiting/declined card (.mt-ask*, which takes the meeting
 * body's place), and the owner's decision cards (.mt-req*, which sit above the
 * tabs). Both are built by js/meetings-access.js.
 *
 * Everything here is token-only (no literal colours), so light and dark come
 * out of the same rules — the two themes are one stylesheet, not two.
 */

/* ---- the requester's screen -------------------------------------------- */

.mt-ask-wrap {
	display: flex;
	align-items: center;
	justify-content: center;
	padding: 30px 16px 44px;
	min-height: 60vh;
}

.mt-ask {
	width: 100%;
	max-width: 470px;
	padding: 28px 26px;
	background: var(--paper);
	border: 1px solid var(--line);
	border-radius: var(--radius);
	box-shadow: var(--shadow-soft);
}

.mt-ask-center { text-align: center; }

.mt-ask-mark {
	margin-bottom: 20px;
	color: var(--ink);
	font-size: 18px;
	font-weight: 800;
	letter-spacing: -0.02em;
}

.mt-ask-mark::after {
	content: "";
	display: inline-block;
	width: 6px;
	height: 6px;
	margin-left: 3px;
	border-radius: 50%;
	background: var(--lime);
}

.mt-ask-title {
	margin: 0 0 4px;
	color: var(--ink);
	font-size: 20px;
	font-weight: 750;
	letter-spacing: -0.015em;
	line-height: 1.28;
	/* A meeting title is one long unbroken string more often than you'd think. */
	overflow-wrap: anywhere;
}

.mt-ask-title.small { font-size: 17px; }

.mt-ask-when {
	margin: 0 0 16px;
	color: var(--muted);
	font-size: 13px;
	font-weight: 600;
}

.mt-ask-copy {
	margin: 0 0 16px;
	color: var(--ink-soft);
	font-size: 14px;
	line-height: 1.55;
}

.mt-ask-you {
	display: flex;
	align-items: center;
	gap: 10px;
	margin-bottom: 13px;
	padding: 10px 12px;
	background: var(--paper-soft);
	border: 1px solid var(--line-soft);
	border-radius: 12px;
	text-align: left;
}

.mt-ask-ava,
.mt-req-ava {
	display: flex;
	flex: none;
	align-items: center;
	justify-content: center;
	width: 32px;
	height: 32px;
	border-radius: 50%;
	background: var(--aqua-soft);
	border: 1px solid var(--aqua-line);
	color: var(--aqua-deep);
	font-size: 11.5px;
	font-weight: 750;
}

.mt-ask-who { min-width: 0; font-size: 12.5px; line-height: 1.35; }
.mt-ask-who b { display: block; color: var(--ink); font-size: 13px; }
.mt-ask-who span { color: var(--muted); overflow-wrap: anywhere; }

.mt-ask-note {
	width: 100%;
	min-height: 84px;
	margin-bottom: 4px;
	padding: 11px 12px;
	background: var(--paper);
	border: 1px solid var(--line);
	border-radius: 12px;
	color: var(--ink);
	font: inherit;
	font-size: 13.5px;
	line-height: 1.5;
	resize: vertical;
	outline: 0;
}

.mt-ask-note:focus { border-color: var(--aqua); box-shadow: 0 0 0 3px #00d8e01c; }
.mt-ask-note::placeholder { color: var(--muted); }

.mt-ask-count {
	margin: 0 0 13px;
	color: var(--muted);
	font-size: 11px;
	text-align: right;
}

.mt-ask-btn { width: 100%; justify-content: center; min-height: 44px; }

.mt-ask-problem {
	margin: 11px 0 0;
	color: var(--coral-deep);
	font-size: 12.5px;
	font-weight: 600;
	line-height: 1.45;
}

.mt-ask-hint {
	margin: 13px 0 0;
	color: var(--muted);
	font-size: 12px;
	line-height: 1.5;
	text-align: center;
}

.mt-ask-ico {
	display: flex;
	align-items: center;
	justify-content: center;
	width: 50px;
	height: 50px;
	margin: 0 auto 15px;
	border-radius: 50%;
	font-size: 22px;
	font-weight: 700;
}

.mt-ask-ico.wait,
.mt-ask-ico.ok {
	background: var(--lime-soft);
	border: 1px solid var(--lime-line);
	color: var(--lime-deep);
}

.mt-ask-ico.no {
	background: var(--silver);
	border: 1px solid var(--line);
	color: var(--ink-soft);
}

.mt-ask-chiprow { margin: 14px 0 0; }

.mt-ask-chip {
	display: inline-flex;
	align-items: center;
	padding: 5px 12px;
	border-radius: 999px;
	background: var(--lime-soft);
	border: 1px solid var(--lime-line);
	color: var(--lime-deep);
	font-size: 12px;
	font-weight: 650;
}

/* ---- the owner's decision cards ---------------------------------------- */

#mt-access:not(:empty) { padding: 16px 21px 4px; }

.mt-req-head {
	margin: 0 0 9px;
	color: var(--muted);
	font-size: 11px;
	font-weight: 750;
	letter-spacing: 0.09em;
	text-transform: uppercase;
}

.mt-req {
	margin: 0 0 10px;
	padding: 14px 16px;
	background: var(--paper);
	border: 1px solid var(--lime-line);
	border-radius: 14px;
}

.mt-req.done-ok { background: var(--lime-soft); border-color: var(--lime-line); }
.mt-req.done-no { background: var(--paper-soft); border-color: var(--line); }

.mt-req-top { display: flex; align-items: flex-start; gap: 11px; }
.mt-req-ava { width: 36px; height: 36px; font-size: 12.5px; }
.mt-req-who { flex: 1; min-width: 0; }
.mt-req-who b { display: block; color: var(--ink); font-size: 14px; }
.mt-req-email { color: var(--muted); font-size: 12px; overflow-wrap: anywhere; }
.mt-req-when { flex: none; color: var(--muted); font-size: 11.5px; white-space: nowrap; }

.mt-req-note {
	margin: 11px 0 0;
	padding: 8px 12px;
	background: var(--paper-soft);
	border-left: 3px solid var(--lime-line);
	border-radius: 0 10px 10px 0;
	color: var(--ink-soft);
	font-size: 13px;
	font-style: italic;
	line-height: 1.5;
	overflow-wrap: anywhere;
}

.mt-req-mailfail {
	margin: 11px 0 0;
	color: var(--coral-deep);
	font-size: 12px;
	font-weight: 600;
	line-height: 1.45;
}

.mt-req-actions {
	display: flex;
	flex-wrap: wrap;
	gap: 8px;
	margin-top: 13px;
}

/* Two decisions, side by side at a readable width — not stretched across a
 * 1300px panel, where "Decline" becomes a 570px slab. */
.mt-req-actions .os-btn { flex: 0 1 220px; min-height: 40px; justify-content: center; }

.mt-req-hint { margin: 9px 0 0; color: var(--muted); font-size: 11.5px; line-height: 1.45; }

.mt-req-done {
	display: flex;
	align-items: center;
	gap: 8px;
	margin: 0;
	color: var(--ink);
	font-size: 13.5px;
	font-weight: 600;
	line-height: 1.45;
}

/* The library chip: a request the owner may never have been emailed about is
 * still in front of them on their next ordinary visit. */
.mt-entry-ask {
	padding: 3px 9px;
	border-radius: 999px;
	background: var(--lime-soft);
	border: 1px solid var(--lime-line);
	color: var(--lime-deep);
	font-size: 11px;
	font-weight: 700;
	white-space: nowrap;
}

/* A finger needs the whole width for the two decisions, and the ask card wants
 * the phone's edges back. */
@media (max-width: 620px) {
	.mt-ask-wrap { padding: 18px 12px 32px; }
	.mt-ask { padding: 22px 18px; }
	#mt-access:not(:empty) { padding: 14px 14px 2px; }
	.mt-req-actions .os-btn { flex: 1 1 100%; min-height: 44px; }
}

/* ============================================================ faces (avatars)
 * Lane os-avatars, 2026-07-30.
 *
 * ONE rule for the image that goes inside a face box, in the ONE stylesheet every
 * page loads. Every face in V2 — a message row, a members list, an agent in
 * Manage, an access request — paints its initials first and lays the picture over
 * them (js/avatars.js), so the img only ever has to fill its box. It lived in
 * threads.css before this, which is why nothing outside Threads could show a
 * photo even when the URL was right there.
 *
 * The boxes themselves stay where they are styled (threads.css, lumi.css,
 * manage.css, and .mt-*-ava below) and only gain `overflow: hidden` — a face box
 * without it lets a square image escape a round frame. */
/* The initials fill the box and centre themselves, independently of how the box
 * itself lays its children out — a face box is variously flex, grid or neither,
 * and a letter that inherits the wrong one lands off-centre. */
.avatar-initials {
	position: absolute;
	inset: 0;
	display: grid;
	place-items: center;
	line-height: 1;
}

.avatar-initials[hidden] { display: none; }

.avatar-img {
	/* ABSOLUTE, not in flow. A face box is a flex/grid centring box, so an <img>
	 * appended after the initials became a SIBLING of that text: the picture took
	 * the full width and the letter was squeezed to a visible sliver down the left
	 * edge. Every numeric assertion passed — the image was there, loaded, and as
	 * wide as its box — and the render gate's own screenshot is what showed it.
	 * Overlaying is also what makes the fallback work: the letter stays underneath,
	 * so a broken image removing itself uncovers it with nothing to re-paint. */
	position: absolute;
	inset: 0;
	width: 100%;
	height: 100%;
	object-fit: cover;
	display: block;
}

/* The two access-request faces: a picture makes "who is asking" and "who they are
 * letting in" recognisable at a glance, which is the whole decision on that card. */
/* A face is the SAME SHAPE everywhere in the OS: a circle (founder, 2026-07-30).
 * The radius itself is set in each box's OWN stylesheet — threads.css and
 * manage.css load after this file, so a `border-radius` declared here loses to
 * theirs on equal specificity. Caught by the 390px screenshot; at 30px on desktop
 * a squircle and a circle are the same handful of pixels. */

/* Every face box that can hold a picture is a positioning context for it. */
.mt-ask-ava,
.mt-req-ava,
.os-avatar,
.msg-avatar,
.mp-avatar,
.m-face,
.m-avatar-pick,
.mem-face,
.lm-avatar,
.member-strip span {
	position: relative;
	overflow: hidden;
}

/* ============================================== iOS input-zoom guard ===== */
/* iOS auto-zooms the whole page when a focused input's font is under 16px,
 * and never zooms back out — the founder's chat sat panned-right with the
 * left column clipped after one tap on the 14px composer (2026-08-02).
 * On touch devices every focusable text field is at least 16px, so the zoom
 * never triggers. Desktop keeps its designed sizes untouched. */
@media (pointer: coarse) {
	input[type="text"],
	input[type="search"],
	input[type="email"],
	input[type="url"],
	/* date/time zoom identically, and V2 has four: the two custom range pickers
	 * on /business, the meeting date on /record, the schedule time on /lumi.
	 * Types V2 does not use (number, tel, password) are deliberately absent
	 * rather than listed on spec. */
	input[type="date"],
	input[type="time"],
	input:not([type]),
	textarea,
	[contenteditable="true"] {
		/* !important, deliberately, and this is the one place it is right.
		 * A page-local rule beats this block on specificity — `.biz-range-custom
		 * input[type="date"]` is (0,2,1) against our (0,1,1), and a media query
		 * adds none — so without it the Business range pickers keep their 12.5px
		 * and keep zooming, and the fix ships looking complete. Enumerating every
		 * offending selector would fix today and rot tomorrow.
		 * The invariant is absolute: on a touch device NO focusable text field is
		 * under 16px, because any such field triggers a zoom iOS never undoes.
		 * There is no design that wants the zoom. */
		font-size: 16px !important;
	}
}

/* ════════════════════════════════════════════════════ the bucket board ══
 *
 * docs/design/V2-TRACKS-TIMELINE-SPEC.md rev 3, built from the mockup the
 * founder signed off ("Much better"): docs/prototypes/v2-tracks-timeline-
 * prototype.html. Replaces the phases × workstreams grid, which is gone
 * (founder ruling N4, 2026-08-06).
 *
 * The one thing this section really has to get right is that THE THREE
 * PROVENANCE STATES NEVER LOOK ALIKE. A card Lumi placed is dashed and tinted;
 * a card somebody confirmed carries a lime edge and a ✓; a card a person placed
 * is plain, because a plain fact needs no decoration. That difference is the
 * founder's ruling ("applies, visibly provisional") made visible, and it is what
 * stops a machine's guess ever wearing a human decision's clothes.
 *
 * Appended, per this file's append-only rule. The dead grid selectors above are
 * left where they are: nothing renders them, and rewriting history in a
 * stylesheet three lanes share is how a rule nobody was looking at breaks.
 */

/* ------------------------------------------------------------- run line -- */

.bk-runline {
	display: flex;
	align-items: center;
	gap: 9px;
	flex-wrap: wrap;
	margin: 4px 0 2px;
	font-size: 12.5px;
	font-weight: 650;
	color: var(--ink-soft);
}

.bk-runline.is-failed { color: var(--coral-deep); font-weight: 750; }
.bk-star { color: var(--aqua-deep); font-size: 14px; }

.bk-rerun {
	border: 0;
	background: none;
	color: var(--aqua-deep);
	font-weight: 800;
	font-size: 12.5px;
	padding: 6px 0;
	min-height: 34px;
	text-decoration: underline;
	text-underline-offset: 2px;
}

.bk-runline.is-failed .bk-rerun { color: var(--coral-deep); }

/* ---------------------------------------------------------- the lens row -- */

.bk-lensrow { display: flex; align-items: center; gap: 9px; flex-wrap: wrap; margin: 12px 0 2px; }

.bk-lens { display: inline-flex; background: var(--silver); border-radius: 10px; padding: 3px; gap: 2px; }

.bk-lens button {
	border: 0;
	background: transparent;
	border-radius: 8px;
	padding: 6px 12px;
	font-size: 12px;
	font-weight: 800;
	color: var(--ink-soft);
	min-height: 34px;
}

.bk-lens button.is-on { background: var(--paper); color: var(--ink); box-shadow: var(--shadow-soft); }
/* Disabled WITH the reason beside it, never hidden — see .bk-lenswhy. */
.bk-lens button:disabled { color: var(--muted); cursor: default; }
.bk-lenswhy { font-size: 11.5px; color: var(--muted); font-weight: 650; max-width: 460px; }
.bk-shape { margin-left: auto; }

/* ------------------------------------------------------------ the board -- */

/* COLUMNS, not a grid — and the render gate is why. A card grid puts the fifth
 * bucket on row two, and row two starts below the TALLEST card on row one: on
 * the founder's own track that stranded "Needs a home" about 700px under a
 * column of empty space, which is the one card on the board you must not be able
 * to miss. Multi-column packs by height instead, so every card follows the one
 * above it. Order becomes column-major, which costs nothing here — bucket order
 * is display order and asserts nothing. */
.bk-grid {
	columns: 320px;
	column-gap: 14px;
	margin-top: 14px;
}

.bk-card { break-inside: avoid; margin-bottom: 14px; }

.bk-card {
	border: 1px solid var(--line);
	border-radius: 15px;
	background: var(--paper-soft);
	padding: 12px 12px 10px;
}

.bk-card.is-tray { border-color: var(--coral-line); }

/* A bucket is a `<details>`, its header a `<summary>` — collapsibility for
 * free, no state of our own to track (2026-08-26). The default marker is
 * swapped for the same rotating-caret convention `.rec-summary` already uses,
 * so this is a second instance of a house pattern rather than a new one. */
.bk-head {
	display: flex;
	align-items: center;
	justify-content: space-between;
	gap: 10px;
	flex-wrap: wrap;
	cursor: pointer;
	list-style: none;
	-webkit-tap-highlight-color: transparent;
}

.bk-head::-webkit-details-marker { display: none; }

.bk-head::before {
	content: "›";
	display: inline-block;
	font-size: 16px;
	line-height: 1;
	color: var(--muted);
	margin-right: 1px;
	transition: transform 0.16s ease;
}

.bk-card[open] > .bk-head::before { transform: rotate(90deg); }
@media (prefers-reduced-motion: reduce) { .bk-head::before { transition: none; } }

.bk-name {
	font-size: 14px;
	font-weight: 850;
	letter-spacing: -0.02em;
	flex: 1 1 auto;
	min-width: 0;
	overflow-wrap: anywhere;
}

.bk-card.is-tray .bk-name { color: var(--coral-deep); }

/* The header's own progress: a stored/derived date chip, a small bar, and the
 * done count in words — everything the old "✓ all" confirm button's row used
 * to carry, minus the button (2026-08-26: nothing left in a bucket header
 * writes anything). */
.bk-headprog { display: flex; align-items: center; gap: 8px; flex: 0 0 auto; }
.bk-pnum { font-size: 11.5px; font-weight: 750; color: var(--ink-soft); white-space: nowrap; }
.bk-datechip { border: 1px solid var(--line); border-radius: 7px; padding: 1px 7px; background: var(--paper); font-size: 11px; color: var(--muted); }

.bk-vall {
	border: 0;
	background: none;
	color: var(--aqua-deep);
	font-weight: 800;
	font-size: 11.5px;
	padding: 4px 0;
	min-height: 32px;
	text-decoration: underline;
	text-underline-offset: 2px;
}

/* Reused for the header's own small bar (2026-08-26) — was a full-width bar
 * under the header; the header now carries name + progress on one line. */
.bk-prog { width: 46px; height: 5px; border-radius: 3px; background: var(--silver); overflow: hidden; flex: 0 0 auto; }
.bk-prog i { display: block; height: 100%; background: var(--lime-deep); border-radius: 3px; }
.bk-cards { display: flex; flex-direction: column; gap: 9px; margin-top: 10px; }
.bk-meta { font-size: 11.5px; color: var(--muted); font-weight: 700; }

/* ------------------------------------------------------------ action card --
 *
 * One look, always (2026-08-26): a placement is settled the instant it is
 * made, so there is no Lumi-vs-human state left to draw differently. The done
 * checkbox sits on the right — text leads, `.trk-check` reused verbatim from
 * the Actions tab rather than a second checkbox style for the same fact.
 */

.bk-a {
	display: flex;
	align-items: flex-start;
	gap: 10px;
	border: 1.5px solid var(--line);
	border-radius: 13px;
	background: var(--paper);
	padding: 11px 12px;
	color: var(--ink);
}

.bk-a.is-tray { border-color: var(--coral-line); background: var(--coral-soft); }

.bk-a-body { flex: 1 1 auto; min-width: 0; }
.bk-a-text { font-size: 13px; font-weight: 700; line-height: 1.4; }
.bk-a.is-done .bk-a-text { color: var(--muted); text-decoration: line-through; text-decoration-thickness: 1px; }

.bk-a-meta {
	display: flex;
	align-items: center;
	gap: 7px;
	flex-wrap: wrap;
	margin-top: 7px;
	font-size: 11px;
	color: var(--muted);
	font-weight: 700;
}

.bk-a-chip {
	border: 1px solid var(--line);
	border-radius: 6px;
	padding: 1px 6px;
	background: var(--paper);
	max-width: 170px;
	overflow: hidden;
	text-overflow: ellipsis;
	white-space: nowrap;
}

/* A quiet, secondary control pushed to the end of the meta row — the only
 * per-action write left on a card besides the checkbox. */
.bk-a-meta .bk-move { margin-left: auto; }

/* ------------------------------------------------------------ time lens -- */

.bk-band {
	margin-top: 16px;
	border: 1px solid var(--line);
	border-radius: 15px;
	background: var(--paper-soft);
	padding: 14px 14px 10px;
	position: relative;
	overflow: hidden;
}

.bk-axis {
	display: flex;
	justify-content: space-between;
	font-size: 10.5px;
	color: var(--muted);
	font-weight: 750;
	padding-bottom: 8px;
	border-bottom: 1px solid var(--line-soft);
}

.bk-row { padding: 11px 0 4px; border-bottom: 1px solid var(--line-soft); }
.bk-row:last-of-type { border-bottom: 0; }
.bk-rowhead { display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; font-size: 12.5px; font-weight: 800; }
.bk-rowhead .sub { color: var(--muted); font-size: 11px; font-weight: 700; }
/* Every span says where its dates came from. This is invariant 6 on the screen. */
.bk-rowhead .src { color: var(--muted); font-size: 10.5px; font-weight: 700; font-style: italic; }
.bk-rowhead .src.is-lumi { color: var(--aqua-deep); }

.bk-rail { position: relative; height: 12px; border-radius: 6px; background: var(--silver); margin-top: 7px; }
.bk-rail i { position: absolute; top: 0; bottom: 0; border-radius: 6px; background: var(--ink-soft); }
.bk-rail i.is-lumi { background: var(--aqua-soft); border: 1.5px dashed var(--aqua-deep); }

.bk-today { position: absolute; top: 42px; bottom: 12px; width: 2px; background: var(--coral); opacity: 0.55; pointer-events: none; }
.bk-todaytag { position: absolute; top: 26px; transform: translateX(-50%); font-size: 9.5px; font-weight: 800; color: var(--coral-deep); }

.bk-shelf { margin-top: 12px; border-top: 1px dashed var(--line); padding-top: 10px; }
.bk-shelfhead { font-size: 11.5px; font-weight: 800; color: var(--muted); }
.bk-shelfrow { display: flex; gap: 8px; flex-wrap: wrap; margin-top: 7px; }

.bk-shelfchip {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	border: 1px solid var(--line);
	border-radius: 10px;
	background: var(--paper);
	padding: 6px 11px;
	font-size: 12px;
	font-weight: 750;
	color: var(--ink-soft);
}

/* ------------------------------------------------------------ the sheets -- */

.bk-sheet-acts { display: flex; flex-direction: column; gap: 7px; }
.bk-sheet-acts .os-btn { justify-content: flex-start; min-height: 44px; border-radius: 12px; }

.bk-editor { display: grid; gap: 7px; }
.bk-editrow { display: flex; gap: 6px; align-items: center; }
.bk-editrow input { flex: 1 1 auto; min-width: 0; }
.bk-editrow .os-btn.small { min-width: 40px; min-height: 40px; padding: 0 8px; }
.bk-editrow .os-btn.danger { color: var(--coral-deep); border-color: var(--coral-line); }

/* One column on a phone, and every control a thumb can hit. Nothing here needs
 * 1440px — he judges this on the phone. */
@media (max-width: 760px) {
	.bk-grid { columns: 1; }
	.bk-lenswhy { max-width: none; }
	.bk-shape { margin-left: 0; }
	.bk-a-chip { max-width: 190px; }
}

@media (hover: none) {
	.bk-vall, .bk-rerun { min-height: 40px; }
	.bk-editrow .os-btn.small { min-width: 44px; min-height: 44px; }
}

/* The run line's ✦ belongs INSIDE the sentence it marks. As its own flex item it
 * wrapped onto a line of its own on a phone, so one sentence took three lines
 * (caught by reading the render, not by any assertion in it). */
.bk-said { display: inline; }
.bk-said .bk-star { font-style: normal; margin-right: 5px; }

/* ====================================== organising every track at once ==
 * (2026-08-07) One button over the whole list, and the honesty it owes: the
 * worker runs one job at a time, so twenty-three tracks take MINUTES. The bar
 * says how many are going and how many have landed; each row says where its own
 * run got to. Both are text, not a spinner — a spinner cannot tell you that
 * three of them failed.
 *
 * Appended, per this file's append-only rule.
 */

.trk-organiseall {
	display: flex;
	align-items: center;
	gap: 12px;
	flex-wrap: wrap;
	margin: 0 0 12px;
	padding: 11px 14px;
	border: 1px solid var(--aqua-line);
	border-radius: 12px;
	background: var(--aqua-soft);
	font-size: 12.5px;
	font-weight: 650;
	color: var(--ink-soft);
}

.trk-oa-said { flex: 1 1 220px; min-width: 0; }
.trk-oa-said i { font-style: normal; margin-right: 6px; color: var(--aqua-deep); }
.trk-organiseall .os-btn { flex: 0 0 auto; }
.trk-organiseall .os-btn[disabled] { opacity: 0.55; cursor: default; }

/* The row's own state. Its own line under the title so it survives the phone
 * layout, which hides the whole .trk-flags cell under 760px. */
.trk-orgchip {
	display: inline-flex;
	align-items: center;
	margin-top: 5px;
	border-radius: 7px;
	padding: 3px 8px;
	font-size: 11px;
	font-weight: 800;
	overflow-wrap: anywhere;
}

.trk-orgchip.going { background: var(--aqua-soft); color: var(--aqua-deep); border: 1px solid var(--aqua-line); }
.trk-orgchip.failed { background: var(--coral-soft); color: var(--coral-deep); border: 1px solid var(--coral-line); }
.trk-orgchip.waiting { background: var(--silver); color: var(--muted); border: 1px solid var(--line); }
.trk-orgchip .bk-star { font-style: normal; margin-right: 5px; font-size: 12px; }

@media (max-width: 760px) {
	.trk-organiseall { align-items: stretch; }
	.trk-organiseall .os-btn { width: 100%; }
}

@media (hover: none) {
	.trk-organiseall .os-btn { min-height: 44px; }
}

/* ==================================================== who can see a track ==
 *
 * The share control on a track's head (tracks.js: shareControl /
 * openShareEditor). A track is shared by hand (2026-08-11), so this is the
 * meetings participant editor in the track's language, and it lives inside the
 * `.trk-status-pop` shell the status editor already defines — one popover
 * shape on this page, not two that drift.
 *
 * `.trk-share-btn` is a BUTTON wearing `.trk-fact`, which is otherwise a label:
 * an action that looks like a chip is the affordance bug this repo has already
 * paid for once, so it carries an underline and a hover, and a non-editor gets
 * the plain `<span>` instead of a control that refuses.
 */

.trk-share-btn {
	border: 0;
	background: transparent;
	color: var(--ink-soft);
	font: inherit;
	padding: 0;
	text-decoration: underline;
	text-decoration-color: var(--line);
	text-underline-offset: 3px;
	cursor: pointer;
}

.trk-share-btn:hover { color: var(--ink); text-decoration-color: currentColor; }

.trk-share-pop { width: min(340px, calc(100vw - 32px)); }
.trk-share-note { margin: 7px 0 10px; color: var(--ink-soft); font-size: 12px; line-height: 1.45; }
.trk-share-list { display: flex; flex-wrap: wrap; gap: 6px; }
.trk-share-empty { color: var(--muted); font-size: 12px; margin: 0; }

.trk-share-chip {
	display: inline-flex;
	align-items: center;
	gap: 6px;
	border: 1px solid var(--line);
	border-radius: 999px;
	padding: 4px 6px 4px 10px;
	background: var(--paper-soft);
	max-width: 100%;
}

.trk-share-chip b { font-size: 12px; font-weight: 700; overflow-wrap: anywhere; }

.trk-share-x {
	display: inline-flex;
	align-items: center;
	justify-content: center;
	width: 20px;
	height: 20px;
	border: 0;
	border-radius: 999px;
	background: transparent;
	color: var(--muted);
	font-size: 15px;
	line-height: 1;
	/* A 20px rect with a thumb-sized reach around it — the tap target is not
	 * the box you can see (the 30x30 action tick, #149). */
	position: relative;
}

.trk-share-x::before {
	content: "";
	position: absolute;
	inset: -12px;
}

.trk-share-x:hover { background: var(--coral-soft); color: var(--coral-deep); }

.trk-share-add { display: flex; gap: 6px; margin-top: 10px; position: relative; }

.trk-share-add input {
	flex: 1;
	min-width: 0;
	min-height: 36px;
	border: 1px solid var(--line);
	border-radius: 9px;
	padding: 0 10px;
	background: var(--paper);
	color: var(--ink);
	font-size: 12.5px;
	outline: 0;
}

.trk-share-add input:focus { border-color: var(--aqua-line); }
/* The list hangs off the row, not off the input, so it clears both controls. */
.trk-share-pop .mt-suggest { width: 100%; top: calc(100% + 4px); }

/* On a phone the popover hangs off `.trk-headings`, which already starts ~130px
 * in behind the back button and the mark — so a 340px card anchored at its LEFT
 * edge runs past the viewport. That is not a cosmetic overhang: the overflow
 * makes the layout viewport WIDER, so Chrome zooms the whole page out, and
 * every measurement taken afterwards (including a JS clamp reading
 * window.innerWidth) reads the already-widened number and agrees with itself.
 * A JS clamp was written first and did exactly that. Anchoring the card's RIGHT
 * edge to the headings block instead cannot overflow at all — the fix is a
 * position, not a correction. */
@media (max-width: 760px) {
	.trk-share-pop { left: auto; right: 0; }
}

@media (hover: none) {
	.trk-share-add input, .trk-share-add .os-btn { min-height: 44px; }
	.trk-share-x { width: 28px; height: 28px; }
}

/* ==========================================================================
   Decision queue — email, agent-first (2026-08-20)
   --------------------------------------------------------------------------
   The rail popover grew from a list of links into the surface where a person
   actually decides: a row carries its provenance and a Bin control, its primary
   tap opens the full card, and approving happens there and nowhere else.

   Appended per this file's convention (one commented section per lane). Where a
   rule below repeats a selector from the original `.os-dec-*` block it is a
   deliberate override and wins by order — the row is a flex container now, not
   a link, and the empty state has two lines instead of one.

   Under 600px the whole thing is a bottom sheet. The popover is anchored to a
   desktop rail a phone does not have, and 340px of width cannot hold a draft
   anybody would read before approving it.
   ========================================================================== */

/* CAUTION, NOT ALARM. The first cut painted every provenance line in the coral
   ALERT scale, and a queue of three ordinary proposals read as three errors —
   every assertion passed and only the screenshot showed it. Untrusted content
   is a thing to READ CAREFULLY, not a failure, so it gets its own amber pair
   rather than borrowing the alert colour. Local to this section on purpose:
   `--viz-*` is the chart IDENTITY scale and using its slot as "warning-ish" is
   the mistake the Business landing page already made once. */
html {
	--dec-caution: #9a5a00;
	--dec-caution-soft: #fff6ea;
	--dec-caution-line: #f0dcbe;
	--dec-go-ink: #ffffff;
}

html[data-theme="dark"] {
	--dec-caution: #d9a24a;
	--dec-caution-soft: #2a2013;
	--dec-caution-line: #46351d;
	/* The primary button is a LIGHT cyan in dark mode, so white-on-it is
	   unreadable. The foreground flips with the theme. */
	--dec-go-ink: #0d1b1c;
}

/* The list is wider and taller than the old link-list needed to be: a row now
   carries three lines of provenance, and at 340×460 the third row sat under the
   fold with four-line wraps above it. Overrides the base rule by order. */
.os-dec-panel { width: min(404px, calc(100vw - 32px)); max-height: min(74vh, 620px); }

.os-dec-panel--wide { width: min(460px, calc(100vw - 32px)); max-height: min(78vh, 640px); }

.os-dec-grab {
	width: 38px;
	height: 4px;
	margin: 2px auto 8px;
	border-radius: 2px;
	background: var(--line);
}

.os-dec-sheet {
	left: 0 !important;
	right: 0;
	top: auto !important;
	bottom: 0;
	width: 100%;
	max-width: none;
	max-height: 88vh;
	border-radius: 20px 20px 0 0;
	border-bottom: 0;
	padding: 10px 14px 0;
}

.os-dec-head-row {
	display: flex;
	align-items: center;
	gap: 8px;
	margin-bottom: 2px;
}

.os-dec-head-row .os-dec-head { flex: 1; min-width: 0; }

.os-dec-back,
.os-dec-close {
	min-width: 44px;
	min-height: 44px;
	padding: 0 6px;
	border: 0;
	border-radius: 10px;
	background: none;
	font: inherit;
	font-size: 12.5px;
	font-weight: 750;
	color: var(--aqua-deep);
	cursor: pointer;
}

.os-dec-back:hover,
.os-dec-close:hover { background: var(--silver); }

.os-dec-notice {
	margin: 8px 0 2px;
	padding: 9px 11px;
	border: 1px solid var(--coral-line);
	border-radius: 11px;
	background: var(--coral-soft);
	font-size: 11.5px;
	font-weight: 700;
	line-height: 1.45;
	color: var(--ink);
}

/* ---- rows ---- */

.os-dec-row {
	display: flex;
	align-items: stretch;
	gap: 0;
	padding: 0;
	overflow: hidden;
	background: var(--paper);
	border: 1px solid var(--line);
}

.os-dec-row:hover { border-color: var(--aqua-line); }

.os-dec-main {
	flex: 1;
	min-width: 0;
	display: block;
	padding: 10px 11px;
	border: 0;
	background: none;
	font: inherit;
	text-align: left;
	cursor: pointer;
}

.os-dec-main:hover { background: var(--aqua-soft); }

.os-dec-kind {
	font-size: 10px;
	font-weight: 850;
	letter-spacing: 0.5px;
	text-transform: uppercase;
	color: var(--muted);
}

.os-dec-prov {
	margin-top: 4px;
	font-size: 11px;
	font-weight: 650;
	line-height: 1.45;
	color: var(--ink-soft);
	overflow-wrap: anywhere;
}

/* Untrusted and unknown are the SAME weight on screen on purpose: a proposal
   whose provenance was never recorded is not a clean one, it is one we cannot
   vouch for. */
.os-dec-prov--untrusted,
.os-dec-prov--unknown { color: var(--dec-caution); font-weight: 700; }

/* The panel has no bottom padding (see above), so a view that ends in the list
   carries its own. */
.os-dec-list { padding-bottom: calc(14px + env(safe-area-inset-bottom)); }

.os-dec-tags {
	display: flex;
	flex-wrap: wrap;
	gap: 4px;
	margin-top: 6px;
}

.os-dec-tag {
	padding: 2px 7px;
	border: 1px solid var(--line);
	border-radius: 8px;
	background: var(--silver);
	font-size: 10px;
	font-weight: 750;
	color: var(--ink-soft);
}

.os-dec-tag.out,
.os-dec-tag.gate {
	border-color: var(--dec-caution-line);
	background: var(--dec-caution-soft);
	color: var(--dec-caution);
}

.os-dec-bin {
	flex: none;
	min-width: 56px;
	min-height: 44px;
	padding: 0 10px;
	border: 0;
	border-left: 1px solid var(--line);
	background: var(--paper-soft);
	font: inherit;
	font-size: 11.5px;
	font-weight: 750;
	/* Muted at rest. Three rows of red BIN read as three things having gone
	   wrong; the destructive colour belongs to the moment of pressing it. */
	color: var(--ink-soft);
	cursor: pointer;
}

.os-dec-bin:hover,
.os-dec-bin:active { background: var(--coral-soft); color: var(--coral-deep); }

/* ---- empty ---- */

.os-dec-empty { padding: 18px 2px 12px; text-align: center; }
.os-dec-empty-h { font-size: 13px; font-weight: 800; color: var(--ink); }

.os-dec-empty-p {
	margin-top: 4px;
	font-size: 11.5px;
	font-weight: 600;
	color: var(--muted);
}

/* ---- card ---- */

.os-dec-provpanel {
	margin: 10px 0 8px;
	padding: 10px 12px;
	border: 1px solid var(--line);
	border-radius: 12px;
	background: var(--paper-soft);
	font-size: 11.5px;
	font-weight: 620;
	line-height: 1.5;
	color: var(--ink-soft);
}

.os-dec-provpanel p { margin: 4px 0 0; overflow-wrap: anywhere; }

.os-dec-provpanel--untrusted,
.os-dec-provpanel--unknown {
	border-color: var(--dec-caution-line);
	background: var(--dec-caution-soft);
	color: var(--ink);
}

.os-dec-ph {
	font-size: 10px;
	font-weight: 850;
	letter-spacing: 0.5px;
	text-transform: uppercase;
	color: var(--muted);
}

.os-dec-warn { color: var(--dec-caution); font-weight: 750; }

.os-dec-panel-box {
	margin: 8px 0;
	padding: 10px 12px;
	border: 1px solid var(--line);
	border-radius: 12px;
	background: var(--paper);
}

.os-dec-kv-wrap { margin-top: 6px; display: flex; flex-direction: column; gap: 5px; }

.os-dec-kv { display: flex; gap: 10px; align-items: baseline; }

.os-dec-k {
	flex: none;
	width: 62px;
	font-size: 11px;
	font-weight: 750;
	color: var(--muted);
}

.os-dec-v {
	flex: 1;
	min-width: 0;
	font-size: 12.5px;
	font-weight: 650;
	color: var(--ink);
	overflow-wrap: anywhere;
}

.os-dec-draft {
	margin-top: 7px;
	font-size: 12.5px;
	font-weight: 550;
	line-height: 1.6;
	color: var(--ink);
	white-space: pre-wrap;
	overflow-wrap: anywhere;
}

.os-dec-src { margin-top: 6px; }
.os-dec-src-subj { font-size: 12.5px; font-weight: 750; color: var(--ink); overflow-wrap: anywhere; }
.os-dec-src-from { font-size: 11px; font-weight: 650; color: var(--muted); overflow-wrap: anywhere; }
.os-dec-src-out:empty { display: none; }

.os-dec-src-note {
	margin: 7px 0 0;
	font-size: 11.5px;
	font-weight: 700;
	line-height: 1.45;
	color: var(--ink-soft);
	overflow-wrap: anywhere;
}

.os-dec-src-note--ok { color: var(--lime-deep); }
.os-dec-src-note--bad { color: var(--coral-deep); }

.os-dec-foot {
	margin: 8px 2px 0;
	font-size: 11px;
	font-weight: 650;
	line-height: 1.45;
	color: var(--muted);
}

.os-dec-link {
	display: inline-flex;
	align-items: center;
	min-height: 44px;
	margin: 2px;
	font-size: 11.5px;
	font-weight: 750;
	color: var(--aqua-deep);
}

/* THE ONE CONTROL THIS SURFACE EXISTS FOR MUST BE ON SCREEN.
 *
 * The card is a bounded, vertically-scrolling popover (or a bottom sheet), and a
 * real draft runs past its fold — so Approve and Bin sat below it on BOTH
 * viewports, with macOS overlay scrollbars invisible. A person opened the one
 * screen whose job is approving and there was no approve control anywhere on it.
 * The render gate could not see it either: its `inside` measurement compared
 * left/right against the viewport WIDTH and had no vertical term at all, so an
 * assertion literally named "approve and bin are both here, and both fit" passed
 * over a screen showing neither (bit-us #34, again).
 *
 * Sticky to the bottom of the scroll container, on the panel's own background so
 * the draft scrolls UNDER it rather than through it, with a hairline that says
 * there is more above. */
.os-dec-actions {
	position: sticky;
	bottom: 0;
	z-index: 1;
	/* Bleeds over the panel's own side and bottom padding, so the bar covers the
	   full width of the scrollport and nothing peeks out beneath it. A sticky bar
	   that leaves a strip of live content under its bottom edge reads as a
	   rendering fault, which is how a person learns to distrust the screen. */
	margin: 8px -14px 0;
	padding: 8px 14px calc(16px + env(safe-area-inset-bottom));
	border-top: 1px solid var(--line);
	background: var(--paper);
}

.os-dec-actionrow {
	display: flex;
	gap: 8px;
}

/* THE SENTENCE THAT SAYS NOTHING GETS SENT RIDES WITH THE BUTTON.
   It used to sit further up the card, which on a real draft means below the
   fold — so the one place it is needed, next to the control that acts, was the
   one place it never appeared. */
.os-dec-actions .os-dec-foot { margin: 0 0 8px; }

/* WHY APPROVE IS INERT, in the same place the button is, and the reason is a
   PREFIX on the existing footnote rather than a replacement — the first version
   replaced it and dropped "Lumi has no way to send mail", the sentence this
   whole surface rests on, from the scroll-0 state of every card. It wears the
   caution scale because it is a fact about this row, not an error. The bar is
   two lines while held and one line after, which is a change UNDER the reader's
   thumb — accepted because it only ever happens while they are scrolled to the
   END of the draft, i.e. nowhere near the bar.

   The end-of-draft sentinel is the thing being watched. It has to have a HEIGHT
   (a zero-height element never intersects) and must not look like anything. */
.os-dec-draft-end { height: 1px; margin: 0; }

.os-dec-actions .os-dec-foot--hold {
	padding: 8px 10px;
	border: 1px solid var(--dec-caution-line);
	border-radius: 10px;
	background: var(--dec-caution-soft);
	font-weight: 700;
}

.os-dec-btn[disabled] {
	opacity: .45;
	cursor: not-allowed;
	filter: none;
}

.os-dec-btn--go[disabled]:hover { filter: none; background: var(--aqua-deep); }

/* Who has to approve this one, said before the tap. Not an error — a fact about
   the row — so it wears the caution scale, not the alert one. */
.os-dec-gate {
	margin: 0 0 8px;
	padding: 8px 10px;
	border: 1px solid var(--dec-caution-line);
	border-radius: 10px;
	background: var(--dec-caution-soft);
	font-size: 11.5px;
	font-weight: 700;
	line-height: 1.45;
	color: var(--dec-caution);
}

/* Every untrusted source, enumerated. One line each — the row summarises, the
   card lists, and the card is the only place approve exists. */
.os-dec-srclist {
	margin: 6px 0 0;
	padding-left: 18px;
	font-size: 11.5px;
	font-weight: 650;
	line-height: 1.5;
}

.os-dec-srclist li { margin-bottom: 3px; }

.os-dec-scan {
	margin-top: 6px;
	font-size: 11px;
	font-weight: 650;
	color: var(--ink-soft);
}

/* The way back to the text you just approved. It is the only copy there is. */
.os-dec-reentry {
	display: block;
	width: 100%;
	min-height: 44px;
	margin: 0 0 8px;
	padding: 8px 10px;
	border: 1px solid var(--line);
	border-radius: 10px;
	background: var(--silver);
	font: inherit;
	font-size: 11.5px;
	font-weight: 750;
	text-align: left;
	color: var(--ink);
	cursor: pointer;
}

.os-dec-reentry:hover { background: var(--paper-soft); }

.os-dec-btn {
	flex: 1;
	min-height: 44px;
	padding: 0 14px;
	border: 1px solid var(--line);
	border-radius: 12px;
	background: var(--paper);
	font: inherit;
	font-size: 12.5px;
	font-weight: 800;
	color: var(--ink);
	cursor: pointer;
}

.os-dec-btn:hover { background: var(--silver); }

.os-dec-btn--go {
	border-color: var(--aqua-deep);
	background: var(--aqua-deep);
	color: var(--dec-go-ink);
}

.os-dec-btn--go:hover { filter: brightness(1.06); background: var(--aqua-deep); }

.os-dec-btn--bin { color: var(--coral-deep); border-color: var(--coral-line); }
.os-dec-btn--bin:hover { background: var(--coral-soft); }

.os-dec-btn--quiet { flex: none; margin-top: 8px; font-size: 11.5px; font-weight: 750; }

.os-dec-copy-status {
	margin: 7px 2px 0;
	min-height: 15px;
	font-size: 11.5px;
	font-weight: 700;
	color: var(--ink-soft);
}

/* --------------------------------------------------------------------------
 * email-agent-first — round 4: the phone's waiting-on-you signal, and the done
 * screen's second copy control.
 *
 * The pending count existed on ONE element, the rail button, and on a phone
 * that element is inside the closed drawer — so the device the founder reviews
 * on showed nothing at all while a draft sat waiting. The badge now also rides
 * the topbar burger. It reuses `.os-rail-badge`'s pill so there is one visual
 * language for a count, and re-pins itself because the ≤760px rule moves that
 * pill to a full-width drawer ROW's right edge, which inside a 44px button
 * lands in the middle of the glyph.
 * ----------------------------------------------------------------------- */
.os-topbar-burger { position: relative; }

.os-topbar-burger .os-topbar-badge {
	top: -4px;
	right: -4px;
	left: auto;
	transform: none;
	pointer-events: none;   /* the burger owns the tap; the count is a signal */
}

/* NOTHING IS PENDING, BUT YOUR APPROVED DRAFT IS STILL IN THERE. A count pill
   with no count would read as a phantom pending item, so the kept state gets a
   smaller, muted dot — present enough to say "there is something behind this
   menu", quiet enough not to be an alarm. Same reasoning as the rail's
   `.os-rail-decisions--kept`; different shape because this one rides a topbar. */
.os-topbar-burger .os-topbar-badge--kept {
	min-width: 8px;
	width: 8px;
	height: 8px;
	padding: 0;
	background: var(--muted);
	box-shadow: 0 0 0 2px var(--paper);
}

/* Two copy controls do not fit side by side at 390 (the second one's label is
   the longer of the two by design — it says where the difference is). Wrapping
   is the whole rule: a flex row that cannot wrap squeezes both labels until
   neither can be read, and both buttons keep their 44px thumb height. */
.os-dec-actionrow--wrap { flex-wrap: wrap; }
.os-dec-actionrow--wrap .os-dec-btn { flex: 1 1 auto; min-width: 132px; }

/* ============================================================ Inbox ==== *
 * Inbox — its own destination (web-v2/inbox.html + js/inbox.js), approved
 * 2026-08-26 (artifact 39aaa245-e34d-4f1c-ac6d-59dfc8231498). The violet
 * accent above is scoped here on purpose: nothing else in the OS drafts text
 * on a person's behalf, so nothing else needed a fifth hue.
 * ========================================================================= */

.ibx-head { margin-bottom: 4px; }
.ibx-greet { margin: 4px 0 0; font-size: 13.5px; color: var(--ink-soft); font-weight: 500; }

.ibx-section { margin: 26px 0 0; max-width: 640px; }
.ibx-seclabel {
	font-size: 11px; font-weight: 800; letter-spacing: .06em; text-transform: uppercase;
	color: var(--muted); padding: 0 2px 10px;
}
.ibx-sub { font-size: 12.5px; color: var(--muted); margin: 0 0 12px; padding: 0 2px; max-width: 58ch; }
.ibx-rows { display: flex; flex-direction: column; gap: 9px; }

.ibx-row {
	display: flex; align-items: stretch; gap: 4px; background: var(--paper);
	border: 1px solid var(--line); border-radius: 14px; box-shadow: var(--shadow-soft);
}
.ibx-row-main {
	flex: 1; min-width: 0; display: flex; align-items: flex-start; gap: 11px;
	text-align: left; font: inherit; background: none; border: 0; cursor: pointer;
	padding: 13px 12px; border-radius: 13px; color: inherit;
}
.ibx-row-main:hover { background: var(--silver); }
.ibx-dot { width: 8px; height: 8px; border-radius: 50%; flex: 0 0 auto; margin-top: 6px; }
.ibx-dot--mail { background: var(--violet); }
.ibx-dot--chat { background: var(--aqua-deep); }
.ibx-dot--flag { background: var(--coral); }
.ibx-dot--cal { background: var(--aqua-deep); }
.ibx-chev { color: var(--muted); font-size: 17px; flex: 0 0 auto; align-self: center; padding-right: 12px; }
.ibx-row-body { flex: 1; min-width: 0; }
.ibx-row-title { font-size: 14.5px; font-weight: 700; letter-spacing: -.01em; line-height: 1.3; }
.ibx-row-sub {
	font-size: 12.5px; color: var(--ink-soft); margin-top: 3px; line-height: 1.35;
	overflow: hidden; text-overflow: ellipsis; display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical;
}
.ibx-row-sub--flag { color: var(--coral-deep); font-weight: 600; }
.ibx-tags { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 6px; }
.ibx-tag { font-size: 10.5px; font-weight: 700; padding: 2px 8px; border-radius: 7px; background: var(--silver); color: var(--ink-soft); }
.ibx-tag--gate { background: var(--coral-soft); color: var(--coral-deep); }
.ibx-tag--out { background: var(--amber-soft); color: var(--amber-deep); }
.ibx-tag--alone { background: var(--silver); color: var(--muted); }
.ibx-bin {
	flex: 0 0 auto; width: 46px; border: 0; background: none; color: var(--muted);
	font-size: 15px; cursor: pointer; border-radius: 12px; align-self: stretch;
}
.ibx-bin:hover { background: var(--coral-soft); color: var(--coral-deep); }

.ibx-empty { padding: 30px 4px; color: var(--muted); }
.ibx-empty-h { font-size: 14.5px; font-weight: 700; color: var(--ink); margin-bottom: 4px; }

.ibx-task {
	display: flex; align-items: flex-start; gap: 12px; background: var(--paper);
	border: 1px solid var(--line); border-radius: 13px; padding: 12px 14px;
	box-shadow: var(--shadow-soft); margin-bottom: 9px;
}
.ibx-task-box { width: 20px; height: 20px; border-radius: 6px; border: 2px solid var(--line); flex: 0 0 auto; margin-top: 1px; }
.ibx-task-t { font-size: 14px; font-weight: 600; line-height: 1.32; }
.ibx-task-m { font-size: 12px; color: var(--ink-soft); margin-top: 4px; }
.ibx-late { color: var(--coral-deep); font-weight: 700; }
.ibx-seeall { display: inline-block; font-size: 13px; font-weight: 700; color: var(--lime-deep); text-decoration: none; padding: 3px 2px; }
.ibx-seeall:hover { text-decoration: underline; }

.ibx-note { font-size: 12.5px; color: var(--muted); line-height: 1.5; padding: 2px 2px; max-width: 58ch; }

.ibx-ev {
	display: flex; gap: 13px; align-items: center; background: var(--paper); border: 1px solid var(--line);
	border-radius: 13px; padding: 11px 14px; box-shadow: var(--shadow-soft); margin-bottom: 9px;
}
.ibx-ev-time { font-size: 12.5px; font-weight: 800; color: var(--aqua-deep); width: 74px; flex: 0 0 auto; }
.ibx-ev-t { font-size: 14px; font-weight: 600; line-height: 1.3; }
.ibx-ev-w { font-size: 12px; color: var(--muted); margin-top: 2px; }

/* -------------------------------------------------------- review overlay -- */

.ibx-review {
	position: fixed; inset: 0; z-index: 70; background: var(--base);
	display: flex; flex-direction: column;
}
.ibx-rv-top {
	flex: 0 0 auto; padding: 18px 16px 12px; display: flex; align-items: center; gap: 8px;
	border-bottom: 1px solid var(--line); background: var(--paper);
}
.ibx-back { border: 0; background: none; color: var(--ink); font: inherit; font-size: 15px; font-weight: 600; cursor: pointer; padding: 6px 4px; }
.ibx-rv-title { flex: 1; text-align: center; font-size: 15px; font-weight: 800; letter-spacing: -.01em; }
.ibx-rv-spacer { width: 44px; flex: 0 0 auto; }
.ibx-rv-scroll { flex: 1; overflow-y: auto; padding: 18px 20px 20px; max-width: 640px; margin: 0 auto; width: 100%; }
.ibx-rv-actions {
	flex: 0 0 auto; padding: 12px 20px calc(20px + var(--os-dock-inset, 0px));
	border-top: 1px solid var(--line); background: var(--paper);
	display: flex; flex-wrap: wrap; gap: 9px; max-width: 640px; margin: 0 auto; width: 100%; box-sizing: border-box;
}

.ibx-ctx { font-size: 13px; }
.ibx-ctx-subj { font-size: 15px; font-weight: 700; letter-spacing: -.01em; margin-bottom: 14px; }

.ibx-provpanel { border-radius: 14px; padding: 13px 15px; margin-bottom: 14px; font-size: 12.5px; line-height: 1.55; }
.ibx-provpanel--untrusted { background: var(--coral-soft); border: 1px solid var(--coral-line); }
.ibx-provpanel--clean { background: var(--lime-soft); border: 1px solid var(--lime-line); }
.ibx-provpanel--unknown { background: var(--amber-soft); border: 1px solid var(--amber-line); }
.ibx-ph { font-size: 11px; font-weight: 700; letter-spacing: .04em; text-transform: uppercase; color: var(--ink-soft); margin-bottom: 6px; }
.ibx-srclist { margin: 6px 0 0; padding-left: 18px; }
.ibx-srclist li { margin-bottom: 3px; }
.ibx-scan { color: var(--ink-soft); margin: 6px 0 0; }
.ibx-warn { font-weight: 600; margin: 8px 0 0; }
.ibx-provpanel--untrusted .ibx-warn { color: var(--coral-deep); }
.ibx-provpanel--unknown .ibx-warn { color: var(--amber-deep); }

.ibx-kvbox { display: flex; flex-direction: column; gap: 8px; margin-bottom: 14px; }
.ibx-kv { display: flex; gap: 10px; font-size: 13px; }
.ibx-k { color: var(--muted); flex: 0 0 88px; }
.ibx-v { font-weight: 600; }

.ibx-draftlabel { font-size: 11px; font-weight: 800; letter-spacing: .05em; text-transform: uppercase; color: var(--violet); padding: 6px 2px 8px; }
.ibx-draft {
	background: var(--paper); border: 1px solid var(--line); border-radius: 13px; padding: 15px;
	font-size: 14.5px; line-height: 1.55; color: var(--ink); min-height: 160px; width: 100%;
	font-family: inherit; resize: vertical; box-sizing: border-box;
}
.ibx-draft:focus { outline: 2px solid var(--violet); outline-offset: 1px; }
.ibx-prov { font-size: 12px; color: var(--muted); line-height: 1.5; margin-top: 12px; display: flex; gap: 6px; }
.ibx-prov-mark { color: var(--violet); flex: 0 0 auto; }

.ibx-warnbox { background: var(--coral-soft); border: 1px solid var(--coral-line); border-radius: 13px; padding: 14px 15px; font-size: 13px; line-height: 1.5; color: var(--coral-deep); font-weight: 600; }

.ibx-gate { font-size: 12.5px; color: var(--amber-deep); background: var(--amber-soft); border: 1px solid var(--amber-line); border-radius: 10px; padding: 9px 12px; margin-bottom: 9px; font-weight: 600; flex: 1 1 100%; }
.ibx-foot { font-size: 12px; color: var(--muted); flex: 1 1 100%; margin-bottom: 2px; }
/* The calendar review's own action row — .ibx-rv-actions already lays out
   the gate note; this nests the two (permanently disabled) RSVP buttons
   underneath it as their own flex row, mirroring .ibx-actionrow elsewhere in
   the app (e.g. os-dec-actionrow). */
.ibx-actionrow { display: flex; gap: 9px; flex: 1 1 100%; }
.ibx-actionrow .ibx-btn { flex: 1; }

.ibx-btn {
	font: inherit; font-size: 14px; font-weight: 700; padding: 13px 16px; border-radius: 12px;
	cursor: pointer; border: 1px solid var(--line); background: var(--paper); color: var(--ink); flex: 1;
}
.ibx-btn--ghost { color: var(--ink-soft); background: transparent; }
.ibx-btn--pri { background: var(--violet); color: #fff; border-color: var(--violet); flex: 2; }
.ibx-btn--pri:hover { background: var(--violet-deep); border-color: var(--violet-deep); }
.ibx-btn[disabled] { opacity: .45; cursor: not-allowed; }

/* ---------------------------------------------------- Mail triage (Needs you)
 * The on-open proactive summary (backend/needs_you.py) — opening the page IS
 * the ask, and this is what it renders while/after that ask runs. Built
 * entirely from JS (renderTriage() in inbox.js: not_connected / running /
 * error / triaged / all_clear), matching every other section on this page.
 * `--mt-*` accents reuse existing tokens rather than inventing a sixth hue:
 * amber for "needs a reply" (attention, not alarm), aqua for "worth knowing",
 * violet for the Draft action (the one existing "Lumi drafts on your behalf"
 * accent — see the Inbox section header above), lime for the all-clear check.
 * ------------------------------------------------------------------------- */

#ibx-mt-body { display: flex; flex-direction: column; gap: 12px; }

.ibx-mt-empty {
	display: flex; flex-direction: column; align-items: center; text-align: center;
	gap: 12px; padding: 34px 16px 30px;
}
.ibx-mt-icon {
	width: 52px; height: 52px; border-radius: 15px; display: flex; align-items: center;
	justify-content: center; background: var(--silver); color: var(--muted); font-size: 22px;
}
.ibx-mt-icon--clear { background: var(--lime-soft); color: var(--lime-deep); }
.ibx-mt-h2 { font-size: 17px; font-weight: 800; letter-spacing: -.01em; }
.ibx-mt-p { font-size: 13.5px; color: var(--ink-soft); line-height: 1.5; max-width: 40ch; }
.ibx-mt-connectbtn {
	font: inherit; font-size: 14px; font-weight: 700; padding: 11px 20px; border-radius: 12px;
	border: 0; background: var(--violet); color: #fff; cursor: pointer; text-decoration: none;
	display: inline-block; margin-top: 2px;
}
.ibx-mt-connectbtn:hover { background: var(--violet-deep); }

.ibx-mt-loading, .ibx-mt-errbox {
	display: flex; align-items: center; justify-content: space-between; gap: 12px;
	background: var(--paper); border: 1px solid var(--line); border-radius: 14px;
	padding: 15px 16px; box-shadow: var(--shadow-soft); font-size: 13.5px;
}
.ibx-mt-errbox { color: var(--coral-deep); }
.ibx-mt-errbox p { margin: 0; }
.ibx-mt-retrybtn {
	font: inherit; font-size: 13px; font-weight: 700; padding: 8px 14px; border-radius: 10px;
	border: 1px solid var(--line); background: var(--paper-soft); color: var(--ink); cursor: pointer;
	flex: 0 0 auto;
}
.ibx-mt-retrybtn:hover { background: var(--silver); }

.ibx-mt-card {
	background: var(--paper); border: 1px solid var(--line); border-radius: 16px;
	padding: 16px; box-shadow: var(--shadow-soft); display: flex; flex-direction: column; gap: 13px;
}
.ibx-mt-top { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
.ibx-mt-headline { font-size: 16px; font-weight: 800; letter-spacing: -.01em; }
.ibx-mt-refresh {
	width: 32px; height: 32px; border-radius: 10px; border: 1px solid var(--line);
	background: var(--paper-soft); color: var(--ink-soft); display: flex; align-items: center;
	justify-content: center; cursor: pointer; flex: 0 0 auto; font-size: 15px; line-height: 1;
}
.ibx-mt-refresh:hover { background: var(--silver); color: var(--ink); }
.ibx-mt-refresh[disabled] { opacity: .5; cursor: default; }
.ibx-mt-refresh.spin { animation: ibx-mt-spin .9s linear infinite; }
@keyframes ibx-mt-spin { to { transform: rotate(360deg); } }

.ibx-mt-meta { font-size: 12px; color: var(--muted); margin-top: -6px; }

.ibx-mt-stats { display: flex; gap: 8px; }
.ibx-mt-stat { flex: 1; border-radius: 12px; padding: 10px 8px; text-align: center; }
.ibx-mt-stat-n { font-size: 19px; font-weight: 800; line-height: 1.1; }
.ibx-mt-stat-l { font-size: 10.5px; color: var(--ink-soft); margin-top: 2px; font-weight: 600; line-height: 1.25; }
.ibx-mt-stat--reply { background: var(--amber-soft); }
.ibx-mt-stat--reply .ibx-mt-stat-n { color: var(--amber-deep); }
.ibx-mt-stat--fyi { background: var(--aqua-soft); }
.ibx-mt-stat--fyi .ibx-mt-stat-n { color: var(--aqua-deep); }
.ibx-mt-stat--nothing { background: var(--silver); }
.ibx-mt-stat--nothing .ibx-mt-stat-n { color: var(--ink-soft); }

.ibx-mt-caption { font-size: 11.5px; color: var(--muted); border-top: 1px solid var(--line-soft); padding-top: 10px; line-height: 1.5; }

.ibx-mt-clear-top { display: flex; align-items: flex-start; gap: 13px; }
.ibx-mt-clear-top .ibx-mt-icon { flex: 0 0 auto; }
.ibx-mt-clear-body { flex: 1; min-width: 0; }
.ibx-mt-clear-body .ibx-mt-h2 { text-align: left; }
.ibx-mt-clear-body .ibx-mt-p { text-align: left; max-width: none; margin-top: 2px; }

.ibx-mt-seclabel {
	font-size: 11px; font-weight: 800; letter-spacing: .05em; text-transform: uppercase;
	color: var(--muted); padding: 2px 2px 0;
}

.ibx-mt-mail {
	background: var(--paper); border: 1px solid var(--line); border-radius: 14px;
	padding: 14px; box-shadow: var(--shadow-soft); display: flex; flex-direction: column; gap: 7px;
}
.ibx-mt-mail-head { display: flex; align-items: flex-start; justify-content: space-between; gap: 10px; }
.ibx-mt-mail-from { font-size: 13px; font-weight: 700; }
.ibx-mt-mail-email { font-weight: 400; color: var(--muted); font-size: 11.5px; display: block; margin-top: 1px; }
.ibx-mt-mail-ago { font-size: 11px; color: var(--muted); white-space: nowrap; flex: 0 0 auto; padding-top: 1px; }
.ibx-mt-mail-subject { font-size: 14px; font-weight: 700; line-height: 1.3; }
.ibx-mt-mail-reason { font-size: 12.5px; color: var(--ink-soft); line-height: 1.4; }
.ibx-mt-mail-actions { margin-top: 3px; }
.ibx-mt-mail-actions .ibx-btn { width: 100%; padding: 10px 14px; font-size: 13.5px; }
.ibx-mt-mail-actions .ibx-btn--done { background: var(--lime-soft); color: var(--lime-deep); border-color: var(--lime-line); cursor: default; }

.ibx-mt-fyi-toggle {
	display: flex; align-items: center; justify-content: space-between; width: 100%;
	background: var(--paper); border: 1px solid var(--line); border-radius: 14px;
	padding: 12px 14px; cursor: pointer; font: inherit; color: inherit;
}
.ibx-mt-fyi-toggle-t { font-size: 13px; font-weight: 700; }
.ibx-mt-chev { color: var(--muted); transition: transform .15s ease; flex: 0 0 auto; }
.ibx-mt-fyi-toggle[aria-expanded="true"] .ibx-mt-chev { transform: rotate(180deg); }
.ibx-mt-fyi-list { display: flex; flex-direction: column; }
.ibx-mt-fyi-row {
	padding: 10px 2px; border-bottom: 1px solid var(--line-soft);
	display: flex; flex-direction: column; gap: 2px;
}
.ibx-mt-fyi-row:last-child { border-bottom: none; }
.ibx-mt-fyi-s { font-size: 12.5px; font-weight: 700; }
.ibx-mt-fyi-sub { font-size: 12px; color: var(--ink-soft); }

@media (max-width: 760px) {
	.ibx-section { max-width: none; }
	.ibx-rv-scroll, .ibx-rv-actions { max-width: none; }
}

/* Complete work files — production Artifact components and OS tokens. */
.work-files-panel .artifact-btn,.work-files-panel .artifact-close,.work-files-panel .artifact-vsel{min-height:44px;}
.work-files-panel .artifact-vsel{max-width:100%;flex:1 1 100%;min-width:0;}
.work-files-panel.is-expanded{width:94vw;}
.work-files-panel .work-files-body{display:block;overflow:auto;background:var(--paper-soft);overscroll-behavior:contain;}
.work-file-source{margin:0;padding:20px;color:var(--ink);font:12px/1.7 var(--mono,monospace);min-height:100%;box-sizing:border-box;white-space:pre;tab-size:2;}
.work-files-panel .artifact-prov{overflow-wrap:anywhere;}
