/* Each format sits inside the existing daily game card and shares its ruler. */
.format-panel{margin:0 32px 26px;border:2px solid var(--ink,#1a1714);border-radius:12px;overflow:hidden;background:#faf6ed;text-align:left}
.format-eyebrow{font-size:10px;font-weight:800;letter-spacing:.1em;text-transform:uppercase;display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap}
.format-panel>.format-eyebrow{padding:15px 18px 0}
.format-footnote{font-size:11px!important;line-height:1.5!important;color:#666253;margin:10px 16px 14px!important;text-align:center}
.count-scene{display:block;width:min(100%,490px);margin:12px auto 0;padding:0 12px;max-height:255px}
.trivia-panel{display:flex;align-items:center;flex-wrap:wrap;gap:10px;padding:18px 20px;background:#efe6ce}
.trivia-panel>.format-eyebrow{padding:0}.trivia-panel p{width:100%;font-size:13px;margin:0}
.topic-stamp{padding:5px 9px;border:1px solid currentColor;border-radius:4px;font-size:11px;transform:rotate(-3deg);margin-left:auto}
.grocery-panel{background:#eaf0e3}.grocery-body{display:flex;align-items:center;gap:16px;padding:20px}
.grocery-bag{width:70px;flex-shrink:0}.grocery-product{flex:1}.grocery-product h3{font-family:inherit!important;font-size:20px!important;line-height:1.2;margin:0 0 8px!important}
.grocery-product p{font-size:14px;margin:0 0 7px}.grocery-product span{font-size:12px;font-weight:700}
.shelf-price{font-size:32px;white-space:nowrap;font-variant-numeric:tabular-nums}
.shelf-label{border-top:2px solid #1a1714;background:#fffdf4;padding:10px 16px;display:flex;justify-content:space-between;gap:8px;flex-wrap:wrap;font-size:10px;letter-spacing:.04em}
.compare-panel{background:#eee7f1}.comparison-pair{display:grid;grid-template-columns:1fr 88px 1fr;gap:10px;align-items:center;padding:20px;text-align:center}
.compare-letter{display:inline-grid;place-items:center;width:25px;height:25px;border:1px solid #1a1714;border-radius:50%;font-size:11px;font-weight:800;background:#fffaf4}
.comparison-pair h3{font-weight:700;margin:9px 0 0;font-family:inherit!important;font-size:16px!important;line-height:1.4!important}
.compare-center svg{display:block;width:62px;margin:auto}.compare-center b{display:block;font-size:26px;margin-top:5px}
.comparison-math{padding:15px 20px;border-top:1px solid #b8aebd;line-height:1.8;font-size:13px;text-align:center;background:#fff8}
.poll-panel{background:#e6edf0}.poll-panel h3{font-family:inherit!important;font-size:24px!important;text-align:center;margin:20px 10px 15px}
.people-grid{display:grid;grid-template-columns:repeat(20,1fr);gap:6px;max-width:440px;margin:16px auto;padding:0 16px}
.people-grid i{position:relative;display:block;height:18px;opacity:.5}.people-grid i:before{content:'';display:block;width:6px;height:6px;border-radius:50%;background:#92a2a8;margin:auto}
.people-grid i:after{content:'';display:block;width:10px;height:10px;border-radius:4px 4px 2px 2px;background:#92a2a8;margin:1px auto}
.people-grid i.selected{opacity:1}.people-grid i.selected:before,.people-grid i.selected:after{background:#b54b30}
.poll-result{display:flex;align-items:center;justify-content:center;gap:14px;margin:15px 0}.poll-result strong{font-size:52px;line-height:1}.poll-result small{font-size:25px}.poll-result span{max-width:100px;font-size:13px;line-height:1.4}
.reveal .source-link{display:block;margin-top:8px}.review-detail>.format-panel{margin:18px 0}
@media(max-width:600px){.format-panel{margin:0 18px 20px}.format-eyebrow{font-size:9px;letter-spacing:.05em}.grocery-body{gap:10px;padding:18px 12px}.grocery-bag{width:48px}.grocery-product h3{font-size:17px!important}.shelf-price{font-size:25px}.comparison-pair{padding:15px 10px;grid-template-columns:1fr 60px 1fr}.comparison-pair h3{font-size:13px!important}.compare-center svg{width:48px}.people-grid{gap:3px}.people-grid i:after{width:8px}.count-scene{max-height:none}}
.pile-panel{background:radial-gradient(ellipse at 50% 60%,#e7e1d4,#f8f4eb 75%)}
.pile-canvas{display:block;width:100%;height:auto;max-width:500px;aspect-ratio:450/370;margin:0 auto;cursor:grab;touch-action:pan-y}
.pile-canvas:active{cursor:grabbing}.pile-canvas:focus-visible{outline:3px solid #bd4932;outline-offset:-5px}
.pile-status{text-align:center;font-size:12px;font-weight:700;min-height:18px;margin:0 12px 13px}
.pile-tools{display:flex;justify-content:center;gap:8px;padding:0 12px}
.pile-tools button{border:1px solid #635c4f;border-radius:20px;background:#fffaf0;color:#26221d;padding:9px 13px;font-family:inherit;font-size:12px;font-weight:600;line-height:1.2;cursor:pointer;min-height:40px}
.pile-tools button:hover{background:#e6ddca}.pile-tools button:focus-visible{outline:3px solid #bd4932;outline-offset:2px}
.pile-count-grid{display:grid;grid-template-columns:repeat(10,1fr);gap:8px;max-width:480px;margin:20px auto;padding:0 18px}
.pile-count-grid span{aspect-ratio:1;display:grid;place-items:center;border-radius:50%;background:radial-gradient(circle at 30% 25%,#ffffff88,var(--ball-color) 65%,#302415);color:white;text-shadow:0 1px 3px #000;font-size:11px;font-weight:800}
.pile-total{text-align:center;margin-top:20px}.pile-total strong{font-size:54px;line-height:1;display:block}.pile-total span{font-size:13px}
@media(max-width:600px){.pile-tools{gap:5px;padding:0 8px}.pile-tools button{font-size:10px;padding:8px}.pile-count-grid{gap:5px;padding:0 12px}.pile-count-grid span{font-size:9px}}
.pile-count-grid .scene-object{position:relative;background:none;aspect-ratio:1;filter:drop-shadow(0 1px 1px #30241533)}
.pile-count-grid .scene-object svg{display:block;width:100%;height:100%}
.pile-count-grid .scene-object b{position:absolute;right:-2px;bottom:-3px;min-width:16px;height:16px;padding:0 2px;display:grid;place-items:center;background:#29231d;border:1px solid #fff6e7;border-radius:8px;font:700 9px/1 sans-serif;color:white;text-shadow:none}

/* ---------- per-format controls (public/controls/*) ----------
   Shared language across the two grid controls: an ink outline marks the band the
   player painted, a blue ground marks what the answer actually covers, so a cell
   that is both still reads as both. */
/* Three steps of ink: the crowd the guess is sure about, the band it is unsure about,
   and the room it leaves alone. The rail below sets the two edges. */
.poll-grid{display:grid;grid-template-columns:repeat(10,1fr);gap:4px;max-width:300px;margin:6px auto 0}
.poll-figure{aspect-ratio:1;display:grid;place-items:center;padding:2px;border:2px solid transparent;border-radius:7px;background:none}
.poll-figure svg{width:100%;height:100%;fill:var(--line);stroke:none}
.poll-figure.sure{background:var(--track)}
.poll-figure.sure svg{fill:var(--faint)}
.poll-figure.band{border-color:var(--ink);background:var(--track)}
.poll-figure.band svg{fill:var(--ink)}
.poll-figure.actual{background:var(--blue)}
.poll-figure.actual svg{fill:var(--white)}
#poll-rail{max-width:460px;margin:0 auto}
.tray-readout{text-align:center;font:600 12px var(--body);color:var(--muted);margin-top:14px;line-height:1.5}
.counting-tray{display:grid;gap:5px;max-width:430px;margin:6px auto 0;touch-action:none}
.tray-cell{aspect-ratio:1;display:grid;place-items:center;padding:2px;border:2px solid transparent;border-radius:8px;background:none;opacity:.45}
.tray-cell svg{width:100%;height:100%}
.tray-cell.inside{opacity:1;border-color:var(--ink);background:var(--track)}
.tray-cell.actual{opacity:1;background:var(--blue)}
.tray-cell:disabled{cursor:default}
.tray-dot{width:58%;aspect-ratio:1;border-radius:50%;background:var(--faint)}
.tray-cell.actual .tray-dot{background:var(--white)}
/* Price rail: the low tag hangs above the rail, the high tag below, so they never
   collide even when the guess is narrow. Positions come from the squared curve. */
/* Side padding is half a tag wide: a tag parked on either end still fits. */
.rail-control{margin-top:6px;padding:0 58px}
.rail{position:relative;height:168px;touch-action:none}
.rail::before{content:'';position:absolute;left:0;right:0;top:50%;height:12px;margin-top:-6px;border:var(--bw) solid var(--ink);border-radius:999px;background:var(--track)}
.rail-span{position:absolute;top:50%;height:12px;margin-top:-6px;border-radius:999px;background:var(--ink);z-index:1}
.rail-span.unset{display:none}
.rail-tag{position:absolute;z-index:2;transform:translateX(-50%);padding:5px 11px 7px;border:var(--bw) solid var(--ink);border-radius:12px;background:var(--white);box-shadow:3px 3px 0 var(--ink);color:inherit;text-align:center;cursor:grab;touch-action:none}
.rail-tag:active{cursor:grabbing}
.rail-tag::after{content:'';position:absolute;inset:-10px -14px}
/* The string ties the tag to the point on the rail it names. */
.rail-tag::before{content:'';position:absolute;left:50%;width:2px;height:22px;background:var(--ink)}
.rail-tag.low{bottom:calc(50% + 28px)}
.rail-tag.low::before{top:100%}
.rail-tag.high{top:calc(50% + 28px)}
.rail-tag.high::before{bottom:100%}
.rail-tag.ghost{background:var(--track);box-shadow:none}
.rail-tag:disabled{cursor:default;box-shadow:none;background:var(--paper)}
.rail-tag-label{display:block;font:700 10px var(--body);letter-spacing:.1em;text-transform:uppercase;color:var(--muted)}
.rail-tag-price{display:block;font:400 23px var(--display);line-height:1.1;letter-spacing:-.5px;font-variant-numeric:tabular-nums}
/* Blue is the answer everywhere else in the game, and it reads against the ink span. */
.rail-actual{position:absolute;top:50%;z-index:3;transform:translate(-50%,-50%);padding:3px 10px;border:var(--bw) solid var(--ink);border-radius:999px;background:var(--blue);color:var(--white);box-shadow:0 0 0 2px var(--paper);font:700 13px var(--body);font-variant-numeric:tabular-nums;white-space:nowrap}
.rail-actual[hidden]{display:none}
.rail-ticks{position:relative;height:18px;margin-top:3px}
.rail-ticks span{position:absolute;transform:translateX(-50%);font:600 11px var(--body);color:var(--muted);font-variant-numeric:tabular-nums;white-space:nowrap}
.rail-ticks span::before{content:'';position:absolute;left:50%;top:-7px;width:2px;height:5px;background:var(--line)}
.rail-hint{text-align:center;font:600 12px var(--body);color:var(--muted);margin-top:14px}
/* Fill meter: B is the tall box, copies of A stack up inside it from the floor. */
.fill-meter{display:flex;align-items:stretch;gap:20px;margin-top:6px}
.meter-b{position:relative;flex:none;width:132px;height:212px;overflow:hidden;border:var(--bw) solid var(--ink);border-radius:14px;background:var(--white)}
.meter-fill{position:absolute;left:0;right:0;bottom:0;display:flex;flex-wrap:wrap;align-content:flex-end;justify-content:center;gap:3px;padding:5px;overflow:hidden}
.meter-fill[hidden]{display:none}
.meter-fill.ghost{z-index:1;color:var(--faint);background:repeating-linear-gradient(45deg,var(--track) 0 6px,transparent 6px 12px);box-shadow:inset 0 2px 0 var(--line)}
.meter-fill.solid{z-index:2;color:var(--ink);background:var(--track);box-shadow:inset 0 2px 0 var(--ink)}
.meter-fill.packed{background-image:repeating-linear-gradient(90deg,currentColor 0 1px,transparent 1px 5px)}
.meter-fill.actual{z-index:3;border-top:var(--bw) solid var(--ink)}
.meter-fill.actual::before{content:'';position:absolute;inset:0;background:var(--blue);opacity:.28}
.meter-copy{flex:none;width:15px;height:15px}
.meter-side{flex:1;min-width:0;display:flex;flex-direction:column;justify-content:center;gap:9px}
.meter-b-label{font:400 22px var(--display);letter-spacing:-.6px}
/* The tray is painted a cell at a time, so a soft change reads well. The poll grid is driven
   by the rail and can turn over forty figures in one pointer move: at 120ms each, nothing ever
   finished fading and the whole crowd sat washed out for the length of the drag. */
@media(prefers-reduced-motion:no-preference){.tray-cell{transition:background .12s,border-color .12s,opacity .12s}}
@media(max-width:600px){
 .poll-grid{gap:3px;max-width:262px}.counting-tray{gap:3px}
 .rail-control{padding:0 48px}.rail{height:150px}.rail-tag{padding:4px 9px 6px}.rail-tag-price{font-size:19px}
 .fill-meter{gap:13px}.meter-b{width:104px;height:180px}.meter-b-label{font-size:19px}
}
@media(max-width:400px){.fill-meter{flex-direction:column;align-items:center}.meter-b{width:100%;max-width:220px;height:150px}.meter-side{width:100%}}

/* Numeric entry is an equivalent input path for every visual control. */
.numeric-entry{margin-top:8px}.numeric-hint{font-size:12px;color:var(--muted);margin:8px 0 20px}.range-inputs input{min-height:44px;min-width:0}.numeric-entry .number-field{min-width:0}
