:root{--bg: #1e2229;--panel: #2a303a;--panel-2: #343b48;--text: #e8ecf2;--muted: #9aa3b2;--accent: #3d8bfd;--top: #4aa3ff;--bottom: #e89a4a;--hi: #ff3b3b;--border: #3e4654;font-family:Segoe UI,PingFang SC,Microsoft YaHei,sans-serif}*{box-sizing:border-box}html,body,#root{margin:0;height:100%;background:var(--bg);color:var(--text)}button,input,select{font:inherit}.login-page{min-height:100%;display:grid;place-items:center;background:radial-gradient(ellipse at 20% 10%,#2b3a55 0%,transparent 50%),radial-gradient(ellipse at 80% 90%,#3a2f24 0%,transparent 45%),var(--bg)}.login-card{width:min(380px,92vw);padding:28px 26px;background:color-mix(in srgb,var(--panel) 92%,transparent);border:1px solid var(--border)}.login-card h1{margin:0 0 6px;font-size:1.6rem;letter-spacing:.04em}.login-card p{margin:0 0 20px;color:var(--muted);font-size:.92rem}.login-card label{display:block;margin:12px 0 6px;color:var(--muted);font-size:.85rem}.login-card input{width:100%;padding:10px 12px;border:1px solid var(--border);background:var(--bg);color:var(--text)}.err{margin-top:10px;color:#ff7b7b;font-size:.88rem}.error-fallback{min-height:100%;display:grid;place-content:center;gap:12px;padding:32px;text-align:center;background:var(--bg);color:var(--text)}.error-fallback h1{margin:0;font-size:1.4rem}.error-fallback p{margin:0;color:var(--muted);max-width:480px}.error-actions{display:flex;gap:10px;justify-content:center}.error-actions button{padding:8px 14px;border:1px solid var(--border);background:var(--panel-2);color:var(--text);cursor:pointer}.load-fail-banner{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 14px;background:#3a2424;border-bottom:1px solid #633;color:#f0c0c0;font-size:.88rem}.load-fail-banner button{border:1px solid #855;background:#4a2a2a;color:#fff;padding:6px 12px;cursor:pointer;white-space:nowrap}.silk-opacity{display:inline-flex;align-items:center;gap:6px;font-size:.78rem;color:var(--muted)}.silk-opacity input[type=range]{width:72px;accent-color:var(--accent)}.info-dl{display:grid;grid-template-columns:72px 1fr;gap:6px 10px;margin:0 0 8px;font-size:.88rem}.info-dl dt{margin:0;color:var(--muted)}.info-dl dd{margin:0;word-break:break-word}.login-card button{margin-top:18px;width:100%;padding:11px;border:0;background:var(--accent);color:#fff;cursor:pointer}.login-card .err{margin-top:12px;color:#ff7b7b;font-size:.88rem}.app-shell{height:100%;display:grid;grid-template-rows:48px 1fr;overflow:hidden}.topbar{display:flex;align-items:center;gap:12px;padding:0 14px;background:var(--panel);border-bottom:1px solid var(--border)}.topbar .brand{font-weight:700;letter-spacing:.06em}.topbar .spacer{flex:1}.desktop-portal-badge{font-size:.75rem;padding:3px 8px;border:1px solid #3ecf8e66;color:#3ecf8e;white-space:nowrap}.entitlement-chip{font-size:.78rem!important;padding:4px 8px!important;border-radius:2px;max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.entitlement-chip.ok{border-color:#3ecf8e55!important;color:#3ecf8e!important}.entitlement-chip.warn{border-color:#e85d5d66!important;color:#e85d5d!important}.vip-tag{display:inline-block;margin-left:6px;padding:1px 5px;font-size:.68rem;color:#e6b84d;border:1px solid #e6b84d66;vertical-align:middle}.board-item.locked{opacity:.72}.board-row.locked .board-item:hover{background:var(--panel-2)}.member-center{width:min(420px,94vw);background:var(--panel);border:1px solid var(--border);padding:0 0 16px}.member-center-head{display:flex;align-items:center;justify-content:space-between;padding:12px 16px;border-bottom:1px solid var(--border)}.member-center-head h2{margin:0;font-size:1rem}.member-banner{margin:14px 16px 0;padding:14px 16px;background:linear-gradient(120deg,#1a3a5c,#2a5a8c);color:#e8f0f8;font-weight:600;letter-spacing:.04em}.member-info{margin:14px 16px 0;display:grid;gap:10px}.member-info>div{display:grid;grid-template-columns:88px 1fr;gap:8px;font-size:.88rem}.member-info dt{margin:0;color:var(--muted)}.member-info dd{margin:0}.member-info dd.ok{color:#3ecf8e}.member-info dd.warn{color:#e85d5d}.member-center .hint{margin:14px 16px 0;padding:0;border:0}.member-redeem{margin:12px 16px 0;display:grid;gap:6px}.member-redeem label{color:var(--muted);font-size:.85rem}.member-redeem-row{display:flex;gap:8px}.member-redeem-row input{flex:1;padding:8px 10px;border:1px solid var(--border);background:var(--bg);color:var(--text)}.admin-code-list{margin:8px 0 0;padding-left:18px;font-size:.85rem;color:var(--muted)}.admin-code-list code{color:var(--text)}.user-entitlement{margin-top:2px;font-size:.72rem;color:var(--muted)}.api-status{display:inline-flex;align-items:center;gap:6px;font-size:.78rem;color:var(--muted);-webkit-user-select:none;user-select:none}.api-status i{width:8px;height:8px;border-radius:50%;background:#666}.api-status.api-ok i{background:#3ecf8e}.api-status.api-warn i{background:#e6b84d}.api-status.api-down i{background:#e85d5d}.api-status.api-checking i{background:#6a7382}.topbar button,.toolbar button,.toolbar select{background:var(--panel-2);color:var(--text);border:1px solid var(--border);padding:6px 10px;cursor:pointer}.main{display:grid;grid-template-columns:240px 1fr 280px;min-height:0}.main.cinema{grid-template-columns:1fr}.main.cinema .sidebar,.main.cinema .net-panel{display:none}.sidebar,.net-panel{background:var(--panel);border-right:1px solid var(--border);overflow:auto;min-height:0}.net-panel{border-right:0;border-left:1px solid var(--border);display:flex;flex-direction:column}.sidebar h2,.net-panel h2{margin:0;padding:12px 14px;font-size:.85rem;color:var(--muted);border-bottom:1px solid var(--border);text-transform:uppercase;letter-spacing:.08em}.board-item{display:block;width:100%;text-align:left;padding:12px 14px;border:0;border-bottom:1px solid var(--border);background:transparent;color:var(--text);cursor:pointer}.board-item.active,.board-item:hover{background:var(--panel-2)}.board-item .meta{color:var(--muted);font-size:.78rem;margin-top:4px}.board-notes{margin-top:4px;color:#b8c0ce;font-size:.76rem;line-height:1.35;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.admin-notes{width:100%;padding:8px 10px;border:1px solid var(--border);background:var(--bg);color:var(--text);resize:vertical;font:inherit}.chk-row{display:flex;align-items:center;gap:6px;font-size:.8rem;color:var(--muted);cursor:pointer;-webkit-user-select:none;user-select:none}.chk-row input{width:auto}.viewer{display:grid;grid-template-rows:auto 1fr;min-width:0;min-height:0;background:#262b33}.workspace{min-height:0;min-width:0;display:grid}.workspace-board,.workspace-pdf{grid-template-columns:1fr}.workspace-split{grid-template-columns:1fr 1fr;gap:1px;background:var(--border)}.hint{padding:12px 14px;color:var(--muted);font-size:.82rem;line-height:1.45;border-top:1px solid var(--border)}.pdf-viewer{display:grid;grid-template-rows:auto 1fr;min-height:0;background:#3a404c}.pdf-toolbar{display:flex;gap:8px;align-items:center;padding:8px 10px;background:#2f3540;border-bottom:1px solid var(--border)}.pdf-toolbar button{background:var(--panel-2);color:var(--text);border:1px solid var(--border);padding:4px 10px;cursor:pointer}.pdf-toolbar button:disabled{opacity:.4;cursor:default}.pdf-scroll{overflow:auto;min-height:0;padding:12px}.pdf-page{position:relative;margin:0 auto;background:#fff;box-shadow:0 2px 12px #00000059}.pdf-page canvas{display:block}.pdf-hit{position:absolute;border:1px solid transparent;background:#3d8bfd14;cursor:pointer;padding:0}.pdf-hit:hover,.pdf-hit.active{border-color:#3d8bfd;background:#3d8bfd38}.pdf-empty{display:grid;place-items:center;color:var(--muted);padding:24px;text-align:center;line-height:1.6}.pdf-empty code{color:#cde}.ann-item{display:block!important}.ann-item .meta{display:block;color:var(--muted);font-size:.75rem;margin-top:2px}.admin-panel{padding:12px 14px;border-bottom:1px solid var(--border);background:#313845}.admin-title{font-size:.85rem;color:var(--muted);margin-bottom:8px;letter-spacing:.06em;text-transform:uppercase}.admin-panel label{display:block;margin:8px 0 4px;font-size:.8rem;color:var(--muted)}.admin-panel input[type=text],.admin-panel input:not([type=file]){width:100%;padding:7px 9px;border:1px solid var(--border);background:var(--bg);color:var(--text)}.admin-panel input[type=file]{width:100%;color:var(--muted);font-size:.8rem}.admin-actions{display:flex;gap:8px;margin-top:12px}.admin-actions button{flex:1;padding:8px;border:1px solid var(--border);background:var(--accent);color:#fff;cursor:pointer}.admin-actions button[type=button]{background:var(--panel-2)}.admin-actions button.danger{background:#8b2e2e}.hover-tip{position:absolute;z-index:5;pointer-events:none;background:#14181eeb;border:1px solid var(--border);color:var(--text);font-size:.78rem;padding:4px 8px;white-space:nowrap;max-width:280px;overflow:hidden;text-overflow:ellipsis}.global-search{position:relative;width:min(360px,40vw);margin-left:16px}.global-search input{width:100%;padding:7px 10px;border:1px solid var(--border);background:var(--bg);color:var(--text);border-radius:2px}.search-dropdown{position:absolute;z-index:20;top:calc(100% + 4px);left:0;right:0;margin:0;padding:0;list-style:none;background:var(--panel);border:1px solid var(--border);max-height:320px;overflow:auto;box-shadow:0 8px 24px #00000059}.search-dropdown button{width:100%;text-align:left;border:0;border-bottom:1px solid var(--border);background:transparent;color:var(--text);padding:8px 10px;cursor:pointer;font-size:.86rem}.search-dropdown button.active,.search-dropdown button:hover{background:var(--panel-2)}.search-dropdown .tag{display:inline-block;min-width:34px;margin-right:8px;color:var(--accent);font-size:.72rem}.search-dropdown .sub{float:right;color:var(--muted);font-size:.75rem}.board-row{display:grid;grid-template-columns:1fr 36px;border-bottom:1px solid var(--border)}.board-row .board-item{border-bottom:0}.fav-btn{border:0;background:transparent;color:#e0c35a;cursor:pointer;font-size:1rem}.fav-btn:hover{background:var(--panel-2)}.toolbar button.toggle-on{background:#2f6b45;border-color:#3f8f5c}.coord-bar{font-family:ui-monospace,Consolas,monospace;font-size:.78rem;color:#b7c2d4;padding:4px 8px;border:1px solid var(--border);background:#1f242c;min-width:210px;white-space:nowrap}.layer-strip{position:absolute;left:6px;top:50%;transform:translateY(-50%);z-index:4;display:flex;flex-direction:column;gap:3px;pointer-events:auto}.layer-strip button{min-width:28px;padding:4px 6px;border:1px solid var(--border);background:color-mix(in srgb,var(--panel) 88%,transparent);color:var(--muted);cursor:pointer;font-size:.72rem;line-height:1.1}.layer-strip button.active{color:var(--text);border-color:var(--accent);background:color-mix(in srgb,var(--accent) 28%,var(--panel))}.catalog-tree{border-bottom:1px solid var(--border)}.catalog-tree>summary{cursor:pointer;padding:8px 14px;color:var(--text);font-weight:600;list-style:none}.catalog-tree>summary::-webkit-details-marker{display:none}.catalog-tree>summary:before{content:"▸ ";color:var(--muted)}.catalog-tree[open]>summary:before{content:"▾ "}.catalog-filter{display:grid;gap:8px;padding:10px 14px;border-bottom:1px solid var(--border)}.catalog-filter input,.catalog-filter select{width:100%;padding:7px 9px;border:1px solid var(--border);background:var(--bg);color:var(--text)}.ann-row{display:grid;grid-template-columns:1fr 32px;border-bottom:1px solid var(--border)}.ann-row .ann-item{border-bottom:0!important}.ann-del{border:0;background:transparent;color:#ff8a8a;cursor:pointer;font-size:1.1rem}.ann-del:hover{background:#4a2a2a}.minimap{position:absolute;right:10px;bottom:10px;z-index:4;border:1px solid var(--border);background:#151920;cursor:crosshair;opacity:.92}.minimap:hover{opacity:1}.net-row{display:grid;grid-template-columns:1fr 36px;border-bottom:1px solid var(--border)}.net-row>button:first-child{border-bottom:0!important}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:50;background:#00000073;display:grid;place-items:center}.modal-card{width:min(360px,92vw);background:var(--panel);border:1px solid var(--border);padding:18px 16px}.modal-card h3{margin:0 0 12px;font-size:1rem}.modal-card label{display:block;margin:8px 0 4px;color:var(--muted);font-size:.82rem}.modal-card input{width:100%;padding:8px 10px;border:1px solid var(--border);background:var(--bg);color:var(--text)}.modal-actions{display:flex;gap:8px;margin-top:14px}.modal-actions button{flex:1;padding:8px;border:1px solid var(--border);background:var(--accent);color:#fff;cursor:pointer}.modal-actions button[type=button]{background:var(--panel-2)}.modal-wide{width:min(480px,94vw)}.help-table{width:100%;border-collapse:collapse;font-size:.88rem}.help-table td{padding:6px 4px;border-bottom:1px solid var(--border);vertical-align:top}.help-table td:first-child{width:110px;white-space:nowrap}.help-table kbd{display:inline-block;padding:2px 6px;border:1px solid var(--border);background:var(--bg);font-family:inherit;font-size:.82rem}.xref-editor{margin-top:4px}.xref-list{max-height:220px;overflow:auto;margin:8px 0;border:1px solid var(--border)}.xref-row,.xref-add{display:grid;grid-template-columns:64px 1fr 48px 32px;gap:4px;padding:4px;align-items:center}.xref-add{grid-template-columns:64px 1fr 48px auto;margin-bottom:8px}.xref-row select,.xref-row input,.xref-add select,.xref-add input{width:100%;padding:4px 6px;border:1px solid var(--border);background:var(--bg);color:var(--text);font-size:.8rem}.xref-page{text-align:center}.xref-row .danger{padding:2px 0;border:0;background:transparent;color:#e88;cursor:pointer}.calibrator-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:80;background:#080c12b8;display:flex;align-items:stretch;justify-content:center;padding:16px}.calibrator{flex:1;max-width:1400px;display:grid;grid-template-rows:auto 1fr;background:var(--panel);border:1px solid var(--border);border-radius:8px;overflow:hidden;min-height:0}.calibrator-head{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:10px 14px;border-bottom:1px solid var(--border);background:var(--panel-2)}.calibrator-head-actions{display:flex;gap:8px}.calibrator-body{display:grid;grid-template-columns:280px 1fr;min-height:0;height:calc(100vh - 80px)}.calibrator-side{border-right:1px solid var(--border);padding:12px;overflow:auto;display:flex;flex-direction:column;gap:6px;background:var(--bg)}.calibrator-side select,.calibrator-side input{width:100%;padding:6px 8px;border:1px solid var(--border);background:var(--panel);color:var(--text);font-size:.85rem}.calibrator-check{display:flex;align-items:center;gap:8px;font-size:.85rem;margin-bottom:4px}.calibrator-list{list-style:none;margin:0;padding:0;max-height:42vh;overflow:auto;border:1px solid var(--border)}.calibrator-list li{display:grid;grid-template-columns:1fr 28px;align-items:center;border-bottom:1px solid var(--border)}.calibrator-list li.active{background:#3d8bfd29}.calibrator-list-main{display:flex;flex-direction:column;align-items:flex-start;gap:2px;padding:6px 8px;border:0;background:transparent;color:var(--text);cursor:pointer;text-align:left;font-size:.8rem}.calibrator-list-main span{color:var(--muted);font-size:.75rem}.calibrator-list .danger{border:0;background:transparent;color:#e88;cursor:pointer}.calibrator-main{display:grid;grid-template-rows:auto 1fr;min-height:0;background:#3a404c}.pdf-page.calibrator-draw{cursor:crosshair;touch-action:none}.calibrator-drag,.calibrator-pending{position:absolute;border:1.5px dashed #3d8bfd;background:#3d8bfd2e;pointer-events:none}.calibrator-pending{border-style:solid;background:#50c87833;border-color:#4c8}@media(max-width:900px){.calibrator-body{grid-template-columns:1fr;grid-template-rows:40% 1fr}.calibrator-side{border-right:0;border-bottom:1px solid var(--border)}}.admin-msg{margin-top:10px;font-size:.82rem;color:#cde;line-height:1.4}.panel-tabs{display:flex;border-bottom:1px solid var(--border)}.panel-tabs button{flex:1;border:0;border-bottom:2px solid transparent;background:transparent;color:var(--muted);padding:10px;cursor:pointer}.panel-tabs button.active{color:var(--text);border-bottom-color:var(--accent)}.toolbar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:8px 10px;border-bottom:1px solid var(--border);background:#2f3540}.toolbar .status{color:var(--muted);font-size:.82rem;margin-left:auto}.canvas-wrap{position:relative;min-height:0}.canvas-wrap canvas{width:100%;height:100%;display:block;cursor:crosshair}.watermark{pointer-events:none;position:absolute;top:0;right:0;bottom:0;left:0;display:grid;place-items:center;opacity:.12;font-size:1.4rem;transform:rotate(-18deg);color:#fff;-webkit-user-select:none;user-select:none}.net-list{list-style:none;margin:0;padding:0}.net-list-books{flex:0 0 auto;max-height:140px;overflow:auto}.net-list li button,.virt-item-btn{width:100%;height:100%;text-align:left;border:0;border-bottom:1px solid var(--border);background:transparent;color:var(--text);padding:8px 12px;cursor:pointer;font-size:.86rem}.net-list li button.active,.net-list li button:hover,.virt-item-btn.active,.virt-item-btn:hover,.net-row>button:first-child.active,.net-row>button:first-child:hover{background:var(--panel-2)}.virt-list{flex:1;min-height:120px;overflow:auto;position:relative}.virt-spacer{position:relative;width:100%}.virt-window{position:absolute;left:0;right:0;top:0;will-change:transform}.virt-row{overflow:hidden}.virt-row .net-row{height:100%;border-bottom:0}.virt-row .net-row>button:first-child{height:100%;border-bottom:1px solid var(--border)}.mobile-nav{display:none}.sel-detail{border-bottom:1px solid var(--border);background:#262c36;flex:0 0 auto;max-height:220px;overflow:auto}.sel-head{padding:8px 12px 4px}.sel-title{font-size:.88rem;font-weight:600}.sel-part{color:var(--muted);font-weight:400;font-size:.8rem}.sel-meta{color:var(--muted);font-size:.78rem;margin-top:2px;display:flex;flex-wrap:wrap;gap:6px;align-items:center}.sel-link{border:1px solid var(--border);background:var(--panel-2);color:var(--text);padding:1px 6px;font-size:.75rem;cursor:pointer}.sel-pads{list-style:none;margin:0;padding:0}.sel-pads li button{width:100%;display:flex;justify-content:space-between;gap:8px;text-align:left;border:0;border-top:1px solid var(--border);background:transparent;color:var(--text);padding:6px 12px;cursor:pointer;font-size:.8rem}.sel-pads li button .meta{color:var(--muted);white-space:nowrap}.sel-pads li button.active,.sel-pads li button:hover{background:var(--panel-2)}.sel-more{padding:6px 12px;color:var(--muted);font-size:.78rem}.audit-list{list-style:none;margin:8px 0 0;padding:0;max-height:180px;overflow:auto;border:1px solid var(--border);font-size:.75rem}.audit-list li{padding:6px 8px;border-bottom:1px solid var(--border);display:grid;gap:2px}.audit-at{color:var(--muted)}.audit-act{color:var(--accent);font-weight:600}.audit-detail{color:var(--text);word-break:break-all}.user-list{list-style:none;margin:8px 0 0;padding:0;border:1px solid var(--border);max-height:140px;overflow:auto;font-size:.8rem}.user-list li{display:grid;grid-template-columns:1fr auto auto;align-items:center;gap:6px;padding:6px 8px;border-bottom:1px solid var(--border)}.user-list select{padding:2px 4px;font-size:.75rem;border:1px solid var(--border);background:var(--bg);color:var(--text)}.user-list span{color:var(--muted)}.user-list .danger{padding:2px 8px;font-size:.75rem;border:1px solid #633;background:#3a2222;color:#e88;cursor:pointer}.net-search{padding:10px;border-bottom:1px solid var(--border);display:grid;gap:8px}.net-search input,.net-search .list-sort{width:100%;padding:8px 10px;border:1px solid var(--border);background:var(--bg);color:var(--text)}.prefix-chips{display:flex;flex-wrap:wrap;gap:4px}.prefix-chips button{border:1px solid var(--border);background:var(--panel-2);color:var(--muted);padding:3px 8px;font-size:.75rem;cursor:pointer}.prefix-chips button.active{color:var(--text);border-color:var(--accent);background:color-mix(in srgb,var(--accent) 25%,var(--panel-2))}.pdf-panel{border-top:1px solid var(--border);padding:10px 14px;color:var(--muted);font-size:.85rem}@media(max-width:900px){.app-shell{grid-template-rows:48px 1fr 48px}.topbar .brand{font-size:.9rem}.topbar span{display:none}.main,.main.cinema{grid-template-columns:1fr}.main.mobile-catalog .viewer,.main.mobile-catalog .net-panel,.main.mobile-viewer .sidebar,.main.mobile-viewer .net-panel,.main.mobile-nets .sidebar,.main.mobile-nets .viewer{display:none}.main.mobile-catalog .sidebar,.main.mobile-viewer .viewer,.main.mobile-nets .net-panel{display:flex;flex-direction:column;min-height:0;overflow:auto}.main.mobile-viewer .viewer{display:grid}.workspace-split{grid-template-columns:1fr;grid-template-rows:1fr 1fr}.toolbar{max-height:30vh;overflow:auto}.toolbar .coord-bar,.toolbar .status{width:100%;margin-left:0}.mobile-nav{display:flex;border-top:1px solid var(--border);background:var(--panel)}.mobile-nav button{flex:1;border:0;background:transparent;color:var(--muted);padding:12px 8px;cursor:pointer;font-size:.9rem}.mobile-nav button.active{color:var(--text);background:var(--panel-2)}.minimap{width:120px!important;height:90px!important;right:6px;bottom:6px}}
