:root{--bg:#f6f8fc;--panel:#fff;--line:#e3e9f2;--text:#152033;--muted:#748198;--primary:#2f80ed}*{box-sizing:border-box}body,html{margin:0;background:var(--bg);color:var(--text);font-family:Inter,ui-sans-serif,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}button,input,select,textarea{font:inherit}.pageShell{display:grid;grid-template-columns:minmax(0,1fr) 280px;grid-gap:16px;gap:16px;padding:18px;align-items:start}.pageShell.exporting{width:max-content;min-width:100%;background:var(--bg)}.pageShell.exporting .board{overflow:visible}.pageShell.exporting .ganttScroll{max-height:none!important;overflow:visible!important}.pageShell.exporting .groupSticky,.pageShell.exporting .headerRow,.pageShell.exporting .stickyTaskHeader,.pageShell.exporting .taskCell{position:relative;left:auto;top:auto;box-shadow:none}.board,.card{background:#fff;border:1px solid #e1e7f0;border-radius:18px;box-shadow:0 4px 18px rgba(36,56,92,.04)}.board{min-width:0;overflow:hidden;align-self:start}.toolbar{height:68px;padding:12px 14px;display:flex;align-items:center;gap:10px;border-bottom:1px solid var(--line)}.toolbarSpacer{flex:1 1}.dateRange,.primaryButton,.secondaryButton,.select{height:40px;border:1px solid var(--line);border-radius:9px;padding:0 14px;background:#fff;color:#42506a;font-weight:700}.primaryButton{background:#2f80ed;border-color:#2f80ed;color:#fff;cursor:pointer}.secondaryButton{cursor:pointer}.dateRange{display:flex;align-items:center}.ganttScroll{overflow:auto;max-height:calc(100vh - 105px);scrollbar-width:thin}.ganttScroll::-webkit-scrollbar{height:11px;width:11px}.ganttScroll::-webkit-scrollbar-thumb{background:#c9d3e1;border-radius:999px}.gantt,.headerRow,.taskRow{position:relative;width:max-content}.headerRow,.taskRow{display:grid}.headerRow{height:52px;top:0;z-index:30;border-bottom:1px solid var(--line)}.headerRow,.stickyTaskHeader{position:-webkit-sticky;position:sticky;background:#fff}.stickyTaskHeader{left:0;z-index:40;padding:17px 18px;font-weight:800;box-shadow:5px 0 14px rgba(36,56,92,.06)}.dateHeader,.stickyTaskHeader{border-right:1px solid var(--line)}.dateHeader{display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:10px;color:#8793a6}.dateHeader strong{font-size:12px;color:#43506a;margin-top:2px}.dateHeader.weekend,.dayCell.weekend{background:#fafbfd}.groupRow{height:40px;background:#f7f9fc;border-bottom:1px solid var(--line);position:relative}.groupSticky{height:100%;width:420px;position:-webkit-sticky;position:sticky;left:0;z-index:20;background:#f7f9fc;display:flex;align-items:center;gap:8px;padding:0 16px;font-weight:800;box-shadow:5px 0 14px rgba(36,56,92,.05)}.groupSticky small{color:#93a0b2}.groupDot{width:9px;height:9px;border-radius:50%}.taskRow{border-bottom:1px solid #e9eef5}.taskCell,.taskRow{height:64px;background:#fff}.taskCell{position:-webkit-sticky;position:sticky;left:0;z-index:18;width:420px;border:0;border-right:1px solid var(--line);box-shadow:5px 0 14px rgba(36,56,92,.06);display:grid;grid-template-columns:28px minmax(0,1fr) auto;align-items:center;grid-gap:8px;gap:8px;padding:8px 12px;text-align:left;cursor:pointer}.sortBadge{width:24px;height:24px;border-radius:7px;background:#eef3f8;color:#5a6b84;display:grid;place-items:center;font-size:10px;font-weight:900}.taskText{min-width:0}.taskText strong{font-size:12px}.taskText span,.taskText strong{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.taskText span{font-size:10.5px;color:#7b8799;margin-top:4px}.statusBadge{font-size:9px;padding:5px 7px;border-radius:7px;font-weight:800;white-space:nowrap}.statusTodo{background:#edf4ff;color:#4f79b7}.statusProgress{background:#fff5df;color:#b7791f}.statusDone{background:#e9f9ef;color:#21884a}.statusCancelled{background:#f1f3f6;color:#7d8795}.dayCell{border-right:1px solid #e8edf4}.taskBar{position:absolute;top:18px;height:28px;border:0;border-radius:8px;color:#1e3a5f;padding:0 9px;font-size:9px;font-weight:800;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left;cursor:pointer;z-index:4;box-shadow:inset 0 0 0 1px rgba(15,23,42,.06)}.checkpointStem{top:31px;height:2px;border:0;margin:0;border-radius:999px;z-index:5;opacity:.95}.checkpoint,.checkpointStem{position:absolute;padding:0;cursor:pointer}.checkpoint{top:26px;width:12px;height:12px;transform:rotate(45deg);border:0;border-radius:2px;background:#2563eb;z-index:6;box-shadow:0 0 0 1px rgba(255,255,255,.65)}.sidebar{display:flex;flex-direction:column;gap:16px;align-self:start}.card{padding:18px}.card h3{margin:0 0 16px;font-size:16px}.bigStat{width:126px;height:126px;margin:4px auto 18px;border:18px solid #91bffc;border-radius:50%;display:flex;flex-direction:column;align-items:center;justify-content:center;font-size:28px;font-weight:900}.bigStat span{font-size:10px;color:#7d899c;font-weight:600}.legend,.projectLine,.summaryLine{display:flex;align-items:center;gap:9px;padding:9px 0;border-top:1px solid #eef2f7;font-size:11px}.summaryLine:first-of-type{border-top:0}.projectLine b,.summaryLine b{margin-left:auto}.projectLine i,.summaryLine i{width:10px;height:10px;border-radius:50%;flex:0 0 auto}.filterItem{width:100%;border:0;background:transparent;text-align:left;cursor:pointer;border-radius:10px;padding-left:8px;padding-right:8px;margin:0 -8px;color:inherit}.filterItem:hover{background:#f3f7fc}.clickableStat{border:18px solid #91bffc;background:#fff;cursor:pointer;font:inherit;color:inherit}.clickableStat:hover{border-color:#6ea8f5}.activeFilter{background:#eaf3ff!important;box-shadow:inset 0 0 0 1px #c5ddfb}.userBadge{height:32px;padding:0 10px;border-radius:999px;background:#eef4ff;color:#35598f;border:1px solid #d5e4fb;font-weight:800;max-width:180px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.filterBanner,.userBadge{display:flex;align-items:center;font-size:11px}.filterBanner{padding:8px 14px;font-weight:700;color:#3d5f8f;background:#f3f8ff;border-bottom:1px solid var(--line);gap:8px;flex-wrap:wrap}.filterBanner strong{background:#fff;border:1px solid #d5e4fb;border-radius:999px;padding:3px 8px;font-size:10px}.emptyFilter{padding:28px 18px;color:#7b8799;font-size:13px;font-weight:600}.loginShell{min-height:100vh;display:grid;place-items:center;padding:24px;background:radial-gradient(circle at top left,rgba(47,128,237,.16),transparent 42%),radial-gradient(circle at bottom right,rgba(20,184,166,.12),transparent 40%),var(--bg)}.loginCard{width:min(420px,100%);background:#fff;border:1px solid #e1e7f0;border-radius:22px;padding:28px;box-shadow:0 18px 50px rgba(36,56,92,.08);display:flex;flex-direction:column;gap:12px}.loginBrand{font-size:12px;font-weight:900;letter-spacing:.04em;text-transform:uppercase;color:#2f80ed}.loginCard h1{margin:0;font-size:28px}.loginCard>p{margin:0 0 8px;color:#748198;font-size:13px;line-height:1.5}.loginCard label{display:flex;flex-direction:column;gap:7px;font-size:11px;font-weight:800;color:#5a677c}.loginCard input{width:100%;border:1px solid #dce4ef;border-radius:10px;padding:11px 12px;color:#22304a;background:#fff;outline:none}.loginCard input:focus{border-color:#80b4fb;box-shadow:0 0 0 3px #eaf3ff}.loginSubmit{width:100%;margin-top:6px}.loginError{background:#fff1f2;color:#be3445;border:1px solid #ffd6da;border-radius:10px;padding:10px 12px;font-size:12px;font-weight:700}.blue{background:#3b82f6}.green{background:#22c55e}.gray{background:#a8b2c2}.projectLine span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:#5f6c81}.barSample{width:38px;height:14px;border-radius:5px;background:#93c5fd;border:1px solid #60a5fa}.diamondSample{width:11px;height:11px;background:#2563eb;transform:rotate(45deg);margin:0 13px;border-radius:1px;box-shadow:-14px 0 0 -4px #2563eb}.hint{font-size:11px;line-height:1.55;color:#7e8ca2;background:#f7faff;border:1px solid #e6eef9;padding:10px 12px;border-radius:10px}.fieldHint{margin:-2px 0 0;font-size:10px;font-weight:600;color:#8090a8}.modalBackdrop{position:fixed;inset:0;background:rgba(15,23,42,.34);display:grid;place-items:center;padding:22px;z-index:100}.modal{width:min(760px,96vw);max-height:92vh;overflow:auto;background:#fff;border-radius:20px;padding:22px;box-shadow:0 24px 80px rgba(15,23,42,.28)}.modalHeader{display:flex;justify-content:space-between;gap:20px;align-items:flex-start}.modalHeader h2{margin:0;font-size:20px}.modalHeader p{margin:5px 0 0;color:#7b879a;font-size:12px}.iconButton{width:34px;height:34px;border:0;border-radius:9px;background:#eef3f8;cursor:pointer;font-size:22px}.formGrid{display:grid;grid-template-columns:1fr 1fr;grid-gap:14px;gap:14px;margin-top:20px}.formGrid label{display:flex;flex-direction:column;gap:7px;font-size:11px;font-weight:800;color:#5a677c}.formGrid input,.formGrid select,.formGrid textarea{width:100%;border:1px solid #dce4ef;border-radius:10px;padding:10px 11px;color:#22304a;background:#fff;outline:none}.formGrid input:focus,.formGrid select:focus,.formGrid textarea:focus{border-color:#80b4fb;box-shadow:0 0 0 3px #eaf3ff}.span2{grid-column:1/-1}.modalActions{display:grid;grid-template-columns:auto 1fr auto auto;grid-gap:10px;gap:10px;margin-top:20px}.dangerButton{height:40px;border:1px solid #ffd6da;background:#fff1f2;color:#c94754;border-radius:9px;padding:0 14px;font-weight:800;cursor:pointer}.dbBadge{height:32px;display:flex;align-items:center;padding:0 10px;border-radius:999px;background:#ecfdf3;color:#16803a;border:1px solid #ccefd8;font-size:10px;font-weight:900;letter-spacing:.02em}.errorBanner,.loadingBanner{padding:10px 14px;font-size:12px;font-weight:700;border-bottom:1px solid var(--line)}.errorBanner{background:#fff1f2;color:#be3445}.loadingBanner{background:#f4f8ff;color:#4c6f9d}button:disabled{opacity:.6;cursor:not-allowed}@media (max-width:1100px){.pageShell{grid-template-columns:1fr}.sidebar{display:grid;grid-template-columns:repeat(3,1fr)}.ganttScroll{max-height:70vh}}@media (max-width:760px){.pageShell{padding:8px}.toolbar{overflow:auto}.formGrid,.sidebar{grid-template-columns:1fr}.span2{grid-column:auto}}