:root{--bg:#f4f6f9;--card:#fff;--text:#1d2433;--muted:#5d6b82;--line:#dfe4ec;--primary:#1f5fbf;--primary-d:#174a96;--danger:#c62828;--warn:#b26a00;--ok:#2e7d32;--info:#0277bd;--radius:10px;--shadow:0 1px 3px #141e3214;color:var(--text);background:var(--bg);font-family:system-ui,-apple-system,Segoe UI,Roboto,Noto Sans,sans-serif;font-size:15px;line-height:1.45}*{box-sizing:border-box}body{margin:0}a{color:var(--primary);text-decoration:none}a:hover{text-decoration:underline}h1{margin:0 0 .75rem;font-size:1.4rem}h2{margin:0 0 .6rem;font-size:1.15rem}h3{margin:0 0 .4rem;font-size:1rem}.muted{color:var(--muted)}.small{font-size:.85rem}.nowrap{white-space:nowrap}.right{text-align:right}.row{flex-wrap:wrap;align-items:center;gap:.6rem;display:flex}.row.between{justify-content:space-between}.stack>*+*{margin-top:.75rem}.grid{gap:.75rem;display:grid}.grid.cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid.cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.grid.cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}@media (width<=900px){.grid.cols-3,.grid.cols-4{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (width<=600px){.grid.cols-2,.grid.cols-3,.grid.cols-4{grid-template-columns:1fr}}.topbar{z-index:20;color:#fff;background:#0f2a52;align-items:center;gap:1rem;padding:.55rem 1rem;display:flex;position:sticky;top:0}.topbar .brand{white-space:nowrap;font-weight:700}.topbar nav{flex-wrap:wrap;flex:1;gap:.25rem;display:flex}.topbar nav a{color:#d6e2f5;border-radius:6px;padding:.35rem .6rem}.topbar nav a.active,.topbar nav a:hover{color:#fff;background:#ffffff24;text-decoration:none}.topbar .user{white-space:nowrap;font-size:.85rem}.menu-btn{color:#fff;background:0 0;border:1px solid #fff6;border-radius:6px;padding:.25rem .5rem;display:none}@media (width<=860px){.topbar{flex-wrap:wrap}.menu-btn{margin-left:auto;display:inline-block}.topbar nav{flex-direction:column;flex-basis:100%;display:none}.topbar nav.open{display:flex}.topbar .user{flex-basis:100%}}main{max-width:1280px;margin:0 auto;padding:1rem}.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:1rem}.card+.card{margin-top:.75rem}label.field{display:block}label.field>span{color:var(--muted);margin-bottom:.2rem;font-size:.85rem;display:block}input,select,textarea{width:100%;font:inherit;color:inherit;background:#fff;border:1px solid #c5cedb;border-radius:8px;padding:.5rem .6rem}input:focus,select:focus,textarea:focus{border-color:var(--primary);outline:2px solid #9cc0f5}input[type=checkbox]{width:auto}textarea{resize:vertical;min-height:70px}.err{color:var(--danger);margin-top:.2rem;font-size:.82rem}.field.invalid input,.field.invalid select,.field.invalid textarea{border-color:var(--danger)}.form-error{color:var(--danger);background:#fdecea;border:1px solid #f5c6c2;border-radius:8px;padding:.5rem .75rem}button,.btn{font:inherit;cursor:pointer;background:var(--primary);color:#fff;border:1px solid #0000;border-radius:8px;align-items:center;gap:.35rem;padding:.45rem .85rem;display:inline-flex}button:hover:not(:disabled),.btn:hover{background:var(--primary-d);text-decoration:none}button:disabled{opacity:.55;cursor:not-allowed}button.secondary,.btn.secondary{color:var(--text);background:#fff;border-color:#c5cedb}button.secondary:hover:not(:disabled){background:#f0f3f8}button.danger{background:var(--danger)}button.danger:hover:not(:disabled){background:#a31f1f}button.success{background:var(--ok)}button.success:hover:not(:disabled){background:#245f27}button.link{color:var(--primary);background:0 0;border:0;padding:0}button.link:hover:not(:disabled){background:0 0;text-decoration:underline}button.small,.btn.small{padding:.25rem .55rem;font-size:.85rem}.table-wrap{overflow-x:auto}table{border-collapse:collapse;width:100%}th,td{text-align:left;border-bottom:1px solid var(--line);vertical-align:top;padding:.5rem .55rem}th{text-transform:uppercase;letter-spacing:.02em;color:var(--muted);background:#f8fafc;font-size:.8rem}tr.clickable{cursor:pointer}tr.clickable:hover td{background:#f5f9ff}.badge{color:#34435c;white-space:nowrap;background:#e8edf5;border-radius:999px;padding:.1rem .5rem;font-size:.78rem;font-weight:600;display:inline-block}.badge.ok{color:var(--ok);background:#e3f3e4}.badge.warn{color:var(--warn);background:#fff1db}.badge.danger{color:var(--danger);background:#fde4e2}.badge.info{color:var(--info);background:#e1f1fb}.badge.gray{color:#5d6b82;background:#eceff3}.progress{background:#e3e8ef;border-radius:999px;min-width:80px;height:10px;overflow:hidden}.progress>div{background:linear-gradient(90deg,#2f7de1,#1f5fbf);height:100%;transition:width .3s}.progress.done>div{background:var(--ok)}.progress-label{color:var(--muted);font-size:.8rem}.tabs{border-bottom:1px solid var(--line);gap:.25rem;margin-bottom:.75rem;display:flex;overflow-x:auto}.tabs button{color:var(--muted);white-space:nowrap;background:0 0;border:0;border-bottom:3px solid #0000;border-radius:0;padding:.55rem .8rem}.tabs button.active{color:var(--primary);border-bottom-color:var(--primary);font-weight:600}.tabs button:hover:not(:disabled){background:#f0f3f8}.stages{grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:.75rem;display:grid}.stage{border:1px solid var(--line);border-radius:var(--radius);background:#fff;border-left:5px solid #b8c2d1;padding:.75rem}.stage.s-berjalan{border-left-color:var(--info)}.stage.s-menunggu{border-left-color:var(--warn)}.stage.s-selesai{border-left-color:var(--ok)}.stage.late{box-shadow:inset 0 0 0 1px #f3b4ae}.stage dl{grid-template-columns:auto 1fr;gap:.15rem .5rem;margin:.5rem 0;font-size:.85rem;display:grid}.stage dt{color:var(--muted)}.stage dd{margin:0}.stage .actions{flex-wrap:wrap;gap:.35rem;margin-top:.5rem;display:flex}.modal-bg{z-index:50;background:#0f192d73;justify-content:center;align-items:flex-start;padding:4vh 1rem;display:flex;position:fixed;inset:0;overflow-y:auto}.modal{background:#fff;border-radius:12px;width:100%;max-width:560px;box-shadow:0 10px 40px #00000040}.modal.wide{max-width:1000px}.modal header{border-bottom:1px solid var(--line);justify-content:space-between;align-items:center;padding:.8rem 1rem;display:flex}.modal header h2{margin:0}.modal .body{padding:1rem}.modal footer{border-top:1px solid var(--line);justify-content:flex-end;gap:.5rem;padding:.75rem 1rem;display:flex}.preview-frame{border:1px solid var(--line);background:#f0f0f0;border-radius:8px;width:100%;height:75vh}.preview-img{max-width:100%;max-height:75vh;margin:0 auto;display:block}.toasts{z-index:100;flex-direction:column;gap:.5rem;max-width:min(420px,100vw - 2rem);display:flex;position:fixed;bottom:1rem;right:1rem}.toast{color:#fff;background:#22324d;border-radius:8px;justify-content:space-between;align-items:flex-start;gap:.75rem;padding:.65rem .9rem;display:flex;box-shadow:0 4px 16px #0003}.toast.success{background:#22662a}.toast.error{background:#a32020}.toast button{color:#fff;opacity:.8;background:0 0;border:0;padding:0}.login-wrap{background:linear-gradient(135deg,#0f2a52,#1f5fbf);justify-content:center;align-items:center;min-height:100vh;padding:1rem;display:flex}.login-card{width:100%;max-width:380px}.stat{text-align:center;border:1px solid var(--line);cursor:pointer;background:#f5f7fb;border-radius:8px;padding:.6rem}.stat.active{outline:2px solid var(--primary)}.stat b{font-size:1.3rem;display:block}.empty{text-align:center;color:var(--muted);padding:2rem 1rem}.spinner{vertical-align:-2px;border:2px solid;border-right-color:#0000;border-radius:50%;width:1em;height:1em;animation:.7s linear infinite spin;display:inline-block}@keyframes spin{to{transform:rotate(360deg)}}.formula{background:#f5f8fd;border:1px solid #d5e2f5;border-radius:8px;padding:.75rem 1rem;font-size:.9rem}.formula code{background:#fff;border:1px solid #e0e6f0;border-radius:4px;padding:.05rem .3rem}.upload-bar{height:14px}.kv{grid-template-columns:max-content 1fr;gap:.25rem .75rem;display:grid}.kv dt{color:var(--muted)}.kv dd{margin:0}@media (width<=600px){main{padding:.6rem}.card{padding:.75rem}.hide-sm{display:none}}.view-toggle{border:1px solid var(--line);background:#fff;border-radius:999px;display:inline-flex;overflow:hidden}.view-toggle button{color:var(--muted);background:0 0;border:0;border-radius:0;padding:.35rem .9rem;font-size:.88rem}.view-toggle button.active{background:var(--primary);color:#fff;font-weight:600}.stage-section-head{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem;margin-bottom:.5rem;display:flex}.stage-section-head h2{margin:0}.stage-section-sum{flex-wrap:wrap;align-items:center;gap:.35rem;display:flex}.stage-section-bar{min-width:140px}.stage-section.all-done{border-left:5px solid var(--ok)}.stage-section-tools{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:.5rem;margin-bottom:.5rem;display:flex}.stage-embed{border:1px dashed var(--line);border-radius:var(--radius);background:#fafbfd;margin-bottom:.75rem;padding:.5rem}.stage-embed .card{box-shadow:none}.stage-rows{flex-direction:column;gap:.5rem;display:flex}.stage-row{border:1px solid var(--line);border-radius:var(--radius);background:#fff;border-left:5px solid #b8c2d1;grid-template-columns:minmax(160px,1.4fr) minmax(110px,.8fr) minmax(140px,1fr) minmax(180px,1.3fr) minmax(170px,1.2fr);align-items:center;gap:.5rem .75rem;padding:.55rem .7rem;display:grid}.stage-row.s-berjalan{border-left-color:var(--info)}.stage-row.s-menunggu{border-left-color:var(--warn)}.stage-row.s-selesai{border-left-color:var(--ok);background:#fbfdfb}.stage-row.late{box-shadow:inset 0 0 0 1px #f3b4ae}.stage-row .sr-status{flex-wrap:wrap;align-items:center;gap:.25rem;display:flex}.stage-row .sr-label{color:var(--muted);margin-right:.25rem}.stage-row .sr-notes{text-overflow:ellipsis;white-space:nowrap;max-width:100%;overflow:hidden}.stage-row .actions{flex-wrap:wrap;justify-content:flex-end;gap:.35rem;display:flex}@media (width<=1000px){.stage-row{grid-template-columns:1fr 1fr}.stage-row .sr-actions{grid-column:1/-1}.stage-row .actions{justify-content:flex-start}}@media (width<=600px){.stage-row{grid-template-columns:1fr}.stage-section-bar{flex:1;min-width:100px}}.notice{color:#6b4e00;background:#fff8e6;border:1px solid #f2d492;border-radius:8px;padding:.5rem .75rem}.notice code{font-size:.85em}.stage-fs-off{flex-direction:column;flex-basis:100%;gap:.35rem;display:flex}button[disabled][title]{cursor:not-allowed}.color-dot{vertical-align:-1px;border:1px solid #00000026;border-radius:50%;width:.75em;height:.75em;margin-right:.35em;display:inline-block}.badge.qc{color:#6b35b8;background:#efe5fb}.file-row{border:1px solid var(--line);background:#fff;border-radius:8px;flex-direction:column;gap:.35rem;padding:.5rem .65rem;display:flex}.file-row.fr-ok{background:#f7fcf7;border-color:#b9dfbb}.file-row.fr-error{background:#fff8f7;border-color:#f5c6c2}.file-row-main{grid-template-columns:minmax(180px,1.2fr) minmax(150px,.9fr) minmax(180px,1.3fr) auto;align-items:end;gap:.5rem;display:grid}@media (width<=760px){.file-row-main{grid-template-columns:1fr}}.month-nav{gap:.4rem}.month-label{text-align:center;min-width:9.5rem}.gantt{--lane-h:26px;padding:.5rem;overflow-x:auto}.gantt-row{grid-template-columns:250px minmax(calc(var(--days) * 30px), 1fr);border-bottom:1px solid var(--line);min-width:calc(250px + var(--days) * 30px);display:grid}.gantt-label{z-index:2;border-right:1px solid var(--line);background:#fff;align-items:center;gap:.3rem;padding:.3rem .45rem;font-size:.88rem;display:flex;position:sticky;left:0}.gantt-label.clickable{cursor:pointer}.gantt-label .caret{width:1em;color:var(--muted)}.gantt-head .gantt-label{background:#f8fafc}.gantt-days{grid-template-columns:repeat(var(--days), 1fr);background:#f8fafc;display:grid}.gantt-day{text-align:center;color:var(--muted);border-left:1px solid #edf0f5;padding:.3rem 0;font-size:.72rem}.gantt-day.today{color:#fff;background:#1f5fbf;border-radius:4px;font-weight:700}.gantt-track{min-height:calc(var(--lanes,1) * var(--lane-h) + 6px);background-image:linear-gradient(90deg,#edf0f5 1px,#0000 1px);background-size:calc(100% / var(--days)) 100%;position:relative}.gantt-today{pointer-events:none;background:#1f5fbf14;position:absolute;top:0;bottom:0}.gantt-bar{height:calc(var(--lane-h) - 6px);color:#fff;font-size:.72rem;line-height:calc(var(--lane-h) - 6px);white-space:nowrap;text-overflow:ellipsis;cursor:default;border-radius:5px;padding:0 .35rem;position:absolute;overflow:hidden;box-shadow:0 1px 2px #0003}.gantt-bar span{text-shadow:0 1px 1px #00000059}.gantt-bar.cut-l{border-top-left-radius:0;border-bottom-left-radius:0}.gantt-bar.cut-r{border-top-right-radius:0;border-bottom-right-radius:0}.gantt-bar.done{opacity:.55}.gantt-row.po-row .gantt-label{font-weight:500}.gantt-row.stage-row-g .gantt-label{background:#fbfcfe;padding-left:1.6rem}.gantt-row.stage-row-g .gantt-bar{opacity:.85}.suggest{position:relative}.suggest-list{z-index:20;color:#111;background:#fff;border:1px solid #d1d5db;border-radius:6px;max-height:220px;margin:0;padding:.25rem 0;list-style:none;position:absolute;left:0;right:0;overflow:auto;box-shadow:0 4px 16px #00000014}.suggest-item{text-align:left;cursor:pointer;background:#fff;border:0;width:100%;padding:.4rem .75rem;display:block;color:#111!important}.suggest-item:hover,.suggest-item:focus{background:var(--hover,#f3f4f6);color:#111!important}.tabs{flex-wrap:wrap;gap:.35rem;display:flex}.tabs button{border:1px solid var(--border,#d1d5db);cursor:pointer;background:#fff;border-radius:999px;padding:.35rem .8rem}.tabs button.active{background:var(--primary,#2563eb);color:#fff;border-color:#0000}.h2{margin:0;font-size:1.15rem}
