/* 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. */
/* 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 sat ABOVE the stage -- 140px of app header,
 * meeting header and tab strip, plus the 24px top padding main-content carries app-wide
 * (113px since #603 moved the tabs beside the title; the value lives in components.css)
 * -- 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. */
/* ONE PANEL FROM THE TAB STRIP DOWN (Dom, 2026-09-22), the shape Speakers took first.
   The filter row was a band with no left or right edge and the agenda was a column of
   cards on the page background; they are the two halves of one object now.

   A flex COLUMN that gives the whole of its remaining height to .mbmv-agw, so the band
   stays and the list scrolls — which is what makes the filter row fixed here without the
   position:sticky Speakers needed. No overflow:hidden: the row menus open past the panel's
   edge, and the top corners are squared by .mw-dock rather than clipped. */
.mbmv-panel{
    display:flex; flex-direction:column; flex:1 1 auto; min-height:0;
    background:var(--gv-surface);
    border:var(--gv-border-width) solid var(--gv-border);
    border-radius:var(--gv-radius-lg);
}
/* The band reaches the panel's edges; the list below carries the inset instead. */
.mbmv-panel > .gv-filterbar{flex:0 0 auto}
.mbmv-panel > .mbmv-agw{padding:0 0 0 var(--gv-space-4)}

.mbmv-agw{position:relative;flex:1 1 auto;min-height:0;display:flex}
/* padding-top is the 8px .gv-filterbar used to keep under itself, moved inside the scroller
   so a scrolled list runs right up to the filter row (#603). */
.mbmv-ag{overflow-y:auto;min-height:0;flex:1 1 auto;padding-right:var(--gv-space-4);padding-top:var(--gv-space-2);scrollbar-gutter:stable}
/* Its scrollbar is the shared .gv-scroll (components.css): thin and always visible, at the panel's
   right edge -- the list carries the inset on the right now, not the wrapper around it. */
/* 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)}
/* THE SAME ROW SPEAKERS DRAWS (Dom, 2026-09-22). These were a bespoke card — a literal
   10px radius, --line for the border, a margin between them and a DASHED left edge on an
   item carrying no motion. Against a voice row on Speakers they read as a different kind
   of object, which on two steps of one workflow is a difference that means nothing.

   So the tokens come from .gv-row: the same border, the same radius, the same hover. What
   is kept is this screen's own left edge, because here it carries state — green filed,
   amber still owed — which a voice row says with the same 3px in the same place.

   The broken edge goes from HERE. It used to mean "nothing here yet", but every agenda
   item starts that way and most stay that way, so the usual state of the list was drawn as
   an exception; and an unassigned voice on Speakers is a solid row with a coloured edge,
   not a sketch. A quiet neutral edge says the same thing without the list looking
   unfinished. The broken edge moved to the state that IS exceptional — .is-nd below. */
.mbmv-i{
    border:var(--gv-border-width) solid var(--gv-border);
    border-left:3px solid var(--gb);
    border-radius:var(--gv-radius-md);
    background:var(--gv-surface);
    margin-bottom:var(--gv-space-2);
    transition:border-color var(--gv-dur-fast) var(--gv-ease), box-shadow var(--gv-dur-fast) var(--gv-ease);
}
.mbmv-i:hover{border-color:var(--gv-border-strong);border-left-color:var(--gb)}
.mbmv-i.none{border-left:3px solid var(--gv-border-strong);background:var(--gv-surface)}
/* RULED OUT on Discussions, and the one place a broken edge still earns its keep (Dom,
   2026-09-22): an item the meeting passed over. It sits after .none, so an item that was
   ruled out reads as ruled out whether or not a motion is filed on it — which is the
   bigger fact about the row.

   DOTTED AND FINER THAN THE OTHERS (Dom, 2026-09-22). Dashed at the full 3px was heavier
   than the solid edges it sits between, so the ruled-out rows — the quiet ones — drew the
   most attention in the list. Dotted at 2px reads as a broken line without shouting.

   The padding-left is what the millimetre buys back: every other .mbmv-i has a 3px border
   and content-box sizing, so a 2px one would start its title 1px further left and the
   column of titles would kink at every ruled-out row. One pixel of padding holds the line.

   It does NOT outrank .incomplete, and that is deliberate: that rule is further down this
   file and sets border-left-COLOR only, so an item ruled out that still owes an answer
   comes out DOTTED AMBER — passed over, and not finished. Both facts, one edge. Anything
   that moved .is-nd below it would silently drop the amber.

   The item stays live either way: + Motion works, because a clerk who ruled it out too
   early has to be able to undo that by simply recording what was moved. */
.mbmv-i.is-nd{border-left:2px dotted var(--gv-border-strong);padding-left:1px}
.mbmv-i.is-nd:hover{border-left-color:var(--gv-border-strong)}
.mbmv-i.is-nd.incomplete:hover{border-left-color:var(--gv-warning)}
.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:var(--gv-space-2);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:var(--gv-space-2);font-size:12px;font-weight:600;color:var(--ink2)}
/* THE MINUTES PANEL'S SIZE (Dom, 2026-09-23). This header row is the same row as the one on
   Minutes (.mbdoc-src__head): the same padding, the switch the same height with its icons the
   same size -- the words beside them are the only difference, set small enough to fit it. */
.mbmv-ph .mbmv-flip{padding:2px}
.mbmv-ph .mbmv-flip button{padding:4px 8px;font-size:var(--gv-text-xs);line-height:var(--gv-leading-tight)}
.mbmv-ph .mbmv-flip button i{font-size:11px;opacity:1}
/* The one match the arrows are on, marked as Discussions marks it (.mbtv-l.hit). The matched
   words themselves use .mbmv-ln mark, below, which a motion line's quote already uses. */
.mbmv-ln.hit-cur{background:#fffbea;box-shadow:inset 0 0 0 1.5px #f0d67a}
.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)}
/* .m, .sp, .spn and .tm, who spoke and when: the column every transcript panel shares,
   in discussions.css (#878). */
.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}
/* An open motion's stretch (mbMvShadeOpen, #873): its words washed as Discussions washes an open
   item's (.mbtv-l .tx .w.in), in the green it gives an item with no colour of its own -- brand-600,
   as a triplet for the alpha, like --mbtv-open (Vinny, 2026-10-06). On the words, not the row, so
   the current line's fill and stripe (.cur) still read as the playhead; the motion's own line keeps
   its yellow on top. No horizontal padding: the words must not move as a motion opens. */
.mbmv-pb{--mbmv-open:90,147,38}
.mbmv-ln .tw{padding:1px 0;-webkit-box-decoration-break:clone;box-decoration-break:clone}
.mbmv-ln.in .tw{background:rgba(var(--mbmv-open),.46)}
.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}}
