.ballot-machine{--ballot-frame-bg:#d6dad6;--ballot-panel-bg:#e7ecea;--ballot-divider:#fff;--ballot-light-off:#5a1f2c;--ballot-light-on:#1ec373;--ballot-vote-idle:#2e6b8a;--ballot-text:#1c2530;--ballot-muted:#5a6470;--ballot-shadow:0 8px 24px #141e282e;flex-direction:column;gap:16px;width:100%;max-width:560px;margin:0 auto;display:flex}.ballot-frame{background:var(--ballot-frame-bg);box-shadow:var(--ballot-shadow);border:1px solid #b8bdb8;border-radius:18px;padding:14px 14px 18px;position:relative}.ballot-frame-header{justify-content:space-between;align-items:center;padding:4px 6px 12px;display:flex}.ballot-status,.ballot-title{color:var(--ballot-text);align-items:center;gap:8px;font-size:.95rem;font-weight:600;display:inline-flex}.ballot-status-label,.ballot-title-label{letter-spacing:.02em}.ballot-status-light{background:#2e6b8a;border-radius:50%;width:14px;height:14px;transition:background .2s,box-shadow .2s;box-shadow:inset 0 1px 2px #0000004d}.ballot-status-light[data-on]{background:var(--ballot-light-on);box-shadow:0 0 8px var(--ballot-light-on), inset 0 1px 1px #fff6}.ballot-title-port{background:#1c2530;border-radius:4px;width:22px;height:12px}.ballot-body{background:var(--ballot-panel-bg);border:1px solid #c5cac5;border-radius:14px;padding:14px}.ballot-candidate-panel{flex-direction:column;gap:12px;display:flex}.ballot-active-seat{color:var(--ballot-text);letter-spacing:-.01em;margin:0;padding:4px 6px;font-size:1.05rem;font-weight:800}.ballot-empty-msg{color:var(--ballot-muted);margin:0;padding:4px 6px;font-size:.95rem;font-style:italic;font-weight:500}.ballot-rows{flex-direction:column;gap:6px;display:flex}.ballot-row{cursor:pointer;text-align:left;touch-action:manipulation;background:#fff;border:1px solid #cdd2d0;border-radius:10px;grid-template-columns:1fr auto auto;align-items:center;gap:12px;min-height:56px;padding:10px 12px;font-family:inherit;transition:border-color .15s,transform .1s,box-shadow .15s;display:grid}.ballot-row:disabled{cursor:not-allowed;opacity:.55;background:#f4f6f5}.ballot-row:not(:disabled):active{transform:scale(.985)}.ballot-row:not(:disabled):focus-visible{outline-offset:2px;outline:3px solid #2563eb}.ballot-row[data-selected]{border-color:var(--ballot-text);box-shadow:0 4px 12px #141e281f}.ballot-row-name-cell{flex-direction:column;gap:2px;min-width:0;display:flex}.ballot-row-name{color:var(--ballot-text);text-overflow:ellipsis;white-space:nowrap;font-size:.95rem;font-weight:700;overflow:hidden}.ballot-row-alliance{letter-spacing:.05em;text-transform:uppercase;font-size:.78rem;font-weight:700}.ballot-row-light{background:var(--ballot-light-off);border-radius:50%;flex-shrink:0;width:14px;height:14px;transition:background .2s,box-shadow .2s;box-shadow:inset 0 1px 2px #0006}.ballot-row-light[data-on]{background:var(--ballot-light-on);box-shadow:0 0 10px var(--ballot-light-on), inset 0 1px 1px #ffffff80}.ballot-row-vote-btn{background:var(--ballot-vote-idle);border-radius:14px;flex-shrink:0;width:56px;height:28px;transition:background .2s,box-shadow .2s,transform .2s;position:relative}.ballot-row-vote-btn[data-selected]{animation:2.2s ease-in-out infinite ballot-vote-pulse}@keyframes ballot-vote-pulse{0%,to{transform:scale(1)}50%{transform:scale(1.04)}}@media (prefers-reduced-motion:reduce){.ballot-row-vote-btn[data-selected]{animation:none}}.ballot-confirmation{text-align:center;color:var(--ballot-text);background:#fff;border:1px solid #cdd2d0;border-radius:10px;justify-content:center;align-items:center;min-height:3.4em;margin:6px 0 0;padding:4px 14px;font-size:1rem;font-weight:600;display:flex}.ballot-confirmation.is-empty{color:var(--ballot-muted);font-style:italic;font-weight:500}.ballot-confirmation-pill{letter-spacing:.04em;border-radius:999px;margin-left:4px;padding:4px 14px;font-size:.95rem;font-weight:800;display:inline-block}.ballot-confirmation-icon{vertical-align:-.9em;width:auto;height:2.8em;margin-left:6px}.district-tally-row{flex-wrap:wrap;justify-content:center;align-items:center;gap:4px;margin-top:4px;display:flex}.district-tally-mini{letter-spacing:.02em;color:#fff;border-radius:999px;align-items:center;gap:3px;padding:1px 6px;font-size:.7rem;font-weight:700;line-height:1.4;display:inline-flex}.district-tally-mini-label,.district-tally-mini-count{display:inline}.district-tally-empty{color:var(--muted,#5a6470);font-size:.7rem;font-style:italic;font-weight:600}@media (max-width:480px){.district-tally-row{gap:3px;margin-top:3px}.district-tally-mini{letter-spacing:0;border-radius:4px;justify-content:center;gap:0;min-width:18px;padding:1px 5px;font-size:.78rem;line-height:1.3}.district-tally-mini-label{display:none}.district-tally-empty{font-size:.65rem}.district-workspace[data-workspace-tab=expert] .ballot-machine-wrap,.district-workspace[data-ballot-mode] .candidate-strip-inner{display:none}}@media (min-width:481px){.district-workspace[data-ballot-mode]{grid-template-columns:40% 60%;align-items:stretch;gap:12px}.district-workspace[data-ballot-mode] .ballot-machine-wrap{justify-content:center;align-items:center;display:flex}.district-workspace[data-ballot-mode] .ballot-machine{width:100%;max-width:100%;margin:0}.district-workspace[data-ballot-mode] .constituency-panel{margin-left:0}.district-workspace[data-ballot-mode] .ballot-frame{border-radius:22px;padding:18px 18px 22px}.district-workspace[data-ballot-mode] .ballot-body{border-radius:16px;padding:18px}.district-workspace[data-ballot-mode] .ballot-active-seat{padding:6px 8px;font-size:1.25rem}.district-workspace[data-ballot-mode] .ballot-row{gap:14px;min-height:64px;padding:14px 16px}.district-workspace[data-ballot-mode] .ballot-row-name{font-size:1.05rem}.district-workspace[data-ballot-mode] .ballot-row-alliance{font-size:.85rem}.district-workspace[data-ballot-mode] .ballot-row-light{width:18px;height:18px}.district-workspace[data-ballot-mode] .ballot-row-vote-btn{border-radius:17px;width:70px;height:34px}.district-workspace[data-ballot-mode] .ballot-confirmation{min-height:3.4em;padding:4px 16px;font-size:1.1rem}.district-workspace[data-ballot-mode] .ballot-confirmation-pill{padding:5px 16px;font-size:1rem}.district-workspace[data-ballot-mode] .ballot-frame-header{padding:4px 8px 14px}.district-workspace[data-ballot-mode] .ballot-status,.district-workspace[data-ballot-mode] .ballot-title{font-size:1.05rem}.district-workspace[data-ballot-mode] .ballot-status-light{width:16px;height:16px}}@media (max-width:480px){.ballot-machine{max-width:100%}.ballot-frame{border-radius:14px;padding:10px 10px 14px}.ballot-body{border-radius:10px;padding:10px}.ballot-row{gap:10px;min-height:52px;padding:8px 10px}.ballot-row-name{font-size:.9rem}.ballot-row-vote-btn{width:48px;height:24px}.ballot-active-seat{font-size:1rem}}
.qp-tab{flex-direction:column;gap:12px;max-width:480px;margin:0 auto;padding:12px 20px;display:flex;position:relative}.qp-header{text-align:center}.qp-title{color:#0f172a;letter-spacing:-.01em;margin:0 0 6px;font-size:22px;font-weight:800}.qp-subtitle{color:#94a3b8;margin:0;font-size:12px;line-height:1.3}.qp-inputs{flex-direction:column;gap:10px;display:flex}.qp-input-group{border-radius:12px;align-items:stretch;display:flex;overflow:hidden;box-shadow:0 0 0 2px #3c3c3d}.qp-label{letter-spacing:.06em;color:#fff;background:#64748b;flex-shrink:0;justify-content:center;align-items:center;width:30%;padding:12px 8px;font-size:18px;font-weight:800;display:flex}.qp-input-group[data-alliance=ldf] .qp-label{background:#dc2626}.qp-input-group[data-alliance=udf] .qp-label{background:#2563eb}.qp-input-group[data-alliance=nda] .qp-label{background:#ea580c}.qp-input-group[data-alliance=others] .qp-label{background:#64748b}.qp-input{text-align:center;color:#0f172a;appearance:textfield;background:#fff;border:none;outline:none;flex:1;padding:12px 8px;font-size:24px;font-weight:800}.qp-input::-webkit-inner-spin-button{appearance:none;margin:0}.qp-input::-webkit-outer-spin-button{appearance:none;margin:0}.qp-input:focus{background:#f0f4ff}.qp-value-display{text-align:center;color:#0f172a;background:#f8fafc;flex:1;padding:12px 8px;font-size:24px;font-weight:800}.qp-bar-chart{background:#d6d9de;border-radius:12px;flex-direction:column;gap:8px;margin-top:4px;padding:12px 14px;display:flex}.qp-bar-row{align-items:center;gap:10px;display:flex}.qp-bar-label{letter-spacing:.1em;color:#94a3b8;flex-shrink:0;width:52px;font-size:11px;font-weight:800}.qp-bar-track{background:#f1f5f9;border-radius:999px;flex:1;height:16px;overflow:hidden}.qp-bar-fill{border-radius:999px;min-width:0;height:100%;transition:width .25s}.qp-bar-row[data-alliance=ldf] .qp-bar-label{color:#dc2626}.qp-bar-row[data-alliance=udf] .qp-bar-label{color:#2563eb}.qp-bar-row[data-alliance=nda] .qp-bar-label{color:#ea580c}.qp-bar-row[data-alliance=others] .qp-bar-label{color:#64748b}.qp-bar-row[data-alliance=ldf] .qp-bar-fill{background:#dc2626}.qp-bar-row[data-alliance=udf] .qp-bar-fill{background:#2563eb}.qp-bar-row[data-alliance=nda] .qp-bar-fill{background:#ea580c}.qp-bar-row[data-alliance=others] .qp-bar-fill{background:#64748b}.qp-bar-count{color:#475569;text-align:right;flex-shrink:0;width:28px;font-size:13px;font-weight:700}.qp-sum-row{justify-content:center;display:flex}.qp-sum{color:#94a3b8;letter-spacing:.04em;background:#f1f5f9;border-radius:999px;padding:4px 14px;font-size:13px;font-weight:700;transition:background .2s,color .2s}.qp-sum--ok{color:#16a34a;background:#dcfce7}.qp-sum--off{color:#92400e;background:#fef9c3}.qp-error{text-align:center;color:#dc2626;background:#fef2f2;border:1px solid #fecaca;border-radius:8px;margin:0;padding:10px 14px;font-size:13px;font-weight:600}.qp-actions{justify-content:center;display:flex}.qp-btn{letter-spacing:.06em;cursor:pointer;border:none;border-radius:999px;padding:14px 48px;font-size:16px;font-weight:800;transition:opacity .15s,transform .12s}.qp-btn:active{transform:scale(.97)}.qp-btn:disabled{opacity:.55;cursor:not-allowed;transform:none}.qp-btn--login{color:#fff;background:#0f172a}.qp-btn--share{color:#fff;background:#2563eb;box-shadow:0 4px 16px #2563eb59}.qp-loading-body{color:#475569;flex-direction:column;justify-content:center;align-items:center;gap:14px;padding:32px 24px;font-size:14px;font-weight:600;display:flex}.qp-loading-spinner{border:3px solid #e2e8f0;border-top-color:#2563eb;border-radius:50%;width:36px;height:36px;animation:.7s linear infinite qp-spin}@keyframes qp-spin{to{transform:rotate(360deg)}}.qp-preview-backdrop{z-index:100;background:#000000a6;justify-content:center;align-items:center;padding:16px;display:flex;position:fixed;inset:0}.qp-preview-popup{background:#fff;border-radius:16px;flex-direction:column;width:100%;max-width:400px;display:flex;overflow:hidden;box-shadow:0 24px 64px #0006}.qp-preview-header{border-bottom:1px solid #e2e8f0;justify-content:space-between;align-items:center;padding:14px 16px;display:flex}.qp-preview-title{color:#0f172a;margin:0;font-size:15px;font-weight:700}.qp-preview-close{cursor:pointer;color:#64748b;background:0 0;border:none;border-radius:6px;padding:4px 8px;font-size:18px}.qp-preview-close:hover{background:#f1f5f9}.qp-preview-image{aspect-ratio:1080/1600;object-fit:cover;width:100%;display:block}.qp-preview-share-btn{color:#fff;cursor:pointer;letter-spacing:.04em;background:#2563eb;border:none;padding:16px;font-size:16px;font-weight:700;transition:background .15s}.qp-preview-share-btn:hover{background:#1d4ed8}@media (max-width:400px){.qp-inputs{grid-template-columns:repeat(2,1fr)}.qp-input,.qp-value-display{padding:12px 4px;font-size:24px}}
