/* viz.css — chart components + analytics/candidate module styles. Colours come from the dataviz reference palette (validated light + dark). */
.viz{--s1:#2a78d6;--s2:#eb6834;--s3:#1baf7a;--s4:#eda100;--s5:#e87ba4;--s6:#008300;--s7:#6250d6;--s8:#e34948;--grid:var(--line);--track:var(--surface-3);--on-heat:#fff}
:root[data-theme="dark"] .viz{--s1:#3987e5;--s2:#d95926;--s3:#199e70;--s4:#c98500;--s5:#d55181;--s6:#008300;--s7:#9085e9;--s8:#e66767}
.viz-wrap{position:relative;width:100%;min-width:0}
.viz svg{display:block;overflow:visible;font-family:var(--font)}
.viz-t{fill:var(--text-3);font-size:11px}.viz-t.v{fill:var(--text-2);font-weight:600}
.viz-grid{stroke:var(--grid);stroke-width:1}.viz-axis{stroke:var(--line-strong);stroke-width:1}
.viz-cross{stroke:var(--text-3);stroke-width:1;stroke-dasharray:3 3}
.viz-dot{stroke:var(--surface);stroke-width:2}
.viz-tip{position:absolute;z-index:5;pointer-events:none;transform:translate(-50%,-112%);background:var(--ink-2);color:#fff;padding:6px 9px;border-radius:var(--r-sm);font-size:12px;line-height:1.35;box-shadow:var(--shadow-md);white-space:nowrap}
:root[data-theme="dark"] .viz-tip{background:#e8ecf8;color:#0f172a}
.viz-tip b{font-weight:700}.viz-tip i{display:inline-block;width:8px;height:8px;border-radius:2px;margin-right:5px}
.viz-legend{display:flex;flex-wrap:wrap;gap:6px 14px;font-size:var(--fs-sm);color:var(--text-2);margin:0 0 var(--s-2)}
.viz-legend span{display:inline-flex;align-items:center;gap:6px}.viz-legend i{width:10px;height:10px;border-radius:3px;display:inline-block}
.viz-total{font-variant-numeric:tabular-nums}

/* entrance animations (duration scales with --dur → 0 under prefers-reduced-motion) */
@keyframes viz-up{from{transform:scaleY(0)}}@keyframes viz-right{from{transform:scaleX(0)}}@keyframes viz-fade{from{opacity:0}}
@keyframes viz-draw{from{stroke-dashoffset:1}}@keyframes viz-arc{from{stroke-dasharray:0 100}}
.viz .b-up,.viz .b-r,.viz .b-l{transform-box:fill-box;animation-duration:calc(var(--dur)*4);animation-timing-function:var(--ease);animation-fill-mode:backwards;animation-delay:calc(var(--i,0)*18ms)}
.viz .b-up{transform-origin:50% 100%;animation-name:viz-up}.viz .b-r{transform-origin:0 50%;animation-name:viz-right}.viz .b-l{transform-origin:100% 50%;animation-name:viz-right}
.viz .l-draw{stroke-dasharray:1;stroke-dashoffset:0;animation:viz-draw calc(var(--dur)*7) var(--ease) backwards}
.viz .a-fade{animation:viz-fade calc(var(--dur)*6) ease backwards;animation-delay:calc(var(--dur)*2)}
.viz .arc{animation:viz-arc calc(var(--dur)*6) var(--ease) backwards;animation-delay:calc(var(--i,0)*70ms);transition:stroke-width .15s}
.viz .arc:hover,.viz .arc.on{stroke-width:22}
.viz .cell{animation:viz-fade calc(var(--dur)*4) ease backwards;animation-delay:calc(var(--i,0)*8ms)}
.viz .mark:hover{filter:brightness(1.12)}
@media (prefers-reduced-motion:reduce){.viz *{animation:none!important;transition:none!important}}

/* horizontal bars */
.hb{display:flex;flex-direction:column;gap:2px}
.hb-row{display:block;width:100%;text-align:left;background:none;border:0;padding:6px 4px;border-radius:var(--r-sm);font:inherit;color:inherit;min-height:40px}
button.hb-row{cursor:pointer}button.hb-row:hover,.hb-row.on{background:var(--surface-3)}
.hb-top{display:flex;justify-content:space-between;gap:10px;font-size:var(--fs-sm);margin-bottom:3px}
.hb-top span:first-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}.hb-top .v{font-variant-numeric:tabular-nums;color:var(--text-2);flex:none}
.hb svg{width:100%;height:8px}

/* donut layout + data table */
.donut-box{display:flex;gap:var(--s-4);align-items:center;flex-wrap:wrap}.donut-box>svg{flex:none}
.donut-legend{flex:1;min-width:150px;display:flex;flex-direction:column;gap:6px;font-size:var(--fs-sm)}
.donut-legend div{display:flex;align-items:center;gap:8px}.donut-legend i{width:10px;height:10px;border-radius:3px;flex:none}.donut-legend b{margin-left:auto;font-variant-numeric:tabular-nums}
.vtable{width:100%;border-collapse:collapse;font-size:var(--fs-sm);margin-top:var(--s-2)}
.vtable th,.vtable td{padding:5px 8px;border-bottom:1px solid var(--line);text-align:left;font-variant-numeric:tabular-nums}.vtable th{color:var(--text-3);font-weight:600}
.vtable-wrap{max-height:260px;overflow:auto}

/* module layout */
.an-grid{display:grid;gap:var(--s-4);grid-template-columns:minmax(0,1fr)}
@media(min-width:900px){.an-grid.two{grid-template-columns:repeat(2,minmax(0,1fr))}.an-grid .span2{grid-column:span 2}}
.an-stats{display:grid;gap:var(--s-3);grid-template-columns:repeat(2,minmax(0,1fr))}
@media(min-width:700px){.an-stats{grid-template-columns:repeat(4,minmax(0,1fr))}}
.an-bar{display:flex;gap:var(--s-3);flex-wrap:wrap;align-items:flex-end}.an-bar>*{flex:1 1 180px;min-width:0}
.prog{height:6px;border-radius:3px;background:var(--track);overflow:hidden}.prog>div{height:100%;background:var(--brand);transition:width .2s}
.sub-nav{display:flex;gap:6px;overflow-x:auto;padding:2px 0 var(--s-3);scrollbar-width:none}.sub-nav::-webkit-scrollbar{display:none}.sub-nav .chip{flex:none}
.range-row{display:flex;gap:var(--s-2);align-items:flex-end;flex-wrap:wrap}.range-row>*{flex:1 1 90px}
.rowline{display:flex;align-items:center;gap:var(--s-3);padding:10px 2px;border-bottom:1px solid var(--line);min-height:48px}.rowline:last-child{border-bottom:0}
.rowline .grow{min-width:0}.rowline .t{font-weight:600;overflow:hidden;text-overflow:ellipsis}.rowline .s{font-size:var(--fs-xs);color:var(--text-3)}
.map-box{height:360px;border-radius:var(--r-md);overflow:hidden;border:1px solid var(--line);background:var(--surface-3)}
.sel-list{display:flex;flex-direction:column;gap:2px;max-height:320px;overflow:auto}

/* voter slips */
.slip-sheet{display:none}
.slip{border:1.5px solid #222;border-radius:6px;padding:8px 10px;display:flex;gap:8px;align-items:center;background:#fff;color:#000;break-inside:avoid;font-family:var(--font)}
.slip .qr{width:84px;height:84px;flex:none}.slip .qr svg{width:100%;height:100%;display:block}
.slip .info{flex:1;min-width:0;font-size:11px;line-height:1.35}.slip .info b{font-size:13px;display:block}.slip .info .k{color:#555}
.slip-preview{display:grid;gap:var(--s-3);grid-template-columns:repeat(auto-fill,minmax(260px,1fr))}
.print-only{display:none}
@media print{
  @page{size:A4;margin:8mm}
  body.printing-slips>*:not(.slip-sheet){display:none!important}
  body.printing-slips{background:#fff!important}
  body.printing-slips .slip-sheet{display:block}
  .slip-sheet .page{display:grid;grid-template-columns:1fr 1fr;grid-auto-rows:66mm;gap:4mm;page-break-after:always;break-after:page}
  .slip-sheet .page:last-child{page-break-after:auto;break-after:auto}
  .slip-sheet.single .page{grid-template-columns:90mm;grid-auto-rows:60mm}
  .slip-sheet .slip{height:100%;box-sizing:border-box}.slip-sheet .slip .qr{width:24mm;height:24mm}
  .slip-sheet .slip .info{font-size:10pt}.slip-sheet .slip .info b{font-size:12pt}
}
.big-num{font-size:clamp(2rem,8vw,2.75rem);font-weight:800;line-height:1.1;display:flex;align-items:baseline;gap:6px}
.h2{font-size:var(--fs-lg,1.15rem);font-weight:700;margin:0}
