:root{--ink:#17201d;--muted:#65716d;--line:#dfe6e2;--soft:#f3f6f4;--paper:#fff;--green:#006c4c;--green-2:#008d65;--green-soft:#e9f6f0;--navy:#233d4d;--amber:#a66200;--amber-soft:#fff4da;--red:#aa2e26;--red-soft:#feeeee;--gray:#7b8581;--shadow:0 10px 30px rgba(22,43,34,.08);font-family:"Noto Sans TC","Microsoft JhengHei",system-ui,sans-serif;color:var(--ink);background:#eef2ef}
*{box-sizing:border-box}html,body{margin:0;min-height:100%;font-size:16px}button,input,select,textarea{font:inherit;color:inherit}button{cursor:pointer}a{color:var(--green);text-decoration:none}p{line-height:1.65}h1,h2,h3,h4,p{margin-top:0}h1{font-size:1.7rem;margin-bottom:.25rem}h2{font-size:1.28rem}h3{font-size:1.05rem}.muted{color:var(--muted)}.eyebrow{margin:0 0 .3rem;color:var(--green);font-size:.72rem;font-weight:800;letter-spacing:.13em;text-transform:uppercase}.stack{display:flex;flex-direction:column}.gap-md{gap:1rem}[hidden]{display:none!important}
.login-shell{min-height:100vh;display:grid;place-items:center;padding:2rem;background:radial-gradient(circle at 15% 20%,#dcefe5,transparent 35%),linear-gradient(145deg,#f6f8f7,#e8efeb)}.login-card{width:min(430px,100%);padding:2.5rem;background:rgba(255,255,255,.96);border:1px solid #fff;border-radius:24px;box-shadow:0 24px 70px rgba(30,64,49,.16)}.brand-mark{width:58px;height:58px;display:grid;place-items:center;border-radius:17px;background:linear-gradient(140deg,var(--green),#17483b);color:#fff;font-weight:900;letter-spacing:.05em;box-shadow:0 8px 20px rgba(0,108,76,.25);margin-bottom:1.2rem}.brand-mark.small{width:38px;height:38px;border-radius:11px;font-size:.82rem;margin:0;box-shadow:none}
label{display:grid;gap:.45rem;font-size:.82rem;font-weight:700;color:#3d4b46}input,select,textarea{width:100%;border:1px solid #cfd9d4;border-radius:10px;background:#fff;padding:.68rem .78rem;outline:none;transition:.15s}input:focus,select:focus,textarea:focus{border-color:var(--green-2);box-shadow:0 0 0 3px rgba(0,141,101,.11)}textarea{min-height:110px;resize:vertical}.form-error{color:var(--red);background:var(--red-soft);border-radius:9px;padding:.7rem;margin:0}
.btn{border:1px solid transparent;border-radius:10px;padding:.62rem .95rem;font-weight:800;background:#fff;transition:.15s}.btn:hover{transform:translateY(-1px)}.btn.primary{background:var(--green);color:#fff}.btn.secondary{border-color:#b6c7bf;color:var(--green);background:#fff}.btn.ghost{background:var(--soft);color:#35443e}.btn.danger{background:var(--red-soft);color:var(--red)}.btn.small{padding:.38rem .62rem;font-size:.78rem}.btn.wide{width:100%}.text-btn{border:0;background:transparent;padding:.35rem;color:#d4e7df;text-align:left}.text-btn.danger{color:#ffbab4}.icon-btn{border:0;background:transparent;width:40px;height:40px;border-radius:10px;font-size:1.25rem}.icon-btn:hover{background:var(--soft)}
.app-shell{min-height:100vh;display:grid;grid-template-columns:258px minmax(0,1fr)}.sidebar{position:fixed;inset:0 auto 0 0;width:258px;display:flex;flex-direction:column;padding:1.2rem;background:#152c25;color:#eff9f5;z-index:20}.brand{display:flex;gap:.8rem;align-items:center;padding:.25rem .35rem 1.4rem}.brand strong{display:block;font-size:.95rem}.brand span{display:block;color:#9eb8ae;font-size:.7rem;margin-top:.2rem}.sidebar nav{display:grid;gap:.35rem}.nav-item{display:grid;grid-template-columns:32px 1fr;gap:.55rem;align-items:center;width:100%;border:0;border-radius:12px;background:transparent;color:#b9cec6;padding:.75rem;text-align:left}.nav-item b,.nav-item small{display:block}.nav-item small{font-size:.68rem;color:#8ea89e;margin-top:.18rem}.nav-item.active,.nav-item:hover{background:#25483d;color:#fff}.nav-item.active small{color:#c5ddd4}.nav-icon{font-size:1.15rem}.sidebar-foot{margin-top:auto;display:grid;gap:.65rem;border-top:1px solid rgba(255,255,255,.1);padding:.9rem .4rem 0}.user-chip{font-size:.78rem;color:#a9c1b8}.main-column{grid-column:2;min-width:0}.topbar{height:92px;position:sticky;top:0;z-index:10;display:flex;align-items:center;gap:1rem;justify-content:space-between;padding:1rem 2rem;background:rgba(255,255,255,.9);backdrop-filter:blur(12px);border-bottom:1px solid var(--line)}.topbar h1{margin:0}.top-actions{display:flex;align-items:center;gap:.55rem}.content{max-width:1500px;margin:auto;padding:1.6rem 2rem 4rem}.mobile-only{display:none}
.hero-strip{display:flex;justify-content:space-between;gap:1rem;align-items:flex-end;margin-bottom:1.2rem}.hero-strip p{margin:0;color:var(--muted)}.cards{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1rem;margin-bottom:1.3rem}.metric{background:var(--paper);border:1px solid var(--line);border-radius:16px;padding:1.1rem 1.2rem;box-shadow:0 4px 15px rgba(30,55,45,.03);position:relative;min-width:0}.metric span{display:block;color:var(--muted);font-size:.78rem}.metric strong{display:block;font-size:2rem;margin:.25rem 0}.metric small{display:block;color:var(--muted);line-height:1.45}.metric.red{border-top:3px solid var(--red)}.metric.amber{border-top:3px solid #d89023}.metric.green{border-top:3px solid var(--green)}.metric-kind{display:block;margin-top:.7rem;font-size:.7rem;font-style:normal;font-weight:800;color:#718078}.metric-static{box-shadow:none;background:#f8faf9}.metric-static .metric-kind{color:#7b8983}.metric-link{display:block;color:inherit;text-decoration:none;cursor:pointer;transition:border-color .15s,box-shadow .15s,transform .15s}.metric-link .metric-kind{color:var(--brand)}.metric-link:hover{border-color:#79a995;box-shadow:0 7px 20px rgba(30,55,45,.09);transform:translateY(-1px)}.metric-link:focus-visible,.clickable-card:focus-visible,.clickable-card-row:focus-visible{outline:3px solid #237166;outline-offset:3px}.clickable-card-row{cursor:pointer}.clickable-card-row:hover{background:#f6faf8}.card-destination{display:block;color:var(--brand);font-size:.72rem;font-style:normal;font-weight:800;margin-top:auto}
.dashboard-grid{display:grid;grid-template-columns:1.25fr .75fr;gap:1rem}.panel{background:var(--paper);border:1px solid var(--line);border-radius:16px;padding:1.15rem;min-width:0}.panel+.panel{margin-top:1rem}.panel-head{display:flex;align-items:center;justify-content:space-between;gap:1rem;margin-bottom:1rem}.panel-head h2,.panel-head h3{margin:0}.panel-head p{margin:.25rem 0 0;color:var(--muted);font-size:.8rem}.link-btn{border:0;background:transparent;color:var(--green);font-weight:800}.empty{padding:2.4rem 1rem;text-align:center;color:var(--muted);border:1px dashed #cbd7d1;border-radius:12px;background:#fafcfb}.loading{display:grid;place-items:center;min-height:280px;color:var(--muted)}
.filterbar{display:flex;gap:.65rem;align-items:end;flex-wrap:wrap;background:#fff;border:1px solid var(--line);border-radius:14px;padding:.85rem;margin-bottom:1rem}.filterbar label{min-width:130px}.filterbar .grow{flex:1;min-width:220px}.view-toggle{display:flex;border:1px solid var(--line);border-radius:10px;overflow:hidden}.view-toggle button{border:0;background:#fff;padding:.56rem .75rem}.view-toggle button.active{background:var(--green-soft);color:var(--green);font-weight:800}
.table-wrap{overflow:auto;border:1px solid var(--line);border-radius:13px;background:#fff}.data-table{width:100%;border-collapse:collapse;min-width:780px}.data-table th{position:sticky;top:0;background:#f5f8f6;color:#53615c;font-size:.73rem;text-align:left;padding:.68rem .75rem;border-bottom:1px solid var(--line);white-space:nowrap}.data-table td{padding:.78rem .75rem;border-bottom:1px solid #edf1ef;vertical-align:top}.data-table tr:last-child td{border-bottom:0}.data-table tbody tr.clickable:hover{background:#f7fbf9;cursor:pointer}.primary-cell strong{display:block}.primary-cell small{display:block;color:var(--muted);margin-top:.2rem}.numeric{text-align:right;font-variant-numeric:tabular-nums}
.badge{display:inline-flex;align-items:center;gap:.3rem;border-radius:999px;padding:.25rem .55rem;background:var(--soft);color:#52615b;font-size:.7rem;font-weight:800;white-space:nowrap}.badge.green{background:var(--green-soft);color:var(--green)}.badge.red{background:var(--red-soft);color:var(--red)}.badge.yellow{background:var(--amber-soft);color:var(--amber)}.badge.gray{background:#edf0ef;color:#66716d}.badge.blue{background:#edf3f7;color:#355d74}.signal{display:inline-flex;align-items:center;gap:.45rem;font-weight:800;font-size:.78rem}.signal:before{content:"";width:9px;height:9px;border-radius:50%;background:var(--gray)}.signal.GREEN:before{background:#15966c}.signal.YELLOW:before{background:#e0a323}.signal.RED:before{background:#c94136}.signal.GRAY:before{background:#98a09d}.progress{height:7px;background:#e8eeeb;border-radius:99px;overflow:hidden;min-width:90px}.progress i{display:block;height:100%;background:var(--green-2);border-radius:inherit}.progress-pair{display:grid;gap:.35rem}.progress-pair small{display:flex;justify-content:space-between;color:var(--muted)}
.project-header{display:flex;align-items:flex-start;justify-content:space-between;gap:1rem;margin-bottom:1rem}.project-title{display:flex;gap:.85rem;align-items:flex-start}.back-btn{border:1px solid var(--line);background:#fff;border-radius:10px;padding:.48rem .65rem}.project-meta{display:flex;gap:.45rem;flex-wrap:wrap;margin-top:.5rem}.tabs{display:flex;gap:.25rem;border-bottom:1px solid var(--line);margin-bottom:1rem;overflow:auto}.tabs button{border:0;background:transparent;padding:.75rem .9rem;color:var(--muted);white-space:nowrap;border-bottom:3px solid transparent}.tabs button.active{color:var(--green);font-weight:900;border-bottom-color:var(--green)}.summary-grid{display:grid;grid-template-columns:2fr 1fr 1fr;gap:1rem}.summary-main{grid-row:span 2}.status-reasons{margin:.8rem 0 0;padding-left:1.1rem;color:#52615b}.status-reasons li{margin:.35rem 0}.key-value{display:grid;grid-template-columns:130px 1fr;gap:.6rem;padding:.55rem 0;border-bottom:1px solid #edf1ef}.key-value:last-child{border-bottom:0}.key-value span{color:var(--muted);font-size:.8rem}
.plan-toolbar{display:flex;gap:.55rem;flex-wrap:wrap;margin-bottom:1rem}.wbs{display:grid;gap:.75rem}.wbs-group{border:1px solid var(--line);border-radius:14px;background:#fff;overflow:hidden}.wbs-head{display:grid;grid-template-columns:minmax(220px,1.4fr) repeat(3,minmax(90px,.45fr)) auto;gap:.75rem;align-items:center;padding:.85rem 1rem;background:#f5f8f6}.wbs-head h3{margin:0}.wbs-body{padding:.4rem 1rem .9rem}.milestone-row,.work-row{display:grid;grid-template-columns:minmax(220px,1.4fr) minmax(100px,.5fr) minmax(100px,.5fr) minmax(100px,.5fr) auto;gap:.75rem;align-items:center;padding:.72rem .3rem;border-bottom:1px solid #edf1ef}.milestone-row{background:#fffaf0;border-left:3px solid #d89a30;padding-left:.65rem}.work-row:last-child,.milestone-row:last-child{border-bottom:0}.row-actions{display:flex;gap:.35rem}.indent{padding-left:1.2rem}.kanban{display:grid;grid-template-columns:repeat(4,minmax(240px,1fr));gap:.8rem;overflow:auto}.kanban-col{background:#eef3f0;border-radius:14px;padding:.75rem;min-height:260px}.kanban-col h3{display:flex;justify-content:space-between}.kanban-card{background:#fff;border:1px solid var(--line);border-radius:10px;padding:.7rem;margin:.55rem 0;box-shadow:0 3px 10px rgba(30,55,45,.04)}.kanban-card p{font-size:.78rem;color:var(--muted);margin:.35rem 0}.kanban-card .meta{display:flex;justify-content:space-between;gap:.4rem;font-size:.7rem}
.timeline{display:grid;gap:.8rem}.timeline-item{display:grid;grid-template-columns:115px 1fr;gap:.9rem}.timeline-date{color:var(--muted);font-size:.75rem;padding-top:.2rem}.timeline-content{border-left:2px solid #b9d7cb;padding:0 0 1rem 1rem}.timeline-content h3{margin:0 0 .35rem}.issue-card{border-left:4px solid #d89023;background:#fff;border-radius:12px;border-top:1px solid var(--line);border-right:1px solid var(--line);border-bottom:1px solid var(--line);padding:.85rem;margin-bottom:.65rem}.issue-card.CRITICAL{border-left-color:var(--red)}.issue-card.HIGH{border-left-color:#e06935}.issue-card h3{margin:0}.issue-card header{display:flex;justify-content:space-between;gap:.5rem}.decision-card{padding:.85rem;border:1px solid var(--line);border-radius:12px;background:#fff;margin-bottom:.65rem}.decision-card h3{margin:.35rem 0}.decision-card p{margin:.35rem 0;color:#44534d}.decision-card .meta{display:flex;gap:.4rem;flex-wrap:wrap}
.modal{width:min(760px,calc(100vw - 2rem));padding:0;border:0;border-radius:18px;box-shadow:0 30px 90px rgba(9,26,19,.3)}.modal::backdrop{background:rgba(10,27,21,.52);backdrop-filter:blur(2px)}.modal-frame{margin:0}.modal-frame>header{display:flex;justify-content:space-between;align-items:center;padding:1.1rem 1.25rem;border-bottom:1px solid var(--line)}.modal-frame>header h2{margin:0}.modal-body{padding:1.2rem;max-height:72vh;overflow:auto}.modal-frame>footer{display:flex;justify-content:flex-end;gap:.6rem;padding:1rem 1.2rem;border-top:1px solid var(--line);background:#fafcfb}.form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:.9rem}.form-grid .full{grid-column:1/-1}.checkline{display:flex;align-items:center;gap:.5rem}.checkline input{width:auto}.toast{position:fixed;right:1.2rem;bottom:1.2rem;z-index:100;width:min(380px,calc(100vw - 2.4rem));padding:.85rem 1rem;border-radius:12px;background:#173a2e;color:#fff;box-shadow:var(--shadow);opacity:0;transform:translateY(12px);pointer-events:none;transition:.2s}.toast.show{opacity:1;transform:none}.toast.error{background:#8f2b25}
/* Geometry is an SVG attribute, so strict style-src 'self' cannot turn 0% into a full bar. */
.progress-chart{display:block;width:100%;height:7px}.progress-fill{fill:var(--green-2)}
@media(max-width:1100px){.cards{grid-template-columns:repeat(2,1fr)}.dashboard-grid,.summary-grid{grid-template-columns:1fr}.summary-main{grid-row:auto}.kanban{grid-template-columns:repeat(4,280px)}}
@media(max-width:760px){.app-shell{display:block}.sidebar{transform:translateX(-100%);transition:.2s}.sidebar.open{transform:none}.main-column{width:100%}.topbar{height:78px;padding:.8rem 1rem}.mobile-only{display:inline-grid;place-items:center}.content{padding:1rem}.cards{grid-template-columns:1fr 1fr;gap:.7rem}.metric{padding:.85rem}.metric strong{font-size:1.55rem}.hero-strip,.project-header{align-items:flex-start;flex-direction:column}.filterbar{display:grid;grid-template-columns:1fr 1fr}.filterbar .grow{grid-column:1/-1}.form-grid{grid-template-columns:1fr}.form-grid .full{grid-column:auto}.wbs-head,.milestone-row,.work-row{grid-template-columns:1fr auto}.wbs-head>*:not(:first-child):not(:last-child),.milestone-row>*:not(:first-child):not(:last-child),.work-row>*:not(:first-child):not(:last-child){display:none}.timeline-item{grid-template-columns:1fr}.timeline-content{border-left:0;padding-left:0}.top-actions .btn.secondary{display:none}}
