/* 보상투자관리 웹앱 — VWorld형 지도 포털 (설계 목업 v0.1 디자인 이식) */
:root{
  --blue:#0B5FB0; --blue-d:#094C8D; --blue-t:#E7F0FA; --navy:#12365B;
  --ink:#22303F; --muted:#66738A; --line:#DCE3EC; --panel:#FFFFFF; --ground:#EEF2F6;
  --sel:#E8590C; --sel-d:#D9480F; --ok:#2B8A3E; --warn:#E8960F; --bad:#C92A2A;
  --gA:#0B6BCB; --gB:#E8960F; --gC:#8A94A2;
  --shadow:0 2px 10px rgba(18,54,91,.14); --rad:6px;
  color-scheme:light;
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{font-family:"Noto Sans KR","Malgun Gothic","Apple SD Gothic Neo",sans-serif;
  font-size:13px;color:var(--ink);background:var(--ground);overflow:hidden}
#app{position:fixed;inset:0;display:flex;flex-direction:column}
button{font:inherit;color:inherit;background:none;border:none;cursor:pointer}
input,select{font:inherit}
button:focus-visible,input:focus-visible,select:focus-visible,.row:focus-visible{outline:2px solid var(--blue);outline-offset:1px}
.num{font-variant-numeric:tabular-nums}
.mono{font-family:Consolas,ui-monospace,monospace;font-size:12px}
[hidden]{display:none!important}

/* ── GNB ─────────────────────────────── */
.gnb{height:56px;flex:0 0 56px;background:#fff;border-bottom:1px solid var(--line);
  display:flex;align-items:center;gap:4px;padding:0 14px;z-index:60;box-shadow:0 1px 4px rgba(18,54,91,.06)}
.brand{display:flex;align-items:center;gap:9px;margin-right:14px;flex:0 0 auto}
.mark{width:32px;height:32px;border-radius:7px;background:linear-gradient(135deg,var(--blue),#1478D6);
  display:grid;place-items:center;color:#fff}
.mark.big{width:44px;height:44px;border-radius:10px}
.brand .t1,.login-logo .t1{font-size:16px;font-weight:800;color:var(--navy);letter-spacing:-.3px;line-height:1.1}
.brand .t2,.login-logo .t2{font-size:9px;font-weight:600;color:var(--muted);letter-spacing:1.4px}
.menus{display:flex;align-items:stretch;height:100%}
.mi{position:relative;display:flex;align-items:center;gap:4px;padding:0 15px;font-size:14.5px;font-weight:600;
  color:#3C4A5C;cursor:pointer;border-bottom:3px solid transparent;border-top:3px solid transparent;user-select:none;white-space:nowrap}
.mi:hover{color:var(--blue)}
.mi.on{color:var(--blue);border-bottom-color:var(--blue)}
.mi .caret{font-size:10px;color:var(--muted)}
.dd{display:none;position:absolute;top:100%;left:0;min-width:225px;background:#fff;border:1px solid var(--line);
  border-radius:0 0 var(--rad) var(--rad);box-shadow:var(--shadow);padding:6px 0;z-index:70}
.mi:hover .dd{display:block}
.dd a{display:block;padding:9px 16px;font-size:13.5px;font-weight:500;color:var(--ink);cursor:pointer;text-decoration:none}
.dd a:hover{background:var(--blue-t);color:var(--blue)}
.dd a small{color:var(--muted);font-size:11px;margin-left:4px}
.gnb-search{position:relative;margin-left:auto;flex:0 1 340px;min-width:180px}
.gnb-search .box{display:flex;align-items:center;gap:8px;height:36px;border:2px solid var(--blue);
  border-radius:18px;padding:0 6px 0 14px;background:#fff}
.gnb-search input{flex:1;border:none;outline:none;font-size:13px;min-width:0}
.gnb-search .go{width:28px;height:28px;border-radius:50%;background:var(--blue);color:#fff;display:grid;place-items:center;flex:0 0 auto}
.sug{display:none;position:absolute;top:calc(100% + 6px);left:0;right:0;background:#fff;border:1px solid var(--line);
  border-radius:var(--rad);box-shadow:var(--shadow);padding:6px 0;z-index:80;max-height:320px;overflow:auto}
.sug.open{display:block}
.sug .hd{padding:5px 14px 6px;font-size:11px;font-weight:700;color:var(--muted)}
.sug a{display:flex;align-items:center;gap:8px;padding:8px 14px;cursor:pointer;font-size:12.5px}
.sug a:hover{background:var(--blue-t)}
.sug .tag{flex:0 0 auto;font-size:10px;font-weight:700;padding:2px 6px;border-radius:3px;background:var(--blue-t);color:var(--blue)}
.who{display:flex;align-items:center;gap:8px;margin-left:14px;flex:0 0 auto;position:relative}
.who .chip{display:flex;align-items:center;gap:7px;height:34px;padding:0 12px;border:1px solid var(--line);
  border-radius:17px;background:#FAFCFE;font-size:12.5px}
.who .role{font-size:10px;font-weight:800;color:#fff;background:var(--navy);border-radius:3px;padding:2px 6px}
.gear{width:34px;height:34px;border-radius:50%;border:1px solid var(--line);display:grid;place-items:center;color:#54637A;background:#fff}
.gear:hover{color:var(--blue);border-color:var(--blue)}
.adminpop{display:none;position:absolute;top:calc(100% + 8px);right:0;width:300px;background:#fff;border:1px solid var(--line);
  border-radius:var(--rad);box-shadow:var(--shadow);z-index:90;padding:12px 14px;max-height:70vh;overflow:auto}
.adminpop.open{display:block}
.adminpop h4{font-size:12px;color:var(--navy);margin:8px 0}
.adminpop h4:first-child{margin-top:0}
.adminpop .hist{font-size:11.5px;color:var(--muted);border-top:1px dashed var(--line);padding-top:8px;line-height:1.7}
/* 배치 이상(FAIL·WARN) 요약 — 팝오버를 열면 먼저 보이도록 붉게 두른다 */
.adminpop .hist-bad{border:1px solid var(--bad);border-radius:4px;background:#FEF3F3;
  padding:7px 9px;color:var(--navy)}
.adminpop .urow{display:flex;align-items:center;gap:6px;font-size:12px;padding:3px 0;border-bottom:1px dashed #EDF1F6}
.adminpop .urow b{flex:1}
.adminpop .ubtn{border:1px solid var(--blue);color:var(--blue);background:#fff;border-radius:4px;
  padding:1px 7px;font-size:11px;cursor:pointer}
.adminpop .ubtn:hover{background:#E7F0FA}
.adminpop .ubtn-x{border-color:var(--bad);color:var(--bad)}
.adminpop .ubtn-x:hover{background:#FDEBEB}
.adminpop .ubtn.on{background:var(--blue);color:#fff;border-color:var(--blue)}
.adminpop .ubtn.on:hover{background:var(--blue)}
.adminpop input{border:1px solid #C6D3E2;border-radius:4px;padding:5px 8px;font-size:12px}
.kpi-alert{background:#FDEBEB;border:1px solid var(--bad);color:var(--bad);font-weight:800;cursor:help}
.bulkbar{display:flex;align-items:center;gap:8px;padding:6px 14px;font-size:12px;
  background:#F3F7FB;border-bottom:1px solid var(--line)}
.bulkbar label{display:flex;align-items:center;gap:5px;cursor:pointer;font-weight:600;color:var(--navy)}
.bulkbar .cnt{color:var(--muted)}
.bulkbar .sp{flex:1}
.bulkbar button{border:1px solid var(--blue);color:var(--blue);background:#fff;border-radius:4px;
  padding:2px 9px;font-size:11.5px;cursor:pointer}
.bulkbar button:hover{background:#E7F0FA}
.bulkbar button.danger{border-color:var(--bad);color:var(--bad)}
.bulkbar button.danger:hover{background:#FDEBEB}
.bulkbar button:disabled{opacity:.45;cursor:default}
.row .rowck{margin:2px 6px 0 0;flex:0 0 auto;cursor:pointer}
.login-alt{margin-top:10px;text-align:center;font-size:12px}
.login-alt a{color:var(--blue);cursor:pointer;text-decoration:underline}
.adminpop input{height:26px;border:1px solid var(--line);border-radius:4px;padding:0 6px;font-size:11.5px;min-width:0}

/* ── Stage / 좌측 패널 ───────────────── */
.stage{flex:1;display:flex;min-height:0;position:relative}
.lp{width:336px;flex:0 0 336px;background:#fff;border-right:1px solid var(--line);display:flex;flex-direction:column;
  min-height:0;z-index:30;transition:margin-left .25s ease}
.lp.closed{margin-left:-336px}
.lp-head{padding:12px 16px 0;border-bottom:1px solid var(--line);flex:0 0 auto}
.lp-title{font-size:16px;font-weight:800;color:var(--navy);display:flex;align-items:center;gap:8px}
.lp-title .cnt{font-size:11px;font-weight:700;color:var(--blue);background:var(--blue-t);border-radius:10px;padding:2px 8px}
.lp-tabs{display:flex;gap:2px;margin-top:10px}
.lp-tabs button{flex:1;padding:7px 2px;font-size:12px;font-weight:600;color:var(--muted);
  border-bottom:2px solid transparent;white-space:nowrap}
.lp-tabs button.on{color:var(--blue);border-bottom-color:var(--blue)}
.lp-body{flex:1;overflow-y:auto;min-height:0}
.filters{display:flex;gap:6px;flex-wrap:wrap;padding:10px 14px;border-bottom:1px solid var(--line);background:#F8FAFC}
.filters select,.filters input{flex:1;min-width:0;height:30px;border:1px solid var(--line);border-radius:4px;padding:0 8px;font-size:12px;background:#fff}
.filters .w100{flex-basis:100%}
.filters .btn{height:30px;padding:0 14px;background:var(--blue);color:#fff;border-radius:4px;font-size:12.5px;font-weight:600;flex:0 0 auto}
.filters .btn:hover{background:var(--blue-d)}
.notebar{margin:10px 14px;padding:9px 12px;font-size:11.5px;line-height:1.55;color:#7A5B12;background:#FFF7E0;border:1px solid #F2E1AE;border-radius:5px}
.hint{padding:18px 16px;color:var(--muted);font-size:12px;line-height:1.7}
.row{padding:10px 16px;border-bottom:1px solid #EDF1F6;cursor:pointer}
.row:hover{background:#F4F8FC}
.row.on{background:var(--blue-t);box-shadow:inset 3px 0 0 var(--blue)}
.row .r1{display:flex;align-items:center;gap:7px;margin-bottom:3px}
.row .r1 b{font-size:13px;color:var(--navy);flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.row .r2{font-size:12px;color:var(--ink);margin-bottom:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.row .r3{display:flex;gap:10px;font-size:11.5px;color:var(--muted);flex-wrap:wrap}
.row .r3 .em{color:var(--navy);font-weight:700}
.pill{flex:0 0 auto;font-size:10px;font-weight:700;padding:2px 7px;border-radius:9px}
.p-run{background:#E5F3E8;color:var(--ok)}   .p-fail{background:#FDEBEB;color:var(--bad)}
.p-A{background:#E3EEFB;color:var(--gA)}     .p-B{background:#FBF0DC;color:#B26F05}
.p-C{background:#EEF0F3;color:#5E6773}       .p-warn{background:#FBF0DC;color:#B26F05}
.p-참고{background:#EEF0F3;color:#5E6773}    /* 배율 미적용 원단가를 전면에 세운 상태 */
.p-news{background:#E3EEFB;color:var(--gA)}  .p-eiass{background:#E9E5F9;color:#6741D9}
.p-jose{background:#E5F3E8;color:var(--ok)}  .p-kind{background:#EEF0F3;color:#5E6773}
.p-ca{background:#E7F0FA;color:#0B5FB0}      .p-pa{background:#E1F5EE;color:#0A8A63} /* 경매=파랑 · 공매=청록 */
.p-own-hit{background:#FDEBEB;color:#C92A2A} .p-own-part{background:#FFF3E2;color:#D9760F} /* 국공유 일치·저촉 */
.ownrow{padding:7px 2px;border-bottom:1px solid var(--line);font-size:12px}
.ownrow:last-of-type{border-bottom:0}
.ownrow .l1{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.ownrow .l2{display:flex;gap:10px;color:var(--muted);font-size:11.5px;margin-top:3px;flex-wrap:wrap}
.ownrow.pub .se{color:var(--bad);font-weight:800}
.lurow{display:flex;gap:7px;align-items:center;padding:4px 2px;font-size:12px;border-bottom:1px solid var(--line)}
.lurow:last-of-type{border-bottom:0}
/* 파산공매 회차별 매각조건 — 상세 패널 안의 소형 표 (대표 회차 강조) */
.rtbl{width:100%;border-collapse:collapse;font-size:11.5px}
.rtbl th{background:#F1F5F9;color:var(--muted);font-weight:700;padding:4px 6px;text-align:left;white-space:nowrap}
.rtbl td{padding:4px 6px;border-bottom:1px solid var(--line);white-space:nowrap}
.rtbl th.r,.rtbl td.r{text-align:right}
.rtbl tr.on td{background:#FDEAE0;font-weight:700;color:var(--sel-d)}
.rtbl tr:last-child td{border-bottom:0}
#btnMoreBs{border-color:var(--blue);color:var(--blue);margin-left:10px}
#btnMoreBs:hover{background:var(--blue-t)} #btnMoreBs:disabled{opacity:.55}
.p-match{background:#FDEAE0;color:var(--sel-d)}
.lp-layers{flex:0 0 auto;border-top:1px solid var(--line);background:#F8FAFC;padding:10px 16px 12px}
.lp-layers h4{font-size:11px;font-weight:800;color:var(--muted);letter-spacing:.8px;margin-bottom:7px}
.lyr{display:grid;grid-template-columns:1fr 1fr;gap:4px 10px}
/* 2열이라 폭이 빠듯하다 — 접히면 '도시계획(도 / 로)'처럼 낱말이 갈라져 읽기 나쁘다.
   줄바꿈을 막고 줌 안내를 작게 줄여 한 줄에 담는다(2026-08-10). */
.lyr label{display:flex;align-items:center;gap:6px;font-size:12px;cursor:pointer;padding:2px 0;
  white-space:nowrap;min-width:0}
.lyr label small{font-size:9.5px;letter-spacing:-.2px}
.lyr input{accent-color:var(--blue)}
.lyr .sw{width:10px;height:10px;border-radius:2px;flex:0 0 auto}
.lp-collapse{position:absolute;top:50%;margin-top:-30px;left:336px;width:19px;height:60px;background:#fff;
  border:1px solid var(--line);border-left:none;border-radius:0 6px 6px 0;color:var(--muted);z-index:29;
  box-shadow:2px 0 6px rgba(18,54,91,.08);transition:left .25s ease;font-size:11px}
.lp-collapse.closed{left:0}
.lp-collapse:hover{color:var(--blue)}

/* ── 지도 ────────────────────────────── */
.mapwrap{flex:1;position:relative;min-width:0;overflow:hidden;background:#EAF0F6}
#map{position:absolute;inset:0}
#map .ol-viewport{border-radius:0}
#maptip{position:absolute;pointer-events:none;background:rgba(18,42,68,.9);color:#fff;
  padding:4px 9px;border-radius:5px;font-size:12px;white-space:nowrap;z-index:25;display:none}
.kpis{position:absolute;top:12px;left:14px;display:flex;gap:6px;z-index:20;flex-wrap:wrap;max-width:calc(100% - 240px)}
.kpi{display:flex;align-items:center;gap:6px;background:rgba(255,255,255,.94);border:1px solid var(--line);
  border-radius:15px;height:30px;padding:0 12px;font-size:11.5px;color:var(--muted);box-shadow:0 1px 4px rgba(18,54,91,.08)}
.kpi b{font-size:12.5px;color:var(--navy)}
.mctrl{position:absolute;top:12px;right:12px;display:flex;flex-direction:column;gap:8px;z-index:20}
.mctrl .grp{background:#fff;border:1px solid var(--line);border-radius:6px;overflow:hidden;box-shadow:var(--shadow);display:flex;flex-direction:column}
.mctrl button{width:36px;height:36px;display:grid;place-items:center;color:#425062;font-size:17px}
.mctrl button + button{border-top:1px solid var(--line)}
.mctrl button:hover{background:var(--blue-t);color:var(--blue)}
.mctrl button.on{background:var(--blue);color:#fff}
.basemap{position:absolute;right:12px;bottom:34px;z-index:20;display:flex;gap:6px;align-items:flex-end}
.bm{width:64px;border-radius:6px;overflow:hidden;border:2px solid #fff;box-shadow:var(--shadow);cursor:pointer;background:#fff}
.bm .th{height:42px}
.bm span{display:block;text-align:center;font-size:10.5px;font-weight:700;padding:3px 0;background:#fff;color:var(--muted)}
.bm.on{border-color:var(--blue)} .bm.on span{color:var(--blue)}
.bm:hover{border-color:#7FB0DF}
.th-base{background:linear-gradient(135deg,#F2F0EA 55%,#DDEAD2 55%,#DDEAD2 70%,#AACBE8 70%)}
.th-sat{background:linear-gradient(135deg,#2E3B2A 50%,#40522F 50%,#40522F 78%,#1B3A52 78%)}
.th-hyb{background:linear-gradient(135deg,#2E3B2A 45%,#40522F 45%,#40522F 62%,#F7C873 62%,#F7C873 70%,#2E3B2A 70%)}
.th-wht{background:linear-gradient(135deg,#FFF 55%,#E1E6EB 55%,#E1E6EB 62%,#FFF 62%,#FFF 80%,#E8EEF3 80%)}
.legend{display:none;position:absolute;right:58px;top:12px;z-index:21;width:210px;background:rgba(255,255,255,.97);
  border:1px solid var(--line);border-radius:6px;box-shadow:var(--shadow);padding:12px 14px}
.legend.open{display:block}
.legend h4{font-size:11.5px;color:var(--navy);margin-bottom:8px}
.legend .li{display:flex;align-items:center;gap:8px;font-size:11.5px;color:var(--ink);padding:2.5px 0}
.legend .li i{width:14px;height:14px;flex:0 0 auto;border-radius:3px}
.coord{position:absolute;left:14px;bottom:12px;z-index:20;background:rgba(255,255,255,.9);border:1px solid var(--line);
  border-radius:4px;padding:3px 9px;font-size:11px;color:var(--muted)}
.attrib{position:absolute;right:12px;bottom:8px;z-index:19;font-size:10px;color:#8894A5}
.notice{position:absolute;top:54px;left:50%;transform:translateX(-50%);z-index:30;background:#FFF7E0;border:1px solid #F2E1AE;
  color:#7A5B12;border-radius:6px;padding:8px 14px;font-size:12px;box-shadow:var(--shadow);max-width:80%}
/* 레이어 안내 배너 — 켠 레이어가 화면에 안 나오는 이유(줌 부족·조회 실패)를 지도 위에 크게 띄운다.
   왼쪽 패널의 작은 경고 글씨는 지도만 보는 동안 눈에 띄지 않는다 (2026-08-12 지적). */
.lyrgate{position:absolute;top:54px;left:50%;transform:translateX(-50%);z-index:45;
  display:flex;align-items:center;gap:10px;background:#FFF3D6;border:1.5px solid #E8A33D;border-left:6px solid #E8590C;
  color:#7A4508;border-radius:8px;padding:9px 10px 9px 14px;font-size:12.5px;font-weight:600;line-height:1.55;
  box-shadow:0 6px 20px rgba(20,40,80,.22);max-width:min(560px,86%);animation:lgpop .28s ease}
.lyrgate[hidden]{display:none}
.lyrgate.bad{background:#FFECEC;border-color:#E03131;border-left-color:#C92A2A;color:#8C2020}
.lyrgate .lg-ico{flex:0 0 auto;font-size:16px}
.lyrgate .lg-txt{flex:1 1 auto;min-width:0}
.lyrgate .lg-btn{flex:0 0 auto;background:#E8590C;color:#fff;border:0;border-radius:5px;padding:5px 11px;
  font-size:12px;font-weight:700;cursor:pointer}
.lyrgate .lg-btn:hover{background:#D9480F}
.lyrgate.bad .lg-btn{background:#C92A2A}
.lyrgate .lg-x{flex:0 0 auto;background:none;border:0;color:inherit;opacity:.55;cursor:pointer;font-size:13px;padding:2px 4px}
.lyrgate .lg-x:hover{opacity:1}
@keyframes lgpop{from{opacity:0;transform:translate(-50%,-8px)}to{opacity:1;transform:translate(-50%,0)}}
.notice:not([hidden]) ~ .lyrgate{top:98px}
/* 지도 중앙 로딩 표시 — 주변 국공유지 조회처럼 수 초 걸리는 온디맨드 작업용 (2026-07-29) */
.maploading{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);z-index:40;
  display:flex;align-items:center;gap:10px;background:rgba(255,255,255,.96);border:1.5px solid #7048E8;
  color:#3B2A86;border-radius:10px;padding:14px 22px;font-size:14px;font-weight:700;
  box-shadow:0 6px 24px rgba(20,40,80,.25)}
.maploading .spin{width:18px;height:18px;border-radius:50%;flex:none;
  border:3px solid #E5DBFF;border-top-color:#7048E8;animation:mapspin .8s linear infinite}
@keyframes mapspin{to{transform:rotate(360deg)}}
.mctrl,.basemap,.legend,.attrib{transition:transform .28s ease}
.stage.dp-open .mctrl,.stage.dp-open .basemap,.stage.dp-open .legend,.stage.dp-open .attrib{transform:translateX(-368px)}
.toast{position:absolute;left:50%;bottom:26px;transform:translate(-50%,10px);z-index:50;background:var(--navy);color:#fff;
  border-radius:6px;padding:9px 16px;font-size:12.5px;opacity:0;pointer-events:none;transition:all .25s ease;max-width:80%;box-shadow:var(--shadow)}
.toast.show{opacity:1;transform:translate(-50%,0)}
.ol-measure-tip{background:rgba(18,42,68,.9);color:#fff;border-radius:5px;padding:3px 8px;font-size:12px;white-space:nowrap}

/* ── 상세 패널 ───────────────────────── */
.dp{position:absolute;top:0;right:0;bottom:0;width:362px;background:#fff;border-left:1px solid var(--line);
  box-shadow:-4px 0 14px rgba(18,54,91,.1);z-index:40;transform:translateX(105%);transition:transform .28s ease;
  display:flex;flex-direction:column}
.dp.open{transform:none}
.dp-top{flex:0 0 auto;display:flex;align-items:center;padding:12px 14px;border-bottom:1px solid var(--line);background:#F8FAFC}
.dp-top h3{font-size:14px;color:var(--navy);flex:1}
.dp-x{width:28px;height:28px;border-radius:4px;color:var(--muted);font-size:16px}
.dp-x:hover{background:#EEF2F6;color:var(--ink)}
.dp-body{flex:1;overflow-y:auto;padding:14px 16px 20px}
.dcard{border:1px solid var(--line);border-radius:6px;padding:12px 14px;margin-bottom:12px}
.dcard h4{font-size:11.5px;font-weight:800;color:var(--muted);letter-spacing:.6px;margin-bottom:9px;display:flex;align-items:center;gap:6px}
.kv{display:grid;grid-template-columns:76px 1fr;gap:5px 10px;font-size:12.5px}
.kv dt{color:var(--muted)} .kv dd{color:var(--ink);font-weight:500;word-break:break-all}
.dhead{margin-bottom:12px}
.dhead .no{display:flex;align-items:center;gap:8px;margin-bottom:4px;flex-wrap:wrap}
.dhead .no b{font-size:16px;color:var(--navy)}
.dhead .addr{font-size:13px;color:var(--ink)}
.bigprice{display:flex;align-items:baseline;gap:8px;margin:8px 0 2px}
.bigprice b{font-size:20px;color:var(--navy)}
.bigprice span{font-size:11.5px;color:var(--muted)}
.parbar{display:flex;align-items:center;gap:8px;font-size:12px;margin-top:6px}
.parbar .track{flex:1;height:7px;border-radius:4px;background:#EBEFF4;overflow:hidden}
.parbar .fill{height:100%;background:var(--ok)} .parbar.warn .fill{background:var(--warn)}
.apcard{border-color:#F0C89A;background:#FFFBF4}
.apcard .unit{font-size:21px;font-weight:800;color:var(--sel-d)}
.apcard .unit small{font-size:11.5px;font-weight:600;color:var(--muted)}
.srcrow{display:flex;align-items:center;gap:8px;font-size:11.5px;padding:2.5px 0;color:var(--ink)}
.srcrow .bar{height:8px;border-radius:3px;background:var(--gB);opacity:.85}
.srcrow .n{min-width:14px;text-align:right;color:var(--muted)}
/* 예상보상가 판정 과정 — 단계 / 결과 / 근거 (수집 소스별 건수 표시를 대체) */
.stagebox{margin-top:10px;padding-top:8px;border-top:1px solid var(--line,#E6E8EB)}
.stagebox>b{display:block;font-size:11px;color:var(--muted);margin-bottom:4px}
.stagerow{display:grid;grid-template-columns:76px auto 1fr;align-items:baseline;gap:6px;
          font-size:11.5px;padding:2.5px 0;color:var(--ink)}
.stagerow .st{color:var(--muted)}
.stagerow .gr{min-width:0;overflow-wrap:anywhere;color:var(--ink)}
/* ④ 산출 조건 입력 — 이용상황·용도지역·반경 (비우면 토지특성에서 자동) */
.apcond{margin-top:10px}
.apcond .in3{display:grid;grid-template-columns:1fr 1fr 74px;gap:6px}
.apcond .in3 input{height:30px;border:1px solid var(--line);border-radius:4px;padding:0 7px;
  font-size:11.5px;background:#fff;min-width:0}
.apcond .in3 input:disabled{background:#F3F5F7;color:var(--muted)}
.apcond .ghint{margin-top:6px}
.dp .act{display:flex;gap:6px;margin-top:10px}
/* 상세 패널 버튼 — 폭 362px 안에 3개까지 한 줄로 들어간다. 글자를 접으면 34px 칸을 뚫고
   두 줄로 삐져나오므로 줄바꿈을 막고(nowrap) 정 모자라면 …으로 자른다 (2026-08-12).
   가운데 정렬은 line-height 로 한다 — flex 로 감싸면 말줄임이 먹지 않는다. */
.btn-p,.btn-o{flex:1 1 auto;min-width:0;height:34px;border-radius:5px;padding:0 6px;
  text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-decoration:none;
  font-size:12.5px;letter-spacing:-.2px;cursor:pointer}
.btn-p{display:block;line-height:34px;background:var(--blue);color:#fff;font-weight:700}
.btn-p:hover{background:var(--blue-d)}
.btn-o{display:block;line-height:32px;border:1px solid var(--blue);color:var(--blue);font-weight:600;background:#fff}
.btn-o:hover{background:var(--blue-t)}
/* 한 줄에 3개가 서는 카드(파산공매 '공고')는 폭이 빠듯하다 — 글자를 한 단계 줄여 여유를 둔다.
   웹폰트를 쓰지 않아 PC 마다 글자 폭이 조금씩 다르므로 여유가 필요하다. */
.dp .act:has(> :nth-child(3)) .btn-o{font-size:12px;letter-spacing:-.3px}
.btn-sel{background:var(--sel)} .btn-sel:hover{background:var(--sel-d)}
.locknote{display:flex;gap:9px;align-items:flex-start;font-size:12px;color:var(--muted);line-height:1.55;
  background:#F4F6F9;border:1px dashed #CDD6E0;border-radius:6px;padding:11px 13px}
.mrow{display:flex;align-items:center;gap:8px;padding:7px 0;border-bottom:1px dashed #EDF1F6;font-size:12.5px;cursor:pointer}
.mrow:last-child{border-bottom:none}
.mrow:hover .mt{color:var(--blue)}
.mrow .mt{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600}
.mrow .dist{color:var(--muted);font-size:11.5px}

/* ── 하단 시트 ───────────────────────── */
.bs{flex:0 0 auto;background:#fff;border-top:1px solid var(--line);z-index:35;display:flex;flex-direction:column;height:300px;transition:height .22s ease}
.bs.closed{height:37px}
.bs.dragging{transition:none}
.bs-resize{flex:0 0 6px;cursor:ns-resize;position:relative;touch-action:none}
.bs-resize::after{content:'';position:absolute;left:50%;top:2px;transform:translateX(-50%);
  width:44px;height:3px;border-radius:2px;background:#C9D4E0}
.bs-resize:hover::after,.bs.dragging .bs-resize::after{background:var(--blue)}
.bs.closed .bs-resize{display:none}
.bs-head{flex:0 0 37px;display:flex;align-items:center;gap:10px;padding:0 14px;border-bottom:1px solid var(--line);background:#F8FAFC}
.bs-head .tt{font-size:13px;font-weight:700;color:var(--navy)}
.bs-head .cnt{font-size:11.5px;color:var(--muted)}
.bs-head .sp{flex:1}
.bs-head select{height:26px;border:1px solid var(--line);border-radius:4px;font-size:11.5px;padding:0 6px;background:#fff}
.btn-xl{height:27px;display:flex;align-items:center;gap:6px;padding:0 12px;border:1px solid var(--ok);color:var(--ok);
  border-radius:4px;font-size:12px;font-weight:700;background:#fff}
.btn-xl:hover{background:#E5F3E8}
.bs-fold{width:26px;height:26px;display:grid;place-items:center;color:var(--muted);border-radius:4px}
.bs-fold:hover{background:#EEF2F6}
.bs-body{flex:1;overflow:auto;min-height:0}
table{width:100%;border-collapse:collapse;font-size:12px}
thead th{position:sticky;top:0;background:#F4F7FA;color:var(--muted);font-weight:700;text-align:left;
  padding:7px 12px;border-bottom:1px solid var(--line);white-space:nowrap;z-index:1}
tbody td{padding:7px 12px;border-bottom:1px solid #EDF1F6;white-space:nowrap;color:var(--ink);max-width:420px;overflow:hidden;text-overflow:ellipsis}
tbody tr{cursor:pointer} tbody tr:hover{background:#F4F8FC}
tbody tr.on{background:var(--blue-t)}
td.r,th.r{text-align:right}

/* ── 지오코딩 카드 ───────────────────── */
.gcard{margin:12px 14px;border:1px solid var(--line);border-radius:6px;padding:13px 14px}
.gcard h4{font-size:12.5px;color:var(--navy);margin-bottom:9px}
.gcard .in{display:flex;gap:6px;margin-bottom:9px}
.gcard input[type=text]{flex:1;height:32px;border:1px solid var(--line);border-radius:4px;padding:0 9px;font-size:12px;min-width:0}
.gcard .btn{height:32px;padding:0 13px;background:var(--blue);color:#fff;border-radius:4px;font-size:12.5px;font-weight:700;flex:0 0 auto}
.gres{background:#F4F8FC;border:1px solid #D7E5F2;border-radius:5px;padding:10px 12px;font-size:12px;display:none}
.gres.show{display:block}
.gres .kv{grid-template-columns:64px 1fr;gap:4px 8px}
.gdl{display:flex;gap:6px;margin-top:9px}
.gdl button,.gdl a{flex:1;height:30px;border:1px solid var(--ok);color:var(--ok);border-radius:4px;font-size:12px;font-weight:700;background:#fff;
  display:flex;align-items:center;justify-content:center;text-decoration:none;cursor:pointer}
.gdl button:hover,.gdl a:hover{background:#E5F3E8}
.ghint{font-size:11px;color:var(--muted);margin-top:8px;line-height:1.6}

/* ── 로그인 ──────────────────────────── */
#login{position:fixed;inset:0;z-index:200;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(160deg,#0E2A47 0%,#0B5FB0 60%,#1478D6 100%)}
#login[hidden]{display:none}
.login-card{width:360px;background:#fff;border-radius:12px;box-shadow:0 12px 40px rgba(6,24,44,.4);padding:28px 28px 24px;
  display:flex;flex-direction:column;gap:12px}
.login-logo{display:flex;align-items:center;gap:11px;margin-bottom:2px}
.login-note{font-size:12px;color:var(--muted);line-height:1.6}
.login-card label{font-size:12px;font-weight:700;color:var(--navy);display:flex;flex-direction:column;gap:5px}
.login-card input{height:38px;border:1px solid var(--line);border-radius:6px;padding:0 11px;font-size:13px}
.login-card input:focus{border-color:var(--blue);outline:none}
.login-card .btn-p{height:40px;line-height:40px;font-size:13px;margin-top:4px}
.login-err{font-size:12px;color:var(--bad);min-height:15px}

@media (prefers-reduced-motion:reduce){*{transition:none!important;animation:none!important}}
@media (max-width:900px){ .gnb-search{display:none} .brand .t2{display:none} }

/* 추출 검증 — 선택된 파일 카드 강조 (하단 표와 대응) */
.vfile.sel{background:#EEF4FB;box-shadow:inset 3px 0 0 var(--blue)}

/* 추출 검증 — 동작 버튼을 명확한 버튼으로 (링크처럼 보여 구분 안 되던 실사고 2026-08-08) */
.vbtns{display:flex;flex-wrap:wrap;gap:4px;margin-top:5px}
.vbtn{border:1px solid #C6D3E2;background:#fff;border-radius:4px;padding:2.5px 8px;
  font-size:11px;color:#33475C;cursor:pointer;line-height:1.5}
.vbtn:hover{border-color:var(--blue);color:var(--blue);background:#F4F8FC}
.vbtn-keep{border-color:#9DBFA0;color:#2B7A3D}
.vbtn-keep:hover{border-color:#2B7A3D;color:#2B7A3D;background:#F1F8F2}
.vbtn-del{border-color:#E4B6B6;color:#C92A2A}
.vbtn-del:hover{border-color:#C92A2A;color:#C92A2A;background:#FDF1F1}

/* 국공유지 그룹 (레이어 박스) — map.js PUB_COLOR 와 짝.
   2열 그리드 안에서 전체 폭을 쓰고, 소유구분 체크는 들여쓰기 + 왼쪽 세로선으로
   '국공유지의 하위 옵션'임을 드러낸다. 레이어 체크와 같은 크기·색으로 나열하면
   별개 레이어처럼 읽힌다(2026-08-10 사용자 지적). */
.pubgrp{grid-column:1/-1;margin-top:5px;padding-top:6px;border-top:1px dashed var(--line)}
.publeg{display:flex;align-items:center;gap:2px 11px;flex-wrap:wrap;
  margin:4px 0 0 8px;padding-left:10px;border-left:2px solid #DCE3EC;
  font-size:11px;color:#5A6675}
/* 캡션은 한 줄을 통째로 차지한다 — 같은 줄에 두면 체크 3개가 다 못 들어가 하나만 접힌다 */
.publeg .cap{flex:0 0 100%;font-size:10px;color:var(--muted);letter-spacing:.2px;margin-bottom:1px}
.publeg label{display:flex;align-items:center;gap:4px;margin:0;padding:1px 0;
  font-size:11px;cursor:pointer}
.publeg input{width:12px;height:12px;margin:0;accent-color:#8A94A2}
.publeg i{width:8px;height:8px;border-radius:2px;display:inline-block;flex:0 0 auto}
.pubstat{margin:4px 0 0 8px;padding-left:10px;font-size:10.5px;color:var(--muted);line-height:1.5}
.pubstat:empty{margin:0}
.pubstat .warn{color:var(--warn)}
