/* ─── Team console — the SHARED styles (owner /team + spaces viewer) ───
 *
 * Display-parity rule (CLAUDE.md "Shared Spaces — viewer renderings"): a
 * shared-space rendering may only be built from the owner surface's shared
 * modules. These rules are public/team.html's inline stylesheet for the
 * Team Home header, the Work (floor) view, the Org Chart view and the
 * helpers they share — moved VERBATIM so /team (owner) and spaces.html
 * (read-only viewer) paint the ONE surface. team.html carries no copy.
 *
 * The console's root element wears the scoping class `.team-console`
 * (TeamConsole.scaffoldHtml). The rules below are NOT re-prefixed with it:
 * every family here is already namespaced (.tv-*, .fl-*, .al-*, .tvtl*), so
 * unlike the process console — which had to escape generic .btn/.card/.h2
 * names — there is nothing on either host page for them to clobber. Colors
 * and typography flow from the host page's CSS variables, which is what
 * keeps the two renders identical.
 *
 * NOT here (deliberately, they are owner page chrome, not console): the
 * .tv-role-* resume overlay and the .tv-cfg-* agent-config overlay.
 */


/* ─── Empty State ─────────────────────────────────────────────── */
.empty-org-text{font-size:14px;font-weight:500;margin-bottom:4px}
.empty-org-sub{font-size:12px;opacity:.6}

/* ─── Team View (mock E) ─────────────────────────────────────── */
.tv-wrap{display:grid;grid-template-columns:minmax(0,1fr);gap:16px;padding:18px 26px;width:100%;margin:0}
.tv-card{background:var(--bg-surface,var(--bg-secondary));border:1px solid var(--border-dim,var(--border));border-radius:12px;padding:14px 16px;margin-bottom:14px}
.tv-sec{font-size:10.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--text-muted);margin-bottom:10px}
.tv-k{font-size:9.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--text-muted)}
.tv-v{font-size:15px;font-weight:800}
.tv-btn{font-size:11px;font-weight:700;color:var(--accent);border:1px solid var(--border-dim,var(--border));border-radius:8px;padding:4px 11px;text-decoration:none;background:none;cursor:pointer}
.tv-statbtn{border:0;background:transparent;color:inherit;text-align:left;padding:0;cursor:pointer;font:inherit}
.tv-statbtn:hover .tv-v,.tv-statbtn:focus-visible .tv-v{color:var(--accent)}
.tv-statbtn:focus-visible{outline:2px solid var(--accent);outline-offset:4px;border-radius:3px}
.tv-modal{position:fixed;inset:0;z-index:1000;display:none;align-items:center;justify-content:center;padding:24px;background:rgba(2,6,15,.72);backdrop-filter:blur(8px)}
.tv-modal.open{display:flex}
.tv-modalbox{width:min(760px,100%);max-height:min(760px,calc(100vh - 48px));display:flex;flex-direction:column;background:var(--bg-surface,var(--bg-secondary));border:1px solid var(--border-glow,var(--border));border-radius:16px;box-shadow:0 24px 80px rgba(0,0,0,.45)}
.tv-modalhead{display:flex;align-items:center;gap:12px;padding:15px 17px;border-bottom:1px solid var(--border-dim,var(--border))}
.tv-modaltitle{font-family:var(--font-display);font-size:15px;font-weight:800}
.tv-modalbody{overflow:auto;padding:14px 17px 18px}
.tv-modalclose{margin-left:auto;width:30px;height:30px;border:1px solid var(--border-dim,var(--border));border-radius:8px;background:transparent;color:var(--text-muted);cursor:pointer;font-size:16px}
.tv-modalclose:hover{color:var(--text-primary);border-color:var(--border-glow,var(--border))}
.tv-taskframe{display:block;width:100%;height:max(620px,calc(100vh - 250px));border:0;background:transparent}
.tv-conversations-pane{width:100%;min-width:0;min-height:max(620px,calc(100vh - 250px))}
.tv-need{display:flex;gap:10px;align-items:center;padding:8px 10px;border:1px solid var(--border-dim,var(--border));border-radius:9px;margin-bottom:7px;font-size:12.5px}
.tv-dot{width:8px;height:8px;border-radius:50%;background:var(--amber,#d97706);flex:none}
.tv-dot.info{background:var(--accent)}
.tv-hier{display:grid;grid-template-columns:60px minmax(0,1fr);gap:0 12px}
.tv-rail{display:flex;flex-direction:column;align-items:center}
.tv-fin{width:46px;height:46px;border-radius:50%;border:2px solid var(--accent);overflow:hidden;display:flex;align-items:center;justify-content:center;background:var(--accent-bg)}
/* FIX 5 (2026-07-30): the no-Finney fallback is a stroke glyph, not an emoji —
   sized to sit inside the 44px face the real avatar occupies, accent-coloured
   through currentColor like every other icon on the page. */
.tv-fin>svg{width:26px;height:26px;color:var(--accent);flex:none}
.tv-fin>div{border-radius:50%!important}
/* Ore 2026-07-30: the label wraps to two lines inside the 60px rail column, so
   without an explicit text-align it renders left-aligned against a centred
   circle. The rail's align-items centres the BOX, not the text inside it. */
.tv-finlbl{font-size:8.5px;font-weight:800;letter-spacing:.06em;color:var(--accent);margin-top:4px;text-align:center;line-height:1.25}
.tv-line{flex:1;width:2px;background:var(--border-dim,var(--border));margin-top:6px;border-radius:2px}
.tv-coord{border:1px solid var(--accent);background:linear-gradient(100deg,var(--accent-bg),var(--bg-surface,var(--bg-secondary)) 60%);border-radius:12px;padding:12px 14px;display:flex;gap:11px;align-items:center;margin-bottom:12px;flex-wrap:wrap}
.tv-chipc{font-size:9px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--accent);border:1px solid var(--accent);border-radius:999px;padding:2px 8px}
/* Collapsible coordinator / all-other groups + the all-other group tile */
.tv-group.collapsed .tv-groupbody{display:none}
.tv-chev{width:22px;height:22px;border:0;background:transparent;color:var(--text-muted);cursor:pointer;display:inline-flex;align-items:center;justify-content:center;font-size:11px;border-radius:6px;flex:none;transition:transform .18s ease;padding:0}
.tv-chev:hover{color:var(--accent);background:var(--accent-bg)}
.tv-group.collapsed .tv-chev{transform:rotate(-90deg)}
.tv-gicon{width:40px;height:40px;border-radius:11px;border:1px dashed var(--accent);color:var(--accent);display:flex;align-items:center;justify-content:center;font-size:17px;flex:none;background:var(--accent-bg)}
/* Foot of the rail: the "Team Huddle" circle — the single door into the Team
   Room (Ore, 2026-07-28). Same 46px geometry as .tv-fin but visually secondary:
   it is Finney's peer at the other end of the connector, not a second Finney. */
.tv-room{width:46px;height:46px;border-radius:50%;border:2px solid var(--border-active,var(--border));background:var(--bg-input,var(--bg-secondary));color:var(--text-muted);display:flex;align-items:center;justify-content:center;text-decoration:none;cursor:pointer;flex:none;margin-top:6px}
.tv-room:hover{border-color:var(--accent);background:var(--accent-bg);color:var(--accent)}
.tv-room svg{width:22px;height:22px}
.tv-roomlbl{font-size:8.5px;font-weight:800;letter-spacing:.06em;color:var(--text-muted);margin-top:4px;text-align:center;line-height:1.25}
@media (prefers-reduced-motion:reduce){.tv-chev{transition:none}}
/* ── floor view (U5 of plan 2026-07-29-001-feat-team-home-floor-view) ──────
   Content/layout follow docs/brainstorms/mocks/team-floor-v3.html; every
   colour is a page variable (R19) — no raw hex, none of the mock's palette.
   var(--red)/var(--red-bg) below are FORWARD REFERENCES: U7 adds both tokens
   to :root and [data-theme=light] within the hour; until then the error badge
   simply inherits, an acceptable one-hour gap. */
.fl-ny .fl-ny-empty{font-size:12px;color:var(--text-muted);padding:6px 0}
.fl-narr{border:1px solid var(--border-dim);border-radius:11px;background:linear-gradient(180deg,var(--accent-glow),transparent);padding:12px 14px;margin-bottom:12px}
.fl-narr-h{font-size:9.5px;letter-spacing:.09em;text-transform:uppercase;font-weight:800;color:var(--accent)}
/* ── Active Workflows panel (workflows U12) — chrome only: the tiles are
   the shared statTiles primitive and the run rows are the shared
   actLineRow, so the panel can never grow a bespoke grid (the tv2 lesson).
   Collapsed (empty container) when the team owns no workflows. */
.fl-wf{border:1px solid var(--border-dim);border-radius:11px;padding:12px 14px;margin-bottom:12px}
.fl-wf-h{font-size:9.5px;letter-spacing:.09em;text-transform:uppercase;font-weight:800;color:var(--accent);margin-bottom:8px}
.fl-wf .wc-tiles{margin-bottom:8px}
.fl-narr-ts{font-family:var(--font-mono);font-size:9px;font-weight:500;color:var(--text-muted);letter-spacing:0;text-transform:none}
.fl-narr-b{font-size:11.5px;line-height:1.6;color:var(--text-secondary);margin-top:6px;white-space:pre-wrap}
.fl-narr-none{color:var(--text-muted);font-style:italic}
/* cycle header — the ONLY place counts live (D-g) */
.fl-cyc{display:flex;align-items:flex-start;justify-content:center;padding:4px 0 16px;margin-bottom:14px;border-bottom:1px solid var(--border-dim)}
.fl-node{width:150px;text-align:center;flex:none}
.fl-circ{width:78px;height:78px;border-radius:50%;margin:0 auto 7px;border:2px solid var(--border-dim);display:flex;flex-direction:column;align-items:center;justify-content:center;background:var(--bg-card);position:relative}
/* GREEN MIGRATED (Completed-lane redesign 2026-07-29): running is LIVENESS,
   not success — Working's active treatment reads ACCENT now; the green
   done-and-healthy feel moved to the Completed ok cards (.fl-lgcard.ok). */
.fl-circ.w{border-color:var(--accent);background:linear-gradient(180deg,var(--accent-bg),var(--bg-card))}
.fl-circ.c{border-color:var(--border-active)}
.fl-num{font-size:22px;font-weight:800;line-height:1;color:var(--text-primary)}
.fl-circ.w .fl-num{color:var(--accent)}
.fl-clbl{font-size:8.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--text-muted);font-weight:800;margin-top:2px}
.fl-cap{font-size:10px;color:var(--text-muted);line-height:1.45}
.fl-arrow{flex:1;height:2px;background:linear-gradient(90deg,var(--border-dim),var(--border-active),var(--border-dim));position:relative;min-width:36px;margin-top:38px}
.fl-arrow::after{content:"";position:absolute;right:-1px;top:-4px;border-left:7px solid var(--border-active);border-top:5px solid transparent;border-bottom:5px solid transparent}
/* KTD6: the problem marker is a DOT ON THE CIRCLE — never a banner strip */
.fl-mark{position:absolute;top:2px;right:2px;width:10px;height:10px;border-radius:50%;background:var(--amber);border:2px solid var(--bg-card)}
/* lanes — headings are bare words; Working is the visual centre (R6) */
.fl-lanes{display:grid;grid-template-columns:1fr 1.35fr 1.15fr;gap:0}
.fl-lane{padding:0 12px;min-width:0}
.fl-lane+.fl-lane{border-left:1px solid var(--border-dim)}
.fl-lane-w{background:linear-gradient(180deg,var(--accent-bg),transparent 65%)}
/* The heading is a flex row so the Completed lane can carry its own compact
   refresh control BESIDE the bare word (FIX 1, Ore 2026-07-30) — the word
   itself stays a closed literal, counts still live only in the circles. */
.fl-lh{font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;font-weight:800;color:var(--text-muted);margin:0 0 10px;display:flex;align-items:center;gap:6px}
.fl-empty{font-size:11.5px;color:var(--text-muted);padding:4px 0 10px}
/* generation-skew marker (review fix 2026-07-29): tiny, muted, self-clearing */
.fl-skewmark{font-size:9px;color:var(--text-muted);font-style:italic;flex:none;margin-top:2px}
.fl-pend{font-size:11px;color:var(--text-muted);border:1px dashed var(--border-dim);border-radius:9px;padding:8px 10px;margin-bottom:8px}
.fl-unavail{border:1px solid var(--border-dim);border-radius:11px;padding:26px 18px;text-align:center;color:var(--text-muted);font-size:12.5px}
/* (The Working/idle-strip card families — .fl-wcard, .fl-wav, .fl-mst,
   .fl-wline, .fl-idleb, .fl-idlerow etc. — moved VERBATIM to the shared
   /work-cards.css, U1 of plan 2026-07-30-001. The <link> in <head> is the
   only source of those rules now.) */
.tv-floor .act-roll.bad .act-dom{color:var(--red)} /* U7 tokens (see block comment) */
/* moved-on fold — ONE real button, rows struck through (D-e/D-f) */
.fl-goneb{display:block;width:100%;text-align:left;background:transparent;border:0;border-top:1px dashed var(--border-dim);color:var(--text-muted);font-size:10.5px;cursor:pointer;margin-top:10px;padding:8px 0 2px;font-family:inherit}
.fl-goneb:hover{color:var(--accent)}
.fl-gone{opacity:.5}
.fl-gone .act-it-what{text-decoration:line-through;text-decoration-thickness:1px}
/* heartbeat fold (#1, plan 2026-07-29-003 U4) — ONE muted collapsed row per
   lane behind a real button, the moved-on fold's pattern. Muted is not
   deleted (KTD3): expanding shows the heartbeat rows, dimmed. */
.fl-hbbtn{display:block;width:100%;text-align:left;background:transparent;border:0;border-top:1px dashed var(--border-dim);color:var(--text-muted);font-size:10.5px;cursor:pointer;margin-top:10px;padding:8px 0 2px;font-family:inherit}
.fl-hbbtn:hover{color:var(--accent)}
.fl-hbbody .act-it{opacity:.55}
/* ── E1 — the work ledger on Completed (U4, plan 2026-07-29-004) ──────────
   Same variable-only rule as the blocks above: no raw hex. Ledger items lead
   the lane; each is a real button expanding to its covered raw rows. */
.fl-ledger{margin-bottom:10px}
.fl-lgstale{font-size:9.5px;color:var(--text-muted);font-style:italic;margin-bottom:4px}
.fl-lgplain{font-size:10.5px;color:var(--text-muted);border:1px dashed var(--border-dim);border-radius:9px;padding:6px 9px;margin-bottom:8px}
.fl-lgnote{font-size:10.5px;color:var(--text-muted);font-style:italic;margin-bottom:8px}
/* ── FIX 2/3 (Ore 2026-07-30) — summary freshness is VISIBLE ──────────────
   COLOUR, on purpose: --text-secondary, never --red and never --amber. Both
   of those already mean FAILURE on this page (.bad rows, the cycle header's
   problem dot, the plain-view marker); a summary that is merely BEHIND its
   facts is not a failure, and spending the alarm palette on it would drain
   the alarm. Muted-with-emphasis instead: a step up from --text-muted, bold,
   in a dashed --border-dim chip. Visible at a glance, honest about severity. */
.fl-lgbehind{font-size:9.5px;font-weight:700;letter-spacing:0;text-transform:none;line-height:1.3;color:var(--text-secondary);border:1px dashed var(--border-dim);border-radius:6px;padding:2px 7px;min-width:0}
.fl-left{margin-top:10px}
.fl-leftb{display:inline-block;text-align:left;background:transparent;border:0;border-top:1px dashed var(--border-dim);color:var(--text-secondary);font-weight:700;font-size:10.5px;cursor:pointer;padding:8px 0 2px;font-family:inherit;width:100%}
.fl-leftb:hover{color:var(--accent)}
.fl-leftcta{margin:4px 6px 2px 0}
.fl-leftpoint{font-size:10px;color:var(--text-muted);font-style:italic}
.fl-leftlead{font-size:10px;color:var(--text-muted);margin:2px 0 6px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.fl-leftbody{margin-top:2px}
/* (The Completed .fl-lgcard and Queued .fl-qcard card families moved
   VERBATIM to the shared /work-cards.css, U1 of plan 2026-07-30-001.) */
.fl-genbtn{display:inline-flex;align-items:center;gap:6px;background:transparent;border:1px solid var(--border-dim);border-radius:8px;padding:5px 11px;font-size:10.5px;font-weight:700;color:var(--accent);cursor:pointer;font-family:inherit}
.fl-genbtn:hover{border-color:var(--accent);background:var(--accent-bg)}
.fl-genbtn:disabled{opacity:.55;cursor:wait}
.fl-genbtn svg{width:13px;height:13px}
.fl-genmsg{font-size:10px;color:var(--text-muted);font-style:italic}
/* FIX 1 (Ore 2026-07-30): on the Completed lane's own header the control is an
   ICON — square, no words, so the click reads as "just this section". The
   accessible name rides title + aria-label (an icon-only control MUST carry
   one) and the feedback line below the heading is its aria-live region. */
.fl-lh .fl-genbtn{padding:2px;border-radius:6px}
.fl-lh .fl-genbtn svg{width:12px;height:12px}
/* The live region is ALWAYS in the DOM (it has to be, to announce) but takes
   NO space until it has something to say — the three lanes' first rows must
   stay aligned on a floor that has never been refreshed. */
.fl-lgmsgrow .fl-genmsg{display:block;line-height:1.3;margin:-4px 0 8px}
.fl-lgmsgrow .fl-genmsg:empty{display:none}
/* FIX 2/3 (Ore 2026-07-30) — the floor's action row: ONE global refresh that
   chains gather → board → narrative, plus the Finney summary handoff, RIGHT
   aligned immediately above the day-narrative header. */
.fl-acts{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap;margin-bottom:8px}
.fl-acts:empty{display:none}
.fl-allbtn{display:inline-flex;align-items:center;gap:6px;background:transparent;border:1px solid var(--border-dim);border-radius:8px;padding:5px 11px;font-size:10.5px;font-weight:700;color:var(--accent);cursor:pointer;font-family:inherit}
.fl-allbtn:hover{border-color:var(--accent);background:var(--accent-bg)}
.fl-allbtn:disabled{opacity:.55;cursor:wait}
.fl-allbtn svg{width:13px;height:13px}
.fl-actsmsg{font-size:10px;color:var(--text-muted);font-style:italic;text-align:right}
/* ── U6 — avatar filter bar + Completed timeframe (R7/R8, D-h, KTD7) ──────
   Same variable-only rule as the U5 block above: no raw hex, no mock palette. */
.fl-bar{display:flex;align-items:center;gap:12px;padding-bottom:12px;margin-bottom:14px;border-bottom:1px solid var(--border-dim);flex-wrap:wrap}
.fl-bar:empty{display:none}
.fl-avs{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.fl-avbtn{width:34px;height:34px;border-radius:50%;flex:none;padding:0;background:var(--bg-input);border:2px solid transparent;cursor:pointer;position:relative;display:flex;align-items:center;justify-content:center}
.fl-avbtn:hover{border-color:var(--border-active)}
.fl-avbtn[aria-pressed="true"]{border-color:var(--accent)}
/* KTD7: the CIRCLE is this wrapper's radius — the face inside stays av()'s
   rounded-square idiom, clipped round exactly like .tv-fin>div. */
.fl-avbtn>.fl-avface{width:100%;height:100%;border-radius:50%!important;overflow:hidden;background:var(--accent-bg);color:var(--accent);display:flex;align-items:center;justify-content:center;font-weight:800;font-size:11.5px}
.fl-avface img{width:100%;height:100%;object-fit:cover}
.fl-avall{width:auto;min-width:34px;border-radius:999px;padding:0 10px;font-size:9.5px;letter-spacing:.03em;font-weight:800;color:var(--text-muted);background:transparent;border:1px dashed var(--border-glow)}
.fl-avall[aria-pressed="true"]{border:2px solid var(--accent);background:var(--accent-bg);color:var(--accent)}
/* status rides the circle as a dot, PAIRED with the aria-label — never colour-only */
.fl-avdot{position:absolute;right:-1px;bottom:-1px;width:9px;height:9px;border-radius:50%;border:2px solid var(--bg-surface)}
.fl-avdot.run{background:var(--accent)} /* running = liveness = accent (redesign 2026-07-29) */
.fl-avdot.nosig{background:var(--amber)}
.fl-avmore{flex:none;background:transparent;border:1px dashed var(--border-glow);border-radius:999px;color:var(--text-muted);font-size:9.5px;font-weight:800;letter-spacing:.03em;padding:0 10px;height:34px;cursor:pointer;font-family:inherit}
.fl-avmore:hover{color:var(--accent);border-color:var(--accent)}
/* Domain filter pills (redesign item 8): one per served domain + All */
.fl-doms{display:flex;align-items:center;gap:5px;flex-wrap:wrap}
.fl-dombtn{background:transparent;border:1px solid var(--border-dim);border-radius:999px;color:var(--text-muted);font-size:9.5px;font-weight:700;letter-spacing:.03em;padding:3px 10px;cursor:pointer;font-family:inherit}
.fl-dombtn:hover{border-color:var(--accent);color:var(--accent)}
.fl-dombtn[aria-pressed="true"]{border-color:var(--accent);background:var(--accent-bg);color:var(--accent)}
.fl-avname{font-size:11px;color:var(--text-muted);margin-left:3px}
/* (.fl-sumbtn — the bar's chat-compose Summarize — REMOVED, item 2 of Ore's
   feedback batch: the merged Summarize control lives on .fl-genbtn and the
   Discuss handoff below.) */
.fl-lgdiscuss{background:transparent;border:0;color:var(--accent);font-size:10px;font-weight:700;cursor:pointer;font-family:inherit;padding:0}
.fl-lgdiscuss:hover{text-decoration:underline}
/* FIX 3: the handoff moved off the Completed lane onto the action row, where it
   sits beside the global refresh — so it wears that row's button chrome. */
.fl-acts .fl-lgdiscuss{border:1px solid var(--border-dim);border-radius:8px;padding:5px 11px;font-size:10.5px}
.fl-acts .fl-lgdiscuss:hover{text-decoration:none;border-color:var(--accent);background:var(--accent-bg)}
.fl-tf{margin-left:auto;display:flex;align-items:center;gap:8px}
.fl-tflbl{font-size:9.5px;letter-spacing:.07em;text-transform:uppercase;font-weight:800;color:var(--text-muted)}
.fl-tfseg{display:inline-flex;border:1px solid var(--border-dim);border-radius:8px;overflow:hidden}
.fl-tfbtn{background:transparent;border:0;color:var(--text-muted);font-size:11px;padding:5px 11px;cursor:pointer;font-family:inherit}
.fl-tfbtn[aria-pressed="true"]{background:var(--accent-bg);color:var(--accent);font-weight:700}
.fl-tfbtn:disabled{opacity:.4;cursor:not-allowed}
.fl-tfhint{font-size:10px;color:var(--text-muted);font-style:italic}
/* ── U6 — the ticker (R12): pure-CSS marquee with WCAG 2.2.2 stop mechanics.
   translateX keyframes over a data-built track duplicated once for the
   seamless wrap; reduced-motion freezes it (the newest few show static);
   hover OR keyboard focus pauses it (the strip is tabbable for exactly that). */
.fl-tick{overflow:hidden;border:1px solid var(--border-dim);border-radius:10px;background:var(--bg-input);position:relative;height:38px;margin-bottom:14px}
.fl-tick:empty{display:none}
/* The track is ABSOLUTELY positioned so its max-content width (a duplicated
   run of chips, ~thousands of px) contributes ZERO to layout: in normal flow
   it propagated min-content width up through the tv-main/tv-hier grid items
   (min-width:auto) and inflated the whole floor 12x wide — Working/Completed
   rendered 16,000px off-screen. Found live via Playwright, 2026-07-29. */
.fl-tickrow{position:absolute;left:0;top:0;display:flex;gap:8px;align-items:center;padding:0 12px;height:100%;white-space:nowrap;width:max-content;animation:flSlide 60s linear infinite}
@keyframes flSlide{0%{transform:translateX(0)}100%{transform:translateX(-50%)}}
.fl-tick:hover .fl-tickrow,.fl-tick:focus-within .fl-tickrow{animation-play-state:paused}
@media (prefers-reduced-motion:reduce){.fl-tickrow{animation:none}}
.fl-chip{display:inline-flex;align-items:center;gap:6px;background:var(--bg-card);border:1px solid var(--border-dim);border-radius:999px;padding:4px 11px;font-size:11px;flex:none;color:var(--text-secondary)}
.fl-tdot{width:5px;height:5px;border-radius:50%;flex:none}
.fl-tdot.q{background:var(--text-muted)}
/* dots follow the migration: working = accent (liveness), completed = green */
.fl-tdot.w{background:var(--accent)}
.fl-tdot.c{background:var(--green)}
@media(max-width:1000px){.fl-lanes{grid-template-columns:1fr}.fl-lane{padding:0}.fl-lane+.fl-lane{border-left:0;border-top:1px solid var(--border-dim);margin-top:14px;padding-top:12px}}
.tv-desks{display:grid;grid-template-columns:repeat(auto-fill,minmax(270px,1fr));gap:12px}

/* ── Org Chart (2026-07-31 — the 'desks' branch, renamed) ────────
   SVG-native tree: nodes AND connectors both drawn in one canvas
   so alignment can't drift. `.tv-org-frame` is the sized position:
   relative wrapper — HTML action-button overlays anchor to IT (not
   .tv-org-canvas), so the row never wanders left when the canvas
   centres a narrow tree (bug caught in mock review). Horizontal
   scroll instead of wrap — an org chart that wraps stops being a
   chart. Team-super is hidden (Ore ruling). */
/* Canvas surface: match the /brief exec-card idiom (bg-card + subtle border
   + card shadow). The prior rgba(0,0,0,.15) fill was too dark against the
   platform theme and made the tree feel like it sat inside a well — Ore
   ruling 2026-07-31: keep it clean, just a card. */
.tv-org-canvas{width:100%;overflow-x:auto;background:var(--bg-card);border:1px solid var(--border);border-radius:var(--radius,12px);box-shadow:var(--shadow,0 2px 12px rgba(0,0,0,.3));padding:24px 20px;margin-top:2px;cursor:grab}
.tv-org-canvas:active{cursor:grabbing}
/* Interactive children override the grab cursor with their own — buttons and
   node rects should still read as clickable, not draggable. */
.tv-org-canvas .tv-org-actions button,.tv-org-canvas .tv-org-nodebg,.tv-org-canvas .tv-org-crosschip{cursor:pointer}
.tv-org-frame{position:relative;margin:0 auto}
.tv-org-frame svg{display:block}
/* Node fill flipped from --bg-card → --bg-input so the nodes read as
   distinct panels ON the canvas card (which is now --bg-card). Without
   this the two share a fill and the tree flattens into the background. */
.tv-org-nodebg{fill:var(--bg-input);stroke:var(--border-dim);stroke-width:1;cursor:pointer;transition:stroke .12s}
.tv-org-nodebg:hover{stroke:var(--border-active)}
.tv-org-nodebg.head{fill:url(#tv-org-head-grad);stroke:var(--border-glow)}
.tv-org-nodetxt-name{font-family:var(--font-sans);font-weight:700;font-size:12px;fill:var(--text-primary);pointer-events:none}
.tv-org-nodetxt-role{font-family:var(--font-sans);font-size:10.5px;fill:var(--text-secondary);pointer-events:none}
.tv-org-nodetxt-cls{font-family:var(--font-mono);font-size:8.5px;fill:var(--text-muted);letter-spacing:.06em;text-transform:uppercase;pointer-events:none}
.tv-org-connector{stroke:var(--border-glow);stroke-width:1.5;fill:none;stroke-linecap:round}
.tv-org-crosschip{display:inline-flex;align-items:center;gap:4px;font-family:var(--font-mono);font-size:9.5px;color:var(--text-muted);background:var(--bg-input);border:1px dashed var(--border-glow);border-radius:999px;padding:2px 8px;white-space:nowrap;position:absolute;pointer-events:auto}
.tv-org-actions{position:absolute;display:flex;gap:4px}
.tv-org-actions button{padding:5px 8px;border-radius:6px;border:1px solid var(--border-dim);background:var(--bg-input);color:var(--text-secondary);cursor:pointer;font-family:var(--font-sans);font-size:9.5px;font-weight:700;display:inline-flex;align-items:center;gap:4px;transition:border-color .1s,color .1s,background .1s}
.tv-org-actions button:hover{border-color:var(--border-active);color:var(--accent)}
.tv-org-actions button.primary{background:var(--accent-bg);color:var(--accent);border-color:var(--border-glow)}
.tv-org-actions button.primary:hover{background:rgba(34,211,238,.22)}
.tv-org-actions svg{width:11px;height:11px;flex-shrink:0}
.tv-org-note{font-family:var(--font-mono);font-size:10.5px;color:var(--text-muted);letter-spacing:.03em;padding:8px 2px;display:flex;justify-content:space-between;gap:14px;flex-wrap:wrap}
.tv-org-note b{color:var(--text-secondary);font-weight:700}
/* Flat photo-wall fallback — used when the team has zero reporting
   relationships. Same node visual as the tree, just laid out as a grid. */
.tv-org-flat{display:grid;grid-template-columns:repeat(auto-fill,minmax(172px,1fr));gap:14px;padding:8px 4px}

/* ── Zoom controls (Ore ruling 2026-07-31: "add ability to zoom out so the
   canvas can see all at once when you have big ones"). Toolbar sits ABOVE
   the canvas so it doesn't scroll with the tree. Scaling is a CSS transform
   on .tv-org-frame with transform-origin:top left; the .tv-org-scaler wrapper
   reflects the scaled size so the parent's overflow-x scroll behaves. HTML
   action-button overlays scale with the frame — they're inside it. */
.tv-org-controls{display:flex;justify-content:flex-end;margin:2px 0 6px}
.tv-org-zoom{display:inline-flex;align-items:center;gap:2px;background:var(--bg-card);border:1px solid var(--border-dim);border-radius:8px;padding:3px 4px;box-shadow:var(--shadow,0 1px 4px rgba(0,0,0,.15))}
.tv-org-zoom button{padding:5px 10px;border-radius:6px;border:0;background:transparent;color:var(--text-secondary);cursor:pointer;font-family:var(--font-sans);font-size:11.5px;font-weight:700;line-height:1;transition:background .1s,color .1s;min-width:26px}
.tv-org-zoom button:hover{background:var(--bg-input);color:var(--accent)}
.tv-org-zoom .tv-org-zoom-pill{font-family:var(--font-mono);font-size:10.5px;font-weight:700;color:var(--text-muted);min-width:44px;text-align:center;padding:0 4px}
.tv-org-zoom .tv-org-zoom-sep{width:1px;height:16px;background:var(--border-dim);margin:0 2px}
.tv-org-scaler{position:relative;margin:0 auto}
.tv-org-scaler > .tv-org-frame{transform-origin:top left;margin:0}
/* Optional team-at-a-glance panel. It participates in layout instead of
   floating over the SVG, so opening it never hides a large org chart. */
.tv-org-stage{display:grid;grid-template-columns:minmax(0,1fr);gap:18px;align-items:start}
.tv-org-stage.responsibilities-open{grid-template-columns:minmax(0,1fr) minmax(300px,340px)}
.tv-org-chartcol{min-width:0}
.tv-org-roster{display:none;background:var(--bg-card);border:1px solid var(--border);border-radius:14px;box-shadow:var(--shadow,0 2px 12px rgba(0,0,0,.12));padding:18px;position:sticky;top:12px;max-height:72vh;overflow:auto}
.tv-org-stage.responsibilities-open .tv-org-roster{display:block;animation:tv-slideup .18s ease-out}
.tv-org-roster-head{display:flex;align-items:flex-start;justify-content:space-between;gap:12px;margin-bottom:15px}
.tv-org-roster-title{font-family:var(--font-display);font-size:16px;font-weight:800;color:var(--text-primary)}
.tv-org-roster-sub{font-size:11px;color:var(--text-muted);line-height:1.45;margin-top:3px}
.tv-org-roster-close{border:0;background:transparent;color:var(--text-muted);cursor:pointer;font-size:18px;padding:0 2px}
.tv-org-roster-list{display:flex;flex-direction:column;gap:14px}
.tv-org-roster-person{display:grid;grid-template-columns:46px minmax(0,1fr);gap:12px;align-items:start;padding-bottom:14px;border-bottom:1px solid var(--border-dim)}
.tv-org-roster-person:last-child{border-bottom:0;padding-bottom:0}
.tv-org-roster-avatar{width:46px;height:46px;border-radius:50%;overflow:hidden;background:var(--accent-bg);color:var(--accent);display:flex;align-items:center;justify-content:center;font-family:var(--font-display);font-size:13px;font-weight:800}
.tv-org-roster-avatar img{width:100%;height:100%;object-fit:cover}
.tv-org-roster-name{font-size:12px;font-weight:800;color:var(--text-primary);line-height:1.3}
.tv-org-roster-role{font-size:10px;color:var(--accent);font-family:var(--font-mono);margin:2px 0 5px}
.tv-org-roster-desc{font-size:11.5px;color:var(--text-secondary);line-height:1.5}
.tv-org-resp-toggle{margin-right:auto;border:0;background:transparent;color:var(--text-muted);padding:6px 8px;border-radius:7px;display:inline-flex;align-items:center;gap:7px;font-family:var(--font-sans);font-size:11.5px;font-weight:700;cursor:pointer;transition:color .12s,background .12s}
.tv-org-resp-toggle svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;flex:none}
.tv-org-resp-toggle:hover,.tv-org-resp-toggle.active{color:var(--accent);background:var(--accent-bg)}
@media(max-width:1120px){.tv-org-stage.responsibilities-open{grid-template-columns:1fr}.tv-org-roster{position:static;max-height:none;grid-row:2}}
@keyframes tv-fade{from{opacity:0}to{opacity:1}}
@keyframes tv-slideup{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
.tv-desk{background:var(--bg-surface,var(--bg-secondary));border:1px solid var(--border-dim,var(--border));border-radius:12px;padding:13px 14px;display:flex;flex-direction:column;gap:8px}
/* Uniform tiles (Ore, 2026-07-18): name/title clamp to one line, the Latest
   box has a fixed slot, actions pin to the bottom — every card same height. */
/* Names + titles wrap to 2 lines instead of ellipsing (2026-07-31) — a 270px
   column ate longer agent names as "Finney the Fina…" which made the roster
   unreadable. The -webkit-line-clamp confines runaway strings without hiding
   them; title= still carries the full text on hover (native + zero-delay CSS
   tooltip via [data-tooltip] rule further down). */
.tv-desk .tv-dname{font-weight:700;font-size:13.5px;line-height:1.25;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}
.tv-desk .tv-dtitle{font-size:11px;color:var(--text-muted);line-height:1.3;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;word-break:break-word}
.tv-desk .tv-now{height:58px;overflow:hidden;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical}
.tv-desk .tv-acts{margin-top:auto}
.tv-feedscroll{max-height:46vh;overflow-y:auto;padding-right:4px}
/* Ghost add-agent tile: chat-first agent creation, styled as an empty desk. */
.tv-ghost{border:2px dashed var(--border-glow,var(--border-dim));background:transparent;align-items:center;justify-content:center;text-align:center;cursor:pointer;color:var(--text-muted);min-height:120px}
.tv-ghost:hover{border-color:var(--accent);color:var(--accent)}
.tv-ghost-plus{width:34px;height:34px;border-radius:50%;border:2px dashed currentColor;display:flex;align-items:center;justify-content:center;margin:0 auto}
.tv-ghost-t{font-size:11.5px;font-weight:800;letter-spacing:.06em}
.tv-ghost-d{font-size:10.5px;color:var(--text-muted)}
/* First-run hero (only-Platform installs): the old /setup doors, on the home. */
.tv-hero{position:relative;border:1px solid var(--border-glow,var(--border-dim));background:linear-gradient(180deg,var(--accent-bg),transparent);border-radius:14px;padding:20px 22px;margin-bottom:16px}
.tv-hero h2{margin:0;font-size:16.5px;font-weight:800}
.tv-hero p{color:var(--text-secondary,var(--text-muted));font-size:12.5px;max-width:66ch;margin:6px 0 13px}
.tv-hero .tvh-acts{display:flex;gap:10px;flex-wrap:wrap;align-items:center}
/* ── The "Today" strip (Ore-approved mock 2026-07-18) ─────────────── */
.tvtl{background:var(--bg-surface,var(--bg-secondary));border:1px solid var(--border-dim,var(--border));border-radius:14px;padding:14px 18px 10px;margin-bottom:16px}
.tvtl-head{display:flex;align-items:center;gap:10px;margin-bottom:6px}
.tvtl-head .t{font-size:10.5px;font-weight:800;letter-spacing:.08em;text-transform:uppercase;color:var(--text-muted)}
.tvtl-legend{margin-left:auto;display:flex;gap:14px;font-size:10px;color:var(--text-muted);align-items:center}
.tvtl-legend i{display:inline-block;width:9px;height:9px;border-radius:50%;margin-right:4px;vertical-align:-1px}
.tvtl-rail{position:relative;height:86px;margin:4px 6px 0}
.tvtl-axis{position:absolute;left:0;right:0;top:54px;height:2px;background:var(--border-dim,var(--border))}
.tvtl-tick{position:absolute;top:58px;font-size:9.5px;color:var(--text-muted);transform:translateX(-50%);font-family:var(--font-mono,monospace)}
.tvtl-tickline{position:absolute;top:50px;width:1px;height:10px;background:var(--border-dim,var(--border))}
.tvtl-now{position:absolute;top:20px;bottom:12px;width:2px;background:var(--accent);border-radius:2px;z-index:1}
.tvtl-now:after{content:"NOW";position:absolute;top:-16px;left:50%;transform:translateX(-50%);font-size:8.5px;font-weight:800;letter-spacing:.06em;color:var(--accent)}
.tvtl-chip{position:absolute;top:26px;transform:translateX(-50%);display:flex;flex-direction:column;align-items:center;gap:3px;cursor:pointer;z-index:2}
.tvtl-chip .dot{width:13px;height:13px;border-radius:50%;border:2.5px solid var(--bg-surface,var(--bg-secondary));box-shadow:0 0 0 1.5px var(--border-dim,var(--border))}
.tvtl-chip.done .dot{background:var(--green,#2fa572);box-shadow:0 0 0 1.5px var(--green,#2fa572)}
.tvtl-chip.up .dot{background:var(--bg-surface,var(--bg-secondary));box-shadow:inset 0 0 0 3px var(--accent),0 0 0 1.5px var(--accent)}
.tvtl-chip.over .dot{background:var(--amber,#d97706);box-shadow:0 0 0 1.5px var(--amber,#d97706);animation:tvtlpulse 1.6s infinite}
@keyframes tvtlpulse{50%{box-shadow:0 0 0 5px rgba(217,119,6,.18)}}
.tvtl-chip .lbl{position:absolute;top:-22px;white-space:nowrap;font-family:var(--font-mono,monospace);font-size:9.5px;font-weight:700;padding:2px 7px;border-radius:6px}
.tvtl-chip.done .lbl{color:var(--green,#2fa572);background:rgba(47,165,114,.13)}
.tvtl-chip.up .lbl{color:var(--accent);background:var(--accent-bg)}
.tvtl-chip.over .lbl{color:var(--amber,#d97706);background:rgba(217,119,6,.14)}
.tvtl-chip .who{position:absolute;top:16px;font-size:9px;color:var(--text-muted);white-space:nowrap;max-width:110px;overflow:hidden;text-overflow:ellipsis}
.tvtl-ghost{position:absolute;top:31px;transform:translateX(-50%);width:7px;height:7px;border-radius:50%;border:1.5px dashed var(--text-muted);opacity:.65;cursor:pointer;z-index:2}
.tvtl-zones{display:flex;gap:10px;justify-content:flex-end;margin-top:2px;flex-wrap:wrap}
.tvtl-zone{font-size:10px;color:var(--text-muted);background:var(--bg-input,var(--bg-primary));border:1px dashed var(--border-dim,var(--border));border-radius:8px;padding:4px 10px}
.tvtl-zone b{color:var(--text-primary,inherit)}
.tvtl-pop{position:absolute;z-index:50;background:var(--bg-surface,var(--bg-secondary));border:1px solid var(--accent);border-radius:10px;padding:10px 12px;font-size:11.5px;max-width:320px;min-width:220px;box-shadow:0 10px 28px rgba(0,0,0,.22);line-height:1.45}
.tvtl-pop .pt{font-family:var(--font-mono,monospace);font-size:9.5px;font-weight:800;margin-bottom:4px}
.tvtl-pop .po{color:var(--text-muted);font-size:11px;max-height:90px;overflow:hidden;margin-bottom:8px;white-space:pre-wrap}
.tvtl-pop .pa{display:flex;gap:6px;flex-wrap:wrap}
.tv-cadrow{display:flex;gap:9px;font-size:11.5px;align-items:flex-start;padding:5px 0;border-bottom:1px solid var(--border-dim,var(--border))}
.tv-cadrow:last-child{border-bottom:0}
.tv-cadtime{flex:none;width:56px;font-family:var(--font-mono,monospace);font-size:10.5px;font-weight:700;color:var(--accent);background:var(--accent-bg);border-radius:6px;padding:2px 0;text-align:center}
.tv-cadtime.done{color:var(--green,#3da96f);background:rgba(61,169,111,.12)}
.tv-cadagent{font-weight:700;font-size:11.5px}
.tv-cadlabel{font-size:11px;color:var(--text-muted);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;line-height:1.4}
.tv-now{font-size:11.5px;color:var(--text-muted);background:var(--bg-input,var(--bg-primary));border:1px solid var(--border-dim,var(--border));border-radius:8px;padding:7px 9px;line-height:1.45}
.tv-acts{display:flex;gap:6px;margin-top:auto;flex-wrap:wrap}
.tv-badge{font-size:9px;font-weight:800;letter-spacing:.05em;border:1px solid var(--border-dim,var(--border));border-radius:999px;padding:2px 8px;color:var(--text-muted);white-space:nowrap}
.tv-badge.warn{border-color:var(--amber,#d97706);color:var(--amber,#d97706)}
.tv-badge.ok{border-color:var(--green,#3da96f);color:var(--green,#3da96f)}
.tv-tog{display:inline-flex;border:1px solid var(--border-dim,var(--border));border-radius:8px;overflow:hidden;margin-left:auto}
.tv-tog button{border:0;background:var(--bg-surface,var(--bg-secondary));color:var(--text-muted);font-size:11px;font-weight:700;padding:5px 12px;cursor:pointer}
.tv-tog button.on{background:var(--accent-bg);color:var(--accent)}
.tv-ev{display:grid;grid-template-columns:12px 1fr;gap:9px;padding:7px 0;border-bottom:1px solid var(--border-dim,var(--border));font-size:12px}
.tv-ev:last-child{border-bottom:0}
.tv-evn{width:7px;height:7px;border-radius:50%;background:var(--accent);margin-top:4px}
/* (FIX 3, 2026-07-30 — .tv-tmsg went with the retired Thread tab: the row
   builder it styled had that tab as its only caller. .tv-ev above is the rail's
   Last-24h row and is untouched.) */

/* ── FIX 4 (Ore 2026-07-30) — the ALL (org-wide) floor ─────────────────────
   REWORKED 2026-07-30 (Ore's screenshot report): ALL is the ORDINARY floor,
   amalgamated — the same .fl-cyc header over the same .fl-lanes three-column
   grid, rendered by the same lane builders. The old per-team accordion (its
   collapsible team header, its count span, its caret, its body and its domain
   sub-heading, plus every builder behind them) is DELETED: a second
   implementation of the floor is exactly what the report objected to. What
   survives here is chrome the floor has no equivalent of — the org note, the
   coverage marker, the team-grain ledger caption, and the narrative clamp. */
.al-narr{margin-bottom:12px}
.al-sub{font-size:9.5px;letter-spacing:.1em;text-transform:uppercase;font-weight:800;color:var(--text-muted);margin:10px 0 6px}
.al-open{font-size:10.5px;font-weight:700;color:var(--accent);text-decoration:none}
.al-note{font-size:11px;color:var(--text-muted);border:1px dashed var(--border-dim,var(--border));border-radius:9px;padding:8px 10px;margin:10px 0 14px}
.al-pend{font-size:9.5px;color:var(--amber,#d97706);font-style:italic}
/* FIX 2 — the in-lane TEAM signal, deliberately subordinate to the lanes: one
   caption on each team-grain ledger block (the ledger cannot be amalgamated —
   it is team-grain by construction), and the team's name prefixed onto the
   Completed lane's own section labels. Nothing structural: the three lanes stay
   the page's only top-level shape. */
.al-lgteam{font-family:var(--font-mono,monospace);font-size:9.5px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;color:var(--text-muted);margin:0 0 4px;display:flex;align-items:center;gap:6px}
/* FIX 3 — the ALL-TEAMS narrative clamp. HEIGHT DERIVATION: .fl-narr-b is
   11.5px at line-height 1.6 = 18.4px per rendered line, and the day-narrative
   prompt LOCKS a per-team section at 2–5 sentences — which is what the
   single-team floor renders unclamped. Six lines (110px) is that section's
   height, so the org narrative collapses to the same block the per-team one
   occupies instead of eating the page. The control below it is a real button,
   so the clamp never cuts silently. */
.al-narrb{max-height:110px;overflow:hidden}
.al-narrb.al-open-b{max-height:none;overflow:visible}
.al-narrmore{margin-top:6px;background:none;border:0;padding:0;cursor:pointer;font-family:inherit;font-size:10px;font-weight:800;letter-spacing:.06em;text-transform:uppercase;color:var(--accent)}
.al-narrmore:hover{text-decoration:underline}
