:root{--ink:#1c2733;--ink-2:#47525f;--ink-3:#6b7683;--line:#dfe3e8;--line-2:#eceff2;--bg:#f3f4f6;--surface:#fff;--primary:#1d4f91;--primary-dark:#163d70;--brand:#d9541e;--ok:#17703f;--ok-bg:#e3f4ea;--warn:#8a5300;--warn-bg:#fdf0d5;--bad:#b42318;--bad-bg:#fde7e4;--info:#1d4f91;--info-bg:#e4edf9;--muted-bg:#eceff2;--series-1:#2a78d6;--series-2:#eb6834;--radius:8px;--side-w:264px;font-family:system-ui,-apple-system,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}*{box-sizing:border-box}body,html{margin:0;padding:0}body{background:var(--bg);color:var(--ink);font-size:14px;line-height:1.45}h1{text-wrap:balance;font-size:22px;line-height:1.25;margin:0 0 4px}h2{font-size:16px;margin:0}h3{font-size:14px;margin:16px 0 8px}p{margin:0 0 8px}a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}code{background:var(--muted-bg);border-radius:4px;font-size:12.5px;padding:1px 5px}button,input,select,textarea{color:inherit;font:inherit}:focus-visible{outline:2px solid var(--primary);outline-offset:2px}.muted{color:var(--ink-3)}.strong{font-weight:650}.num{font-variant-numeric:tabular-nums;text-align:right}.center{text-align:center}.nowrap{white-space:nowrap}.pre{white-space:pre-wrap}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12.5px}.spacer{flex:1 1 auto}.hint{color:var(--ink-3);font-size:13px;max-width:95ch}.print-only,.print-only-row{display:none}.bad-text{color:var(--bad)}.loading,.splash{color:var(--ink-3);padding:48px;text-align:center}.shell{display:flex;min-height:100vh}.side{background:var(--ink);color:#d5dbe2;flex:0 0 var(--side-w);height:100vh;overflow-y:auto;padding:12px 10px 24px;position:sticky;top:0;width:var(--side-w)}.brand{align-items:center;color:#fff;display:flex;font-size:17px;font-weight:700;gap:10px;letter-spacing:.2px;padding:6px 8px 14px}.brand:hover{text-decoration:none}.brand-mark{background:var(--brand);border-radius:6px;color:#fff;display:inline-grid;font-weight:800;height:28px;place-items:center;width:28px}.side-project{background:hsla(0,0%,100%,.07);border-radius:var(--radius);margin:0 0 6px;padding:10px}.side-project-name{color:#fff;font-weight:650;overflow-wrap:anywhere}.side-project-code{color:#9fabb8;font-size:12px}.nav-title{color:#8794a2;font-size:11px;letter-spacing:.7px;padding:14px 10px 4px;text-transform:uppercase}.nav-item{border-radius:6px;color:#d5dbe2;display:block;padding:7px 10px}.nav-item:hover{background:hsla(0,0%,100%,.08);text-decoration:none}.nav-item.active{background:#fff;color:var(--ink);font-weight:650}.scrim{display:none}.main{display:flex;flex:1 1 auto;flex-direction:column;min-width:0}.topbar{align-items:center;background:var(--surface);border-bottom:1px solid var(--line);display:flex;gap:12px;padding:8px 20px;position:sticky;top:0;z-index:20}.topbar .js-nav{display:none}.topbar-title{flex:1 1 auto;font-weight:650;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topbar-user{align-items:center;display:flex;gap:10px}.user-name{color:var(--ink-2);font-size:13px}.content{max-width:1500px;padding:20px;width:100%}.page-head{align-items:flex-start;display:flex;flex-wrap:wrap;gap:16px;justify-content:space-between;margin-bottom:16px}.page-head>div:first-child{flex:1 1 420px;min-width:260px}.actions{align-items:center;display:flex;flex-wrap:wrap;gap:8px}.back{display:inline-block;font-size:13px;margin-bottom:4px}.btn{align-items:center;background:var(--surface);border:1px solid #c5ccd5;border-radius:6px;color:var(--ink);cursor:pointer;display:inline-flex;gap:6px;justify-content:center;line-height:1.2;padding:7px 12px;white-space:nowrap}.btn:hover{background:#f1f3f6;text-decoration:none}.btn.primary{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}.btn.primary:hover{background:var(--primary-dark)}.btn.danger{border-color:#e3b4ae;color:var(--bad)}.btn.danger:hover{background:var(--bad-bg)}.btn.small{font-size:13px;padding:4px 9px}.btn.block,.link.block{display:flex;margin-top:10px;width:100%}.btn:disabled{cursor:default;opacity:.6}.file-btn,.link{cursor:pointer}.link{background:none;border:0;border-radius:4px;color:var(--primary);padding:2px 4px}.link:hover{background:var(--info-bg)}.icon-btn{background:none;border:0;border-radius:6px;color:var(--ink-2);cursor:pointer;font-size:18px;line-height:1;padding:6px 8px}.badge,.icon-btn:hover{background:var(--muted-bg)}.badge{border-radius:999px;color:var(--ink-2);display:inline-block;font-size:12px;font-weight:600;padding:1px 8px;white-space:nowrap}.badge.ok{background:var(--ok-bg);color:var(--ok)}.badge.warn{background:var(--warn-bg);color:var(--warn)}.badge.bad{background:var(--bad-bg);color:var(--bad)}.badge.info{background:var(--info-bg);color:var(--info)}.chip{align-items:center;background:var(--muted-bg);border-radius:999px;display:inline-flex;font-size:13px;gap:2px;padding:2px 4px 2px 10px}.notice{background:var(--info-bg);border:1px solid #c4d6ef;border-radius:var(--radius);margin-bottom:12px;padding:10px 12px}.notice.warn{background:var(--warn-bg);border-color:#efd9a7}.notice .btn{margin-left:8px}ul.plain{margin:6px 0 0;padding-left:18px}.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);margin-bottom:16px;padding:16px}.card-top,.card>.form-grid{margin-bottom:12px}.card-top{align-items:center;display:flex;flex-wrap:wrap;gap:12px;justify-content:space-between}.cards{display:grid;gap:14px;grid-template-columns:repeat(auto-fill,minmax(270px,1fr))}.project-card{color:var(--ink);display:block;margin:0}.project-card:hover{border-color:var(--primary);text-decoration:none}.project-card h3{font-size:16px;margin:4px 0 6px}.card-links{display:flex;flex-wrap:wrap;font-size:13px;gap:14px;margin-top:12px}.overview{display:grid;gap:16px;grid-template-columns:repeat(auto-fit,minmax(340px,1fr))}.overview .card{margin:0}.overview{margin-bottom:16px}.danger-zone{border-color:#e3b4ae}.empty-state{color:var(--ink-2);padding:48px 16px;text-align:center}.empty-state h2{font-size:18px;margin-bottom:8px}.kpis{display:grid;gap:10px;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));margin-bottom:16px}.kpis.compact{grid-template-columns:repeat(auto-fit,minmax(140px,1fr));margin-bottom:0}.kpi{background:var(--surface);border:1px solid var(--line);border-left:4px solid #c5ccd5;border-radius:var(--radius);padding:10px 12px}.kpi.ok{border-left-color:var(--ok)}.kpi.warn{border-left-color:#c98500}.kpi.bad{border-left-color:var(--bad)}.kpi.info{border-left-color:var(--info)}.kpi-label{color:var(--ink-3);font-size:12px}.kpi-value{font-size:19px;font-variant-numeric:tabular-nums;font-weight:650}.kpi-note{color:var(--ink-3);font-size:12px}.info-grid{display:grid;gap:10px 20px;grid-template-columns:repeat(auto-fill,minmax(230px,1fr))}.info-label{color:var(--ink-3);display:block;font-size:12px}.info-value{font-weight:550;white-space:pre-wrap}.toolbar{align-items:center;display:flex;flex-wrap:wrap;gap:8px;margin-bottom:10px}.toolbar input[type=search],.toolbar input[type=text]{min-width:220px}.count{color:var(--ink-3);font-size:13px}.table-wrap{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);overflow-x:auto}.card .table-wrap{border-radius:6px}table{border-collapse:collapse;width:100%}.grid td,.grid th{border-bottom:1px solid var(--line-2);padding:7px 10px;text-align:left;vertical-align:top}.grid th{background:#f7f8fa;color:var(--ink-2);font-size:12px;font-weight:650;position:sticky;top:0;white-space:nowrap}.grid td.num,.grid th.num{text-align:right}.grid td.center,.grid th.center{text-align:center}.grid tbody tr:last-child td{border-bottom:0}.grid.clickable tbody tr.js-load:hover,.grid.clickable tbody tr.js-row:hover,.grid.clickable tbody tr.js-sample:hover{background:#f5f8fc;cursor:pointer}.grid tfoot td{background:#f7f8fa;border-bottom:0;border-top:1px solid var(--line);font-weight:650}.grid.compact td,.grid.compact th{padding:5px 8px}.grid td.empty{color:var(--ink-3);padding:28px 10px;text-align:center}.grid .sub{color:var(--ink-3);font-size:12px}.row-actions{text-align:right;white-space:nowrap}input.cell{padding:4px 6px;width:110px}input[type=date],input[type=email],input[type=password],input[type=search],input[type=text],input[type=time],select,textarea{background:#fff;border:1px solid #c5ccd5;border-radius:6px;max-width:100%;padding:7px 9px}textarea{resize:vertical;width:100%}input.num{font-variant-numeric:tabular-nums;text-align:right}.form-grid{display:grid;gap:12px 16px;grid-template-columns:repeat(2,minmax(0,1fr))}.form-grid.single{grid-template-columns:1fr}.field{display:flex;flex-direction:column;gap:4px;min-width:0}.field.full{grid-column:1/-1}.field-label,.field>span:first-child{color:var(--ink-2);font-size:12.5px;font-weight:600}.field input,.field select,.field textarea{width:100%}.field small{color:var(--ink-3);font-size:12px}.field.check{align-items:center;flex-direction:row;gap:8px;padding-top:18px}.field.check input{width:auto}.field.check span,.field.check>span:first-child{color:var(--ink);font-size:14px;font-weight:500}.req{color:var(--bad)}.form-h{border-top:1px solid var(--line-2);color:var(--ink-2);font-size:13px;grid-column:1/-1;letter-spacing:.4px;margin:6px 0 0;padding-top:10px;text-transform:uppercase}.file-row,.select-row{align-items:center;display:flex;flex-wrap:wrap;gap:8px}.select-row{flex-wrap:nowrap}.select-row select{flex:1 1 0;min-width:0;width:auto}.file-row input[type=file]{flex:1 1 200px;width:auto}.inline-check{align-items:center;display:inline-flex;font-size:13px;gap:6px}.inline-form{align-items:center;display:flex;flex-wrap:wrap;gap:8px;margin-top:12px}.inline-form select{max-width:min(560px,100%)}.inline-form .grow,.inline-form input[type=email]{flex:1 1 260px}.form-actions{align-items:center;display:flex;flex-wrap:wrap;gap:8px;margin-top:10px}.form-error{background:var(--bad-bg);border-radius:6px;color:var(--bad);font-size:13px;margin-top:10px;padding:8px 10px}.settings-form{align-content:start;display:grid;gap:10px;margin:0}.settings-form h3{margin:0}.auth{background:var(--ink);display:grid;min-height:100vh;padding:20px;place-items:center}.auth-card{background:var(--surface);border-radius:12px;display:grid;gap:12px;padding:28px;width:min(400px,100%)}.auth-brand{align-items:center;display:flex;font-size:20px;font-weight:700;gap:10px}.auth-sub{color:var(--ink-3);font-size:13px;margin:0}.overlay{align-items:flex-start;background:rgba(20,28,38,.55);display:flex;inset:0;justify-content:center;overflow-y:auto;padding:4vh 12px;position:fixed;z-index:1000}.modal{background:var(--surface);border-radius:10px;box-shadow:0 20px 60px rgba(0,0,0,.3);width:min(720px,100%)}.modal.wide{width:min(1040px,100%)}.modal-head{align-items:center;border-bottom:1px solid var(--line);display:flex;gap:10px;padding:14px 16px}.modal-head h2{flex:1 1 auto}.modal-body{padding:16px}.modal-foot{align-items:center;background:#f7f8fa;border-radius:0 0 10px 10px;border-top:1px solid var(--line);display:flex;flex-wrap:wrap;gap:8px;padding:12px 16px}.image-view img{display:block;margin:0 auto;max-width:100%}.toasts{bottom:16px;display:grid;gap:8px;max-width:min(420px,calc(100vw - 32px));position:fixed;right:16px;z-index:2000}.toast{background:var(--ink);border-radius:8px;box-shadow:0 6px 20px rgba(0,0,0,.25);color:#fff;padding:10px 14px}.toast.bad{background:var(--bad)}.toast.warn{background:#8a5a00}.sheet-head{margin-bottom:12px}.sheet-project{color:var(--ink-3);font-size:13px}.sheet-table th{color:var(--ink-2);font-weight:600;padding:6px 10px 6px 0;text-align:left;vertical-align:top;width:34%}.sheet-table td,.sheet-table th{border-bottom:1px solid var(--line-2)}.sheet-table td{padding:6px 0}.sheet-table th.sheet-h{font-size:12px;letter-spacing:.4px;padding-top:14px;text-transform:uppercase}.sheet-sign{display:none}.seg{border:1px solid #c5ccd5;border-radius:6px;display:inline-flex;overflow:hidden}.seg-btn{background:var(--surface);border:0;cursor:pointer;padding:7px 12px}.seg-btn+.seg-btn{border-left:1px solid #c5ccd5}.seg-btn.active{background:var(--ink);color:#fff}.embedded .table-wrap{border-radius:6px}[data-tip]{position:relative}[data-tip]:focus-visible:after,[data-tip]:hover:after{background:var(--ink);border-radius:5px;bottom:calc(100% + 6px);color:#fff;content:attr(data-tip);font-size:12px;font-weight:500;left:50%;padding:4px 8px;pointer-events:none;position:absolute;transform:translateX(-50%);white-space:nowrap;z-index:30}.sub-banner{background:var(--warn-bg);border:1px solid #efd9a7;border-radius:var(--radius);color:var(--warn);font-weight:550;margin-bottom:14px;padding:10px 12px}.sub-banner.bad{background:var(--bad-bg);border-color:#e3b4ae;color:var(--bad)}.sub-banner a{margin-left:8px;white-space:nowrap}.sub-note{margin-bottom:0;margin-top:12px}.member-info{margin-bottom:12px}.form-grid>.full{grid-column:1/-1}.form-h.first{border-top:0;margin-bottom:10px;padding-top:0}.modal-body>.form-h{margin:18px 0 10px}.quick{gap:6px}.pay-form,.quick{display:flex;flex-wrap:wrap}.pay-form{align-items:flex-end;gap:10px;margin-bottom:8px}.pay-form .field{flex:0 1 180px}.pay-form .field.grow{flex:1 1 200px}.modal-body>.table-wrap{margin-bottom:4px}@media (max-width:900px){.side{left:0;position:fixed;top:0;transform:translateX(-100%);transition:transform .18s ease;z-index:900}.nav-open .side{transform:none}.nav-open .scrim{background:rgba(20,28,38,.5);display:block;inset:0;position:fixed;z-index:800}.topbar .js-nav{display:inline-block}.topbar{padding:8px 12px}.user-name{display:none}.content{padding:14px 12px}.form-grid{grid-template-columns:1fr}.overlay{padding:0}.modal,.modal.wide{border-radius:0;min-height:100vh;width:100%}.field.check{padding-top:0}.pay-form .field{flex:1 1 100%}}@media (prefers-reduced-motion:reduce){.side{transition:none}}@page{size:A4;margin:14mm 12mm}@media print{body{background:#fff;font-size:11px}.no-print,.scrim,.side,.toasts,.topbar{display:none!important}.print-only{display:block}tr.print-only-row{display:table-row}.shell{display:block}.content{max-width:none;padding:0}.card,.kpi,.table-wrap{border-color:#999;box-shadow:none}.card{break-inside:avoid;padding:10px}.table-wrap{overflow:visible}.grid th{position:static}.grid td,.grid th{padding:4px 6px}.print-title{border-bottom:2px solid #000;display:flex;font-size:13px;font-weight:700;justify-content:space-between;margin-bottom:10px;padding-bottom:4px}a{color:inherit}.sheet-sign{display:flex;justify-content:space-around;margin-top:50px}.sheet-sign div{border-top:1px solid #000;padding-top:4px;text-align:center;width:35%}body.print-modal .shell{display:none}body.print-modal .overlay{background:none;display:block;padding:0;position:static}body.print-modal .modal{box-shadow:none;width:100%}body.print-modal .modal-body{padding:0}}.vault-card{width:min(520px,100%)}.vault-card h2{font-size:17px;margin:0}.vault-form{display:grid;gap:12px}.vault-warning{background:var(--bad-bg);border:1px solid #e3b4ae;border-left:4px solid var(--bad);border-radius:6px;color:var(--ink);font-size:13.5px;line-height:1.45;padding:10px 12px}.vault-warning strong{color:var(--bad);display:block;margin-bottom:2px}.card>.vault-warning{margin:12px 0;max-width:95ch}.vault-list{color:var(--ink-2);display:grid;font-size:13px;gap:4px;margin:0;padding-left:20px}.locked-project{margin:0 auto;max-width:720px;text-align:left}.locked-project .actions{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px}.locked-project .vault-list{font-size:14px;margin:8px 0}.btn.danger.block{justify-content:center}.visually-hidden{clip:rect(0 0 0 0);border:0;clip-path:inset(50%);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute!important;white-space:nowrap;width:1px}.enc-image.failed{outline:2px dashed var(--bad);outline-offset:-2px}.dash{display:grid;gap:16px;grid-template-columns:repeat(2,minmax(0,1fr))}.dash .card{margin:0;min-width:0}.dash .card.wide{grid-column:1/-1}.viz .hint{margin-bottom:0;margin-top:12px}.legend{color:var(--ink-2);display:flex;flex-wrap:wrap;font-size:12.5px;gap:14px}.key{align-items:center;display:inline-flex;gap:6px}.swatch{border-radius:2px;display:inline-block;height:10px;width:10px}.s1{background:var(--series-1)}.s2{background:var(--series-2)}.tick-key{background:var(--ink);width:2px}.tick-key,.today-key{display:inline-block;height:12px}.today-key{border-left:1px solid var(--ink);width:0}.colchart{display:grid;gap:0 8px;grid-template-columns:auto 1fr}.colchart-axis{color:var(--ink-3);font-size:11.5px;height:180px;position:relative;width:52px}.colchart-axis span{position:absolute;right:0;transform:translateY(50%);white-space:nowrap}.colchart-plot{align-items:stretch;display:flex;gap:4px;height:180px;margin-bottom:22px;position:relative}.gridline{background:var(--line-2);height:1px;left:0;position:absolute;right:0}.colgroup{display:flex;flex:1 1 0;justify-content:center;min-width:0;position:relative}.cols{align-items:stretch;gap:2px}.col,.cols{display:flex;height:100%}.col{align-items:flex-end;outline-offset:0;width:14px}.col i{border-radius:4px 4px 0 0;display:block;width:100%}.col-label{color:var(--ink-3);font-size:11.5px;left:50%;position:absolute;top:calc(100% + 4px);transform:translateX(-50%);white-space:nowrap}.hbars{display:grid;gap:8px}.hbar-row{align-items:center;display:grid;font-size:13px;gap:10px;grid-template-columns:minmax(120px,1.1fr) minmax(80px,2fr) auto}.hbar-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.hbar-track{border-left:1px solid var(--line);height:14px;position:relative}.hbar{border-radius:0 4px 4px 0;height:100%;min-width:1px}.hbar-tick{background:var(--ink);bottom:-3px;position:absolute;top:-3px;transform:translateX(-1px);width:2px}.hbar-value{font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap}.meters{display:grid;gap:8px}.meter-row{align-items:center;display:grid;font-size:13px;gap:10px;grid-template-columns:minmax(120px,1.4fr) minmax(80px,2fr) 52px}.meter-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.meter{background:var(--muted-bg);border-radius:4px;height:8px;overflow:hidden}.meter-fill{background:var(--series-1);border-radius:4px;height:100%}.meter-value{font-variant-numeric:tabular-nums;text-align:right}.gantt{display:grid;gap:0;overflow-x:auto}.gantt-head,.gantt-row{align-items:center;display:grid;gap:12px;grid-template-columns:minmax(170px,260px) minmax(420px,1fr)}.gantt-row{border-top:1px solid var(--line-2)}.gantt-label{font-size:13px;overflow:hidden;padding:6px 0;text-overflow:ellipsis;white-space:nowrap}.gantt-track{height:34px;position:relative}.gantt-head .gantt-track{height:20px}.gantt-month{color:var(--ink-3);font-size:11.5px;padding-left:3px;position:absolute;top:0;white-space:nowrap}.gantt-grid{background:var(--line-2)}.gantt-grid,.gantt-today{bottom:0;position:absolute;top:0;width:1px}.gantt-today{background:var(--ink)}.gbar{border-radius:4px;height:9px;position:absolute;top:6px}.gbar.lower{top:19px}@media (max-width:900px){.dash,.hbar-row{grid-template-columns:1fr}.hbar-row{gap:3px}.hbar-value{text-align:left}}@media print{.dash{grid-template-columns:1fr}}