:root{--bg: #f6f7f9;--surface: #ffffff;--line: #e3e6eb;--text: #111827;--muted: #6b7280;--brand: #1d4ed8;--brand-soft: #e8efff;--danger: #b42318;--radius: 10px;--shadow: 0 1px 2px rgba(16, 24, 40, .06), 0 1px 3px rgba(16, 24, 40, .04)}*{box-sizing:border-box}html,body,#root{height:100%}body{margin:0;background:var(--bg);color:var(--text);font:14px/1.55 -apple-system,BlinkMacSystemFont,Segoe UI,Noto Sans TC,Microsoft JhengHei,sans-serif;-webkit-font-smoothing:antialiased}a{color:var(--brand);text-decoration:none}a:hover{text-decoration:underline}h1{font-size:1.35rem;margin:0 0 .35rem}h2{font-size:.98rem;margin:0 0 .6rem;color:var(--muted);font-weight:600;letter-spacing:.02em}p{margin:.4rem 0}.muted{color:var(--muted)}.small{font-size:.82rem}.mono{font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:.85em}.err{color:var(--danger);margin:.4rem 0}.boot{display:grid;place-items:center;height:100%;color:var(--muted)}.center{min-height:100%;display:grid;place-items:center;padding:24px}.center.wide{align-items:start}.center .card{width:100%;max-width:420px}.center.wide .card{max-width:640px}.card{background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:18px 20px}.card+.card{margin-top:14px}.login h1{margin-bottom:.2rem}.form{display:grid;gap:10px;margin-top:12px}.form label{display:grid;gap:4px;font-size:.85rem;color:var(--muted)}.form input{height:38px;padding:0 10px;border:1px solid var(--line);border-radius:8px;font:inherit;color:var(--text);background:#fff}.form input:focus{outline:2px solid var(--brand-soft);border-color:var(--brand)}.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;height:36px;padding:0 14px;border-radius:8px;border:1px solid transparent;background:var(--brand);color:#fff;font:inherit;cursor:pointer}.btn:hover{filter:brightness(1.05);text-decoration:none}.btn:disabled{opacity:.55;cursor:default}.btn.ghost{background:transparent;color:var(--text);border-color:var(--line)}.btn.ghost:hover{background:var(--brand-soft)}.row{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:14px}.notice{border:1px solid #f2d38b;background:#fffaeb;color:#7a4d00;border-radius:8px;padding:10px 12px;margin:12px 0}.notice p{margin:.25rem 0 0;font-size:.85rem}.wsList{list-style:none;margin:14px 0 0;padding:0;display:grid;gap:10px}.wsList li{display:flex;align-items:center;justify-content:space-between;gap:12px;border:1px solid var(--line);border-radius:8px;padding:12px}.wsName{font-weight:600}.wsMeta{color:var(--muted);font-size:.82rem}.shell{display:grid;grid-template-columns:240px 1fr;min-height:100%}.side{background:#0f172a;color:#e5e7eb;padding:16px 14px;display:flex;flex-direction:column;gap:14px}.brand{display:flex;align-items:center;gap:8px}.mark{width:26px;height:26px;border-radius:7px;background:#fff;color:#0f172a;display:grid;place-items:center;font-weight:700;font-size:12px}.brandText{font-weight:600;display:grid;line-height:1.2}.brandSub{font-size:.68rem;color:#94a3b8;font-weight:400}.wsBox{background:#ffffff0f;border-radius:8px;padding:10px}.wsBox .wsName{color:#fff}.wsBox .wsMeta{color:#94a3b8}.wsSwitch{display:inline-block;margin-top:6px;font-size:.78rem;color:#c7d2fe}.nav{display:grid;gap:2px}.nav a,.nav .soon{display:block;padding:8px 10px;border-radius:7px;color:#cbd5e1;font-size:.88rem}.nav a:hover{background:#ffffff14;text-decoration:none}.nav a.on{background:#fff;color:#0f172a;font-weight:600}.nav .soon{color:#64748b;font-size:.8rem}.main{display:flex;flex-direction:column;min-width:0}.top{height:54px;display:flex;align-items:center;justify-content:space-between;padding:0 20px;background:var(--surface);border-bottom:1px solid var(--line)}.topTitle{font-weight:600}.topRight{display:flex;align-items:center;gap:10px}.who{color:var(--muted);font-size:.85rem}.page{padding:20px;max-width:1080px}.pageTitle{margin-bottom:12px}.grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:14px}.kv{display:grid;grid-template-columns:110px 1fr;gap:6px 10px;margin:0}.kv dt{color:var(--muted)}.kv dd{margin:0;word-break:break-word}.todo{margin:0;padding-left:18px}.todo li{margin:4px 0}.matrix{width:100%;border-collapse:collapse;font-size:.88rem}.matrix th,.matrix td{border-bottom:1px solid var(--line);padding:8px;text-align:left}.matrix thead th{color:var(--muted);font-weight:600;font-size:.8rem}.matrix td{text-align:center}.matrix input[type=checkbox]{width:16px;height:16px}@media(max-width:780px){.shell{grid-template-columns:1fr}.side{flex-direction:row;flex-wrap:wrap;align-items:center}.nav{grid-auto-flow:column;overflow-x:auto}.wsBox{display:none}}.ok{color:#067647;margin:.4rem 0}.matrixWrap{overflow-x:auto;background:var(--surface);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow)}.permMatrix{width:100%;border-collapse:collapse;font-size:.86rem;min-width:720px}.permMatrix th,.permMatrix td{border-bottom:1px solid var(--line);padding:8px 10px;text-align:left;white-space:nowrap}.permMatrix thead th{color:var(--muted);font-weight:600;font-size:.78rem;background:var(--surface-2)}.permMatrix tbody tr:hover{background:#fafbfc}.permMatrix tr.is-open{background:var(--brand-soft)}.permMatrix .detailRow>td{background:#fbfcff;padding:14px;white-space:normal}.memberCell{display:grid;gap:2px}.roleTag{font-size:.72rem;color:var(--muted);font-weight:400}.cellBtn{width:30px;height:26px;border-radius:6px;border:1px solid var(--line);background:#fff;color:var(--muted);cursor:pointer;font-size:.8rem;line-height:1}.cellBtn:hover:not(:disabled){border-color:var(--brand);color:var(--brand)}.cellBtn.on{background:var(--brand);border-color:var(--brand);color:#fff}.cellBtn.partial{background:var(--brand-soft);border-color:var(--brand);color:var(--brand)}.cellBtn:disabled{opacity:.45;cursor:default}.capGrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:10px 18px}.capGroupTitle{font-size:.76rem;font-weight:600;color:var(--muted);margin-bottom:4px}.capRow{display:flex;align-items:center;gap:6px;font-size:.82rem;padding:2px 0}.capRow input{width:15px;height:15px}.inlineField{display:inline-flex;align-items:center;gap:6px;font-size:.82rem;color:var(--muted)}.inlineField select{height:32px;border:1px solid var(--line);border-radius:8px;padding:0 8px;font:inherit;background:#fff}
