/*  V905 -- Score Keeper's stylesheet. Lifted out of templates/cardpoints.html
    unchanged so the spectator page can wear the same clothes.

    WHY IT MOVED. A guest watching a game is a SECOND page -- deliberately a
    separate template, so the hand entry, the settings and the settle screen are
    not in the markup at all rather than hidden by a class somebody can flip.
    Two pages wanting one look is what a stylesheet is for, and every other tool
    of this size already has one (bingo.css, duo.css, tunebook.css). Nothing in
    here was rewritten in the move; V905's own rules are at the end.  */
/* V887 — Card Points.

   THE WIDE PAGE RULE IS NOT RE-DECLARED HERE. `.page-wide` and its 1600px cap
   shipped site-wide in V881 (line_escape.css) precisely so a page written after it
   never types a number again. This file styles the sheet and nothing about width.

   ONE PANEL PER ROW, TABLES AT width:100% WITH NO min-width, and the columns that
   are detail rather than answer drop at 1180 (.c-lo) and 900 (.c-mid). Below 900
   the hand history becomes cards, because a nine-column table on a phone is a
   horizontal scroll nobody performs. */
.cp{color:var(--text)}
.cp h1{font-size:19px;font-weight:800;margin:0 0 3px}
.cp .sub{color:var(--muted2);font-size:13.5px;margin:0 0 14px}
.cp .panel{width:100%;border:1px solid var(--line);border-radius:14px;
  background:var(--panel);overflow:hidden;margin-top:14px}
/*  V921, HIS ASK: *"reduce the padding further pls"*. 12-20px became 9-14px
    and the panel headers 11px became 8px. Five panels on a sheet is roughly
    60-80px of height back -- most of a hand row on a phone. The clamp shape is
    kept, not replaced by a flat number: a laptop still gets a little more air
    than a phone, which is the whole point of the clamp. */
.cp .pad{padding:clamp(9px,1vw,14px) clamp(10px,1.1vw,16px)}
.cp .ph{display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  border-bottom:1px solid var(--line);padding:8px clamp(10px,1.1vw,16px)}
/*  V1036 --- ONE GAP UNDER THE BLUE BAR, AND IT IS THE SCOREBOARD'S.

    HIS ASK, with the sheet marked A/B/C: *"what is the height pixel size
    between the blue bar and content below that for A, B and C. Idle should be
    height of C to be applied in all"*.

    MEASURED IN A BROWSER AGAINST THESE STYLESHEETS, not estimated off the
    screenshot (whose scale is unknown, which is exactly how V1034's sweep
    measured four states nobody was in):

        A  Players   -> the names box     31px
        B  Hand      -> the first row     23px
        C  Scoreboard-> the table          9px

    WHY C WAS ALREADY TIGHTER, which is the whole fix: it is the only one of
    the three whose body is NOT wrapped in `.pad`. Its 9px is this bar's own
    breathing room -- 8px of padding and the 1px hairline -- and nothing else.
    A and B add `.pad`'s 14px on top, and A another 8px from `.rosbox`.

    SO THE FIX IS SUBTRACTIVE AND THERE IS NO NEW NUMBER IN IT. The top padding
    goes, and only where the body sits directly under a bar; the sides and the
    bottom stay, or the content would touch the panel edge. The first child's
    own top margin goes with it, which is `.rosbox`'s 8px.

    V1039 TOOK THE `.cp` OFF, his *"apply in all tools all pages"*. The rule was
    written against `.ph + .pad` and nothing of Score Keeper's own precisely so
    that this edit would be two characters rather than a second rule.

    THE SITE-WIDE HALF IS NOT THIS RULE. Other tools use the section band --
    `.sec` / `.sechd` / `.secbd` -- which is a FILLED band with no hairline and
    no padding of its own below it, so there is nothing to subtract and the 9px
    is written out in line_escape.css instead. Same number, different mechanism,
    said in both places. ~14px back per panel, about 70px on a five-panel
    sheet. */
.ph + .pad{padding-top:0}
.ph + .pad > :first-child{margin-top:0}
.cp .ph h2{font-size:12px;text-transform:uppercase;letter-spacing:.06em;
  color:var(--muted2);margin:0;font-weight:700;flex:1 1 auto}
.cp .tw{width:100%;overflow-x:auto}
.cp table{width:100%;min-width:0;border-collapse:collapse;font-size:13.5px}
.cp th{text-align:left;color:var(--muted2);font-weight:600;font-size:11.5px;
  text-transform:uppercase;letter-spacing:.04em;padding:9px clamp(7px,.7vw,13px);
  border-bottom:1px solid var(--line);white-space:nowrap}
.cp td{padding:9px clamp(7px,.7vw,13px);border-bottom:1px solid var(--line);
  vertical-align:middle}
.cp tr:last-child td{border-bottom:0}
.cp .num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
.cp .pos{color:var(--good,#0f9d58);font-weight:700}
.cp .neg{color:var(--bad,#d93025);font-weight:700}
.cp .btn{border:1px solid var(--line2);background:var(--btn);color:var(--text);
  border-radius:8px;padding:7px 13px;font:inherit;font-size:13.5px;cursor:pointer}
.cp .btn.pri{background:var(--accent);border-color:transparent;color:var(--bg);font-weight:700}
.cp .btn.sm{padding:4px 9px;font-size:12px}
.cp .btn[disabled]{opacity:.45;cursor:default}
/*  V900. `hidden` LOSES TO A DISPLAY RULE, and this page now has several boxes
    that are flex AND hidden -- the selection bar, the paging row, the scan stage.
    Without this the bar reading "0 games ticked" sat on screen permanently. Same
    fix V898 shipped for the tab strip, scoped here rather than site-wide. */
.cp [hidden]{display:none !important}
.cp input[type=text],.cp input[type=number],.cp input[type=date],.cp select{background:var(--bg);
  color:var(--text);border:1px solid var(--line2);border-radius:8px;
  padding:7px 9px;font:inherit;font-size:var(--fld-fs,13.5px);max-width:100%}
.cp .row{display:flex;gap:9px;flex-wrap:wrap;align-items:center}
.cp .chip{display:inline-block;border:1px solid var(--line2);border-radius:999px;
  padding:2px 9px;font-size:11.5px;color:var(--muted2)}
.cp .chip.on{border-color:var(--accent);color:var(--accent)}
/*  V1025 --- THE EVENING'S STATE IS A LABEL, NOT A CONTROL. His question,
    about a gold pill reading "open" next to three real buttons: *"what is the
    use of this Open button"*. It has none, because it is not one -- it says
    whether the evening is still open and it reads "closed" after Close &
    settle. It wore `.chip.on`, the accent border this tool puts on things you
    press, so it looked like the row's fourth button and invited a tap that
    does nothing. A control that does nothing when pressed is worse than no
    control; the same goes for a label that looks like one. */
.cp .chip.state{border-style:dashed;border-color:var(--line2);color:var(--muted2);
  letter-spacing:.04em;text-transform:lowercase;cursor:default}
.cp .chip.state.shut{color:var(--muted3,var(--muted2));opacity:.8}

/*  V1025 --- THE GAME NAME, EDITED WHERE IT IS READ. It looks like the heading
    it replaced until you put a cursor in it: no border, no fill, the same
    size and weight. The box fills the row so a long name is not cut short by
    a field sized for a short one.

    16px IS NOT NEGOTIABLE -- anything smaller is a page zoom on iOS, which on
    a header input means the whole sheet jumps the moment he taps the name. It
    is a heading, so it was always going to be larger than that anyway. */
/*  V1027 --- AND V1026 BROKE IT THE OTHER WAY. THE WHOLE STORY, THREE TRIES.

    HIS REPORT EACH TIME WAS THE SAME SENTENCE -- the game name is white on a
    pale ground and cannot be read. Three releases, three different wrong
    answers from me, and the reason is that I never checked WHERE THE NAVY
    ACTUALLY COMES FROM.

    V1025: white ink, and focus repainted the ground to `var(--bg)`. Readable
           at rest, invisible the moment you clicked it.
    V1026: I kept `--hdr-fg` (white) and made the ground TRANSPARENT in every
           state, writing the rule "takes the band's ink AND ground, or
           neither" -- and then took the ground away while keeping the ink,
           which is the one combination the rule forbids. Now it was invisible
           ALL the time, which is why his third screenshot is worse than his
           first.

    THE THING I ASSUMED AND NEVER MEASURED: `.cp .ph` HAS NO BACKGROUND. It is
    `display:flex` with a bottom hairline, on the page's own ground -- thirty
    lines up in this file, and I could have read it any time in two releases.
    There is no navy band behind this input. `.sechd` ON THE INPUT ITSELF was
    the navy: the element was its own pill, and `background: transparent`
    deleted the only navy on the row.

    SO IT TAKES NEITHER, which is the other half of the rule. The name is the
    page's own heading text on the page's own ground -- `var(--text)`, like
    every other thing on this row, which is light in a light theme and pale in
    a dark one BECAUSE THE TOKEN FOLLOWS THE THEME and `--hdr-fg` never did.
    `.sechd` is off the element in the template too, so no future
    `.sechd.sechd.sechd` rule can reach in and repaint it.

    AND THE FOCUS RULE FROM V1026 STAYS, because that part was right: a ring,
    never a new ground. The text is not repainted at the moment somebody is
    reading it.

    THE LESSON, written here rather than in a release note: "it sits on the
    band" was a belief, not a measurement, and both wrong fixes were built on
    top of it. When a colour is wrong, read the PARENT'S rule before writing
    the child's. */
/*  V1037: `flex:1 1 0`, not `1 1 auto`. With All games beside it the row
    has two items and `.ph` is `flex-wrap:wrap` -- an `auto` basis is the
    input's CONTENT width, so a long name pushed the button onto a second
    line instead of shrinking. Measured: 78px of header on a 360px phone
    where 43px is one row. A zero basis makes the name the thing that
    gives, which is what `min-width:0` and the ellipsis were always for. */
.cp .ph input.cptitle{flex:1 1 0;min-width:0;margin:0;background:transparent;
  border:1px solid transparent;border-radius:8px;padding:2px 8px;
  color:var(--text);font:inherit;font-size:17px;font-weight:800;
  text-overflow:ellipsis;-webkit-text-fill-color:var(--text)}
.cp .ph input.cptitle::placeholder{color:var(--muted2);opacity:1}
/*  V1037: All games sits on the name's row. `flex:0 0 auto` so the NAME is the
    only elastic thing there -- V1031's rule, which is the whole reason the name
    stopped being the one cut. The phone query below hides the label. */
/*  V1037 --- THE WAY OUT IS GOLD-BORDERED, his ask. `flex:0 0 auto` so the NAME
    is the only elastic thing on this row -- V1031's rule, and the reason the
    name stopped being the one cut.

    RING AND ALL, MATCHING THE SCORE BOX EXACTLY -- his call, asked and
    answered. I had shipped the border alone on the reasoning that two equally
    loud golds on one screen would mean two different things, and that the
    pairing should stay reserved for "type here" among five identical boxes.
    He wanted them the same, and they are the same: 2px at 22%, the one
    declaration repeated rather than a second gold invented.

    THEY ARE NOT ON ONE ROW TOGETHER, which is what makes it hold up: the way
    out is in the header, the score boxes are inside the hand panel below, and
    nothing on a given row is competing with anything else for the same gold. */
.cp .ph #cpBack{flex:0 0 auto;border-color:var(--accent);color:var(--accent);
  box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 22%,transparent)}
.cp .ph input.cptitle:hover:not([readonly]){
  border-color:color-mix(in srgb,var(--text) 35%,transparent)}
/*  The ring, and NOT a new ground. `outline` rather than a background so the
    text is never repainted at the moment somebody is reading it. */
.cp .ph input.cptitle:focus{border-color:var(--accent);background:transparent;
  outline:2px solid var(--accent);outline-offset:-2px}
.cp .ph input.cptitle[readonly]{cursor:default}
.cp .muted{color:var(--muted2);font-size:12.5px}
.cp .empty{color:var(--muted2);font-size:13.5px;padding:14px 0;text-align:center}
/*  V921, HIS ASK: *"the running now section shows the name of game in blue
    colour - it should be white for dark theme as its not being contrast
    enough"*. He is right and the cause is the element, not the theme: this card
    is built as a <button> (cardpoints.js drawRunning), and a button whose own
    rule never names a colour takes the BROWSER's default for button text, which
    is a blue. Inheriting from `.cp{color:var(--text)}` never happens, because
    the UA stylesheet sets `color` on the button itself and a set value beats an
    inherited one whatever the specificity.

    Same shape as V916's white-on-white titles on Raffle Hub and Tune Book.

    Event Expenses got this right already -- `.ev .gcard` in events.html names
    colour, text-align, font and width. This rule was missing all four, which is
    why only Score Keeper showed it. The two now say the same thing. */
.cp .gcard{border:1px solid var(--line);border-radius:12px;background:var(--panel);
  padding:12px 13px;cursor:pointer;color:var(--text);text-align:left;
  font:inherit;width:100%}
.cp .glist{display:grid;gap:10px;grid-template-columns:repeat(auto-fill,minmax(250px,1fr))}
.cp .gcard b{display:block;font-size:14.5px;margin-bottom:2px}
.cp .hcards{display:none}
.cp .hcard{border:1px solid var(--line);border-radius:11px;padding:10px 12px;margin-top:9px}
.cp .hcard .hh{display:flex;justify-content:space-between;font-weight:700;font-size:13px;
  margin-bottom:5px}
.cp .hcard .hr{display:flex;justify-content:space-between;font-size:13px;padding:2px 0}
.cp .ent td{padding:6px clamp(5px,.6vw,10px)}
.cp .ent input[type=number]{width:62px;padding:5px 6px}
.cp .pot{border:1px dashed var(--accent);border-radius:10px;padding:8px 11px;
  font-size:13px;margin-top:10px}
/* ======================================================================== V900
   SCORE KEEPER'S DASHBOARD AND SET-UP.

   The three games are BUTTONS, not a typed number in a prompt; every setting is
   on one form instead of four dialogs in a row; and the games list is built for
   thirty evenings rather than three -- search, sort, filter, page. His notes,
   in that order.

   `.picker` is nowrap on purpose: three names across a 390px phone was the
   measured ask ("fit these three in same row"), and the font shrinks at the
   breakpoint rather than the row wrapping. */
.cp .picker{display:flex;gap:8px;flex-wrap:nowrap;align-items:center}
.cp .gbtn{display:inline-flex;align-items:center;justify-content:center;gap:6px;
  flex:1 1 0;min-width:0;border:1px solid var(--line2);background:var(--btn);
  color:var(--text);border-radius:9px;padding:0 11px;height:36px;font:inherit;
  font-size:13.5px;font-weight:700;white-space:nowrap;cursor:pointer;
  transition:border-color .12s}
.cp .gbtn:hover,.cp .gbtn.on{border-color:var(--accent)}
/* V930 — HIS PICK, OPTION B, on the three buttons that START a game. Gold border
   and a 13% wash of gold through the ground, keeping the page's own text colour.
   NOT solid gold: three solid slabs read as a warning rather than a choice, which
   is why B was the recommendation and not the loudest option on the sheet.

   SCOPED BY [data-kind], so it is exactly the three. `.gbtn` is also the class on
   the game-type filter capsule further down the page, and painting that gold would
   make a FILTER look like an action.

   AND THE REASON `Show past games` IS DEMOTED IN THE SAME RELEASE (its `pri` is
   dropped in the template): before this, the loudest control on the screen was a
   button for looking BACKWARDS while the three that start a game were the quietest.
   Two gold things on one short screen, and the louder one pointing at the past, is
   how gold stops meaning anything. He did not answer when asked; the default was
   stated as "demote" and this is it. One word in the template to put back. */
.cp .gbtn[data-kind]{border-color:var(--accent);
  background:color-mix(in srgb, var(--accent) 13%, var(--btn))}
.cp .gbtn[data-kind]:hover{background:color-mix(in srgb, var(--accent) 20%, var(--btn))}
.cp .gbtn .gi{font-size:15px;line-height:1;flex:0 0 auto}

/* a field is one row: its name on the left, a short box on the right */
.cp .fl{display:flex;align-items:center;gap:11px;padding:6px 0;
  border-bottom:1px solid var(--line)}
.cp .fl:last-child{border-bottom:0}
.cp .fl > span{flex:1 1 auto;font-size:13.5px;color:var(--text);min-width:0}
.cp .fl > span small{display:block;color:var(--muted3);font-size:11.5px}
.cp .fl input,.cp .fl select{flex:0 0 auto;width:83px;text-align:right}
.cp .fl input.wide{width:153px;text-align:left}
.cp .flcols{display:grid;grid-template-columns:repeat(auto-fit,minmax(243px,1fr));
  gap:0 25px}

/*  V919 --- THE ROSTER AS ONE LINE, the shape Event Expenses settled in V906.
    The button is a real <button> and not a styled div, so it is reachable by
    keyboard and announces itself; `.car` is the caret, pushed to the end by
    margin rather than by a second flex child with a width. The box behind it is
    plain flow: nothing here is positioned, so a long roster simply makes the
    panel taller instead of escaping it. */
/*  V919 --- THE TWO FILTER CAPSULES. A pill with its label inside it, so the
    control says WHAT it filters without a separate caption line above --
    "Status: All" reads as one thing where a label and a dropdown read as two.
    The <select> is a real native select: on a phone that is the OS picker,
    which is better than anything built here, and it is keyboard-reachable for
    free. `appearance:none` only removes the chrome; the element is unchanged. */
.cp .caps{display:flex;flex-wrap:wrap;gap:8px;margin-top:9px}
.cp .cap{display:inline-flex;align-items:center;gap:6px;border-radius:999px;
  border:1px solid var(--line2);background:var(--btn);padding:4px 6px 4px 12px;
  font-size:12px;color:var(--muted2);cursor:pointer;max-width:100%}
.cp .cap:focus-within{border-color:var(--accent)}
.cp .cap > span{white-space:nowrap}
.cp .cap select{appearance:none;-webkit-appearance:none;border:0;background:transparent;
  color:var(--text);font:inherit;font-size:var(--fld-fs,13.5px);font-weight:700;cursor:pointer;
  padding:3px 20px 3px 2px;max-width:100%;
  background-image:linear-gradient(45deg,transparent 50%,currentColor 50%),
    linear-gradient(135deg,currentColor 50%,transparent 50%);
  background-position:right 9px center,right 4px center;
  background-size:5px 5px,5px 5px;background-repeat:no-repeat}
.cp .cap select:focus:not(:focus-visible){ outline: none; }
.cp .rosbox{margin-top:8px}
.cp .oneline{display:flex;align-items:center;gap:9px;width:100%;
  border:1px solid var(--line2);background:var(--bg);border-radius:9px;
  padding:0 12px;min-height:38px;color:var(--text);font:inherit;font-size:13.5px;
  cursor:pointer;text-align:left}
.cp .oneline:hover,.cp .oneline:focus-visible{border-color:var(--accent)}
.cp .oneline .car{margin-left:auto;color:var(--muted3)}
/*  The name run wraps rather than pushing the caret off the right edge -- three
    long usernames and "+4 others" is wider than 390px, and a horizontal scroll
    inside a panel is the defect this site has now fixed four times. */
.cp .oneline > span:first-child{min-width:0;overflow-wrap:anywhere;
  padding:7px 0}
.cp #cpRosOpen{margin-top:10px}
.cp .who{display:flex;flex-wrap:wrap;gap:5px;margin-top:8px}
.cp .wchip{display:inline-flex;align-items:center;gap:4px;border:1px solid var(--line2);
  background:var(--btn);border-radius:999px;padding:3px 4px 3px 9px;font-size:12.5px}
.cp .wchip .x{border:0;background:transparent;color:var(--muted2);cursor:pointer;
  font:inherit;line-height:1;padding:3px 5px;border-radius:999px;font-size:11px}
.cp .wchip .x:hover{color:var(--accent)}
.cp .wchip.host{border-color:var(--accent)}
.cp .wchip.out{opacity:.55}

.cp .share{display:flex;gap:14px;align-items:flex-start;flex-wrap:wrap}
.cp .qrbox{border:1px solid var(--line2);border-radius:11px;background:#fff;
  padding:7px;line-height:0;flex:0 0 auto}
.cp .qrbox canvas,.cp .qrbox svg{width:119px;height:119px;display:block}
.cp .shr{flex:1 1 198px;min-width:0}
.cp .code{font-size:24px;font-weight:800;letter-spacing:.18em;color:var(--accent);
  font-variant-numeric:tabular-nums}

/*  the games list, built for thirty rows

    V921, HIS ASK: *"also the table is not modern.. change the ui and suggest few
    options"*, and of the three shown he picked CARDS -- "No table at all, so
    nothing can scroll sideways on a phone", and the same shape as the Running
    now cards further up, so the page reads as one design rather than two.

    This is a restyle, not a rewrite: the markup drawAll() builds is unchanged
    (checkbox, .gn with its small line, .gv, .menu). A row that was separated
    from its neighbour by a hairline is now separated by a gap and carries its
    own border. Nothing about what a row CONTAINS moved, so the sort, the tick,
    the menu and the totals all behave exactly as they did. */
.cp .gpick{display:flex;align-items:center;gap:11px;padding:10px 12px;
  border:1px solid var(--line);border-radius:11px;background:var(--bg);
  margin-bottom:8px;font-size:13.5px}
.cp .gpick:last-of-type{margin-bottom:0}
.cp .gpick:hover{border-color:var(--line2)}
/*  V1066 --- SOMEBODY ELSE'S EVENING. Same row shape so it is obviously the
    same kind of thing, dashed so it is obviously not his: a row he can open but
    not type into should not look identical to one he owns, and the mockup's
    whole argument for the banner on the sheet applies here too. */
.cp .gpick.isother{border-style:dashed}
.cp .gpick .gvview{flex:0 0 auto;color:var(--muted2);font-size:12.5px;white-space:nowrap}
.cp .gpick input[type=checkbox]{width:16px;height:16px;accent-color:var(--accent);flex:0 0 auto}
.cp .gpick .gn{flex:1 1 auto;min-width:0;border:0;background:transparent;
  color:var(--text);font:inherit;font-size:13.5px;text-align:left;cursor:pointer;
  padding:2px 0;border-radius:5px}
.cp .gpick .gn:hover{color:var(--accent)}
.cp .gpick .gn small{display:block;color:var(--muted3);font-size:11.5px}
.cp .gpick .gv{font-weight:700;font-variant-numeric:tabular-nums;min-width:59px;
  text-align:right}
.cp .selbar{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-top:11px;
  border-top:2px solid var(--line2);padding-top:10px;font-size:14px;font-weight:700}
.cp .ptags{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.cp .ptag{display:inline-flex;align-items:center;gap:5px;border:1px solid var(--line2);
  background:var(--btn);border-radius:999px;padding:4px 9px;font-size:12.5px;
  cursor:pointer}
.cp .ptag.on{border-color:var(--accent);color:var(--accent)}

/* the row's own menu */
.cp .menu{position:relative;flex:0 0 auto}
.cp .dots{border:1px solid var(--line2);background:var(--btn);color:var(--muted2);
  border-radius:7px;width:27px;height:27px;font:inherit;font-size:15px;cursor:pointer;
  line-height:1;padding:0}
.cp .dots:hover{border-color:var(--accent);color:var(--accent)}
/*  V904: the drop-out list is GONE. It was absolutely positioned inside a
    panel that is `overflow:hidden`, so on a panel's last row it was cut in
    half -- which is what his screenshot showed. Its replacement is a popup,
    which nothing can clip. `.menu` and `.dots` stay: the button is still the
    button, only what it opens changed. */
.cp .mi{border:0;background:transparent;color:var(--text);font:inherit;font-size:13px;
  text-align:left;padding:7px 9px;border-radius:6px;cursor:pointer;white-space:nowrap}
.cp .mi:hover{background:var(--btn);color:var(--accent)}
.cp .mi.off{color:var(--muted3);cursor:default}
.cp .mi.off:hover{background:transparent;color:var(--muted3)}

/* the searchable person picker */
.cp .dd{position:relative;flex:1 1 234px;min-width:0}
.cp .dd > input{width:100%}
.cp .ddlist{position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:20;
  background:var(--panel);border:1px solid var(--line2);border-radius:9px;
  box-shadow:0 13px 27px rgba(0,0,0,.42);max-height:212px;overflow:auto;padding:4px}
.cp .ddlist[hidden]{display:none}
.cp .ddi{display:flex;align-items:center;gap:8px;padding:8px 9px;border-radius:7px;
  cursor:pointer;font-size:13.5px}
.cp .ddi:hover{background:var(--btn)}
.cp .ddi small{color:var(--muted3);font-size:11.5px}
.cp .ddi .tick{margin-left:auto;color:var(--accent);font-size:12.5px;font-weight:700}
.cp .ddempty{padding:10px;color:var(--muted3);font-size:12.5px}

/* the close-first dialog */
.cp .scanstage{position:relative;background:#000;border:1px solid var(--line);
  border-radius:13px;overflow:hidden;aspect-ratio:1/1;max-width:288px;margin-top:9px}
.cp .scanstage video{width:100%;height:100%;object-fit:cover;display:block}
.cp .scanframe{position:absolute;inset:16%;border:2px solid var(--accent);
  border-radius:11px;pointer-events:none}
.cp .modal{position:fixed;inset:0;z-index:60;background:var(--backdrop);
  display:flex;align-items:center;justify-content:center;padding:16px}
.cp .modal[hidden]{display:none}
.cp .mcard{width:100%;max-width:468px;border:1px solid var(--line2);border-radius:13px;
  background:var(--panel);overflow:hidden;box-shadow:0 22px 54px rgba(0,0,0,.5)}
.cp .crow{display:flex;align-items:center;gap:8px;padding:8px 0;
  border-bottom:1px solid var(--line)}
.cp .crow .gn2{flex:1 1 auto;min-width:0;font-size:13.5px}
.cp .crow .gn2 small{display:block;color:var(--muted3);font-size:11.5px}
.cp .savebar{display:flex;gap:9px;align-items:center;flex-wrap:wrap;margin-top:11px}
.cp .savebar .btn.pri{flex:1 1 180px;padding:10px 14px;font-size:15px;min-height:40px}
/*  V1035 --- GREYED, BUT NOT `disabled`. The button keeps its place in the Tab
    order and still takes a press, because the press is what prints what is
    missing -- his *"show error- what is pending if save is pressed"*. A real
    `disabled` attribute would swallow it and say nothing.
    `cursor:default` rather than `not-allowed`: the control is not forbidden,
    it is waiting, and pressing it is the thing to do next. The focus ring is
    left alone on purpose (V1034) -- a control that can be reached by keyboard
    has to show where the keyboard is. */
.cp .savebar .btn.pri.off,.cp .btn.pri.off{background:var(--panel2,#1f4733);
  border-color:var(--line);color:var(--muted3,#8aa39a);font-weight:600;cursor:default}
.cp .savebar .btn.pri.off:hover{background:var(--panel2,#1f4733)}
@media (max-width:620px){
  .cp .gbtn{font-size:12px;padding:0 7px;gap:4px;height:34px}
  .cp .fl input,.cp .fl select{width:76px}
  .cp .fl input.wide{width:117px}
  /*  V921: the phone card is ONE LINE, not three. The old rule gave the name
      `flex:1 1 100%`, which on a flat list cost nothing -- the checkbox simply
      sat on the line above. Inside a bordered card that same wrap draws a box
      three rows tall with two of them nearly empty, which is the opposite of
      what he asked for when he asked for less padding.

      140px is the basis, not 100%: 16 + 140 + 59 + 30 and three 11px gaps is
      278px inside a 390px phone's card, so everything fits on one line, and a
      name longer than its share wraps its own small line rather than pushing
      the row. It still wraps if it has to -- flex-wrap stays. */
  .cp .gpick{flex-wrap:wrap;gap:9px}
  .cp .gpick input[type=checkbox]{order:0}
  .cp .gpick .gn{order:1;flex:1 1 140px}
  .cp .gpick .gv{order:2;margin-left:auto;min-width:0}
  .cp .gpick .menu{order:3}
}
/* ======================================================================== V902
   THE SHEET: one line per player, and the scoreboard the table already draws.

   The entry form was a nine-column table of number boxes and radio buttons --
   his note, and he is right: at a table, on a phone, with one hand holding
   cards, that is not a form anybody fills in. One row per player now, and the
   words became marks: a crown for who won, an eye open or shut for seen or
   unseen, a flag for a foul. Four players fit on one phone screen instead of
   one and a half.

   THE SCOREBOARD IS HANDS DOWN, PLAYERS ACROSS, #1 at the top -- the paper sheet
   everybody already draws. The newest hand keeps its money line under it, the
   older ones show points only, and the POT COLUMN is what makes the arithmetic
   checkable: every row across, players and pot together, comes to zero. */
/*  ================================================ V914 · THE MARRIAGE HAND ROW
    HIS REPORT: *"in iphone the hand #*** marriage box is nof fully visible (not
    visble after flag botton)"*.

    PROVEN BY MEASUREMENT, in a harness loading these real stylesheets. At 375px
    the card came out 367px wide and the flag landed at x=384 -- off the right
    edge of the screen. TWO THINGS DID IT, and both had to go:

      1. `minmax(330px,1fr)` is a FLOOR. An auto-fit track will not go below its
         minimum, so once the page and panel padding are taken off a 375px
         screen there is less than 330px left and the track overflows rather
         than shrinking. `min(330px,100%)` is the fix: 330 when there is room,
         the available width when there is not.
      2. A grid item's `min-width` is `auto`, which means "no smaller than your
         content" -- so even a track that could shrink was held open by the
         name. `min-width:0` lets the name ellipsise, which `.pnm` has always
         been ready to do.

    AFTER: card 321px, flag at 338px, name ellipsised. The same two-line fix as
    the step list in V912 and the Event Expenses popover before it -- a grid
    column that refuses to shrink is this site's most repeated layout defect.  */
/*  V1026 --- THREE TO A ROW, NOT FOUR, and the name takes what Dublee gave up.
    HIS REPORT, with a screenshot of five cards whose names read "raja...",
    "Pra...", "Pun...", "Gan...", "Suni...": *"the pause is overflowing.. we can
    increase the name box length by taking the saving from Dublee = D change.
    also we can start showing only 3 people details in one row"*.

    ONE CAUSE, TWO SYMPTOMS. The Marriage row now carries six controls -- crown,
    dublee, maal box, eye, flag and V1025's pause -- and `auto-fit` was packing
    four or five cards across a laptop at 330px each. The controls have fixed
    minimum widths and the name is the only flexible thing on the row, so the
    name is what got crushed, and past a point the last control was pushed out
    of the card.

    EXPLICIT COLUMNS RATHER THAN A BIGGER `minmax`. `auto-fit` fits as many as
    the number allows, so raising 330 to 440 caps it at three on a 1400px
    laptop and still packs four on a 1850px monitor -- which is the width he
    screenshotted. Three means three.  */
.cp .hands{display:grid;gap:8px;grid-template-columns:1fr}
@media (min-width:720px){ .cp .hands{grid-template-columns:repeat(2,1fr)} }
@media (min-width:1120px){ .cp .hands{grid-template-columns:repeat(3,1fr)} }
.cp .pcard{border:1px solid var(--line);border-radius:10px;background:var(--bg);
  padding:7px 9px;min-width:0}
.cp .pcard.win{border-color:var(--accent);box-shadow:inset 0 0 0 1px var(--accent)}
.cp .pcard.out{opacity:.5}
.cp .prow{display:flex;align-items:center;gap:6px;min-width:0}
/*  The name is the only elastic thing on the row, so it is where both savings
    land -- a third of the width instead of a quarter, and the five characters
    "Dublee" gave back. 92px is about eleven characters at this size, which is
    the difference between "Pun..." and "Punnyashree".  */
.cp .pnm{flex:1 1 auto;font-weight:700;font-size:14px;min-width:92px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cp .mini{display:inline-flex;align-items:center;justify-content:center;gap:5px;
  border:1px solid var(--line2);background:var(--bg);color:var(--muted2);
  border-radius:8px;height:34px;min-width:34px;padding:0 8px;font:inherit;
  font-size:12.5px;cursor:pointer;flex:0 0 auto}
.cp .mini svg{width:16px;height:16px;display:block}
.cp .mini.on{border-color:var(--accent);color:var(--accent-fg);background:var(--accent);
  font-weight:700}
.cp .mini.on.q{background:var(--bg);color:var(--accent)}
.cp .mini[disabled]{opacity:.35;cursor:default}
/*  V1025 --- THE CONTROLS ON A LINE SHARE ONE BASELINE AND ONE HEIGHT.
    His report, circling the CALL box, the MADE box and the pause beside them:
    *"all of these should be aligned and same height"*. The boxes sit in a
    two-row cell (a small label over the input) and the button had no label, so
    it stretched to the card and sat on a different baseline from the things it
    stands next to. It rides the same cell now, with the label space kept
    empty, and both are 34px.  */
.cp .pcard .mini{height:34px;min-height:34px;align-self:flex-end}
.cp .bx{align-self:flex-end}
.cp .mini .hg{font-size:13px;line-height:1}

/*  A player sitting this hand out. VISIBLE AND GREYED rather than gone: the
    control that put them out has to be the one that brings them back, and a
    row that vanishes under a finger sends somebody hunting for the name strip
    to undo it. Their boxes are off, so no row is sent for them. */
.cp .pcard.held{opacity:.45}
.cp .pcard.held .pnm:after{content:" \00b7 sitting out";color:var(--accent);
  font-weight:400;font-size:11.5px}
/*  THE SAME GREY, A DIFFERENT SENTENCE. On a new hand the pause is the roster
    hold and the player is sitting tonight out; on an edit it means they were
    not dealt into THAT hand, which is a fact about a Tuesday three weeks ago
    and says nothing about the roster. Two meanings on one control is only
    safe while the screen says which one is in force.  */
.cp .editing .pcard.held .pnm:after{content:" \00b7 not in this hand"}
.cp .mini.hold{color:var(--accent);border-color:var(--accent);opacity:1}
.cp .pcard.held .mini.hold{opacity:1}

/*  A locked call is READ-ONLY, not disabled: disabled greys its own text, and
    the bids are exactly what everybody is looking at while the hand is played. */
.cp .pts.lockd{background:var(--btn);border-color:var(--line);color:var(--accent);
  font-weight:800}

/*  V1026 --- THE PRIVATE MAAL NOTE. It sits under the row rather than on it
    because the row is already six controls wide, and because this is a
    different KIND of thing: everything on the row is the hand's public record,
    and this is one person's own.

    THE LABEL IS PART OF THE FEATURE and its wording is a decision -- see
    `cardpoints_maal.py` and PROJECT_GUIDE §7, which are server-side and carry
    the whole of it. It is small and muted because it is a standing fact, not
    a warning.

    V1027: the reasoning used to be written out here, and this stylesheet is
    DOWNLOADED BY EVERY PLAYER. A comment in a served file is as public as the
    screen it styles, so anything about who can read what lives in the .py.
    `tests/_privscan.py` fails the build if it comes back.  */
.cp .maalnote{display:flex;flex-direction:column;gap:3px;margin:7px 1px 1px;
  padding-top:7px;border-top:1px dashed var(--line2)}
.cp .maalnote label{display:flex;align-items:baseline;gap:6px;font-size:11px;
  font-weight:700;color:var(--muted2);letter-spacing:.02em}
.cp .maalnote label small{font-weight:400;font-size:10.5px;color:var(--muted3)}
.cp input.mnote{width:100%;background:var(--bg);border:1px solid var(--line2);
  color:var(--text);border-radius:7px;height:32px;padding:0 9px;
  font:inherit;font-size:16px}
.cp input.mnote:focus{border-color:var(--accent);}
.cp input.mnote:focus:not(:focus-visible){ outline: none; }
.cp input.mnote::placeholder{color:var(--muted3);opacity:1}

/*  The running tally. `called` is a fact; `made` is a check, so only that one
    takes a colour. */
.cp .cbtally{display:flex;gap:14px;align-items:center;justify-content:flex-end;
  flex-wrap:wrap;margin:8px 2px 0;font-size:12.5px;color:var(--muted2)}
.cp .cbtally .lnk{margin-right:auto;border:0;background:none;padding:0;
  color:var(--accent);font:inherit;font-weight:700;cursor:pointer}
.cp .cbtally .okx{color:var(--good,#8fd45e);font-weight:800}
.cp .cbtally .warnx{color:var(--bad);font-weight:800}
.cp .btn[disabled]{opacity:.45;cursor:default}
/*  V1026 --- "D" AT EVERY WIDTH, his ask: *"in laptop Dublee can be denoted as
    D instead of writing dull Dublee"*. The word was already shortened below
    620px; it was only the laptop that still spelled it out, and on the Marriage
    row -- crown, dublee, maal box, eye, flag, pause -- it was the one control
    spending six characters on what a letter says. The narrow-screen rules
    below are now the rule everywhere, so they say nothing new.  */
.cp .mini .lg{display:none}
.cp .mini .sh{display:inline}
.cp .pts{width:64px;height:34px;text-align:center;padding:0;font-size:14px;
  font-weight:700;font-variant-numeric:tabular-nums;flex:0 0 auto}
.cp .pts::placeholder{color:var(--muted3);opacity:1;font-weight:400}
.cp .bx{display:flex;flex-direction:column;gap:2px;flex:1 1 0;min-width:0}
.cp .bx small{font-size:10.5px;text-transform:uppercase;letter-spacing:.04em;
  color:var(--muted3);font-weight:700}
.cp .bx .pts{width:100%}

.cp table.sb th:first-child,.cp table.sb td:first-child{
  position:sticky;left:0;background:var(--panel);z-index:1;min-width:58px}
/*  V1026 --- AND THE WRAPPER HAS TO SCROLL, which V1025 missed entirely.
    HIS REPORT: *"name is still not scroll locked"* -- and he was right, the
    rule below had never once fired.

    `.tw` carried `overflow-x: auto`, and CSS makes an element a scroll
    container in BOTH axes the moment either one stops being `visible`. So
    `top: 0` was sticking to `.tw` rather than to the page -- and `.tw` had no
    height limit, so nothing ever scrolled inside it and the heading went up
    with the document like any other row.

    THE FIRST COLUMN WORKED FOR THE SAME REASON IT FAILED: `left: 0` sticks to
    that same box, and `.tw` DOES scroll sideways, so sideways was fine and
    vertical silently was not. One rule half-working is what stopped this being
    obvious in the source.

    A MAX HEIGHT IS THE FIX, not removing the overflow: take `overflow-x` off
    and the wide board stops scrolling sideways at all. The board now scrolls
    inside its own box in both directions, which is what makes BOTH sticky
    edges real. 68vh leaves the hand-entry form visible under it on a laptop
    and still shows eight or nine hands.  */
.cp .tw{max-height:68vh;overflow:auto}

/*  V1025 --- THE HEADING ROW STAYS PUT. His report, on an eleven-hand board:
    *"the name should be scroll locked so that in larger games name should be
    visible when people want to see the end value"*.

    The end value is Total points and Total value, at the FOOT -- so reading it
    means scrolling the names off the top, and six columns of numbers with no
    headings is six columns you cannot attribute. The first column was already
    sticky (V902, for the sideways scroll); this is the same fix in the other
    axis, and the two were always going to be needed together.

    THE PAGE SCROLLS, NOT THE TABLE -- `.tw` sets overflow-x only -- so `top:0`
    sticks against the viewport, which is what is wanted. The corner cell is
    both at once and needs the higher z-index, or the row headings slide over
    it on the sideways scroll.  */
.cp table.sb thead th{position:sticky;top:0;background:var(--panel);z-index:2}
.cp table.sb thead th:first-child{z-index:3}
/*  V1025 --- THE THREE NEW ROWS. A hand that does not count states what it is
    across the whole width rather than showing a line of dashes, because dashes
    read as "no data" and these are not missing numbers -- they are hands with
    a reason. The locked one is gold because it is the hand happening NOW;
    the disqualified one is muted because it is over.  */
.cp table.sb tr.dqrow td{color:var(--muted2);font-style:italic}
/*  V1066 (finding #21): the way back onto the struck-off row itself. Not
    italic -- it is a control, and the row's italics are about the hand. */
.cp table.sb tr.dqrow .dqback{font-style:normal;margin-left:10px;padding:2px 8px;font-size:11.5px}
.cp table.sb tr.lockrow td{color:var(--accent);font-style:italic}
.cp table.sb tr.rankrow td{font-weight:800}
/*  V1026 --- the maal line under the newest hand. Quieter than the points
    above it, because it is the INPUT the points were worked out from rather
    than a result -- the same relationship the `value` line below has to it,
    and it takes the same treatment.  */
.cp table.sb tr.maalrow td{color:var(--muted2);font-size:12.5px}
.cp table.sb tr.maalrow td:first-child{font-style:italic}
.cp table.sb tr.rankrow td:not(:first-child){color:var(--accent)}
.cp table.sb td{font-variant-numeric:tabular-nums;padding:7px clamp(6px,.7vw,12px)}
.cp table.sb th{padding:8px clamp(6px,.7vw,12px)}
/*  V914: a shortened column heading, tappable to see the whole name. It is
    marked only on the headings that are actually short, because a heading
    already showing its whole name has nothing to open.

    V921 TOOK THE DOTTED UNDERLINE OFF, his ask: *"no need to give dotted
    underline against name in scorekeeper as well as event expenses"*. What that
    costs is written out beside the .whois rule in line_escape.css -- on a phone
    there is now no hint at all that a shortened heading opens. It still does. */
.cp .nmcut{border:0;background:transparent;color:inherit;font:inherit;
  cursor:pointer;padding:0}
.cp .nmcut:hover,.cp .nmcut:focus-visible{color:var(--accent)}
.cp tr.latest td{background:color-mix(in srgb,var(--accent) 9%,transparent);
  border-bottom:0;font-weight:700}
.cp tr.latest.val td{border-bottom:1px solid var(--line2);font-weight:600;
  font-size:12.5px;color:var(--muted2)}
.cp tr.latest td:first-child,.cp tr.latest.val td:first-child{
  background:color-mix(in srgb,var(--accent) 9%,var(--panel))}
.cp tr.tot td{border-top:2px solid var(--line2);font-weight:800;border-bottom:0}
.cp tr.tot.val td{font-weight:700;font-size:12.5px;border-top:0}
.cp .hno{display:inline-flex;align-items:center;gap:6px;white-space:nowrap}
.cp .hno .pen{border:1px solid var(--line2);background:var(--btn);color:var(--muted2);
  border-radius:6px;width:24px;height:24px;font:inherit;font-size:12px;cursor:pointer;
  flex:0 0 auto;padding:0}
.cp .hno .pen:hover{border-color:var(--accent);color:var(--accent)}
.cp .mk{color:var(--accent);font-size:11.5px;margin-right:3px}
.cp .mk.f{color:var(--bad)}
.cp .mk.e{color:var(--muted3);opacity:.75}
.cp .mk.w{color:var(--accent)}
/*  V1024 -- the dublee mark, on the board and in the legend. A LETTER and not
    an icon, deliberately: dublee has no picture the table already reads, and an
    invented glyph would mean nothing without the legend standing next to it.
    The letterform is its own legend. It rides .mk so it sits on the same
    baseline and spacing as the crown, the eye and the flag rather than being a
    fourth mark that lines up with none of them. */
.cp .mk.d{display:inline-block;font-weight:800;font-size:10px;line-height:1.3;
  border:1px solid var(--accent);border-radius:4px;padding:0 3px;
  vertical-align:1px;margin-right:3px}
.cp .potcol{color:var(--muted2);font-size:12px}

/*  V903: the cross-evening settle. `owe` is Event Expenses' payment row, the
    same shape for the same job -- two tools printing "A pays B 40.00" in two
    layouts is two things to learn for one fact. */
.cp .owe{display:flex;justify-content:space-between;align-items:center;gap:12px;
  background:var(--bg);border:1px solid var(--line);border-radius:10px;
  padding:10px 13px;margin-bottom:8px}
.cp .owe .amt{font-variant-numeric:tabular-nums;font-weight:800;white-space:nowrap}
.cp .msg{font-size:13px;margin-top:9px;min-height:1px;color:var(--bad)}
.cp .gline{border:1px solid var(--line);border-radius:10px;background:var(--bg);
  padding:9px 12px;margin-bottom:7px}
.cp .gline .gt{display:flex;gap:9px;align-items:baseline;flex-wrap:wrap}
.cp .gline .gt b{font-size:13.5px}
.cp .gline .gp{margin-top:5px;font-size:12.5px;color:var(--muted2);
  display:flex;gap:4px 14px;flex-wrap:wrap}
.cp .gline .gp span{font-variant-numeric:tabular-nums}

/*  V904: a rung is a line that says WHO pays it. "50,100,150" in one box made
    the order carry the meaning, which is a thing to remember rather than read. */
.cp .rung{display:flex;align-items:center;gap:10px;padding:7px 0;
  border-bottom:1px solid var(--line)}
.cp .rung:last-child{border-bottom:0}
.cp .rung .rl{flex:1 1 auto;font-size:13.5px}
.cp .rung input{flex:0 0 auto;width:83px;text-align:right}
.cp .rung .x{border:1px solid var(--line2);background:var(--btn);color:var(--muted2);
  cursor:pointer;font:inherit;line-height:1;padding:5px 9px;border-radius:999px;font-size:12px}
.cp .rung .x:hover{color:var(--bad)}
.cp .lk{border:0;background:none;color:var(--accent);font:inherit;font-size:inherit;cursor:pointer;padding:0;text-decoration:underline}
/*  V904: a MENU row, not a save bar. `.savebar .btn.pri{flex:1 1 180px}` is right
    for a form with two buttons and wrong for four, where it made the last one
    wrap onto its own line. Four equal shares; below 470px a 2x2 grid, because
    four legible taps do not fit across a phone. */
.cp .mcard.menu, .ev .mcard.menu{max-width:560px}
.cp .mbar, .ev .mbar{display:flex;gap:8px;margin-top:12px}
.cp .mbar .btn, .ev .mbar .btn{flex:1 1 0;min-width:0;white-space:nowrap;
  padding:10px 8px;font-size:14px;min-height:40px;justify-content:center;text-align:center}
@media (max-width:470px){
  .cp .mbar, .ev .mbar{display:grid;grid-template-columns:1fr 1fr}
  .cp .mbar .btn, .ev .mbar .btn{white-space:normal}
}

.cp .log{font-size:12.5px}
.cp .log .le{display:flex;gap:10px;padding:8px 0;border-bottom:1px solid var(--line)}
.cp .log .le:last-child{border-bottom:0}
.cp .log .lw{color:var(--muted3);white-space:nowrap;flex:0 0 auto}
.cp .log .lt b{color:var(--accent);font-weight:700}
@media (max-width:620px){
  .cp .pts{flex:0 1 auto;width:56px;min-width:46px}
  /*  V1037: the arrow alone on a phone. ~34px from the name instead of ~115px
      -- B3 exists because the name was the thing being cut, and a button won
      at the name's expense would put that straight back. */
  .cp .ph #cpBack .blbl{display:none}
  .cp .mini{padding:0 6px;gap:4px}
  .cp .log .le{flex-wrap:wrap;gap:3px}
}
@media (max-width:1180px){ .cp .c-lo{display:none} }
@media (max-width:900px){
  .cp .c-mid{display:none}
  .cp .hist table{display:none}
  .cp .hcards{display:block}
}

/*  V905 -- the accounting figure. His rule, and the same one Event Expenses has
    worn since V896: what you are down is red and in brackets, what you are up is
    green and plain, and a nil is neither. The brackets carry the sign, so the
    minus is dropped rather than doubled up.  */
.cp .brk{color:var(--bad,#d93025);font-weight:700}
.cp .zed{color:var(--muted3)}
.cp td.num .pos,.cp td.num .brk,.cp td.num .zed{white-space:nowrap}

/*  V905 -- the spectator. Everything below is the watch page only; the sheet
    itself is drawn by the rules above, unchanged, which is the whole point of
    having lifted them into a file both pages can wear.  */
.cp .lockrow{display:flex;gap:10px;flex-wrap:wrap}
/*  V1068: .72 -> .84. Measured, not guessed: at .72 the label came out at
    4.06:1 against the filled green, under WCAG's 4.5 floor, and test_v578's
    contrast sweep says so. The button is meant to read as unavailable and .84
    still does -- the lock glyph beside it is what actually carries that, which
    is the rule this project keeps: never colour alone. A pre-existing red,
    found by widening the audit for this release. */
.cp .gbtn.locked{opacity:.84;position:relative}
.cp .gbtn.locked .lock{margin-left:7px;font-size:12px;opacity:.85}
.cp .wbar{display:flex;gap:9px;flex-wrap:wrap;align-items:center}
.cp .wbar input{flex:0 1 190px}
.cp .wtag{display:inline-flex;align-items:center;gap:6px;font-size:11.5px;
  font-weight:700;letter-spacing:.05em;text-transform:uppercase;
  color:var(--muted2);border:1px solid var(--line);border-radius:999px;
  padding:3px 10px}
.cp .wtag i{width:6px;height:6px;border-radius:50%;background:var(--good,#0f9d58);
  font-style:normal;display:inline-block}
/*  The popup itself is NOT redeclared here. `.cp .modal`, `.cp .mcard` and
    `.cp .mbar` are already above -- centred since V904, four-in-a-row since V904 --
    and a second copy further down the file would silently win on source order and
    become the one nobody remembers editing. The spectator's sign-in box wears the
    rules the sheet's popups already wear.  */

/* ======================================================= V1031 ============ */

/*  V1032 --- THE ⋯ MENU'S STYLES ARE GONE, AND THEY TOOK A SECOND BUG WITH
    THEM. V1031 styled `.cp .menu` for the new header popup -- absolutely
    positioned, 212px wide, with a panel background and a shadow.

    `.cp .menu` WAS ALREADY TAKEN. Line 302: `.cp .menu{position:relative;
    flex:0 0 auto}` -- the wrapper around the ⋯ on every row of All games,
    since V904. So every one of those rows got a 212px absolutely-positioned
    panel where a 34px button used to be, which is the wide empty boxes and
    the horizontal scrollbar in his screenshot of that screen. He reported it
    as *"this 2nd screen ... is overflowing"* and it was never that screen's
    fault.

    The lesson is the plain one: a class name in a shared stylesheet is a
    global, and the new feature took a name the old one was using. Checking
    for `.menu` before adding rules for `.menu` costs one grep. */

/*  THE PLAYERS PANEL. The count rides the band row so the panel still says
    something useful while it is shut.

    `<div class="ph"><h2 class="sechd">` IS THE HOUSE SHAPE, not a choice --
    V977/V979/V980 run a heading census over every template and hold two rules:
    every heading is banded or named, and every BAND is or wraps a heading. A
    `div.sechd` with the words in it satisfies neither, and the census caught
    all three of this release's new panels doing exactly that. */
.cp .ph > .muted{margin-left:auto;white-space:nowrap}

/*  P2 -- ONE ROW PER PLAYER, his pick over the chips.
    FULL WIDTH IS THE POINT: a chip sizes to its text, so a long username and a
    26px button end up sharing one line and the button lands under a thumb
    aimed at the name. A row gives the name all the space there is and puts the
    control at the far end of it. */
.cp .plist{display:flex;flex-direction:column}
.cp .plist .pr{display:flex;align-items:center;gap:9px;padding:9px 0;
  border-bottom:1px solid var(--line)}
.cp .plist .pr:last-child{border-bottom:0}
.cp .plist .nm{flex:1 1 auto;min-width:0;font-weight:700;font-size:14px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/*  "sitting out since hand #3" rather than a 50% fade. V1031: a fade is a
    cue, not a label, and the one thing somebody checks this panel FOR is who
    is in -- which in Marriage is an arithmetic input, not a presentation. */
.cp .plist .sb2{display:block;font-weight:400;font-size:11.5px;color:var(--muted3);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.cp .plist .pr.out .nm{opacity:.6}
.cp .plist .tot{font-variant-numeric:tabular-nums;font-weight:700;font-size:13px;
  color:var(--muted2);flex:0 0 auto}
.cp .plist .tot.up{color:var(--good,#5fe3a1)}
.cp .plist .pr .btn{flex:0 0 auto;white-space:nowrap}

/*  MY MAAL, its own panel at the foot of the sheet. */
.cp .mlrow{align-items:flex-end;gap:9px}
.cp .mlbx{display:flex;flex-direction:column;gap:3px;flex:0 0 96px}
.cp .mlbx.grow{flex:1 1 200px;min-width:0}
.cp .mllb{font-size:10.5px;text-transform:uppercase;letter-spacing:.04em;
  color:var(--muted3);font-weight:700}
.cp #cpMaalNo{text-align:center}
.cp .mlhead{border-top:1px solid var(--line);border-bottom:0}
.cp .mlog .mr{display:flex;align-items:center;gap:9px;padding:8px 0;
  border-bottom:1px solid var(--line);font-size:13px}
.cp .mlog .mr:last-child{border-bottom:0}
.cp .mlog .mg{flex:1 1 auto;min-width:0;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}
.cp .mlog .mg b{font-weight:700}
.cp .mlog .mg small{display:block;font-size:11.5px;color:var(--muted3)}
.cp .mlog .mh{flex:0 0 auto;color:var(--muted2);font-variant-numeric:tabular-nums}

/*  V1066 --- EARLIER EVENINGS, FOLDED. His ask of 25-Oct reverses his own of
    18-Oct: the maal log is this evening only now. The history is not deleted,
    it is one press away, and the fold says how many are in there so the press
    is worth making. The nested list drops its top border -- it already has one
    from the wrapper above it, and two reads as an empty row. */
.cp .mlold-wrap{margin-top:9px;padding-top:9px;border-top:1px solid var(--line)}
.cp .mlold{color:var(--muted2)}
.cp .mlold.on{color:var(--text)}
.cp .mlold-list{margin-top:6px}
.cp .mlold-list .mr:first-child{padding-top:0}

/*  ======================================================= H2, PHONE ONLY ===
    THE HAND ROW OVERFLOWED, and he reported it with a screenshot: the name cut
    to `rajanbanjad…` and the flag pushed off the right edge.

    THE ARITHMETIC, because "make it smaller" was already tried. The row holds
    a name plus five controls; each `.mini` is 34px with a 6px gap, so the
    controls alone need 34*5 + 6*5 = 200px before the name gets anything. A
    320px phone has ~292px of card inside the page and panel padding. The
    existing phone rule shrank `.pts` from 64px to 56px -- 8px against a ~90px
    shortfall.

    SO THE ROW BECOMES TWO ROWS, which is H2 of the three he was shown: the
    name and the score box on the line you type on, and the five marks as one
    strip beneath that spans the card.

    THE STRIP IS A GRID AND NOT A FLEX ROW, deliberately: `1fr` columns make
    every mark the same width and the whole strip exactly as wide as the card,
    at any screen size, with no measurement and nothing to overflow. The marks
    get BIGGER on a bigger phone instead of leaving a gap at the end.

    LAPTOP IS UNTOUCHED. Everything here is inside the 620px query, so the
    three-across grid at >=720px keeps the single-line row it has always had. */
/*  `.marks` WRAPS THE FIVE MARK BUTTONS and is INVISIBLE on a laptop:
    `display:contents` means its children lay out as if it were not there, so
    the wide row is byte-for-byte the layout it has always had. The wrapper
    exists only so that one element can be moved as a block on a phone. */
.cp .pcard .marks{display:contents}

@media (max-width:620px){
  /*  Two rows. Line one is the name and the box you type in; line two is the
      strip of marks. */
  .cp .pcard .prow{display:grid;grid-template-columns:1fr auto;
    grid-template-areas:"nm pts" "mk mk";gap:0 8px;align-items:center}
  .cp .pcard .prow .pnm{grid-area:nm;min-width:0}
  .cp .pcard .prow .pts{grid-area:pts;width:92px;min-width:92px;height:38px;
    font-size:16px;flex:0 0 auto}
  /*  The strip: equal columns, exactly as wide as the card, at every width.
      Nothing to measure and nothing that can overflow. */
  .cp .pcard .marks{grid-area:mk;display:grid;grid-auto-flow:column;
    grid-auto-columns:1fr;margin-top:8px}
  .cp .pcard .marks .mini{width:100%;min-width:0;height:36px;padding:0;
    border-radius:0;border-left-width:0}
  .cp .pcard .marks .mini:first-child{border-left-width:1px;
    border-top-left-radius:9px;border-bottom-left-radius:9px}
  .cp .pcard .marks .mini:last-child{border-top-right-radius:9px;
    border-bottom-right-radius:9px}
  .cp .pcard .marks .hg{font-size:14px}
  /*  V1031 supersedes V920's 56px shrink: the box GROWS on a phone now, and
      the old rule would fight this one on specificity. */
  .cp .pts{flex:0 0 auto}

}

/*  THE GOLD BORDER ON THE SCORE BOX, V1031, WIDENED TO EVERY SCREEN IN V1035.

    HIS FIRST ASK: *"only the score input area to be golden bordered so that
    people will know where to enter the value..others to be as is.. in
    mobile"*. It was built inside the 620px query, because "in mobile" was
    half of what he asked and a laptop had not been mentioned.

    HIS SECOND, 19-Oct, WITH THE LAPTOP SHEET CIRCLED: *"i thought we agreed to
    make these also yellow lined box"*. So the rule was never about the phone;
    it is about a box that has to be told apart from five buttons of exactly
    its own size. That is as true at 1800px as at 360px -- on the laptop sheet
    there are THREE of these rows side by side, which is if anything more
    places for the eye to lose the one box you type in.

    SO THE RULE MOVED OUT OF THE QUERY RATHER THAN BEING COPIED INTO A SECOND
    ONE. Two blocks saying the same thing at two widths is how the two come to
    disagree -- and the phone block right above still owns the phone's SIZES,
    which genuinely do differ.

    ON `.pts` ALONE. The crown, D, eye, flag and hold keep `--line2` exactly as
    they are: a sheet where everything is gold marks nothing.

    A RING AS WELL AS A BORDER, 2px at 22% opacity. The border alone is one
    pixel of gold against a dark green card; next to five buttons of the same
    size it reads as a slightly different shade rather than as "type here".
    The ring is what makes it the thing you see first.

    NOT `:focus`. This marks where to enter a value BEFORE anybody has touched
    it -- a focus style would appear only once you had already found it, which
    is the opposite of the ask. The existing focus styling still applies on
    top. */
.cp .pcard .pts{border-color:var(--accent);
  box-shadow:0 0 0 2px color-mix(in srgb,var(--accent) 22%,transparent)}
/*  A player sitting out has no value to type, so the invitation goes with the
    rest of their row rather than pointing at a disabled box. */
.cp .pcard.held .pts{border-color:var(--line2);box-shadow:none}

/*  Ending the evening, at the foot of the settings screen (V1031). Set apart
    from the fields above it: those are typed and saved together, this one
    acts the moment it is pressed. */
.cp .endbar{margin-top:16px;padding-top:13px;border-top:1px solid var(--line)}
.cp .endbar .h3{font-size:11.5px;text-transform:uppercase;letter-spacing:.06em;
  color:var(--muted2);margin:0 0 8px;font-weight:700}

/*  V1032 --- DELETE, at the foot of the settings screen. Set apart from Close
    & settle by a line of its own: closing is reversible and routine, this one
    takes the evening off everybody's list. */
.cp .delbar{margin-top:14px;padding-top:12px;border-top:1px solid var(--line)}
.cp .btn.danger{border-color:#7a3030;color:#ffb3a7;background:#2a1414}
.cp .btn.danger:hover{border-color:#a04040}

/*  THE ALL GAMES ROWS RAN OFF THE RIGHT EDGE -- his screenshot, with a
    horizontal scrollbar under the list and each row's ⋯ pushed outside the
    panel. The row is a flex line of [tick] [name and meta] [⋯]; the middle
    cell had no `min-width:0`, so a long game name (`6th_floor_17thOct_2nd_
    Callbreak`) refused to shrink below its content and pushed the rest out.
    A flex item will not shrink past its content width without this -- the
    same fault, and the same one-line fix, as the roster row in V1031. */
/*  And a long game name is allowed to wrap rather than widen its row --
    `6th_floor_17thOct_2nd_Callbreak` is one unbreakable token to a browser,
    and a flex item will not shrink past its content without `min-width:0`. */
.cp .gpick .gn{min-width:0}
.cp .gpick .gn small,.cp .gpick .gn{overflow-wrap:anywhere}

/*  V1066 --- THE OWNER-VIEW BANNER (his Proposed B). On the spectator layout,
    and on HIS screen only -- the route decides, not the browser. Accent-edged
    rather than red: this is not a warning, it is a statement about which
    screen he is on, and a red strip over somebody's evening reads as an
    accusation about the evening. */
.cp .cwown{border-color:var(--accent);margin-bottom:12px}
.cp .cwown .pad{font-size:13px;line-height:1.55}
.cp .cwown b{color:var(--text)}

/*  V1066 --- V1061 FINDING #29: THE SETTLE-UP TABLE READS FROM YOUR SIDE.

    It was plain unsigned numbers on the one table somebody opens to find out
    whether they are handing money over or taking it, while every other figure
    in this tool is written from the reader's side. The figures go through
    `accM` now -- the tool's own money rule -- and the rows carry the side.

    THE ROW TINT IS FAINT ON PURPOSE. The figure is already coloured; a strong
    row behind it would be the same fact said twice and would fight the
    brackets, which are what actually carry the meaning when colour is not
    available. */
.cp .stnet{margin:0 0 10px;font-size:14.5px;font-weight:700}
.cp tr.stout td{background:color-mix(in srgb, var(--bad) 7%, transparent)}
.cp tr.stin td{background:color-mix(in srgb, var(--good) 7%, transparent)}

/*  V1066 --- V1061 FINDING #31: "HAND 3 OF 5" ON THE SCOREBOARD HEADER.

    The header line is `.muted` and stays `.muted`: the hand number is context,
    not an alarm, and it sits beside the rate. The one state that earns ink is
    the plan being done -- `.planfull` is the moment the host decides whether
    to close -- and even that is a colour and a weight on the same small text,
    not a badge. A table that wants a sixth hand is doing nothing wrong. */
.cp #cpRate.planfull{color:var(--good);font-weight:700}

/*  V1076 --- EACH PLAYER COLUMN ITS OWN COLOUR, his ask. By POSITION, so the
    colour is stable for a whole game: a reader who has learnt which column is
    whose keeps that across eight hands, which is the point of colouring them
    at all. Six hues, then they repeat -- more than six stop being
    distinguishable and start being decoration. Chosen to clear 4.5:1 on the
    board's own ground; the numbers below stay red/green, because sign is a
    different question from identity and must not be read as a name. */
#cardpoints #cpBoard th.cpn0, .floathead th.cpn0 { color: #7fd4ff; }
#cardpoints #cpBoard th.cpn1, .floathead th.cpn1 { color: #ffc46b; }
#cardpoints #cpBoard th.cpn2, .floathead th.cpn2 { color: #8fe3b8; }
#cardpoints #cpBoard th.cpn3, .floathead th.cpn3 { color: #ff9fd0; }
#cardpoints #cpBoard th.cpn4, .floathead th.cpn4 { color: #c4a7ff; }
#cardpoints #cpBoard th.cpn5, .floathead th.cpn5 { color: #ffe06b; }
#cardpoints #cpBoard th.cpn0 button, #cardpoints #cpBoard th.cpn1 button,
#cardpoints #cpBoard th.cpn2 button, #cardpoints #cpBoard th.cpn3 button,
#cardpoints #cpBoard th.cpn4 button, #cardpoints #cpBoard th.cpn5 button,
.floathead th[class*="cpn"] button { color: inherit; }
