:root{--paper: oklch(98.6% .008 85);--paper-2: oklch(96.4% .011 82);--surface: oklch(99.5% .004 85);--ink: oklch(23% .02 60);--ink-2: oklch(40% .02 60);--muted: oklch(54% .018 65);--line: oklch(90% .012 82);--line-2: oklch(85% .015 80);--accent: oklch(58% .128 45);--accent-2: oklch(50% .12 45);--accent-ink: oklch(37% .09 45);--accent-soft: oklch(95% .035 60);--sidebar: oklch(21% .018 55);--sidebar-2: oklch(25% .018 55);--sidebar-ink: oklch(88% .008 80);--sidebar-muted: oklch(62% .012 70);--ok: oklch(55% .12 150);--ok-soft: oklch(94% .05 150);--warn: oklch(70% .13 72);--warn-soft: oklch(95% .05 80);--danger: oklch(55% .17 25);--danger-soft: oklch(95% .045 25);--info: oklch(55% .11 250);--info-soft: oklch(95% .04 250);--violet: oklch(55% .12 300);--violet-soft: oklch(95% .04 300);--font-display: "Iowan Old Style", "Palatino Linotype", Palatino, Georgia, ui-serif, serif;--font-body: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;--font-mono: ui-monospace, "SF Mono", Menlo, Consolas, monospace;--text-xs: 11.5px;--text-sm: 12.5px;--text-base: 14px;--text-md: 15px;--text-lg: 18px;--text-xl: 24px;--text-display: 30px;--s1: 4px;--s2: 8px;--s3: 12px;--s4: 16px;--s5: 24px;--s6: 32px;--s7: 48px;--r-sm: 8px;--r: 12px;--r-lg: 16px;--r-pill: 999px;--ease-out: cubic-bezier(.22, 1, .36, 1);--ease-in-out: cubic-bezier(.65, 0, .35, 1);--dur: .16s;--shadow-1: 0 1px 2px rgba(48, 34, 20, .06), 0 1px 3px rgba(48, 34, 20, .05);--shadow-2: 0 12px 40px rgba(48, 34, 20, .12);--ring: 0 0 0 3px oklch(58% .128 45 / .28)}*{box-sizing:border-box}html,body,#root{height:100%}html{overflow-x:clip}body{margin:0;overflow-x:clip;font-family:var(--font-body);font-size:var(--text-base);line-height:1.5;color:var(--ink);background:var(--paper);-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}h1,h2,h3{font-family:var(--font-display);font-style:normal;font-weight:600;letter-spacing:-.01em;color:var(--ink)}.app{display:flex;min-height:100vh}.sidebar{width:256px;flex:0 0 256px;background:var(--sidebar);color:var(--sidebar-ink);display:flex;flex-direction:column;padding:var(--s5) var(--s3);position:sticky;top:0;height:100vh;overflow-y:auto}.brand{display:flex;align-items:center;gap:var(--s3);padding:var(--s1) var(--s2) var(--s5)}.logo{width:40px;height:40px;flex:0 0 40px;border-radius:11px;background:linear-gradient(145deg,var(--accent),var(--accent-2));color:#fff;font-family:var(--font-display);font-weight:700;font-size:22px;display:grid;place-items:center;box-shadow:inset 0 0 0 1px #ffffff1f}.brand-name{font-weight:600;color:#fff;font-size:var(--text-md);letter-spacing:-.01em}.brand-sub{font-size:var(--text-xs);color:var(--sidebar-muted);margin-top:2px}.nav-group{margin-bottom:var(--s3)}.nav-title{font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--sidebar-muted);padding:var(--s2) var(--s2) var(--s1);font-weight:600}.nav-item{display:flex;align-items:center;gap:10px;width:100%;border:0;background:transparent;color:var(--sidebar-ink);padding:9px 10px;border-radius:var(--r-sm);cursor:pointer;font-family:var(--font-body);font-size:13.5px;text-align:left;transition:background var(--dur) var(--ease-out),color var(--dur) var(--ease-out)}.nav-item:hover{background:#ffffff0f}.nav-item:focus-visible{outline:0;box-shadow:var(--ring)}.nav-item.active{background:var(--accent);color:#fff;font-weight:600}.nav-ico{width:18px;text-align:center;opacity:.85}.nav-item.active .nav-ico{opacity:1}.side-foot{margin-top:auto;padding:var(--s3) var(--s2) 0;font-size:var(--text-xs);color:var(--sidebar-muted);border-top:1px solid rgba(255,255,255,.08)}.main{flex:1;min-width:0}.page{padding:var(--s6) var(--s6) 72px;max-width:1260px}.page-head{display:flex;justify-content:space-between;align-items:flex-start;gap:var(--s4);margin-bottom:var(--s5)}.page-head h1{font-size:var(--text-display);margin:0 0 4px;line-height:1.1}.muted{color:var(--muted)}.small{font-size:var(--text-sm)}.pad{padding:var(--s5) 0}h2{font-size:var(--text-lg);margin:0 0 var(--s3);line-height:1.2}h2.sec{margin-top:var(--s6)}.btn{font-family:var(--font-body);font-size:13.5px;font-weight:600;border:1px solid var(--line-2);background:var(--surface);color:var(--ink);padding:9px 14px;border-radius:var(--r-sm);cursor:pointer;transition:background var(--dur) var(--ease-out),border-color var(--dur) var(--ease-out),transform var(--dur) var(--ease-out)}.btn:hover{background:var(--paper-2)}.btn:focus-visible{outline:0;box-shadow:var(--ring)}.btn:active{transform:translateY(1px)}.btn:disabled{opacity:.55;cursor:default}.btn.primary{background:var(--accent);border-color:var(--accent);color:#fff}.btn.primary:hover{background:var(--accent-2);border-color:var(--accent-2)}.link{border:0;background:none;color:var(--accent-2);cursor:pointer;padding:0 6px;font-size:var(--text-sm);font-weight:600}.link:hover{text-decoration:underline}.link.danger{color:var(--danger)}.link:focus-visible{outline:0;box-shadow:var(--ring);border-radius:4px}.toolbar{display:flex;flex-wrap:wrap;gap:var(--s2);align-items:center;margin-bottom:var(--s4)}.search{flex:1;min-width:200px;padding:9px 12px;border:1px solid var(--line-2);border-radius:var(--r-sm);font-size:13.5px;background:var(--surface);color:var(--ink);font-family:var(--font-body)}.search:focus-visible{outline:0;border-color:var(--accent);box-shadow:var(--ring)}.toolbar select{padding:9px 10px;border:1px solid var(--line-2);border-radius:var(--r-sm);background:var(--surface);font-size:13px;max-width:230px;color:var(--ink);font-family:var(--font-body)}.toolbar select:focus-visible{outline:0;border-color:var(--accent);box-shadow:var(--ring)}.count{margin-left:auto;color:var(--muted);font-size:var(--text-sm)}.table-wrap{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);overflow:auto;box-shadow:var(--shadow-1)}table{width:100%;border-collapse:collapse}th,td{padding:11px 14px;text-align:left;vertical-align:top;border-bottom:1px solid var(--line)}th{background:var(--paper-2);font-size:var(--text-xs);text-transform:uppercase;letter-spacing:.06em;color:var(--ink-2);font-weight:600;position:sticky;top:0;z-index:1}tr:last-child td{border-bottom:0}tbody tr{transition:background var(--dur) var(--ease-out)}tbody tr:hover{background:#f9f4ec}td.act,th.act{text-align:right;white-space:nowrap}td.empty{text-align:center;color:var(--muted);padding:var(--s6)}.cell-txt{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;max-width:430px}.tnum{font-variant-numeric:tabular-nums}.badge,.pill{display:inline-block;padding:3px 9px;border-radius:var(--r-pill);font-size:var(--text-xs);font-weight:600;white-space:nowrap;line-height:1.5}.badge{background:var(--paper-2);color:var(--ink-2)}.b-done,.b-decided,.b-paid{background:var(--ok-soft);color:#085023}.b-in-progress,.b-reimbursed{background:var(--info-soft);color:#124a7b}.b-blocked{background:var(--danger-soft);color:#8d1a1e}.b-not-started,.b-cancelled,.b-not-applicable{background:var(--paper-2);color:var(--muted)}.b-open,.b-planned{background:var(--warn-soft);color:#764b00;color:oklch(45% .12 72)}.b-deferred{background:var(--violet-soft);color:#583a84}.pill{background:var(--paper-2);color:var(--ink-2)}.p-critical{background:var(--danger-soft);color:#8d1a1e}.p-high{background:#ffeadc;background:oklch(95% .05 55);color:#873d00;color:oklch(45% .13 50)}.p-medium{background:var(--warn-soft);color:#764b00;color:oklch(45% .12 72)}.p-low{background:var(--paper-2);color:var(--ink-2)}.kpis{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:var(--s3);margin-bottom:var(--s5)}.kpi{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);padding:var(--s4);box-shadow:var(--shadow-1)}.kpi-val{font-family:var(--font-display);font-size:var(--text-xl);font-weight:600;letter-spacing:-.01em;font-variant-numeric:tabular-nums}.kpi-label{font-size:var(--text-xs);color:var(--muted);margin-top:4px;text-transform:uppercase;letter-spacing:.05em}.kpi.ok .kpi-val{color:#09672e}.kpi.warn .kpi-val{color:#905c00;color:oklch(52% .13 72)}.kpi.danger .kpi-val{color:var(--danger)}.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);padding:var(--s5);margin-bottom:var(--s4);box-shadow:var(--shadow-1)}.grid2{display:grid;grid-template-columns:1fr 1fr;gap:var(--s4)}.big{font-family:var(--font-display);font-size:48px;font-weight:600;color:var(--accent-2);line-height:1;margin-bottom:var(--s3);font-variant-numeric:tabular-nums}.bar{height:9px;background:var(--paper-2);border-radius:var(--r-pill);overflow:hidden}.bar>span{display:block;height:100%;background:linear-gradient(90deg,var(--accent),var(--accent-2));border-radius:var(--r-pill);transition:width var(--dur) var(--ease-out)}.flex1{flex:1}.bar-row{margin-bottom:12px}.bar-row-top{display:flex;justify-content:space-between;gap:10px;font-size:var(--text-sm);margin-bottom:5px}.bar-row-top span:last-child{color:var(--ink-2);font-weight:600}.phase-row{display:flex;align-items:center;gap:12px;padding:7px 0}.phase-name{width:250px;font-size:13px}.phase-num{width:120px;text-align:right;font-size:var(--text-sm);color:var(--muted);font-variant-numeric:tabular-nums}.gate{display:inline-block;padding:10px 16px;border-radius:var(--r);font-weight:700;letter-spacing:.03em;font-size:13px}.gate.ok{background:var(--ok-soft);color:#085023}.gate.danger{background:var(--danger-soft);color:#8d1a1e}table.mini{width:100%;border-collapse:collapse}table.mini td{padding:7px 0;border-bottom:1px solid var(--line);font-size:13px}table.mini tr:last-child td{border-bottom:0}table.mini .r{text-align:right}.neg{color:var(--danger)}.modal-bg{position:fixed;top:0;right:0;bottom:0;left:0;background:#1d140d80;-webkit-backdrop-filter:blur(2px);backdrop-filter:blur(2px);display:grid;place-items:center;padding:var(--s5);z-index:50}.modal{background:var(--surface);border-radius:var(--r-lg);width:min(780px,100%);max-height:90vh;overflow-y:auto;box-shadow:var(--shadow-2);border:1px solid var(--line)}.modal-head{display:flex;justify-content:space-between;align-items:center;padding:var(--s4) var(--s5);border-bottom:1px solid var(--line);position:sticky;top:0;background:var(--surface);z-index:2}.modal-head h2{margin:0}.x{border:0;background:none;font-size:26px;line-height:1;color:var(--muted);cursor:pointer;padding:0 4px}.x:hover{color:var(--ink)}.x:focus-visible{outline:0;box-shadow:var(--ring);border-radius:6px}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:var(--s3) var(--s4);padding:var(--s5)}.form-grid label{display:flex;flex-direction:column;gap:5px;font-size:var(--text-sm);color:var(--ink-2);font-weight:500}.form-grid label.full{grid-column:1 / -1}.form-grid label em{color:var(--danger);font-style:normal}.form-grid input,.form-grid select,.form-grid textarea{border:1px solid var(--line-2);border-radius:var(--r-sm);padding:9px 11px;font-size:13.5px;font-family:var(--font-body);background:var(--surface);color:var(--ink);transition:border-color var(--dur) var(--ease-out),box-shadow var(--dur) var(--ease-out)}.form-grid input:focus-visible,.form-grid select:focus-visible,.form-grid textarea:focus-visible{outline:0;border-color:var(--accent);box-shadow:var(--ring)}.form-grid textarea{resize:vertical}.modal-foot{display:flex;justify-content:flex-end;gap:var(--s2);padding:var(--s4) var(--s5);border-top:1px solid var(--line);position:sticky;bottom:0;background:var(--surface)}.alert{background:var(--danger-soft);color:#8d1a1e;border:1px solid oklch(88% .06 25);padding:10px 14px;border-radius:var(--r-sm);margin:var(--s3) 0;font-size:13px}.report-head{display:flex;justify-content:space-between;align-items:center;padding:var(--s5);background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);margin-bottom:var(--s5);box-shadow:var(--shadow-1)}.rh-title{font-family:var(--font-display);font-size:var(--text-lg);font-weight:600}.rh-sub{color:var(--muted);font-size:var(--text-sm);margin-top:3px}.rep-table{width:100%;border-collapse:collapse;background:var(--surface);border:1px solid var(--line);border-radius:var(--r);overflow:hidden;margin-bottom:var(--s2)}.rep-table th,.rep-table td{padding:9px 14px;border-bottom:1px solid var(--line);font-size:13px}.rep-table th{background:var(--paper-2)}.rep-table .r{text-align:right;font-variant-numeric:tabular-nums}.foot-note{margin-top:var(--s5)}.head-actions{display:flex;gap:var(--s2);align-items:center;flex-wrap:wrap}.head-actions .btn{text-decoration:none;display:inline-block}.hint{background:var(--info-soft);color:#124a7b;border:1px solid oklch(90% .04 250);border-radius:var(--r-sm);padding:9px 14px;margin-bottom:var(--s4);font-size:var(--text-sm)}.strip{display:flex;align-items:center;gap:var(--s2);padding:9px 14px;margin-bottom:var(--s3);background:var(--accent-soft);border:1px solid oklch(90% .04 55);border-radius:var(--r-sm)}.strip b{font-family:var(--font-display);font-size:var(--text-md);color:var(--accent-ink)}.flag{display:inline-block;padding:2px 8px;border-radius:var(--r-pill);font-size:var(--text-xs);font-weight:600;background:var(--paper-2);color:var(--muted)}.flag.on{background:var(--accent-soft);color:var(--accent-ink)}tbody tr.derived{background:repeating-linear-gradient(135deg,var(--paper-2) 0 6px,var(--surface) 6px 12px)}tbody tr.derived td{color:var(--muted);font-style:italic}.mono{font-family:var(--font-mono);font-size:var(--text-sm);color:var(--ink-2)}.ext{color:var(--accent-2);font-weight:600;text-decoration:none}.ext:hover{text-decoration:underline}.ext.small{font-size:var(--text-xs)}.kpi-sub{font-size:var(--text-xs);color:var(--muted);margin-top:5px}h2.sect{margin-top:var(--s6);padding-top:var(--s4);border-top:1px solid var(--line)}.gate-list{list-style:none;margin:var(--s3) 0 0;padding:0}.gate-list li{display:flex;align-items:center;gap:var(--s2);padding:6px 0;border-bottom:1px solid var(--line);font-size:var(--text-sm)}.gate-list li:last-child{border-bottom:0}.gate-list .txt{flex:1;display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden}table.mini thead th{position:static;background:transparent;padding:6px 0;border-bottom:1px solid var(--line-2);font-size:10.5px}table.mini th.r{text-align:right}table.mini td{padding:8px 0}.w-pct{width:120px}.bar.slim{height:6px;margin-bottom:4px}.bar>span.over{background:linear-gradient(90deg,var(--warn),var(--danger))}.spacer{flex:1}.btn.wide{width:100%;text-align:center}.center{text-align:center}.alert.warn{background:var(--warn-soft);color:#6b4300;color:oklch(42% .12 72);border-color:#f1d2ad}.form-grid label .check{display:flex;align-items:center;gap:8px;padding:9px 0;font-size:13.5px;color:var(--ink);font-weight:500;cursor:pointer}.form-grid label .check input{width:16px;height:16px;accent-color:var(--accent)}.upload{display:grid;grid-template-columns:1fr auto;gap:6px;align-items:center}.upload input[type=file]{grid-column:1 / -1;font-size:var(--text-xs)}.upload a{grid-column:1 / -1}.boot{display:grid;place-items:center;min-height:100vh;color:var(--muted)}.login-wrap{min-height:100vh;display:grid;place-items:center;padding:var(--s5);background:radial-gradient(900px 500px at 15% -10%,oklch(94% .035 55),transparent 60%),var(--paper)}.login-card{width:min(400px,100%);background:var(--surface);border:1px solid var(--line);border-radius:var(--r-lg);padding:var(--s6);box-shadow:var(--shadow-2);display:flex;flex-direction:column;gap:var(--s3)}.login-brand{padding:0 0 var(--s3)}.login-brand .brand-name{color:var(--ink)}.login-brand .brand-sub{color:var(--muted)}.login-card h1{font-size:var(--text-xl);margin:0}.login-card label{display:flex;flex-direction:column;gap:5px;font-size:var(--text-sm);color:var(--ink-2);font-weight:500}.login-card input{border:1px solid var(--line-2);border-radius:var(--r-sm);padding:10px 12px;font-size:var(--text-md);font-family:var(--font-body);background:var(--surface);color:var(--ink)}.login-card input:focus-visible{outline:0;border-color:var(--accent);box-shadow:var(--ring)}.login-card code{background:var(--paper-2);padding:1px 5px;border-radius:4px;font-size:var(--text-xs)}.role-chip{display:inline-block;margin-bottom:var(--s2);background:#ffffff1a;color:var(--sidebar-ink);padding:3px 9px;border-radius:var(--r-pill);font-size:var(--text-xs);font-weight:600}.side-foot{display:flex;flex-direction:column;gap:var(--s2);align-items:flex-start}.side-foot .link{color:var(--sidebar-ink);padding:0}.side-foot .link:hover{color:#fff}.tl-card{padding:var(--s4) var(--s4) var(--s3);overflow:hidden}.tl-scroll{overflow-x:auto}.tl-grid{min-width:640px}.tl-row{display:grid;grid-template-columns:270px repeat(var(--weeks),minmax(30px,1fr));align-items:center;border-bottom:1px solid var(--line)}.tl-row:last-child{border-bottom:0}.tl-row.tl-head{border-bottom:1px solid var(--line-2)}.tl-label{padding:9px 12px 9px 0;font-size:var(--text-sm);min-width:0}.tl-phase-name{font-weight:600;color:var(--ink)}.tl-item-name{display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden;color:var(--ink-2)}.tl-meta{display:block;font-size:var(--text-xs);color:var(--muted);margin-top:2px}.tl-gate-tag{color:var(--accent-2)}.tl-row.is-phase{background:var(--paper-2)}.tl-row.is-phase .tl-label{font-weight:600}.tl-row.is-item .tl-label{padding-left:14px}.tl-week{text-align:center;padding:7px 2px;line-height:1.25;border-left:1px solid var(--line);overflow:hidden}.tl-week b{display:block;font-size:10.5px;color:var(--ink-2);letter-spacing:.04em}.tl-week span{display:block;font-size:9px;color:var(--muted);white-space:nowrap}.tl-week.now{background:var(--accent-soft)}.tl-week.now b{color:var(--accent-ink)}.tl-week.launch{background:#d5f5da}.tl-week.launch b{color:#115629}.tl-track{grid-column:2 / -1;display:grid;grid-template-columns:repeat(var(--weeks),minmax(0,1fr));align-items:center;min-height:34px;padding:5px 0;background-image:linear-gradient(to right,var(--line) 0 1px,transparent 1px);background-size:calc(100% / var(--weeks)) 100%;background-position:left center}.tl-row.is-phase .tl-track{min-height:40px}.tl-bar{height:12px;border-radius:var(--r-pill);margin:0 2px;display:flex;align-items:center;justify-content:flex-end;padding-right:7px;overflow:hidden;font-size:9.5px;font-weight:700;color:#fff;background:var(--line-2);transition:filter var(--dur) var(--ease-out)}.tl-bar.thick{height:18px}.tl-bar:hover{filter:brightness(.94)}.tl-bar.done{background:linear-gradient(90deg,oklch(60% .12 150),var(--ok))}.tl-bar.progress{background:linear-gradient(90deg,oklch(60% .12 250),var(--info))}.tl-bar.blocked{background:linear-gradient(90deg,oklch(62% .16 25),var(--danger))}.tl-bar.idle{background:linear-gradient(90deg,oklch(80% .012 80),var(--line-2));color:var(--ink-2)}.tl-diamond{grid-row:1;align-self:center;justify-self:end;z-index:2;width:9px;height:9px;margin-right:-3px;background:var(--accent-ink);transform:rotate(45deg);box-shadow:0 0 0 2px var(--surface)}.tl-legend{display:flex;flex-wrap:wrap;gap:var(--s4);padding:var(--s3) 0 0;margin-top:var(--s3);border-top:1px solid var(--line);font-size:var(--text-xs);color:var(--muted)}.tl-legend span{display:inline-flex;align-items:center;gap:6px}.tl-legend .sw{width:11px;height:11px;border-radius:3px;display:inline-block}.tl-legend .sw.done{background:var(--ok)}.tl-legend .sw.progress{background:var(--info)}.tl-legend .sw.blocked{background:var(--danger)}.tl-legend .sw.idle{background:var(--line-2)}.tl-legend .sw.diamond{width:8px;height:8px;border-radius:0;transform:rotate(45deg);background:var(--accent-ink)}.tl-field{display:flex;flex-direction:column;gap:3px;font-size:var(--text-xs);color:var(--muted)}.tl-field input,.tl-field select{padding:7px 9px;border:1px solid var(--line-2);border-radius:var(--r-sm);background:var(--surface);color:var(--ink);font-size:13px;font-family:var(--font-body)}.tl-field input:disabled{opacity:.6}.tl-field input:focus-visible,.tl-field select:focus-visible{outline:0;border-color:var(--accent);box-shadow:var(--ring)}@media print{body{background:#fff}.sidebar,.no-print{display:none!important}.page{padding:0;max-width:none}.report-head{border:0;box-shadow:none}.kpi,.rep-table{break-inside:avoid;box-shadow:none}.tl-scroll{overflow:visible}.tl-grid{min-width:0}.tl-card{border:0;box-shadow:none;padding:0}.tl-row{break-inside:avoid}.tl-bar,.tl-diamond,.tl-week.now{-webkit-print-color-adjust:exact;print-color-adjust:exact}}@media (max-width: 820px){.sidebar{display:none}.page{padding:var(--s5) var(--s4) 60px}.grid2,.form-grid{grid-template-columns:1fr}.phase-name{width:150px}}
