:root{--bg: #f5f6f8;--card: #fff;--text: #1f2328;--muted: #5f6672;--line: #d9dde3;--accent: #1f6feb;--accent-dark: #1858c4;--warn: #c2410c;--warn-bg: #fff4e5;--check-bg: #fdecec;--changed-bg: #e7f0ff;--ok: #15803d;--ok-bg: #e8f6ec;font-family:system-ui,-apple-system,Segoe UI,Roboto,sans-serif;font-size:14px;color:var(--text);background:var(--bg)}*{box-sizing:border-box}body{margin:0}h1{font-size:22px;margin:0}h2{font-size:18px;margin:0 0 12px}a{color:var(--accent);text-decoration:none}a:hover{text-decoration:underline}input,textarea,button,select{font:inherit}input,textarea{border:1px solid var(--line);border-radius:6px;padding:7px 9px;background:#fff;width:100%}input:focus,textarea:focus{outline:2px solid #b6d0ff;border-color:var(--accent)}button,.button{border:1px solid var(--line);background:#fff;border-radius:6px;padding:7px 12px;cursor:pointer;white-space:nowrap;display:inline-block}a,button,.button,input,textarea,select,.chip{transition:color .15s ease,background-color .15s ease,border-color .15s ease,box-shadow .15s ease,outline-color .15s ease,opacity .15s ease,transform .08s ease}button:hover,.button:hover{border-color:#b8bec7}button:active:not(:disabled),.button:active,.chip:active{transform:scale(.96)}button:focus:not(:focus-visible),.chip:focus:not(:focus-visible){outline:none}@media(prefers-reduced-motion:reduce){*,*:before,*:after{transition:none!important}button:active:not(:disabled),.button:active,.chip:active,input[type=checkbox]:active{transform:none}}button:disabled{opacity:.55;cursor:default}button.primary{background:var(--accent);border-color:var(--accent);color:#fff}button.primary:hover:not(:disabled){background:var(--accent-dark)}button.link{border:none;background:none;color:var(--accent);padding:0 4px}button.link:hover:not(:disabled){color:var(--accent-dark)}button.danger{color:#b91c1c}button.danger:hover:not(:disabled){background:var(--check-bg);border-color:#f3b4b4}button.mini{padding:1px 8px;font-size:12px;line-height:20px}button.confirm{transition:background-color .2s ease,border-color .2s ease,color .2s ease}button.confirm:hover{background:var(--ok);border-color:var(--ok);color:#fff}button.ghost{border-color:transparent;background:transparent;color:var(--accent);text-decoration:underline dotted}.muted{color:var(--muted)}.error{color:#b91c1c;margin:6px 0}.center{min-height:100vh;display:grid;place-items:center}.spacer{flex:1}.topbar{display:flex;gap:18px;align-items:center;padding:10px 20px;background:#fff;border-bottom:1px solid var(--line)}.topbar nav{display:flex;gap:14px}.brand{font-weight:600;color:var(--text)}.page{padding:18px 20px}.page-head{display:flex;gap:10px;align-items:center;margin-bottom:12px;flex-wrap:wrap}.card{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:24px}.login{width:340px;display:grid;gap:12px}label{display:grid;gap:4px;font-size:13px;color:#374151}label.inline{display:flex;gap:6px;align-items:center}label.inline input{width:auto}table.list{width:100%;border-collapse:collapse;background:#fff;border:1px solid var(--line)}table.list th,table.list td{text-align:left;padding:8px 10px;border-bottom:1px solid #eceef1;vertical-align:top}table.list th{background:#f0f2f5;font-weight:600;font-size:12px;color:#4b5563}tr.noreason td{background:#fffaf0}.empty{padding:30px;text-align:center;color:var(--muted);background:#fff;border:1px dashed var(--line);border-radius:8px}.badge{display:inline-block;padding:2px 9px;border-radius:999px;font-size:12px;background:#eef0f3}.badge.warn{background:var(--warn-bg);color:var(--warn)}.badge.ok{background:var(--ok-bg);color:var(--ok)}.badge.info{background:var(--changed-bg);color:#1e40af}.modal-bg{position:fixed;top:0;right:0;bottom:0;left:0;background:#0f172a59;display:grid;place-items:center;z-index:50}.modal{background:#fff;border-radius:10px;padding:20px;width:min(520px,94vw);display:grid;gap:12px;max-height:92vh;overflow:auto}.modal.wide{width:min(1200px,96vw)}.modal .scroll{max-height:60vh;overflow:auto}.actions{display:flex;gap:8px;justify-content:flex-end;flex-wrap:wrap}.reason .diff{display:flex;gap:16px;flex-wrap:wrap;background:#f6f7f9;padding:8px 10px;border-radius:6px}.reason .diff .new{color:var(--accent)}.reasons{display:flex;flex-wrap:wrap;gap:6px}.chip{display:inline-flex;align-items:center;padding:5px 11px;border:1px solid var(--line);border-radius:999px;cursor:pointer;font-size:13px}.chip input{display:none}.chip.active{background:var(--accent);border-color:var(--accent);color:#fff}.chip.active .muted{color:inherit;opacity:.8}.reasons:focus{outline:none}.dropzone{border:2px dashed #b8c2d0;border-radius:10px;padding:28px;text-align:center;cursor:pointer;display:grid;gap:6px;background:#fafbfc}.dropzone.over{border-color:var(--accent);background:#eef4ff}.file-list{margin:0;padding-left:18px;max-height:180px;overflow-y:auto;overflow-x:hidden;font-size:13px;overflow-wrap:anywhere}.report{background:#f6f7f9;border-radius:6px;padding:10px}.warnings{margin:0;padding-left:18px;color:var(--warn)}.toolbar{display:flex;gap:16px;align-items:flex-end;flex-wrap:wrap;margin-bottom:8px}.invoice{width:200px}.progress{display:flex;align-items:center;gap:8px;font-size:13px}.progress .bar{width:200px;height:8px;background:#e5e7eb;border-radius:4px;overflow:hidden}.progress .bar div{height:100%;background:var(--accent);transition:width .3s}.status-row{display:flex;flex-wrap:wrap;align-items:center;gap:0 18px}.status-row .todo-bar{margin-bottom:4px}.upload-summary{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--ok)}.upload-summary.warn{color:var(--warn)}.upload-summary.neutral{color:var(--muted)}.chips{display:flex;gap:6px;flex-wrap:wrap}.legend{font-size:12px;display:flex;gap:6px;align-items:center;flex-wrap:wrap;margin-bottom:6px}.sw{display:inline-block;width:14px;height:14px;border-radius:3px;margin-left:8px}.sw.required{background:var(--warn-bg);box-shadow:inset 0 0 0 2px #fb923c}.sw.changed{background:var(--changed-bg);box-shadow:inset 0 0 0 1px #93b4f5}.sw.rule{background:var(--changed-bg);outline:1px dashed var(--accent);outline-offset:-1px}.sw.check{background:var(--check-bg)}.sw.tube{background:#f3effc;box-shadow:inset 0 0 0 1px #d6caf2}.work{display:grid;grid-template-columns:1fr;gap:12px}.work.with-drawer{grid-template-columns:1fr 400px}.grid-wrap{height:var(--grid-h, calc(100vh - 250px) );min-height:320px}.grid-area{position:relative;min-width:0}.grid-empty{position:absolute;top:60px;right:0;bottom:0;left:0;display:flex;align-items:flex-start;justify-content:center;padding-top:60px;pointer-events:none}.grid-empty-box{pointer-events:auto;display:grid;gap:8px;justify-items:center;text-align:center;font-size:14px}.grid-drop{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;align-items:center;justify-content:center;border:2px dashed var(--accent);border-radius:10px;background:#eef4ffd9;font-weight:600;pointer-events:none}.drawer{background:#fff;border:1px solid var(--line);border-radius:10px;padding:12px;overflow:auto;height:var(--grid-h, calc(100vh - 250px) );display:grid;gap:10px;align-content:start}.drawer-head{display:flex;justify-content:space-between;gap:8px}.drawer img{width:100%;border:1px solid var(--line);border-radius:6px;cursor:zoom-in}.status-box{padding:8px 10px;border-radius:6px;background:#f6f7f9;font-size:13px}.row-numbers{display:grid;grid-template-columns:repeat(24,1fr);gap:4px}.rn{display:flex;flex-direction:column;justify-content:space-between;gap:6px;padding:6px 8px 5px;border:1px solid #e3e6ea;border-radius:6px;min-width:0}.rn-label{font-size:11px;line-height:13px;color:var(--muted);letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.rn-value{font-size:16px;line-height:20px;font-weight:600;font-variant-numeric:tabular-nums;white-space:nowrap}.rn.text .rn-value{white-space:normal;overflow-wrap:anywhere}.rn.changed .rn-value{color:var(--accent)}.rn.missing{background:var(--warn-bg);border-color:#f7c99b}.rn.missing .rn-value{color:var(--warn);font-weight:500;font-size:13px;line-height:16px;white-space:normal}table.kv{border-collapse:collapse;font-size:13px;width:100%}table.kv td{padding:5px 8px 5px 0;border-bottom:1px solid #eceef1;vertical-align:top}table.kv td:first-child{color:var(--muted);width:44%}table.kv tr:last-child td{border-bottom:none}table.kv tr.changed td:nth-child(2){color:var(--accent);font-weight:600}.inline-form{display:flex;gap:8px;margin:10px 0 14px;max-width:760px}.row-check{background:var(--check-bg)!important}.row-tube{background:#f3effc!important}.row-unsupported{background:#f1f2f4!important;color:var(--muted)}.row-busy{color:var(--muted);font-style:italic}.cell-required{background:var(--warn-bg)!important;box-shadow:inset 0 0 0 2px #fb923c}.cell-changed{background:var(--changed-bg)!important;font-weight:600}.cell-rule{background:var(--changed-bg)!important;font-weight:600;outline:1px dashed var(--accent);outline-offset:-3px}.cell-unsaved{font-style:italic;background-image:repeating-linear-gradient(135deg,transparent 0 5px,rgba(194,65,12,.12) 5px 7px)!important}.cell-noreason:after{content:"?";position:absolute;right:3px;top:1px;font-size:10px;color:var(--warn);font-weight:700}.ag-tooltip{white-space:pre-line;max-width:440px;overflow-wrap:break-word}.num{text-align:right;font-variant-numeric:tabular-nums}.status-cell{display:flex;gap:6px;align-items:center;height:100%;overflow:hidden}.repeat-mark{display:inline-block;width:4px;height:14px;border-radius:2px;background:var(--accent);vertical-align:-2px}.status-cell .repeat-mark{position:absolute;left:0;top:6px;bottom:6px;width:3px;height:auto}.grid-input{width:100%;height:100%;border:none;border-radius:0;padding:0 8px}.grid-input[list]::-webkit-calendar-picker-indicator{display:none!important}.grid-input[list]::-webkit-list-button{display:none!important}.toast.sticky{white-space:pre-line;padding-right:36px;max-height:50vh;overflow-y:auto}.toast-close{position:absolute;top:6px;right:8px;background:none;border:none;color:#fff;font-size:18px;cursor:pointer}.toast{position:fixed;bottom:20px;left:50%;transform:translate(-50%);background:#111827;color:#fff;padding:10px 16px;border-radius:8px;z-index:60;max-width:80vw}button.danger{color:#b91c1c;border-color:#f3c2c2;justify-self:start}.open-card{display:inline-flex;align-items:center;gap:3px;height:24px;padding:0 5px;margin-top:5px;line-height:22px;border-color:#cfdcf3;background:#f3f7ff;color:var(--accent);font-size:13px;font-variant-numeric:tabular-nums}.open-card svg{flex:none;opacity:.85}.open-card:hover{background:var(--accent);border-color:var(--accent);color:#fff}.open-card:hover svg{opacity:1}.open-card:active{transform:scale(.92)}.card-section{border-top:1px solid #eceef1;padding-top:10px;margin-top:2px}.preview-caption{display:grid;gap:4px;font-size:13px;margin-top:-2px}.legend-red{display:flex;align-items:center;gap:6px;font-weight:500}.sw-red{width:14px;height:10px;border-radius:2px;background:#dc26261f;box-shadow:inset 0 0 0 1.5px #dc2626;flex:none}.caption-note{color:var(--warn)}.keep-row{display:flex;align-items:center;justify-content:space-between;gap:4px 8px}.keep-row label.keep{flex:1 1 auto;min-width:0;flex-wrap:nowrap;color:var(--text);font-weight:500}.keep-row .keep-date{white-space:nowrap;font-size:12px}.keep-row .keep-date{margin-left:auto}.card-actions{display:flex;justify-content:space-between;gap:8px;flex-wrap:wrap;border-top:1px solid #eceef1;padding-top:12px;margin-top:4px}.card-actions button{font-size:13px;padding:6px 12px}.card-actions button:hover:not(:disabled){background:#f0f4ff;border-color:#9fbdf2;color:var(--accent-dark);box-shadow:0 1px 3px #0f172a14}.card-actions button.danger:hover:not(:disabled){background:var(--check-bg);border-color:#e99a9a;color:#991b1b}.card-actions button:active:not(:disabled){transform:scale(.95);box-shadow:none}.total{font-size:14px;padding-bottom:4px}.modal-form{display:grid;gap:12px}select.versions{border:1px solid var(--line);border-radius:6px;padding:7px 8px;background:#fff;font:inherit}label.keep{font-size:13px;flex-wrap:wrap}.row-actions{white-space:nowrap;width:1%}.row-actions>*+*{margin-left:6px}.repeat-box{padding:8px 10px;border-radius:6px;background:#eef6ee;font-size:13px;line-height:1.5}.repeat-box button{margin-top:6px}.noreason-box{padding:8px 10px;border-radius:6px;background:#fffaf0;font-size:13px;line-height:1.8}.noreason-box button{margin-right:6px}label.rule-check{font-size:13px;flex-wrap:wrap}.suggestions{display:grid;gap:10px;margin-bottom:14px;padding:16px}.suggestion{display:flex;gap:12px;align-items:center;justify-content:space-between;border-top:1px solid #eceef1;padding-top:8px}.rule-form{display:flex;gap:6px;align-items:center;flex-wrap:wrap;margin:10px 0 14px}.rule-form input{width:150px}.rule-form input.short{width:70px}.rule-form input.wide{width:190px}.rule-form input.mid{width:180px}.rule-form .rule-submit{display:flex;gap:6px;align-items:center;margin-left:auto}kbd{border:1px solid var(--line);border-bottom-width:2px;border-radius:4px;padding:0 5px;font-size:12px;background:#fafafa}table.keys td{padding:4px 8px}.materials{background:#fff;border:1px solid var(--line);border-radius:8px;padding:8px 12px;margin-bottom:16px}.materials summary{cursor:pointer;font-weight:600}table.list.compact{margin-top:8px;max-width:900px}table.list.compact th,table.list.compact td{padding:5px 10px}select.versions{width:150px}.menu{position:relative}.menu-list{position:absolute;right:0;top:calc(100% + 4px);z-index:40;background:#fff;border:1px solid var(--line);border-radius:8px;box-shadow:0 8px 24px #0f172a1f;padding:4px;min-width:280px;display:grid}.menu-list button{border:none;text-align:left;padding:8px 10px;border-radius:6px;background:none}.menu-list button:hover:not(:disabled){background:#f0f4ff}.todo-bar{display:flex;flex-wrap:wrap;gap:6px 10px;align-items:center;margin:4px 0 10px;font-size:13px}.todo-title{color:var(--muted)}.todo-done{color:var(--ok);font-weight:600}.todo-item{display:inline-flex;gap:4px;align-items:center}.todo-chip{border-radius:999px;padding:3px 11px;background:var(--warn-bg);border-color:#f7c99b;color:var(--warn)}.todo-chip.soft{background:#f1f2f4;border-color:var(--line);color:var(--muted)}.todo-chip.active{background:var(--warn);border-color:var(--warn);color:#fff}button.small,.small{font-size:12px}.totals{display:flex;gap:24px;align-items:center;justify-content:flex-end;margin:6px 0 8px;font-size:14px}.totals-missing{margin-left:10px;color:var(--warn);cursor:help}.status-row .invoice{width:auto;display:flex;gap:8px;align-items:center;margin:0 0 4px auto;font-weight:600}.status-row .invoice input{width:150px;font-size:15px;font-weight:600}.help{background:#fff;border:1px solid var(--line);border-radius:8px;padding:8px 12px;margin-bottom:10px;font-size:13px}.help summary{cursor:pointer;color:var(--accent)}.help-body{display:flex;gap:40px;flex-wrap:wrap;padding:8px 0 4px}.help-col{display:grid;gap:6px;align-content:start}.status-badge{display:inline-block;padding:1px 9px;border-radius:999px;font-size:12px;line-height:20px;white-space:nowrap}.status-badge.ok{background:var(--ok-bg);color:var(--ok)}.status-badge.todo{background:var(--warn-bg);color:var(--warn)}.status-badge.check{background:#fde2e2;color:#b91c1c}.status-badge.off,.status-badge.busy{background:#eef0f3;color:var(--muted)}.status-badge .info-i{display:inline-flex;align-items:center;justify-content:center;width:10px;height:10px;margin-left:2px;border:1px solid currentColor;border-radius:50%;font:italic 600 9px/1 Georgia,serif;vertical-align:1px;opacity:.75;transition:opacity .15s ease}.status-cell:hover .info-i{opacity:1}.status-cell:has(.info-i){gap:3px}.status-cell .status-badge:has(.info-i){padding:1px 5px;cursor:help}.status-box.check{background:var(--check-bg)}.todo-line{margin-top:6px;color:var(--warn)}.section-title{font-weight:600;font-size:13px;margin-bottom:4px}table.kv tr.missing td:nth-child(2){color:var(--warn);font-style:italic}details.service summary{cursor:pointer;color:var(--muted);font-size:13px}details.service summary:hover{color:var(--text)}details.service[open] summary{margin-bottom:6px}.ag-cell.pos-cell{padding-left:4px;padding-right:2px}.mid-ellipsis{display:flex;min-width:0;overflow:hidden;white-space:pre}.mid-ellipsis .head{overflow:hidden;text-overflow:ellipsis;min-width:0;flex-shrink:1}.mid-ellipsis .tail{flex-shrink:0}.offline-bar{display:flex;flex-wrap:wrap;gap:6px 10px;align-items:center;margin:4px 0 6px;padding:6px 10px;font-size:13px;background:var(--warn-bg);color:var(--warn);border:1px solid #f7c99b;border-radius:8px}.topbar nav a.active{color:var(--text);font-weight:600;text-decoration:underline 2px var(--accent);text-underline-offset:6px}.cell-invalid{background:var(--check-bg)!important;box-shadow:inset 0 0 0 2px #dc2626;color:#b91c1c}input.invalid,input.invalid:focus{border-color:#dc2626;outline-color:#fca5a5;background:var(--check-bg);color:#b91c1c}input[type=checkbox],label.inline input[type=checkbox]{-moz-appearance:none;appearance:none;-webkit-appearance:none;flex:none;width:16px;height:16px;padding:0;margin:0;border:1.5px solid #b8bec7;border-radius:4px;background:#fff;display:inline-grid;place-content:center;vertical-align:middle;cursor:pointer}input[type=checkbox]:after{content:"";width:8px;height:4px;margin-top:-2px;border:2px solid #fff;border-top:0;border-right:0;transform:rotate(-45deg) scale(0);transition:transform .15s ease}input[type=checkbox]:checked{background:var(--accent);border-color:var(--accent)}input[type=checkbox]:checked:after{transform:rotate(-45deg) scale(1)}input[type=checkbox]:hover:not(:disabled){border-color:var(--accent)}input[type=checkbox]:focus{outline:none}input[type=checkbox]:focus-visible{outline:2px solid #b6d0ff;outline-offset:1px}input[type=checkbox]:active:not(:disabled){transform:scale(.9)}input[type=checkbox]:disabled{opacity:.5;cursor:default}@media(prefers-reduced-motion:reduce){.open-card:active,.card-actions button:active:not(:disabled){transform:none}}
