/* Votes -- the meeting workflow's "what was moved, and how did it go?" step.
 *
 * These rules lived as a JS string array inside mbMvCss() in app.js, injected into a
 * <style id="mbmv-css"> at runtime. Nothing could reach them: not a stylesheet, not
 * /design/, and not the design-system checks -- which is how 142 hardcoded colours and a
 * private 19-variable palette survived here while the rest of the repo moved onto tokens.
 * See issue 364. discussions.css is the same move, made first, for the sibling screen.
 *
 * Moved as-is: every rule was a plain string literal with no interpolation, so this is a
 * relocation rather than a rewrite. The palette block now points at --gv-* tokens instead
 * of repeating their values, using the mapping discussions.css already uses so the two
 * screens resolve identically. Most are exact renames; two neutrals resolve to SEMANTIC
 * roles rather than raw ramp steps, which moves them slightly -- both upward:
 *
 *   --mut  #6b7280 -> --gv-text-subtle    4.83:1 -> 5.16:1 on white
 *   --ink  #111827 -> --gv-text          17.74:1 -> 18.44:1
 *
 * Mapping --mut onto --gv-ink-500 instead would have dropped it to 4.39:1 and FAILED AA.
 *
 * --gdh (#0a5b42, one use, a hover green) has no token and stays a literal, as it does in
 * discussions.css. --viol was defined and never referenced; it is gone.
 *
 * THE VIOLET: the transcript quote under a motion was violet (--vio #5b21b6, a #fbfaff
 * tint, #3b2f63 text) -- and the design system carries no violet, because .gv-said, added
 * for this exact "what was said" job, deliberately uses a neutral rule instead. The move
 * resolved those colours to neutral roles rather than enshrining a rejected hue as a
 * token, keeping the block's own geometry. The rebuild that followed then replaced the
 * block outright: the screen renders .gv-said now, so the question is settled by the
 * component rather than by a recoloured copy of it, and the copy's rules are gone.
 */
.mbmv{--g:var(--gv-brand-700);--gd:var(--gv-brand-900);--gdh:#0a5b42;--gl:var(--gv-brand-50);--gb:var(--gv-brand-200);--ink:var(--gv-text);--ink2:var(--gv-ink-700);--mut:var(--gv-text-subtle);--mut2:var(--gv-text-disabled);--line:var(--gv-border);--am:var(--gv-gold-fg);--aml:var(--gv-gold-bg);--amb:var(--gv-gold-border);--rd:var(--gv-danger-fg);--rdl:var(--gv-danger-bg);--rdb:var(--gv-danger-border);color:var(--gv-text)}
.mbmv .tnum{font-variant-numeric:tabular-nums}
/* The toolbar rules that used to sit here (.mbmv-bar, .mbmv-btn and their states) are
 * gone: the bar is the shared workspace toolbar card now, and its buttons are gv-btn
 * variants, so Votes, Discussions and Speakers draw the same bar from one place.
 * That took 14 rules and the last of the near-black .mbmv-btn.ai treatment with it. */
/* Find motions keeps its width when its label changes to "Finding motions…" (#410). Both
 * labels sit in ONE grid cell, so the cell is as wide as the longer of them and the button
 * never resizes mid-run — a control that grows on its own press shoves Bulk Assign, Undo
 * and Reset along the toolbar at the moment the clerk is still looking at it.
 *
 * The hidden label is the width, so there is no measured px here to go stale: re-word
 * either string, change the font, zoom the page, and the button is still the right size. */
/* .mbmv-find__l / .mbmv-find__g moved to components.css (#448) as .gv-btn__swap and
 * .gv-btn__swap-ghost. The Document tab's AI buttons wanted the same label swap, and this
 * is the point at which it graduates rather than being copied under a second prefix. */
/* The one control the toolbar still styles itself: the button's name, inside the sentence
 * that tells an empty screen to press it (#410). It was <b class="font-semibold
 * text-gray-700"> — it looked like the thing to press, which was the point, and it was
 * also where the mouse went, which was the bug.
 *
 * So it has to keep looking like bold text in a sentence and start behaving like a
 * control: font:inherit keeps it at the slot's size, the weight and colour are what the
 * <b> resolved to, and the affordance is the underline rather than a colour, because
 * recolouring one word mid-sentence reads as a highlight, not as something to press.
 * --gd on hover is the colour this file already uses for an interactive hover. */
.mbmv-hint{border:0;background:transparent;padding:0;font:inherit;font-weight:600;color:var(--ink2);cursor:pointer;border-radius:3px}
.mbmv-hint:hover:not([disabled]){color:var(--gd);text-decoration:underline}
.mbmv-hint:focus-visible{outline:2px solid var(--g);outline-offset:2px}
.mbmv-hint[disabled]{color:var(--mut2);cursor:not-allowed;text-decoration:none}
/* The step is locked to one viewport: nothing scrolls except the agenda list and the
 * side panel, so the toolbar is never somewhere you have to go and find.
 *
 * The offset is the stage top (140px of app header + meeting header + tab strip) plus
 * main-content's own 24px bottom padding. It was 210px, which is 46px more than the
 * stage actually starts at, and left ~70px of dead white space under the screen at
 * every window height. That number predates this change -- it is byte-identical on
 * dev -- and most likely dates from the standalone Meeting Mode page (#268, deleted),
 * which had more chrome above the stage than the inline tab does. */
/* Down to the bottom edge. 164px is what sits ABOVE the stage -- 140px of app header,
 * meeting header and tab strip, plus the 24px top padding main-content carries app-wide
 * -- so the stage already ends level with the viewport. What left a strip of page under
 * a step that is otherwise viewport-locked was main-content's matching BOTTOM padding,
 * pushing 24px of nothing past the fold. The root pulls back over it: the one screen
 * that fills the window is the one that should not be inset by the page.
 *
 * BY ID, not by class (#466). `.mbmv` is two things in this app: the Motions screen's
 * root, and a PALETTE SCOPE that other surfaces wear to borrow the colour aliases these
 * rules resolve against -- the Document tab puts it on its side column to get .mbmv-pan
 * styled. So this negative margin, which is about where one whole SCREEN sits on the page,
 * was also landing on a column inside another screen and hanging it 24px below the stage.
 * Measured on /demo/minutes: stage bottom 946, side column bottom 970. Harmless-looking
 * while the columns were separately defined; an obviously uneven pair once they share a
 * stage. #mbmv-root is the screen, which is all this rule ever meant. */
#mbmv-root{margin-bottom:-24px}
/* The stage is .gv-stage in components.css now (#466), and it carries THIS file's
   numbers forward: the 164px offset measured above, and 520px min-height. What changed
   is the side column, from minmax(420px,36%) to the Document tab's
   clamp(260px,36%,420px) -- same proportion, same maximum, but it shrinks instead of
   refusing to. .mbmv-l/.mbmv-r are .gv-stage__main and .gv-stage__side. */
/* .mbmv-f, .mbmv-srch and .mbmv-more moved to components.css (#448) as .gv-filterbar,
 * .gv-filterbar__search and .gv-filterbar__more. The Document tab is the second surface
 * to draw this row; the local aliases it used (--line, --mut2, --ink, --ink2, --g) are
 * spelled as the tokens they aliased so the component stands outside .mbmv. */
/* The search box is sized to what it needs, not to whatever is spare (#401). It used to be
 * `flex:1 ... max-width:330px` — it GREW into every gap, and at 330px it left 585px of chips
 * and a 34px button fighting over what remained, so the chips wrapped two-and-two and the bar
 * became three lines deep.
 *
 * 160px is arithmetic, not taste. The button and the two gaps take 50, so the row holds while
 * `chips + 50 + 160` fits the bar — and the chips are NOT a fixed number, because the count
 * pills grow with their digits:
 *
 *     counts        chips    row holds down to
 *     6 6 0 0       519px    729px
 *     42 18 24 11   544px    754px
 *     100 42 58 11  550px    760px
 *
 * The last row is the busiest realistic meeting: a hundred motions, so All Motions carries
 * three digits and the rest two. That is the number 160 is sized for, not the prettiest one.
 *
 * WHY 160 AND NOT MORE. The left column is 771px at a 1280 viewport, which is the narrowest
 * laptop worth holding. 160 puts the busiest meeting at 760px and clears it; 170 lands on
 * 770 and clears it by a pixel, which is not a margin; 185 would give the widest field the
 * old threshold allowed and wrap at 1280 outright. Measured by bisecting the real bar, not
 * derived on paper — every row above was confirmed by rendering it.
 *
 * The cap was 120 while the chips read "Motions to Place"/"Motions Placed" and measured
 * 617px: that needed a 787px bar, so a hundred-motion meeting ALREADY wrapped at 1280. The
 * rename freed 67px and this spends 40 of it, leaving the row strictly safer than it was
 * and the field half again as wide — 118px of input where there were 78.
 *
 * RE-MEASURED for the Incomplete/Complete rename (#416), against the real chips and the real
 * stylesheets. The chips got SHORTER: "Motions to Place"/"Motions Placed" measured 617px at
 * a hundred motions and wanted a 787px bar, so the row is 67px safer than it was. Keeping the
 * nouns — "Incomplete Motions"/"Complete Motions" — measured 655px and wanted 825px, which
 * fits a 1440 laptop and misses a 1366 one by a pixel; the nouns were dropped for that, and
 * because beside "All Motions" they said nothing the chip did not.
 *
 * The left column is 873px at a 1440 viewport and 826px at 1366, measured from the real
 * .mbmv-stage grid, which is what these thresholds have to clear.
 *
 * THE BOX GROWS NOW, and the fixed cap is gone. A cap has to be sized for the NARROWEST
 * window anyone might use, so every wider one wore the same 118px field with a band of dead
 * space between the last chip and the ... button. The pair of rules below replaces it:
 *
 *   .gv-chips  flex:0 0 auto   the chips claim their max-content width and cannot shrink,
 *                              so nothing can starve them into wrapping two-and-two
 *   .mbmv-srch flex:1 1 120px  the search takes whatever is genuinely left over
 *
 * The 120px BASIS is the safety number, not max-width: flex line-breaking reads the basis
 * (see the note under .gv-chips), so the row holds while `chips + 120 + 50` fits the bar --
 * 720px at a hundred motions, where the 160px cap it replaces wrapped at 760px. max-width is
 * taste alone: 360px, past which a filter box on a list of motions is just a wide box.
 *
 * Measured, one line at a hundred motions: 318px of input at 1180, 231px at 873 (a 1440
 * laptop), 129px at 771 (a 1280 one), 78px at the 720px floor. The old cap gave 118px at
 * every one of them and wrapped below 760.
 *
 * And it fails better. Under the cap the chips split two-and-two and the bar went three deep;
 * here the chips stay one unbroken row and the search drops to a line of its own. */
/* The filter chips are GV.chips now (#398). Five rules stood here — .mbmv-chip, its .ct
 * count pill, the .on selected state and .warn.on — a third hand-rolled set of the one
 * control, which is how this tab ended up with no hover state at all and with "Motions
 * to Place" selected in the AI gold. The component carries all of it, including the
 * --gv-warning tone that matches the edge on the motions it filters to. */
/* The chips absorb the slack in this bar, so the ... button never gets pushed off it (#401).
 *
 * .mbmv-f wraps, and flex LINE-BREAKING uses each item's hypothetical main size — flex-basis
 * clamped by min/max, worked out BEFORE anything grows or shrinks. At `flex: 0 1 auto` the
 * chips box's basis is its max-content width (585px measured, four Motions chips), so
 * 190 search + 585 chips + 34 button + 16 gaps = 825px, and under that the button, last on
 * the line, wrapped — where its own margin-left:auto then parked it alone at the right edge.
 *
 * A ZERO basis was the fix WHILE THE SEARCH BOX WAS CAPPED: the chips claimed no width when
 * the line was measured, never forced the break, then grew into what was left and wrapped
 * their own chips instead. min-width:0 alone did NOT do it — it permits shrinking but leaves
 * the hypothetical size at max-content, and the button still wrapped below 860px.
 *
 * IT IS THE OPPOSITE NOW (#416), because the search box grows instead of being capped. With
 * a zero basis the chips would claim nothing, the search would take the whole bar, and the
 * chips would wrap two-and-two underneath it — the #402 bug, arrived at from the other side.
 * At `flex:0 0 auto` the chips take max-content and refuse to shrink, so the search can only
 * ever have what is genuinely spare, and its own 120px basis is what decides the break.
 *
 * Scoped to this bar on purpose: .gv-chips is the shared component Discussions and Speakers
 * draw too, and neither has a control after it to protect. */

/* Whole-tray actions, at the end of the filters. margin-left:auto pins it to the right
 * edge however many chips there are, and it stays quiet until hovered: it is not a
 * fifth filter, and nothing in it is part of reading the screen. */
/* THE MENU IS THE DESIGN SYSTEM'S NOW (#430). Fourteen rules stood here -- .mbmv-menu and
 * its item, hover, disabled, separator, danger and count-pill states -- a second menu
 * beside .gv-menu, which Discussions has drawn from since #379. Being outside the
 * component is what let them drift: the hover here was a brand-50 tint where every other
 * menu in the app uses the neutral --gv-surface-sunk, so the two screens answered the
 * same gesture in different colours.
 *
 * GV.menu.toggle owns the markup and the behaviour; .gv-menu and .gv-picker__opt own the
 * look. What this file keeps is the one thing genuinely local: how dense THIS screen's
 * agenda picker is (see #mbmv-item-picker below), which is a list of forty items rather
 * than a handful of verbs. */
/* The attendance drawer is gone (#381). Twenty-two rules stood here — .mbmv-pres and
 * its labels, the collapsed .mbmv-set summary strip and its drawer — for a control that
 * decided who could vote while living on the screen that only READS that field. It is a
 * checkbox on each board-member row on Speakers now, which is where a clerk works out
 * who was in the room. This screen still reads attendance; it just no longer writes it.
 *
 * .mbmv-pres label.out went with them, and deliberately: it struck the name through and
 * greyed the row, so an absent member looked like a DISABLED control. It never was one. */
.mbmv-scrim{position:fixed;inset:0;background:rgba(17,24,39,.45);display:flex;align-items:center;justify-content:center;padding:20px;z-index:1200}
.mbmv-dlg{background:#fff;border-radius:13px;width:min(560px,100%);max-height:88vh;display:flex;flex-direction:column;box-shadow:0 24px 60px -12px rgba(0,0,0,.4);overflow:hidden;color:var(--ink);text-align:left}
.mbmv-dlg .mbmv-grid{padding:0;overflow-y:auto;min-height:0}
.mbmv-dh{display:flex;align-items:flex-start;gap:12px;padding:16px 18px 12px;border-bottom:1px solid var(--line)}
.mbmv-dh h4{margin:0;font-size:16px;font-weight:600;letter-spacing:-.01em}
.mbmv-dh p{margin:4px 0 0;font-size:12.5px;color:var(--mut);line-height:1.5}
.mbmv-dx{margin-left:auto;border:0;background:transparent;color:var(--mut2);font-size:16px;cursor:pointer;line-height:1;padding:2px 4px}
.mbmv-dx:hover{color:var(--ink2)}
.mbmv-db{padding:14px 18px;display:flex;flex-direction:column;gap:0;min-height:0;overflow-y:auto}
.mbmv-dn{font-size:12.5px;color:var(--mut);background:#fafbfa;border:1px solid var(--line);border-radius:8px;padding:9px 11px;line-height:1.5}
.mbmv-dn b{color:var(--ink);font-weight:650}
.mbmv-df{display:flex;align-items:center;gap:9px;padding:13px 18px;border-top:1px solid var(--line);background:#fafbfa}
.mbmv-df .sp{margin-left:auto}
.mbmv-df .go{border:1px solid var(--gd);background:var(--gd);color:#fff;font-size:13px;font-weight:600;padding:8px 15px;border-radius:8px;cursor:pointer;font-family:inherit}
.mbmv-df .go:hover{background:var(--gdh)}
.mbmv-df .go[disabled]{opacity:.5;cursor:default}
.mbmv-df .cx{border:1px solid var(--line);background:#fff;color:var(--ink2);font-size:13px;font-weight:600;padding:8px 15px;border-radius:8px;cursor:pointer;font-family:inherit}
.mbmv-df .cx:hover{border-color:#d1d5db;background:#fafbfc}
/* The motion's own line in the card head: the play control, then the sentence. Without
 * this the <p> is a block and drops to the line below the control, which left the
 * timestamp stranded above the words it belongs to.
 *
 * align-items:flex-start: a wrapping sentence reads from the top, level with the
 * control and the heading beside it, rather than sinking half a line as it grows.
 * min-width:0 so it can wrap inside the flex row instead of forcing the head wider. */
/* One left edge for everything the band says. The motion's play control starts after
 * the heading, so its x depended on how wide the words "The motion" happened to be --
 * and the quote's play control below it started at the body edge instead, 130px to
 * the left. Two controls doing the same job, on two different lines.
 *
 * The label column is fixed instead, so the head's content and the body's content
 * start at the same place, and "The motion" and "The vote" line up with each other
 * as well. min-width rather than a hard width: a longer label grows past it visibly
 * instead of being truncated. */
/* The block's measurements, in one place.
 *
 * These were five numbers doing three jobs: the header sat 14px in from the block edge
 * and the body 10px, so the motion started further left than the label above it; the
 * vertical rhythm was 10, 12, 16 and 20 depending which rule you landed on. Naming them
 * is what makes "the same as the row above" checkable rather than remembered.
 *
 * --mbmv-pad-x is the block's own inset, and the card inside it adds the design
 * system's 16px of its own. That nesting is deliberate: the card is a bordered object
 * sitting inside the block, not the block itself. */
.mbmv{
    --mbmv-pad-x: 14px;      /* block edge to anything in it */
    --mbmv-pad-y: 12px;      /* the rhythm down a row */
    --mbmv-band-gap: 20px;   /* between The motion and The vote */
    --mbmv-label-w: 5.5rem;  /* the widest label's ink, so the gap after it IS the gap */
    --mbmv-label-gap: 6px;   /* label column to whatever the band puts beside it */
}
.mbmv .gv-card--band > .gv-card__head > .gv-card__title{flex:0 0 auto;min-width:var(--mbmv-label-w)}
.mbmv .gv-card--band > .gv-card__head{gap:var(--mbmv-label-gap)}
/* The .gv-said indent that sat here is gone (#406). It aligned the motion's quote with
 * the label column when the figure lived in the MOTION's body; the one figure this screen
 * still renders -- the announcement, above the roll call in the VOTE's body -- sits flush
 * with the grid it introduces, so the indent has nothing left to align. */
/* The band's head: play control + the motion's language beside the "The motion" label.
 * Both stages of a motion render this head now -- it is the shared component's face. */
.mbmv-lang-row{display:flex;align-items:flex-start;gap:var(--gv-space-2);flex:1;min-width:0}
/* Nudge the control onto the first line's optical centre. Top-aligned, an 18px control
 * in a 22.1px line sits 2px high -- its box lines up while the glyph does not. Derived
 * from the type tokens rather than pinned at 2px, so it follows the scale if the scale
 * moves: (line-height - control height) / 2. */
.mbmv-lang-row .gv-play{flex:0 0 auto;margin-top:calc((var(--gv-text-sm) * var(--gv-leading-relaxed) - 18px) / 2)}
/* ONE scroller in this panel, and it is .mbmv-ag. Everything the chips can show now
 * lives inside it, the tray included, so no section bounds itself.
 *
 * The tray used to be a sibling of the agenda, splitting a fixed-height stage and
 * taking whatever it wanted: five motions with one open onto its roll call came to
 * ~865px inside a 736px stage, leaving the agenda exactly ZERO pixels. Capping the tray
 * fixed that; moving it into the list made the cap unnecessary, which is better -- a
 * section that scrolls inside a scroller is how this screen ended up drawing three
 * scrollbars over one list of agenda items. */
/* No box at all. The tray is a section of the list, not a container sitting on top of
 * one: every motion in it is already a bordered card, so the amber outline framed
 * content that was framed, and the tint plus its heading restated the chip directly
 * above them ("Motions to Place 5"). What is left is the rows — plus, only in the view
 * that shows both kinds, a section label in the treatment the agenda already uses.
 * .mbmv-th went with the box. */
.mbmv-tray{margin-bottom:9px}
/* The .mbmv-uc rules that styled the unplaced-motion row are gone: each pending motion
 * is a gv-row now, so it opens onto the words that were actually said, how the vote
 * was announced and the model's own reason -- all of which were already on the object
 * and never rendered. */
.mbmv-tc{display:flex;flex-direction:column;gap:5px}

/* An unplaced motion is the same block as a placed one, with one switch. The left
 * edge says which: amber for work in progress, the ordinary item green once it is
 * filed. What this replaced was a separate .mbmv-pm layout for the tray -- a joined
 * label/select/button control above a bare band -- which is how the same record read
 * as two different objects depending which half of the screen it was in. */
/* --gv-warning, not --am. --am is the gold register, which in this system means AI --
 * the nib, Detect Speakers, Train VoicePrint -- and a motion that still owes a decision
 * has nothing to do with AI. This is the same orange .gv-row.is-flagged already uses for
 * "still owes an answer", so every in-progress mark in the app moves from one line in
 * tokens.css. The label takes the readable stop: --gv-warning is 2.1:1 on white, a
 * decoration weight, fine for a 3px edge and not for words. */
.mbmv-c.is-unplaced{border-left:3px solid var(--gv-warning)}
/* Place Motion sits beside the select rather than joined to it, because the row is a
 * line of parts (caret, label, select, time, + Motion) and not a segmented control.
 * The select gives up the width the button takes -- narrower when unplaced is the
 * price of the answer being one click away. */
/* Depth is DATA, not padding (#442). The block carries --gv-row-depth and the
 * stylesheet decides what a level is worth -- the same rule components.css applies
 * to .gv-row. It was a hand-computed padding-left that only ever ran on the
 * empty-row path, so a sub-item flattened against its parent the moment a motion
 * landed on it. */
.mbmv-i{margin-left:calc(var(--gv-row-depth, 0) * var(--gv-space-5))}
/* .mbmv-src and .mbmv-src__b are gone (#477). They drew the AI / Verbatim segmented pair
 * in each motion's action cluster -- which wording the motion used, the drafted line or
 * the words as they were said. The choice went with the chips: the transcript panel shows
 * the spoken words in context now, which is a better answer than swapping them into a band
 * sized for one sentence. See "how a motion reads" in app.js. */

/* Placed motions as a flat list: each one is a block naming its own item, so the
 * caption line that used to sit above a card is gone with the card's own picker. */

/* Ruled out, and reversible. Quiet: this list exists to be checked occasionally and to
 * undo a misclick, not to compete with the motions that are going in the minutes. */
.mbmv-gone__row{display:flex;align-items:center;gap:10px;border:1px solid var(--line);background:#fff;border-radius:9px;padding:8px 11px;margin-bottom:6px}
.mbmv-gone__row .at{flex:0 0 auto;font-size:11.5px;font-weight:600;color:var(--mut2)}
.mbmv-gone__row .tx{flex:1;min-width:0;font-size:12.5px;color:var(--mut);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* Which agenda item, asked on the row asking it: .mbmv-place wrapped the question,
 * .mbmv-pick was the <select>, .mbmv-placeq its label and .mbmv-why the reason under it.
 * All four are gone. The control is .gv-picker-trigger with .gv-picker's popover, styled
 * by the design system; the reason is the trigger's tooltip; the .mbmv-pbar bar that
 * narrated placing mode went with the mode. */
.mbmv-agw{position:relative;flex:1 1 auto;min-height:0;display:flex}
.mbmv-ag{overflow-y:auto;min-height:0;flex:1 1 auto;padding-right:8px;scrollbar-gutter:stable}
.mbmv-ag::-webkit-scrollbar{width:10px}
.mbmv-ag::-webkit-scrollbar-track{background:#f1f3f5;border-radius:8px}
.mbmv-ag::-webkit-scrollbar-thumb{background:#cbd5e1;border-radius:8px;border:2px solid #f1f3f5}
.mbmv-ag::-webkit-scrollbar-thumb:hover{background:#94a3b8}
/* The "scroll for more" fade is gone: a scrollbar already says a list scrolls, and
 * this one sat over the last row, which is the row it was pointing at. */
.mbmv-sec{font-size:10.5px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--mut2);margin:15px 0 7px;display:flex;align-items:center;gap:9px}
.mbmv-sec .l{flex:1;height:0;border-top:1px solid var(--line)}
.mbmv-i{border:1px solid var(--line);border-left:3px solid var(--gb);border-radius:10px;background:#fff;margin-bottom:10px;transition:.12s}
.mbmv-i.none{border-left:3px dashed #dfe3e6;background:#fbfcfd}
.mbmv-i.active{border-color:var(--gd);box-shadow:0 0 0 2px rgba(8,71,52,.10)}
.mbmv-ih{display:flex;align-items:center;gap:10px;padding:var(--mbmv-pad-y) var(--mbmv-pad-x)}
.mbmv-i.none .mbmv-ih{padding:8px var(--mbmv-pad-x)}
/* NO RESERVED COLUMN. The number and the title are one phrase -- "4.a Nesmith Excavating
 * contract" -- and the number starts at the block's own padding, the same x an unnumbered
 * heading's title starts at.
 *
 * Two goes at a column, both wrong, both measured:
 *   34px left-aligned  38px between "1" and its title, 19px after "10.b" -- too much, and
 *                      a different amount per row. It aligned the TITLES by pushing the
 *                      numbers away from them.
 *   1.5rem right       constant 6px to the title and the titles in line, but a one-digit
 *                      number then sits 17px in from the card's edge, with the reserved
 *                      space now sitting to its LEFT. The gap moved; it did not go.
 *
 * So the column goes. The number is as wide as its digits, 6px from its title, and 14px
 * from the card edge -- which is the padding every other row starts at. Titles are
 * strictly aligned only among numbers of equal width, which is what an agenda level
 * actually contains: 1-9 at one level reads flush, and a 9/10 boundary shifts by a digit.
 * That is the price, and it is smaller than either column's.
 *
 * The -4px is against .mbmv-ih's 10px flex gap. Pulling the pair together is what a gap on
 * the ROW cannot express: the number belongs to the title, not to the row's run of
 * controls, and the play chip and + Motion still want their 10px. */
.mbmv-ih .num{font-size:12px;font-weight:800;color:var(--gd);min-width:0;margin-right:-4px;flex:0 0 auto;font-variant-numeric:tabular-nums}
/* A top-level row draws no number (mbMvItemNum), and an empty 34px column plus the row's
 * 10px gap left 44px of nothing in front of every heading on the screen. The column is not
 * what aligns a heading with its sub-items -- the sub-item's whole block is indented by
 * --gv-row-depth -- so reserving it bought nothing and cost the title its left edge.
 * display:none rather than a zero width: the row is a flex line, and a zero-width child
 * still takes its gap. */
.mbmv-ih .num:empty{display:none}
.mbmv-i.none .mbmv-ih .num{color:var(--mut2)}
.mbmv-ih .ttl{flex:1;min-width:0;font-size:13.5px;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* An item carrying motions names itself with a control instead of static text: the label
 * beside the caret, the select where the number and title were, the time range and
 * + Motion still hard right. One line, the same order the row always read in. */
/* The same ink as "The motion" and "The vote" -- the three read as one set of
 * headings down the block, and a muted label made this one look like a caption for
 * the others rather than a heading of its own. */
/* One width at both stages. Growing to fill left them different: a placed motion's
 * header carries the time range and + Motion beside the picker and an unplaced one
 * carries Place Motion, so "the rest of the row" is a different amount of room and
 * the same control came out two sizes. A basis rather than a fixed width, so it
 * still gives way on a narrow window instead of pushing the row wider. */
.mbmv-ih__pick{flex:0 1 auto;min-width:0;border:1px solid var(--line);border-radius:7px;background:#fff;color:var(--ink);font:inherit;font-size:13px;padding:4px 8px;cursor:pointer}
.mbmv-ih__pick:hover{border-color:var(--gb)}
.mbmv-ih__pick:focus-visible{outline:2px solid var(--g);outline-offset:1px}
.mbmv-i.none .mbmv-ih .ttl{font-size:12.5px;color:var(--mut)}
/* The header ROW is not a control any more (#406) — the fold moved onto each motion's own
 * "The vote", so this row names the item and files motions elsewhere, nothing more. Its
 * caret, its cursor:pointer and its hover all went with the click. The row keeps that;
 * what came back in #477 is a control INSIDE it, below, with its own affordance. */
.mbmv-ih{cursor:default}
/* The number and title, as one press: show the transcript from where this item came up
 * (#477). It has to be a <button> to reach the keyboard, and it has to not LOOK like one --
 * this is the item's name, in a list of item names, and a bordered control around every
 * one of them would read as a row of buttons rather than as the agenda.
 *
 * So: no chrome, inherit the type, and take over the flex line the two spans used to hold
 * between them -- the same 10px gap the row sets, so .num's -4px pull still lands where it
 * was measured. The hover tint is the whole affordance, and it is the one .mbmv-ap already
 * uses over in the panel, because these two rows are the same row in two places.
 *
 * text-align:left because a button centres its text; min-width:0 so .ttl's ellipsis still
 * has something to overflow against. */
.mbmv-ih__go{display:flex;align-items:center;gap:10px;flex:1;min-width:0;border:0;background:transparent;font:inherit;color:inherit;text-align:left;padding:4px 6px;margin:-4px -6px;border-radius:7px;cursor:pointer}
.mbmv-ih__go:hover{background:#f7f9fa}
.mbmv-ih__go:focus-visible{outline:2px solid var(--g);outline-offset:-2px}

/* ── The fold, on The vote ────────────────────────────────────────────────────
 * The whole head is the control: the caret marks it, and pressing anywhere along the row
 * opens the motion. A caret alone is a 12px target next to a heading a clerk is already
 * reading, and the row was where they were pointing anyway.
 *
 * --gv-surface-sunk is the app's hover ground, the same step .gv-picker's options take.
 * A tint rather than a border move: the motion already draws borders that carry meaning,
 * and a third border state competes with them. */
.mbmv .gv-card__head.mbmv-fold{cursor:pointer;border-radius:var(--gv-radius-sm)}
.mbmv .gv-card__head.mbmv-fold:hover{background:var(--gv-surface-sunk)}
/* The nested head sits flush to the body's content box, so a tint drawn on it stops dead
 * at the first and last character. Padded out and pulled back by the same 8px, which
 * gives the highlight room either side of the text without moving the text itself. Half
 * the body's own 16px inset, not all of it: the tint is a hover state on a row inside the
 * motion, and running it clean out to the card's edges would read as a band across the
 * whole record rather than as one pressable line in it. */
.mbmv .gv-card--nested > .gv-card__head.mbmv-fold{
    padding-left:var(--gv-space-2);padding-right:var(--gv-space-2);
    margin-left:calc(var(--gv-space-2) * -1);margin-right:calc(var(--gv-space-2) * -1)}
/* The caret is a real <button> (see mbMvBandHtml) — it carries aria-expanded and takes
 * focus, which a bare <i> could do neither of. Everything a button brings with it is given
 * up here so it sits in the head as a 12px glyph and nothing re-spaces around it.
 *
 * At --mut2 and 10px this was a decoration beside the words it opens; --gv-text-muted is
 * the readable stop, and 700 gives the glyph enough body to register as a control. */
.mbmv .ichev{flex:0 0 auto;width:12px;transition:transform .15s}
.mbmv button.ichev{display:inline-flex;align-items:center;justify-content:center;
    padding:0;border:0;background:none;font:inherit;font-size:11px;font-weight:700;
    line-height:1;color:var(--gv-text-muted);cursor:pointer}
.mbmv button.ichev:hover{color:var(--gv-brand-fg)}
.mbmv button.ichev:focus-visible{outline:var(--gv-focus-width) solid var(--gv-focus-color);
    outline-offset:var(--gv-focus-offset);border-radius:var(--gv-radius-sm)}
/* Pointing down when the grid below it is showing. The vote band carries its own state
 * now, so the rule reads straight off it -- no walking up to a parent, and no chance of
 * the caret reporting one thing while the body does another.
 *
 * (It briefly keyed off `.gv-card--band:not(.shut)`, which also matched the vote band
 * itself -- the band that never carried the class -- so every caret on the screen pointed
 * down whatever its motion was doing. Measured: rotate(90deg) on all five in the harness.
 * Keying off the element that actually holds the state is what makes that unrepeatable.) */
.mbmv .gv-card--nested:not(.is-shut) .ichev{transform:rotate(90deg)}
/* Collapsed, only the GRID hides. "The vote" heading, the outcome badge beside it, the
 * motion's language above and the announcement figure all stay -- see mbMvBandHtml. A
 * stack of rules used to sit here unpicking a fold that took the whole motion: everything
 * in the motion's body except the nested band, then the nested band's own body, then the
 * padding each left behind, then two borders and two head paddings. All of it is gone.
 * .gv-card--band.is-shut and .gv-card__body[hidden] are the design system's own shut-band
 * convention, and they carry the whole state -- so this file styles no fold at all. */
/* 20px between the two bands, and the same in both fold states -- the vote's body is what
 * hides, so the band and everything above it never re-space. .gv-card--nested carries
 * 16px from the design system; this is that, tuned. Scoped to .mbmv: one caller. */
.mbmv .gv-card--nested{margin-top:var(--mbmv-band-gap)}
/* ...unless there is nothing above it to be separated FROM. The gap exists to stand the
 * vote off the quote; a motion entered by hand has no quote, so the band was the first
 * thing in the body and its margin stacked on the body's own padding -- 37px of empty
 * between the motion and the vote, on the card where the two are all there is.
 *
 * And its border with it. That border separates the vote from what sits above it;
 * with nothing above, the motion head's own bottom rule is already that line, and the
 * two drew together -- touching when collapsed, 16px apart when open. */
.mbmv .gv-card__body > .gv-card--nested:first-child{margin-top:0;border-top:0}
/* A head's bottom rule separates it from its body, and with the grid hidden it would draw
 * a line across the bottom of the card. .gv-card--band.is-shut in components.css already
 * drops it, for exactly that reason -- nothing needed here.
 *
 * And the 20px gap and the vote's top border both STAY when the grid is hidden. That is
 * the point of folding only the roll call: the quote is still sitting above the band, so
 * the gap is still standing The vote off it and the border is still the line between the
 * two. Nothing re-spaces as the grid opens. The collapsed-only overrides that used to live
 * here -- a zeroed gap, a dropped border, halved head paddings -- were all undoing a fold
 * that hid the quote as well. */
/* .mbmv-ih .win drew the item's discussion window -- a play control and a timestamp
 * range, hard right on every row. Gone (#442): it cued a question the Discussions step
 * is built to answer, on a list whose subject is motions, and every motion under the row
 * already carries its own play cued to the moment the motion was made. The title now
 * takes the slack the chip's margin-left:auto used to hold open. */
/* Position only. The appearance is .gv-btn--secondary's now -- this was a bespoke
 * button with its own border, weight and padding, sitting beside real ones. */
.mbmv-ih .addm{flex:0 0 auto;white-space:nowrap}
.mbmv-ms{padding:0 var(--mbmv-pad-x) var(--mbmv-pad-x);position:relative}
.mbmv-ms:empty{display:none}
/* A motion that still owes an answer wears the orange in-progress edge -- the same mark
 * .mbmv-i.unplaced and .gv-row.is-flagged use, and it now means the same thing they do,
 * because being unplaced is one of the ways a motion is unfinished. On the block's edge
 * always, and on the card's own edge too, so on an item holding several motions the one
 * owing the answer is the one marked. Every card keeps its box now, including the only one
 * on its item, so there is no case where the block edge has to carry this alone.
 * This replaced .mbmv-note, a caption above the grid ("Mark the roll call...") that was
 * only readable once the motion was already open -- an edge reads from the list.
 * Was .needs-roll (#406). Renamed with the predicate it renders (#416): the mark covers
 * a motion with no result and a half-finished roll call now, and "needs a roll call" is
 * not what either of those is. The class name is the only documentation at this end. */
.mbmv-i.incomplete{border-left-color:var(--gv-warning)}
.mbmv-c.incomplete{border-left:3px solid var(--gv-warning)}

/* THE ASK, on the row it is asking about (#442).
 *
 * An unplaced motion used to be its own block in a strip above the agenda, carrying its
 * own copy of the item picker -- so the one question it asks was asked as far from the
 * agenda as the screen allowed. It renders inside its candidate item now, and this strip
 * is the question: the drafter's reason, Place here, and the way to choose otherwise.
 *
 * --gv-warning-bg/-border/-fg, the treatment .mbmv-recon.is-conflict already uses for
 * "a clerk has to decide something before this motion is finished". The nib inside it is
 * gold, which is what AI claims in this system -- who suggested the item is a different
 * fact from an answer being owed, and they get different registers. */
.mbmv-c__ask{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
    padding:7px var(--mbmv-pad-x);background:var(--gv-warning-bg);
    border-bottom:1px solid var(--gv-warning-border)}
.mbmv-c__askw{flex:1 1 12rem;min-width:0;font-size:11.5px;line-height:1.45;color:var(--gv-warning-fg)}
/* .mbmv-conf drew the drafter's 0-100 placement score beside the picker. It is off the
 * strip by decision (#442) -- the strip asks one question, and a percentage next to the
 * answer is a second thing to weigh on a row whose job is to be pressed or corrected. The
 * number is still on the record, so bringing it back is a render, not a migration. */
/* The picker takes the room the prose had: it is the answer AND the control that changes
 * it, so it leads the strip rather than following a sentence describing it. Wide enough to
 * read an item's name, and it gives way first when the row is narrow -- the label, the
 * percentage and the button beside it are all fixed-size and cannot. */
.mbmv-c__ask .mbmv-ih__pick{flex:1 1 10rem;min-width:0}
/* What the control holds. The same words the item header used to carry, where they stood
 * in place of a title the row should have spoken for itself; here they label a question
 * that is actually being asked, so they earn the room. Quiet and fixed-width: it is a
 * caption for the control, not a thing to read on the way past. */
.mbmv-c__asklbl{flex:0 0 auto;font-size:11px;font-weight:600;letter-spacing:.02em;
    color:var(--gv-warning-fg);white-space:nowrap}
/* The button's class and handler deliberately do NOT reuse the names the deleted placing
 * mode used -- check-votes-css.js asserts those stay gone, and it reads this file, so
 * naming them here would fail the check this comment exists to explain. The words on the
 * button are the product decision; the old names are history and stay history. */
.mbmv-ask__go{flex:0 0 auto;white-space:nowrap}

/* The picker when it is a control among others rather than the row's own name: it says
 * what it DOES instead of what is chosen, so it takes only the width of its words. */
.mbmv-ih__pick--compact{flex:0 0 auto;font-size:11.5px;padding:3px 8px}
/* A trigger that holds state and draws nothing. The `hidden` ATTRIBUTE alone does not do
 * it: the UA sheet's [hidden]{display:none} is beaten by .gv-picker-trigger's own display,
 * so the control rendered in full -- measured 112.86x27, and the motion's action cluster
 * came out with four visible controls instead of two. Author-level rule, so it wins.
 *
 * It exists because the motion card's ⋯ menu opens the SAME popover the ask strip does,
 * and that popover reads its state (data-at, data-commit) off a trigger by id. The
 * alternative was a second copy of the popover path, and two copies drift. */
.mbmv .gv-picker-trigger[hidden]{display:none}
/* The agenda picker's own density. .gv-picker__opt is the design system's, and it is
 * shared with GV.menu -- the Speakers actions menu and the /design/ pages draw from the
 * same rule -- so this is scoped to THIS popover rather than tightened at the source.
 *
 * A menu holds a handful of verbs and can afford 4px above and below each. This list is
 * the whole agenda: forty single-line items a clerk scans for one title, where the space
 * between rows is what they are scrolling PAST. 2px, and the list's own end padding with
 * it. Nothing about the option's height changes -- the text and the tick still sit where
 * they did, there is simply less air between them. */
#mbmv-item-picker .gv-picker__list{padding:2px 0}
#mbmv-item-picker .gv-picker__opt{padding-top:2px;padding-bottom:2px}
/* The announcement reconciled against the names under it (#418) -- "Still to place: 3 Aye,
 * 1 Abstain", or the contradiction and its two ways out. Sits under the roll call, after
 * .gv-quick.
 *
 * --gv-warning-fg, not --gv-warning: this line is WORDS, and the solid mid stop is 2.1:1
 * on white -- a decoration weight, correct for the 3px edge above and unreadable as text.
 * The rule at the top of this file applies unchanged: amber is "still owes an answer",
 * gold (--am) is the AI register, and although the tally came from the AI this is the
 * clerk's outstanding work, not a machine's suggestion. No gold here.
 *
 * At rest it is a quiet line -- most motions are mid-attribution and a tinted box on every
 * one of them would be noise. The conflict earns the box, because it is the state where
 * the clerk has to decide something before the motion can be finished. */
.mbmv-recon{margin:0;font-size:12px;line-height:1.5;color:var(--gv-warning-fg)}
/* Carries .gv-quick's own vertical rhythm, because in this state it IS .gv-quick -- the
 * contradiction replaces the shortcut row rather than stacking under it, so the table must
 * not butt against it any more than it did against the buttons. */
.mbmv-recon.is-conflict{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;
    gap:var(--gv-space-2);margin:var(--gv-space-3) 0;padding:8px 10px;
    border:1px solid var(--gv-warning-border);
    border-radius:var(--gv-radius-md);background:var(--gv-warning-bg)}
/* Under the Vote column head, naming the column the contradiction is in. Inherits the
 * head's centring; everything else about a <th> -- the caps, the tracking, the weight --
 * has to be undone, because this is a reading, not a label. */
.mbmv-colmark{display:block;margin-top:2px;font-size:10px;font-weight:400;letter-spacing:0;
    text-transform:none;color:var(--gv-warning-fg)}
.mbmv-recon__say{flex:1 1 240px;min-width:0}
/* The pair stays together when the sentence wraps above it: two buttons that are each
 * other's alternative must not end up on separate lines with the words between them. */
.mbmv-recon__act{display:flex;gap:var(--gv-space-2);flex:0 0 auto}
.mbmv-c{border:1px solid var(--line);border-radius:9px;background:#fff;margin-bottom:6px;overflow:hidden;position:relative}
/* One motion on the item, one box. The block is already a bordered, rounded object;
 * a second one inside it, in the same colour 15px away, reads as a separate thing
 * rather than as the contents of the first -- the same argument .gv-card--nested
 * makes in components.css, where a band gives up its box for exactly this reason.
 * Two or more and each keeps its own, because then the box is what says where one
 * motion ends and the next begins. */
/* TWO LEVELS OF BOX, NEVER THREE. A motion was drawn inside three nested outlines -- the
 * item block, the motion's own card, and the band's -- because .gv-card carries a border
 * and .gv-card--band keeps it. Measured: an item with two motions drew all three around
 * each of them, and so did an unplaced motion, whose card is never a lone child in the
 * sense the rule below means.
 *
 * The band gives up its box. It is the innermost of the three and the one that says least:
 * the card already delimits the motion, and "The motion" / "The vote" are labelled by
 * their own headings. The nested vote band keeps its border-top, which is the line between
 * the two, and is the separation the outline was doing badly. */
.mbmv-c > .gv-card--band{border:0;border-radius:0;box-shadow:none}
/* ...and EVERY motion keeps its own box, including the only one on its item. A :only-child
 * rule used to strip it, on the reasoning that the block already draws an outline and a
 * second one 15px inside it reads as a separate thing. That reasoning held while the BAND
 * still drew a box -- the lone motion kept an outline either way, just the band's. With the
 * band's box gone the strip left a single motion with no outline at all: a heading, a rule,
 * and text running to the block's edge, while the same motion on an item with two of them
 * sat in a card. One motion should not be drawn differently from two.
 *
 * So: two levels, always. The item block, and a card per motion -- which is also what
 * carries the amber left edge for an unplaced motion or one still owing a roll call,
 * without a second rule to restore it. */
.mbmv-c:last-child{margin-bottom:0}
.mbmv-ch{display:flex;align-items:center;gap:11px;padding:9px 11px;cursor:pointer;background:#fcfdfe}
.mbmv-ch .grip{color:#cbd5e1;font-size:10px;flex:0 0 auto;cursor:grab}
/* .mbmv-grip and the five rules under it are gone with the drag they dressed (#447):
 * the handle itself, its :active grabbing cursor, its lift to the ink colour on the card's
 * hover, and .mbmv-c.dragging / .dropbefore / .dropafter, which were the moving card and
 * the line showing where it would land. The handle was drawn on every placed motion,
 * including the many items holding exactly one, and a drag has no keyboard route at all --
 * the note that used to sit here said as much and called it a limit. Reordering is Move up
 * / Move down in the motion's own ⋯ menu now, which is a real control and reachable from
 * the keyboard, so there is nothing left for these to style. */
@keyframes mbmvIn{from{opacity:0;transform:translateY(-6px);max-height:0}to{opacity:1;transform:none;max-height:1400px}}
.mbmv-c.fresh{animation:mbmvIn .32s cubic-bezier(.22,1,.36,1) both;overflow:hidden}
/* .mbmv-ms.dropinto is gone with the drop it marked: dragging a motion ONTO another item
 * re-filed it, silently, in the record the minutes are built from. The item picker on the
 * block header is how a motion changes items -- it names both, and it cannot happen by
 * accident (#416). */
.mbmv-ch:hover{background:#f7f9fa}
.mbmv-ch .at{font-size:11px;font-weight:700;color:var(--mut);flex:0 0 auto;font-variant-numeric:tabular-nums}
.mbmv-ch button.at{display:inline-flex;align-items:center;gap:5px;border:1px solid var(--line);background:#fff;border-radius:6px;padding:3px 8px;cursor:pointer;transition:.12s}
.mbmv-ch button.at i{font-size:8px;color:var(--gd)}
.mbmv-ch button.at:hover{border-color:var(--gd);background:var(--gd);color:#fff}
.mbmv-ch button.at:hover i{color:#fff}
.mbmv-ch .gist{flex:1;min-width:0;font-size:12.5px;color:var(--ink2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mbmv-ch .gist.empty{color:var(--mut2);font-style:italic}
.mbmv-ch .chev{flex:0 0 auto;color:var(--mut2);font-size:10px;transition:transform .15s}
.mbmv-c.open .mbmv-ch .chev{transform:rotate(90deg)}
.mbmv-c.open .mbmv-ch{border-bottom:1px solid var(--line)}
/* .mbmv-band and its h5 drew "The motion" and "The vote" here. Both are .gv-card--band
 * now, from components.css, which is the point of the move -- and .mbmv-miss, the "no
 * mover / 2nd" flag on the head row, went with the head row: the roll call directly below
 * shows who is marked better than a badge saying somebody is not. */
.mbmv-p{flex:0 0 auto;font-size:10.5px;font-weight:700;padding:2px 8px;border-radius:20px;border:1px solid;white-space:nowrap}
.mbmv-p.carried{color:#166534;background:#f2fbf4;border-color:#bbe3c2}
.mbmv-p.failed{color:#991b1b;background:var(--rdl);border-color:var(--rdb)}
.mbmv-p.tabled{color:var(--am);background:var(--aml);border-color:var(--amb)}
.mbmv-p.blank{color:var(--mut2);background:#f4f6f7;border-color:var(--line)}
.mbmv-p.sm{display:inline-flex;align-items:center;gap:5px;min-width:56px;justify-content:center;font-variant-numeric:tabular-nums;padding:3px 9px}
.mbmv-p.sm i{font-size:9px}
.mbmv-p.sm.blank{min-width:36px}
.mbmv-b{display:none;padding:10px}
.mbmv-c.open .mbmv-b{display:block}
/* Gone with the card they were part of: .mbmv-tx (the always-open textarea, now
 * .gv-textarea and only while editing), the quote block (now .gv-said --
 * which is where the violet this file set out to resolve actually went), .mbmv-fld and
 * .mbmv-sel (a labelled row and its <select>, now the picker in the block head), and
 * .mbmv-vb / .mbmv-vh / .mbmv-sw (the vote box, its header and the roll/voice switch,
 * now one .gv-card--band with the table inside it). */
.mbmv-grid{padding:7px 10px 9px;display:flex;flex-direction:column;gap:4px}
/* The Bulk Assign dialog renders mbMvVoteBlockHtml itself -- the same table, the same
 * .gv-picks / .gv-pick controls, the same quick-set row -- so there is nothing left here
 * to style it with. What stood here was that table drawn a second time: its own rows, its
 * own quick-set strip above the names, and its own violet, green and red, hardcoded. */
.mbmv-tb{padding:9px 10px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
/* .mbmv-step (the +/- tally stepper) and .mbmv-res (the result strip along the bottom
 * of an open card) are gone too. Nothing steps a tally by hand any more -- the roll
 * call counts itself -- and the result is stated once, in The vote band header. */
/* The video box is .gv-stage__vid and its empty state .gv-stage__noplay (#466); this
   file's 32vh cap is the one the shared box took. */
.mbmv-clock{font-size:11.5px;color:var(--mut2);margin-left:4px;white-space:nowrap;font-variant-numeric:tabular-nums}
/* The .mbmv-tr / .mbmv-tbn transport is gone: this screen draws the design system's
 * .gv-transport now, the same one Discussions and Speakers use. It was the third
 * implementation of one control, and the only one still filling its play button. */
.mbmv-pan{border:1px solid var(--line);border-radius:12px;background:#fff;overflow:hidden;display:flex;flex-direction:column;flex:1 1 auto;min-height:170px}
/* Inside a stage's side column, wherever that column belongs. FOUR steps draw this panel
   without owning it -- Recording, Speakers and the Document tab all render
   mbStagePanelHtml -- and in a viewport-locked column the 170px floor above is the wrong
   answer: it stops the panel shrinking, so the column runs past the bottom of the stage
   and .gv-stage__side clips whatever did not fit. min-height:0 lets it give way, and the
   body scrolls its own content instead. These were #mbdoc-below .mbmv-pan/.mbmv-pb in
   document.css, which only ever matched one of the four (#466). */
.gv-stage__side .mbmv-pan{min-height:0}
.gv-stage__side .mbmv-pb{flex:1 1 auto;min-height:0;overflow-y:auto}
.mbmv-ph{padding:8px 10px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:10px;font-size:12px;font-weight:600;color:var(--ink2)}
.mbmv-ph .s{font-size:11px;color:var(--mut2);margin-left:auto;font-weight:500}
.mbmv-pb{overflow-y:auto;flex:1;padding:6px 5px 18px}
.mbmv-ln{display:flex;gap:10px;padding:7px 10px;border-radius:7px;cursor:pointer}
.mbmv-ln:hover{background:#f7f9fa}
.mbmv-ln.cur{background:var(--gl);box-shadow:inset 2px 0 0 var(--gd)}
.mbmv-ln .m{flex:0 0 auto;width:72px}
.mbmv-ln .sp{font-size:10.5px;font-weight:700;color:var(--ink2);display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mbmv-ln .tm{font-size:9.5px;color:var(--mut2);display:block;margin-top:2px;font-variant-numeric:tabular-nums}
.mbmv-ln .t{font-size:12.5px;color:var(--ink2);line-height:1.55;flex:1;min-width:0}
.mbmv-flip{display:inline-flex;background:#f1f3f5;border-radius:9px;padding:3px;gap:2px}
.mbmv-flip button{border:0;background:transparent;color:var(--mut);font-size:12px;font-weight:600;padding:5px 12px;border-radius:7px;cursor:pointer;display:inline-flex;align-items:center;gap:6px}
.mbmv-flip button i{font-size:10px;opacity:.75}
.mbmv-flip button.on{background:#fff;color:var(--gd);box-shadow:0 1px 2px rgba(15,23,42,.10)}
.mbmv-ap{display:flex;align-items:center;gap:10px;padding:8px 11px;border-radius:7px;cursor:pointer;min-width:0}
.mbmv-ap:hover{background:#f7f9fa}
.mbmv-ap .t{flex:1;min-width:0;font-size:12.5px;color:var(--ink2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.mbmv-ap .w{flex:0 0 auto;font-size:11px;color:var(--mut2);font-variant-numeric:tabular-nums}
.mbmv-ap .b{flex:0 0 auto;font-size:10px;font-weight:700;padding:1px 6px;border-radius:20px;color:var(--gd);background:var(--gl)}
.mbmv-ap.go{cursor:pointer}
.mbmv-ap.off .t{color:var(--mut2);text-decoration:line-through;text-decoration-color:#d1d5db}
.mbmv-aphead{font-size:10px;font-weight:800;letter-spacing:.09em;text-transform:uppercase;color:var(--mut2);padding:12px 11px 4px}
.mbmv-ln mark{background:#fef08a;border-radius:2px;padding:0 1px}
.mbmv-mk{display:flex;align-items:center;gap:9px;padding:10px 12px 6px}
.mbmv-mk .l{flex:1;height:0;border-top:1.5px dashed var(--gb)}
.mbmv-mk .cp{font-size:9.5px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--gd);background:var(--gl);border:1px solid var(--gb);padding:3px 8px;border-radius:5px;white-space:nowrap;cursor:pointer}
.mbmv-mk.am .l{border-color:var(--amb)}
.mbmv-mk.am .cp{color:var(--am);background:var(--aml);border-color:var(--amb)}
.mbmv-empty{padding:26px 14px;text-align:center;color:var(--mut2);font-size:12.5px}
/* Stacking is .gv-stage's now, and 1180 -- this screen's number -- is the one all five
   steps share (#466). The panel's floor below that width stays here; it is this panel's
   business, not the stage's. */
@media(max-width:1180px){.mbmv-pan{min-height:300px}}
