:root{color-scheme:light;font-family:Inter,-apple-system,BlinkMacSystemFont,Segoe UI,Microsoft YaHei,sans-serif;color:#1b2430;background:#f7f8fa;font-synthesis:none;--bg: #f7f8fa;--surface: #ffffff;--surface-subtle: #f2f4f6;--text: #1b2430;--muted: #6c7785;--line: #dfe3e8;--line-strong: #cdd3da;--primary: #17695d;--primary-strong: #0d554b;--primary-soft: #e7f3f0;--danger: #b23838;--danger-soft: #fff0ef;--warning: #a15a14;--shadow: 0 18px 50px rgba(30, 39, 50, .14)}*{box-sizing:border-box}html,body,#app{width:100%;min-width:320px;height:100%;margin:0}body{overflow:hidden}button,input,textarea{font:inherit;letter-spacing:0}button,a{-webkit-tap-highlight-color:transparent}button{border:0;cursor:pointer}button:disabled{cursor:not-allowed;opacity:.48}input,textarea{color:var(--text);border:1px solid var(--line-strong);border-radius:6px;outline:none;background:var(--surface)}input:focus,textarea:focus{border-color:var(--primary);box-shadow:0 0 0 3px #17695d1f}.mobile-only{display:none!important}.boot-screen{width:100%;height:100%;display:grid;place-items:center;background:var(--bg)}.spinner{width:26px;height:26px;display:inline-block;border:3px solid #d8dedf;border-top-color:var(--primary);border-radius:50%;animation:rotate .8s linear infinite}@keyframes rotate{to{transform:rotate(360deg)}}.spinning{animation:rotate .9s linear infinite}.login-page{min-height:100%;display:grid;place-items:center;padding:24px;background:linear-gradient(90deg,rgba(23,105,93,.05) 1px,transparent 1px),linear-gradient(rgba(23,105,93,.05) 1px,transparent 1px),var(--bg);background-size:32px 32px}.login-form{width:min(100%,420px);display:grid;gap:14px;padding:28px;border:1px solid var(--line);border-radius:8px;background:var(--surface);box-shadow:var(--shadow)}.login-form header{margin-bottom:5px}.login-form h2{margin:0;font-size:25px}.login-form header p{margin:7px 0 0;color:var(--muted);font-size:14px}.login-form label{display:grid;gap:7px;color:#4b5662;font-size:14px;font-weight:600}.login-form input{height:46px;padding:0 13px}.form-error{min-height:20px;margin:-4px 0 0;color:var(--danger);font-size:13px}.primary-button,.quiet-button,.wecom-button,.batch-exit{min-height:40px;display:inline-flex;align-items:center;justify-content:center;gap:8px;padding:0 15px;border-radius:6px;text-decoration:none;white-space:nowrap}.primary-button{color:#fff;background:var(--primary)}.primary-button:hover{background:var(--primary-strong)}.login-submit{width:100%;min-height:46px}.wecom-button{color:#24313c;border:1px solid var(--line-strong);background:#fff}.wecom-button:hover,.quiet-button:hover{background:var(--surface-subtle)}.login-divider{position:relative;display:grid;place-items:center;color:var(--muted);font-size:12px}.login-divider:before{content:"";position:absolute;left:0;right:0;height:1px;background:var(--line)}.login-divider span{position:relative;padding:0 10px;background:#fff}.workspace-app{position:relative;width:100%;height:100%;display:grid;grid-template-rows:64px minmax(0,1fr);overflow:hidden;background:var(--bg)}.app-header{position:relative;z-index:30;display:grid;grid-template-columns:minmax(245px,1fr) minmax(300px,560px) minmax(245px,1fr);align-items:center;gap:20px;min-height:64px;padding:0 18px;border-bottom:1px solid var(--line);background:var(--surface)}.app-identity,.header-actions,.user-block,.panel-header>div,.project-meta,.place-search,.project-search,.error-banner,.map-count,.filter-trigger{display:flex;align-items:center}.app-identity{min-width:0}.app-identity p{margin:0;color:var(--muted);font-size:12px;white-space:nowrap}.project-search{height:40px;gap:9px;padding-left:12px;border:1px solid var(--line-strong);border-radius:6px;color:var(--muted);background:#f9fafb}.project-search:focus-within{border-color:var(--primary);box-shadow:0 0 0 3px #17695d1a}.project-search input,.place-search input{min-width:0;height:100%;flex:1;padding:0;border:0;box-shadow:none;background:transparent}.header-actions{justify-content:flex-end;gap:10px}.quiet-button{color:#34424e;border:1px solid var(--line-strong);background:#fff}.user-block{align-items:flex-end;flex-direction:column;line-height:1.2}.user-block strong{max-width:130px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}.user-block span{margin-top:3px;color:var(--muted);font-size:11px}.icon-action,.primary-icon-button{width:36px;height:36px;flex:0 0 36px;display:grid;place-items:center;padding:0;border-radius:6px;color:#596672;background:transparent}.icon-action:hover{color:var(--text);background:var(--surface-subtle)}.primary-icon-button{color:#fff;background:var(--primary)}.text-button{padding:5px;color:var(--primary);background:transparent;font-size:13px}.error-banner{position:absolute;z-index:50;top:74px;left:50%;width:min(580px,calc(100% - 32px));min-height:42px;justify-content:center;gap:9px;padding:6px 8px 6px 14px;transform:translate(-50%);color:var(--danger);border:1px solid #efc4c1;border-radius:6px;background:var(--danger-soft);box-shadow:0 10px 28px #5a23231f;font-size:13px}.error-banner span{flex:1;text-align:center}.workspace-grid{--project-panel-width: 342px;min-height:0;display:grid;grid-template-columns:258px minmax(420px,1fr) var(--project-panel-width);overflow:hidden;transition:grid-template-columns .22s ease}.workspace-grid--project-panel-collapsed{--project-panel-width: 0px}.filter-panel,.project-panel,.map-panel{min-width:0;min-height:0;background:var(--surface)}.filter-panel{z-index:10;display:flex;flex-direction:column;border-right:1px solid var(--line)}.project-panel{display:flex;flex-direction:column;overflow:hidden;border-left:1px solid var(--line);transition:opacity .16s ease,border-color .16s ease}.workspace-grid--project-panel-collapsed .project-panel{visibility:hidden;opacity:0;border-left-color:transparent;pointer-events:none}.panel-header{min-height:54px;display:flex;align-items:center;justify-content:space-between;padding:0 15px;border-bottom:1px solid var(--line)}.panel-header>div{gap:8px}.panel-header h2{margin:0;font-size:15px}.panel-header>span{color:var(--muted);font-size:12px}.filter-scroll,.project-list{min-height:0;overflow:auto;overscroll-behavior:contain}.filter-section{padding:15px;border-bottom:1px solid var(--line)}.filter-section h3{margin:0 0 11px;color:var(--muted);font-size:12px;font-weight:700}.filter-chip-list{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:8px}.filter-chip-list--scroll{max-height:260px;align-content:flex-start;overflow-x:hidden;overflow-y:auto;padding-right:3px}.filter-chip-list button{width:100%;min-width:0;min-height:34px;display:inline-flex;align-items:center;justify-content:center;gap:3px;padding:0 3px;border:1px solid var(--line-strong);border-radius:6px;color:#374551;background:#fafbfc;font-size:12px;white-space:nowrap;overflow:hidden}.filter-chip-list button>span{min-width:0;overflow:hidden;font-size:12px;text-overflow:clip;white-space:nowrap}.filter-chip-list button>span.filter-chip-label--long{font-size:10px}.filter-chip-list button:hover{border-color:#9abbb6;background:#f3f8f7}.filter-chip-list button.selected{border-color:#6fa99f;color:var(--primary-strong);background:var(--primary-soft);font-weight:700}.filter-chip-list em{flex:0 0 auto;color:var(--muted);font-style:normal;font-size:10px}.filter-chip-list button.selected em{color:var(--primary)}.filter-chip-list .disabled{opacity:.42}.map-panel{position:relative;display:grid;grid-template-rows:54px minmax(0,1fr);overflow:hidden}.map-toolbar{position:relative;z-index:5;display:grid;grid-template-columns:minmax(260px,520px) auto;justify-content:space-between;gap:10px;align-items:center;padding:7px 12px;border-bottom:1px solid var(--line);background:#fffffff5}.map-toolbar-actions{min-width:0;display:flex;justify-self:end;align-items:center;gap:8px}.place-search{min-width:0;height:40px;gap:9px;padding-left:11px;color:var(--muted);border:1px solid var(--line-strong);border-radius:6px;background:#fff}.batch-trigger{justify-self:end}.map-layer-trigger.active{color:var(--primary-strong);border-color:#6fa99f;background:var(--primary-soft)}.batch-exit{color:#8b4a11;border:1px solid #e7ba8c;background:#fff8f0}.map-canvas{width:100%;min-height:360px;background:#edf0f2}.map-error{position:absolute;z-index:4;inset:54px 0 0;display:flex;align-items:center;justify-content:center;gap:9px;padding:20px;color:var(--danger);background:#f7f8fae0;font-size:14px}.map-marker{display:block;width:16px;height:16px;border:3px solid #fff;border-radius:50%;background:var(--marker-color);box-shadow:0 2px 10px color-mix(in srgb,var(--marker-color) 48%,transparent)}.map-marker--temporary{width:20px;height:20px;border-radius:50% 50% 50% 0;transform:rotate(-45deg)}.map-grid-label{min-width:32px;height:32px;display:grid;place-items:center;color:#e53935eb;font-size:26px;font-weight:500;line-height:1;text-shadow:0 1px 4px #fff,0 0 8px rgba(255,255,255,.95);pointer-events:none;-webkit-user-select:none;user-select:none}.map-region-label{min-width:88px;min-height:34px;display:grid;place-items:center;color:#e32722;font-size:23px;font-weight:800;line-height:1;text-shadow:0 1px 4px #fff,0 0 8px #fff;pointer-events:none;-webkit-user-select:none;user-select:none}.map-info{min-width:180px;max-width:290px;display:grid;gap:5px;padding:2px;line-height:1.45}.map-info strong{font-size:14px}.map-info span{color:#687481;font-size:12px}.map-project-info{width:280px;max-width:min(280px,calc(100vw - 64px));padding:0;line-height:1.4}.map-project-info__address{margin:0;padding:0 0 9px;border-bottom:1px solid #edf0f3;color:#17212b;font-size:14px;font-weight:700;overflow-wrap:anywhere}.map-project-info dl{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:9px 18px;margin:0;padding:10px 0}.map-project-info dl div{min-width:0;display:flex;align-items:baseline;gap:6px}.map-project-info dt{flex:0 0 auto;color:#778391;font-size:11px}.map-project-info dd{min-width:0;margin:0;overflow-wrap:anywhere;color:#1d2833;font-size:12px;font-weight:700}.map-count{position:absolute;z-index:4;right:14px;bottom:14px;gap:7px;min-height:40px;padding:0 12px;border:1px solid rgba(205,211,218,.9);border-radius:6px;background:#fffffff0;box-shadow:0 8px 22px #1e27321a}.map-count strong{font-size:18px}.map-count span{color:var(--muted);font-size:11px}.project-panel-toggle{position:absolute;z-index:6;top:50%;right:0;width:34px;height:50px;display:grid;place-items:center;padding:0;transform:translateY(-50%);border:1px solid var(--line-strong);border-right:0;border-radius:6px 0 0 6px;color:#50616e;background:#fffffff5;box-shadow:-4px 6px 16px #1e27321f}.project-panel-toggle:hover{color:var(--primary);background:#fff}.project-panel-toggle:focus-visible{outline:2px solid var(--primary);outline-offset:-3px}.panel-loading{min-height:180px;display:grid;place-items:center}.project-list{padding:8px}.project-item{min-width:0;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:7px;padding:11px 8px 11px 10px;border:1px solid transparent;border-bottom-color:var(--line);cursor:pointer}.project-item:hover{background:#f8f9fa}.project-item.active{border-color:#a9ccc6;border-radius:6px;background:var(--primary-soft)}.project-item.failed{border-left-color:#d9827c}.project-item-main{min-width:0}.project-item-title{display:block;min-width:0;overflow:hidden;color:#1d2833;font-size:13px;line-height:1.45;text-overflow:ellipsis;white-space:nowrap;font-weight:700}.project-item p{margin:6px 0 0;overflow:hidden;color:var(--muted);font-size:12px;line-height:1.45;text-overflow:ellipsis;white-space:nowrap}.project-meta{gap:9px;margin-top:7px;overflow:hidden;color:#4b5965;font-size:11px;white-space:nowrap}.project-meta span{min-width:0;overflow:hidden;text-overflow:ellipsis}.project-meta span+span:before{content:"·";margin-right:9px;color:#a2aab2}.project-item p.location-error,.location-error{color:var(--danger);white-space:normal}.empty-panel{min-height:220px;display:grid;place-items:center;align-content:center;gap:10px;color:#8a949f;font-size:13px}.detail-sheet{position:absolute;z-index:25;right:354px;bottom:16px;width:min(640px,calc(100% - 654px));max-height:min(520px,calc(100% - 96px));overflow:auto;border:1px solid var(--line-strong);border-radius:8px;background:#fff;box-shadow:var(--shadow);transition:right .22s ease,width .22s ease}.workspace-app--project-panel-collapsed .detail-sheet{right:16px;width:min(640px,calc(100% - 306px))}.detail-sheet>header,.batch-dialog>header{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;padding:15px 16px;border-bottom:1px solid var(--line)}.detail-sheet>header span,.batch-dialog>header span{color:var(--primary);font-size:11px;font-weight:800}.detail-sheet h2,.batch-dialog h2{margin:5px 0 0;overflow-wrap:anywhere;font-size:17px}.batch-dialog h2{margin-top:0}.batch-dialog>header p{margin:5px 0 0;color:var(--muted);font-size:12px}.project-detail,.temporary-detail{padding:16px}.project-detail dl{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;margin:0}.project-detail dl div{min-width:0}.project-detail .detail-address{grid-column:1 / -1}.project-detail dt{color:var(--muted);font-size:11px}.project-detail dd{margin:4px 0 0;overflow-wrap:anywhere;font-size:13px;font-weight:650}.node-timeline{display:grid;grid-template-columns:repeat(7,minmax(58px,1fr));gap:0;margin-top:18px;overflow-x:auto}.node-timeline>div{position:relative;min-width:58px;display:grid;justify-items:center;gap:4px;padding-top:2px;text-align:center}.node-timeline>div:before{content:"";position:absolute;top:6px;left:0;right:0;height:2px;background:#dfe3e7}.node-timeline>div:first-child:before{left:50%}.node-timeline>div:last-child:before{right:50%}.node-timeline i{position:relative;z-index:1;width:10px;height:10px;border:2px solid #fff;border-radius:50%;box-shadow:0 0 0 1px #cdd3d9}.node-timeline span{margin-top:3px;color:var(--muted);font-size:10px}.node-timeline strong{max-width:72px;overflow-wrap:anywhere;font-size:10px;font-weight:650}.retry-button{margin-top:15px}.temporary-detail{display:grid;gap:8px}.temporary-detail p{margin:0;color:#46535f;line-height:1.55}.temporary-detail span{color:var(--muted);font-size:12px}.modal-backdrop{position:fixed;z-index:80;inset:0;display:grid;place-items:center;padding:24px;background:#141c226b}.batch-dialog{width:min(620px,100%);border:1px solid var(--line-strong);border-radius:8px;background:#fff;box-shadow:0 24px 70px #141c2240}.batch-dialog textarea{width:calc(100% - 32px);margin:16px;padding:12px;resize:vertical;line-height:1.55}.batch-dialog footer{min-height:64px;display:flex;align-items:center;justify-content:flex-end;gap:9px;padding:10px 16px;border-top:1px solid var(--line)}.batch-dialog footer>span{margin-right:auto;color:var(--muted);font-size:12px}.batch-progress{padding:0 16px 14px}.batch-progress>div{height:6px;overflow:hidden;border-radius:3px;background:#e6e9ec}.batch-progress>div span{display:block;height:100%;background:var(--primary);transition:width .25s ease}.batch-progress p{margin:7px 0 0;color:var(--muted);font-size:12px}.mobile-menu{display:none}@media(max-width:1220px){.workspace-grid{--project-panel-width: 310px;grid-template-columns:236px minmax(390px,1fr) var(--project-panel-width)}.workspace-grid--project-panel-collapsed{--project-panel-width: 0px}.detail-sheet{right:322px;width:min(580px,calc(100% - 590px))}.workspace-app--project-panel-collapsed .detail-sheet{right:16px;width:min(640px,calc(100% - 284px))}.app-header{grid-template-columns:minmax(215px,.8fr) minmax(280px,1fr) minmax(220px,.8fr)}}@media(min-width:761px)and (max-width:1350px){.map-toolbar{grid-template-columns:minmax(200px,1fr) auto}.map-layer-trigger{width:40px;padding:0}.map-layer-trigger-label{display:none}}@media(max-width:980px){.workspace-grid{grid-template-columns:220px minmax(0,1fr)}.project-panel,.project-panel-toggle{display:none}.detail-sheet,.workspace-app--project-panel-collapsed .detail-sheet{right:16px;width:min(600px,calc(100% - 268px))}.map-toolbar{grid-template-columns:minmax(240px,1fr) auto}}@media(max-width:760px){body{overflow:hidden}.desktop-only{display:none!important}.mobile-only{display:grid!important}.login-page{padding:22px}.login-form{padding:25px 22px}.workspace-app{grid-template-rows:58px minmax(0,1fr)}.app-header{grid-template-columns:minmax(0,1fr) auto;min-height:58px;gap:8px;padding:0 10px}.app-identity p{max-width:210px;overflow:hidden;text-overflow:ellipsis}.project-search{position:absolute;top:65px;left:9px;right:9px;z-index:20;background:#fffffff7;box-shadow:0 8px 20px #1e27321f}.mobile-menu{position:absolute;top:52px;right:8px;z-index:60;width:210px;display:grid;gap:5px;padding:9px;border:1px solid var(--line-strong);border-radius:7px;background:#fff;box-shadow:var(--shadow)}.mobile-menu>div{display:grid;gap:2px;padding:8px;border-bottom:1px solid var(--line);font-size:13px}.mobile-menu>div span{color:var(--muted);font-size:11px}.mobile-menu button{min-height:38px;display:flex;align-items:center;gap:8px;padding:0 8px;border-radius:5px;color:#34424e;background:transparent;text-align:left}.workspace-grid{grid-template-columns:1fr}.filter-panel{position:fixed;z-index:70;inset:0 auto 0 0;width:min(320px,calc(100% - 44px));transform:translate(-102%);transition:transform .2s ease;box-shadow:18px 0 40px #141c2233}.filter-panel--open{transform:translate(0)}.filter-panel--open:after{content:"";position:fixed;inset:0 0 0 100%;width:44px;background:#141c2252}.map-panel{grid-template-rows:98px minmax(0,1fr)}.map-toolbar{grid-template-columns:auto minmax(0,1fr) auto;align-content:end;gap:7px;padding:52px 8px 6px}.filter-trigger{position:relative;min-height:40px;grid-template-columns:auto auto auto;gap:6px;padding:0 10px;border:1px solid var(--line-strong);border-radius:6px;color:#34424e;background:#fff}.filter-trigger em{min-width:18px;height:18px;display:grid;place-items:center;color:#fff;border-radius:50%;background:var(--primary);font-size:10px;font-style:normal}.place-search{min-width:0}.map-toolbar-actions{gap:0}.map-layer-trigger{width:40px;padding:0}.map-layer-trigger-label{display:none}.batch-exit{position:absolute;top:7px;right:8px;min-height:36px}.map-canvas{min-height:300px}.map-error{inset:98px 0 0}.map-count{right:8px;bottom:8px}.map-grid-label{min-width:26px;height:26px;font-size:20px}.map-region-label{min-width:68px;min-height:28px;font-size:18px}.detail-sheet{right:0;bottom:0;left:0;width:100%;max-height:52%;border-width:1px 0 0;border-radius:8px 8px 0 0}.workspace-app--project-panel-collapsed .detail-sheet{right:0;width:100%}.project-detail dl{grid-template-columns:1fr 1fr}.project-detail .detail-address{grid-column:1 / -1}.modal-backdrop{align-items:end;padding:0}.batch-dialog{width:100%;border-width:1px 0 0;border-radius:8px 8px 0 0}.error-banner{top:64px}}@media(max-width:390px){.app-identity p{max-width:170px}.filter-trigger span{display:none}.project-detail dl{grid-template-columns:1fr}.project-detail .detail-address{grid-column:auto}}
