/* ═══ style.css — 지앤톡 ERP 화면 스타일. 색·글꼴은 맨 위 :root 변수에서 바꾼다 (밝은 화면은 theme-light.css 가 같은 변수를 바꾼다) */

:root{
  --bg:#0d1117; --card:#161b24; --card2:#11161e; --line:#252d3a;
  --text:#e3e8ef; --dim:#8b95a5; --cyan:#4dc9c0; --amber:#e0a458;
  --rose:#e2707a; --ok:#5fc98a; --violet:#a58bd8;
  --gold:#e3b341;  /* v101 (명세 2-A): 변경이력 표 '(딸린 변경 N)' 금색 — 바탕 --bg 9.7:1 · --card 8.9:1 (theme-glass · theme-light 에서 다시 정의) */
  --sky:#7cc4f5;   /* v78: 계약 상태 '대기'(DB 등록완료 — 승인됐지만 서비스 시작 전) 글씨 · D-day. 바탕은 칠하지 않는다 (사용자 말 '대기의 폰트는 하늘색') */
  --map1:#02773e; --map2:#339659; --map3:#55b577; --map4:#76d695; --map5:#97f7b5;   /* v53: 대시보드 지역 지도 칸 5단계 (값이 클수록 밝다) */
  --map-edge:rgba(13,17,23,.6);   /* v68: 실제 지도의 시군구 경계선 (칸 사이 가는 선) */
  /* v63: 규칙마다 직접 적던 색을 토큰으로 (값은 그대로 — 어두운 화면 모양은 같다). 밝은 화면(theme-light.css)이 이 값만 바꾼다
     --hi 제목·큰 숫자 글자(흰색) · --faint 아주 흐린 글자 · --row 표 줄 선 · --scheme 날짜 칸 달력 아이콘 등 기본 입력 모양 */
  --hi:#fff; --faint:#4a5464; --row:#1c2330; --scheme:dark;
}
*{box-sizing:border-box}
html,body{margin:0;padding:0;background:var(--bg);color:var(--text);
  font-family:-apple-system,"Malgun Gothic","Apple SD Gothic Neo",sans-serif;
  font-size:15px;line-height:1.6;-webkit-font-smoothing:antialiased}
.wrap{max-width:1200px;margin:0 auto;padding:20px 16px 60px}

/* setup · login · signup — 같은 카드 모양을 쓴다 */
#setup,#login,#signup{max-width:560px;margin:60px auto;background:var(--card);
  border:1px solid var(--line);border-radius:14px;padding:32px}
#login{max-width:420px}
#signup{max-width:460px}
#setup h2,#login h2,#signup h2{margin:0 0 6px;font-size:20px;color:var(--hi)}
#setup p,#login p,#signup p{color:var(--dim);font-size:13.5px;margin:0 0 22px}
#setup label,#login label,#signup label{display:block;font-size:12.5px;color:var(--dim);margin:14px 0 5px}
#setup input,#login input,#signup input{width:100%;background:var(--card2);border:1px solid var(--line);
  color:var(--text);padding:11px 13px;border-radius:8px;font-size:13px;
  font-family:Consolas,monospace}
#login input,#signup input{font-family:inherit;font-size:14px}
#setup input:focus,#login input:focus,#signup input:focus{outline:none;border-color:var(--cyan)}
/* v83: 인터넷에 올린 사본(conn.js 에 연결 — index.html 이 <html data-conn="fixed">)은 처음 연결 칸·'서버 연결 변경' 을 보이지 않는다 */
:root[data-conn="fixed"] #setup,:root[data-conn="fixed"] .conn-chg{display:none}
.req{color:var(--rose)}
.hint{color:var(--faint);font-size:11px}
.loginfoot a{color:var(--cyan);text-decoration:none}
.loginfoot a:hover{text-decoration:underline}
.loginmsg.ok{color:var(--ok)}
.loginmsg{margin-top:16px;font-size:13px;color:var(--rose);line-height:1.6;min-height:1px}
.loginmsg.wait{color:var(--dim)}
.loginfoot{margin-top:20px;padding-top:16px;border-top:1px solid var(--line);
  font-size:12px;color:var(--dim);display:flex;justify-content:space-between;
  align-items:center;gap:10px;flex-wrap:wrap}
.who{font-size:12.5px;color:var(--text)}
.who .dim{color:var(--dim)}
.warnbox{background:#221417;border-left:3px solid var(--rose);padding:11px 15px;
  border-radius:0 8px 8px 0;font-size:12.5px;margin:18px 0;line-height:1.6}
.warnbox b{color:var(--rose)}

/* header */
header{display:flex;justify-content:space-between;align-items:center;
  padding-bottom:16px;border-bottom:1px solid var(--line);margin-bottom:20px;
  flex-wrap:wrap;gap:12px}
h1{font-size:20px;margin:0;font-weight:650;color:var(--hi);letter-spacing:-.01em}
h1 span{color:var(--cyan)}
.conn{font-size:12px;color:var(--dim);display:flex;align-items:center;gap:6px}
.conn b{color:var(--ok)}

/* 알림 종 (관리자) */
.bellwrap{position:relative;display:inline-block;margin-right:6px}
button.bell{background:var(--card2);border:1px solid var(--line);border-radius:999px;color:var(--text);
  padding:4px 9px;font-size:14px;line-height:1;margin:0;cursor:pointer;position:relative}
button.bell:hover{border-color:var(--cyan)}
button.bell .pill{position:absolute;top:-6px;right:-6px;margin:0;min-width:16px;text-align:center}
button.bell.ring{animation:ring .6s ease-in-out 2}
@keyframes ring{0%,100%{transform:rotate(0)}25%{transform:rotate(14deg)}50%{transform:rotate(-12deg)}75%{transform:rotate(8deg)}}
.bellpanel{position:absolute;right:0;top:calc(100% + 8px);width:min(340px,calc(100vw - 32px));z-index:60;
  background:var(--card);border:1px solid var(--line);border-radius:12px;padding:10px 12px;
  box-shadow:0 12px 32px rgba(0,0,0,.35);font-size:12.5px;color:var(--text);text-align:left;animation:fadein .25s ease-out}
.bellpanel h5{margin:0 0 8px;font-size:12px;color:var(--dim);font-weight:600}
.bellpanel .row{display:flex;justify-content:space-between;align-items:center;padding:6px 4px;border-top:1px solid var(--line);cursor:pointer;gap:8px}
.bellpanel .row:hover{color:var(--cyan)}
.bellpanel .row .n{font-weight:700;color:var(--rose)}
.bellpanel .sub{font-size:11.5px;color:var(--dim);padding:0 4px 6px;line-height:1.5}
.bellpanel .none{padding:6px 4px;color:var(--dim)}

/* filters */
.filters{background:var(--card);border:1px solid var(--line);border-radius:12px;
  padding:16px 18px;margin-bottom:16px}
.frow{display:flex;gap:10px;flex-wrap:wrap;align-items:flex-end}
.fld{display:flex;flex-direction:column;gap:5px;min-width:0}
.fld label{font-size:11.5px;color:var(--dim);letter-spacing:.02em}
select,input[type=text],input[type=number]{background:var(--card2);
  border:1px solid var(--line);color:var(--text);padding:8px 11px;border-radius:7px;
  font-size:13.5px;font-family:inherit;min-width:130px}
select:focus,input:focus{outline:none;border-color:var(--cyan)}
.chks{display:flex;gap:14px;flex-wrap:wrap;margin-top:12px;padding-top:12px;
  border-top:1px solid var(--line)}
.chk{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--dim);cursor:pointer}
.chk input{accent-color:var(--cyan);cursor:pointer}
.chk:hover{color:var(--text)}
button.go{background:var(--cyan);color:#06131a;border:none;padding:9px 22px;
  border-radius:7px;font-size:13.5px;font-weight:650;cursor:pointer;font-family:inherit}
button.go:hover{opacity:.88}
button.ghost{background:none;border:1px solid var(--line);color:var(--dim);
  padding:8px 16px;border-radius:7px;font-size:13px;cursor:pointer;font-family:inherit}
button.ghost:hover{color:var(--text);border-color:var(--dim)}

/* summary */
.sum{display:flex;gap:20px;flex-wrap:wrap;font-size:13px;color:var(--dim);
  margin-bottom:12px;padding:0 2px}
.sum b{color:var(--cyan);font-variant-numeric:tabular-nums}
.sum .g{color:var(--ok)}

/* table */
.tblwrap{background:var(--card);border:1px solid var(--line);border-radius:12px;
  overflow:hidden}
table{border-collapse:collapse;width:100%;font-size:13.5px}
th{background:#1a212c;color:#c9d3e0;text-align:left;padding:10px 13px;
  border-bottom:1px solid var(--line);font-weight:600;font-size:12.5px;
  white-space:nowrap;position:sticky;top:0}
td{padding:10px 13px;border-bottom:1px solid var(--row);vertical-align:middle}
tr:last-child td{border-bottom:none}
tbody tr{cursor:pointer;transition:background .12s}
tbody tr:hover{background:#1b2432}
td.n{text-align:right;font-variant-numeric:tabular-nums}
.badge{display:inline-block;font-size:11px;padding:2px 9px;border-radius:20px;
  border:1px solid var(--line);color:var(--dim);white-space:nowrap}
.badge.cust{color:var(--ok);border-color:#2a4a38;background:#12241c}
.badge.rev{color:var(--amber);border-color:#4a3a22;background:#231b10}
.badge.p{color:var(--rose);border-color:#4a2a2e}
.prod{color:var(--cyan);font-size:12.5px}
/* 남은 계약일수 — 90일 이하 노랑, 30일 이하·만료 빨강 */
.dd{margin-left:1px;font-variant-numeric:tabular-nums;color:var(--dim)}
.dd-y{color:var(--amber)}
.dd-r{color:var(--rose);font-weight:600}
.dd.dim{color:var(--faint)}
.bud{color:var(--amber);font-weight:700;margin-right:1px}   /* 예산지원 표시 */
.chklbl{font-size:12px;color:var(--dim);margin-right:4px;align-self:center}
.empty{padding:50px 20px;text-align:center;color:var(--dim);font-size:14px}
.loading{padding:40px;text-align:center;color:var(--dim)}

/* tabs */
.tabs{display:flex;gap:4px;margin-bottom:18px;border-bottom:1px solid var(--line)}
button.tab{background:none;border:none;border-bottom:2px solid transparent;
  color:var(--dim);padding:9px 16px;font-size:14px;cursor:pointer;font-family:inherit;
  margin-bottom:-1px}
button.tab:hover{color:var(--text)}
button.tab.on{color:var(--cyan);border-bottom-color:var(--cyan);font-weight:600}
.pill{display:inline-block;background:var(--rose);color:#fff;font-size:10.5px;
  padding:1px 6px;border-radius:10px;margin-left:4px;vertical-align:middle}

/* admin */
.asec{background:var(--card);border:1px solid var(--line);border-radius:12px;
  padding:18px 20px;margin-bottom:16px}
.asec h3{margin:0 0 4px;font-size:15px;color:var(--hi);font-weight:650}
.asec .cnt{display:inline-block;background:var(--card2);border:1px solid var(--line);
  color:var(--dim);font-size:11.5px;padding:1px 8px;border-radius:10px;margin-left:6px;
  font-variant-numeric:tabular-nums}
.adesc{color:var(--dim);font-size:12.5px;margin:0 0 14px;line-height:1.6}
.asec table{font-size:13px}
.asec th{background:transparent;border-bottom:1px solid var(--line);padding:8px 10px}
.asec td{padding:7px 10px;border-bottom:1px solid var(--row)}
.asec tbody tr{cursor:default}
.asec tbody tr:hover{background:transparent}
.asec select,.asec input[type=text]{padding:5px 8px;font-size:12.5px;min-width:0}
.addrow{display:flex;gap:8px;margin-bottom:14px;flex-wrap:wrap}
button.mini{background:var(--card2);border:1px solid var(--line);color:var(--dim);
  padding:4px 11px;border-radius:6px;font-size:12px;cursor:pointer;font-family:inherit}
button.mini:hover{color:var(--text);border-color:var(--dim)}
button.mini.ok{color:var(--ok);border-color:#2a4a38}
button.mini.ok:hover{background:#12241c}
button.mini.no{color:var(--rose);border-color:#4a2a2e}
button.mini.no:hover{background:#221417}
button.mini:disabled{opacity:.4;cursor:default}
.me{color:var(--cyan);font-size:11px;margin-left:4px}

/* 담당자 신청 폼 */
.flabel{display:block;font-size:12.5px;color:var(--dim);margin:16px 0 6px}
#askModal input[type=file]{width:100%;background:var(--card2);border:1px dashed var(--line);
  color:var(--text);padding:12px;border-radius:8px;font-size:12.5px;font-family:inherit;cursor:pointer}
#askModal input[type=file]:hover{border-color:var(--cyan)}
#askModal textarea{width:100%;background:var(--card2);border:1px solid var(--line);
  color:var(--text);padding:10px 12px;border-radius:8px;font-size:13.5px;
  font-family:inherit;resize:vertical}
#askModal textarea:focus{outline:none;border-color:var(--cyan)}

/* 입력 폼 (활동 기록 · 계약 등록) */
.fgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:2px 14px}
#actModal input:not([type=checkbox]),#actModal select,#actModal textarea,
#ctModal input:not([type=checkbox]):not([type=file]),#ctModal select{
  width:100%;background:var(--card2);border:1px solid var(--line);color:var(--text);
  padding:9px 11px;border-radius:7px;font-size:13.5px;font-family:inherit;min-width:0}
#actModal textarea{resize:vertical}
#actModal :focus,#ctModal :focus{outline:none;border-color:var(--cyan)}
#ctModal input[type=file]{width:100%;background:var(--card2);border:1px dashed var(--line);
  color:var(--text);padding:12px;border-radius:8px;font-size:12.5px;cursor:pointer;font-family:inherit}
.fsec{margin-top:18px;border:1px solid var(--line);border-radius:9px;padding:10px 14px;background:var(--card2)}
.fsec summary{cursor:pointer;list-style:none;display:flex;align-items:center;gap:10px;font-size:13px;flex-wrap:wrap}
.fsec summary::-webkit-details-marker{display:none}
.fsec[open] summary{margin-bottom:6px;padding-bottom:8px;border-bottom:1px solid var(--line)}
.fsec .fgrid input,.fsec .fgrid select,.fsec>input{background:var(--card)}
.fsec2{margin-top:16px;border-top:1px solid var(--line);padding-top:12px}
.fst{font-size:12.5px;color:var(--cyan);font-weight:600;margin-bottom:4px}
.sumrow{display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:12px}
.sumrow .sum{margin-bottom:0}

/* 상세 — 첨부 파일 */
.files{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:2px 0 10px}
.fchip{display:flex;align-items:center;gap:8px;background:var(--card);border:1px solid var(--line);border-radius:8px;
  padding:4px 8px 4px 4px;cursor:pointer;max-width:260px;position:relative}
.fchip:hover{border-color:var(--cyan)}
.fchip.hid{opacity:.45;border-style:dashed}
.qrbox{display:flex;align-items:center;gap:12px;margin-top:10px;font-size:12px}
.qrbox img.th.qr{width:96px;height:96px;border-radius:8px;background:#fff;padding:4px;cursor:pointer;object-fit:contain}
.qrbox img.th.qr:hover{outline:2px solid var(--cyan)}
.fchip .th{width:44px;height:44px;border-radius:6px;object-fit:cover;background:#0b0f14;flex:none;display:flex;
  align-items:center;justify-content:center;font-size:11px;color:var(--amber);font-weight:700;letter-spacing:.03em}
/* v37: 보고서 · My page */
.seg{display:inline-flex;border:1px solid var(--line);border-radius:8px;overflow:hidden}
.seg button{background:transparent;border:0;color:var(--dim);padding:7px 14px;cursor:pointer;font-size:13px}
.seg button.on{background:var(--accent,#2f6fed);color:#fff}
.rpme{padding:8px 12px;background:var(--card);border:1px solid var(--line);border-radius:8px;font-weight:600}
.rpsum{display:flex;gap:14px;flex-wrap:wrap;align-items:stretch;margin:12px 0 14px}
.rpsl{display:grid;grid-template-columns:repeat(4,minmax(120px,1fr));gap:10px;flex:1 1 480px}
.rpsl .tile .v{font-size:20px}
.rpsr{flex:1 1 320px;background:var(--card);border:1px solid var(--line);border-radius:12px;padding:12px 14px;display:flex;flex-wrap:wrap;gap:8px 18px;align-content:flex-start}
.rpsr .k{width:100%;font-size:11.5px;color:var(--dim)}
.rpp{display:flex;align-items:baseline;gap:6px;font-size:13.5px}.rpp .n{color:var(--dim)}.rpp b{font-size:18px}.rpp .add{color:var(--dim);font-size:12px}.rpp .add.up{color:var(--ok);font-weight:600}
/* v40: 보고서·My page 는 본문 1200px 제한을 풀고(body.wide) 표를 창 너비만큼 쓴다. 그래도 넘치면 가로 스크롤(스크롤바 항상 보임) */
/* v42: 본문 폭(1200px)은 두고 보고서 표(.rpwide)만 창 너비로 튀어나온다 — 탭·필터·요약은 그대로 */
body.wide .rpwide{width:calc(100vw - 32px);position:relative;left:50%;transform:translateX(-50%)}
.rtable{overflow-x:auto;border:1px solid var(--line);border-radius:12px;scrollbar-width:thin}
.rtable::-webkit-scrollbar{height:10px}.rtable::-webkit-scrollbar-thumb{background:rgba(255,255,255,.25);border-radius:5px}.rtable::-webkit-scrollbar-track{background:rgba(255,255,255,.06)}
table.rp{min-width:1500px}table.rp th{white-space:nowrap;position:sticky;top:0;text-align:center}
table.rp td{text-align:center}   /* v40: 표 안 값은 전부 가운데 정렬(사용자 요청) */
table.rp th,table.rp td{padding:8px 8px}   /* v41: 열 17개가 들어가도록 칸 여백을 줄임 */
table.rp td .mini{white-space:nowrap}
table.rp td .sub{display:block;font-size:11.5px;color:var(--dim);margin-top:2px}   /* v42: 한 칸 두 줄의 아랫줄 (장충 연도 · 확도) */
.inqcx,.inqcx a,td.inqcx a{color:var(--amber)!important;font-weight:600}
.warn{color:var(--amber);font-weight:600}   /* v43: 계약완료? (계약 미등록) */
.rpest{grid-column:1/-1;font-size:13px;color:var(--amber);padding:4px 4px 0}   /* v44: 요약 아래 예상 줄 (계약완료?) */
.tile .v .unit{font-size:12px;margin-left:3px;color:var(--dim);font-weight:400}
table.rp td .sub.prev{color:var(--amber);white-space:nowrap}   /* v44: 초록 칸의 이전 값 */   /* v42: 담당자 변경 문의의 단지 이름 */   /* v41: 표가 창 너비를 다 쓰면 마지막 '+ 활동기록' 칸이 좁아져 글자가 세로로 서던 것 */
table.rp td.num{font-variant-numeric:tabular-nums;white-space:nowrap}
table.rp td.nm{white-space:nowrap;font-weight:600}table.rp td.nw{white-space:nowrap}table.rp td.nm a{color:inherit;text-decoration:none;border-bottom:1px dotted var(--dim)}
table.rp td.memo{min-width:180px;max-width:320px;color:var(--dim);font-size:12.5px}
table.rp td.chg{background:rgba(46,204,113,.22);box-shadow:inset 0 0 0 1.5px rgba(46,204,113,.7);border-radius:4px}
table.rp tr.rowok td{background:rgba(46,204,113,.10)}table.rp tr.rowfail td{background:rgba(231,76,60,.14)}
table.rp tr.rownew td.nm::after{content:'NEW';margin-left:6px;font-size:10px;color:var(--ok);border:1px solid var(--ok);border-radius:4px;padding:0 4px;vertical-align:middle}
table.rp tr.rgrp td{background:var(--card);font-weight:700;padding:10px 12px;letter-spacing:.02em;text-align:left}
table.rp tr.rgadd td{padding:8px 12px;background:rgba(255,255,255,.03);text-align:left}
table.rp tr.rgrp.update td{color:var(--ok)}table.rp tr.rgrp.pending td{color:var(--amber)}table.rp tr.rgrp.finished td{color:var(--dim)}
table.rp tr.rgrp.complete td{color:var(--ok)}table.rp tr.rgrp.open td{color:var(--amber)}
table.rp .cnt{display:inline-block;margin-left:6px;font-size:11px;padding:1px 7px;border-radius:9px;background:rgba(255,255,255,.08)}
@media (max-width:700px){.rpsl{grid-template-columns:repeat(2,1fr)}}
/* v35: 긴 이메일(더하기 주소 등)이 칸을 넘지 않게 — 아무 데서나 줄바꿈 */
.em{overflow-wrap:anywhere;word-break:break-all;max-width:230px}
.fchip .fn{font-size:12px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:150px}
.fchip .fk{font-size:10.5px;color:var(--dim);flex:none}
.fchip .fh{position:absolute;top:-8px;right:-6px;font-size:10px;padding:1px 6px;border-radius:8px;background:var(--card2);
  border:1px solid var(--line);color:var(--dim);cursor:pointer}
.addfile{display:inline-flex;align-items:center;border:1px dashed var(--line);border-radius:8px;padding:12px 14px;
  font-size:12.5px;color:var(--cyan);cursor:pointer}
.addfile:hover{border-color:var(--cyan);background:#12241f}
.addfile input{display:none}
.nofile{font-size:12px;color:var(--faint);font-style:italic}
.fmsg{font-size:12px;color:var(--dim)}
/* 뷰어 */
.fv{max-width:1100px;height:calc(100vh - 48px);margin:0 auto;background:var(--card);border:1px solid var(--line);
  border-radius:14px;display:flex;flex-direction:column;overflow:hidden}
.fvhead{display:flex;justify-content:space-between;align-items:center;gap:12px;padding:10px 16px;border-bottom:1px solid var(--line);font-size:13px;color:var(--dim)}
.fvhead .fvnav{display:flex;align-items:center;gap:8px;flex:none}
.fvhead #fvPos{font-variant-numeric:tabular-nums;font-size:12px}
.fvbody{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;background:#0b0f14}
.fvbody img{max-width:100%;max-height:100%;object-fit:contain}
.fvbody iframe{width:100%;height:100%;border:0;background:#fff}
.fvother{color:var(--dim);text-align:center;font-size:14px}

/* 상세 — 영업 활동 */
.sec h4{display:flex;align-items:center;gap:8px}
.secbtns{margin-left:auto;display:flex;gap:6px;text-transform:none;letter-spacing:0}
.oppbox{background:var(--card2);border:1px solid var(--line);border-radius:9px;padding:11px 14px;
  margin-bottom:10px;font-size:13px;color:var(--dim);line-height:1.8}
.oppbox .st{display:inline-block;background:#1f2a3a;color:var(--cyan);padding:1px 9px;border-radius:12px;
  font-size:12px;margin-right:4px}
.oppbox b{color:var(--text);font-weight:500}
.actlist{list-style:none;margin:0;padding:0}
.actlist li{padding:7px 0;border-bottom:1px solid var(--row);font-size:13px;display:flex;gap:10px;align-items:baseline}
.actlist li:last-child{border-bottom:none}
.actlist .d{color:var(--dim);flex:none;width:82px;font-variant-numeric:tabular-nums;font-size:12.5px}
.actlist .ty{color:var(--amber);flex:none;width:56px;font-size:12.5px}
.actlist .who{color:var(--dim);flex:none;font-size:12px}
.actlist .m{color:var(--text)}

/* 대시보드 */
.tiles{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px;margin-bottom:16px}
.tile{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:14px 16px}
.tile .k{font-size:11.5px;color:var(--dim);margin-bottom:4px}
.tile .v{font-size:24px;font-weight:650;color:var(--hi);font-variant-numeric:tabular-nums;letter-spacing:-.01em;line-height:1.2}
.tile .v.c{color:var(--cyan)}.tile .v.g{color:var(--ok)}.tile .v.a{color:var(--amber)}.tile .v.r{color:var(--rose)}
.tile .s{font-size:11px;color:#5c6b7a;margin-top:4px}
.dgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(400px,1fr));gap:16px}
/* v48: 대시보드 인포그래픽 (순수 CSS/SVG) */
.tile.kpi .s{color:var(--dim);font-size:11.5px;margin-top:4px}.delta{display:inline-block;margin-top:6px;font-size:11.5px;color:var(--dim)}.delta.up{color:var(--ok)}.delta.down{color:var(--rose)}.delta i{font-style:normal;color:var(--dim);font-weight:400;margin-left:2px}
.donut{display:flex;gap:18px;align-items:center;flex-wrap:wrap}.donut svg{flex:none}.donut .ct{font-size:12px;font-weight:700;fill:var(--text)}.donut .cs{font-size:7px;fill:var(--dim)}
.legend{display:grid;gap:6px;font-size:13px;min-width:200px}.legend i{display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:6px;vertical-align:middle}
.lg,.fnl{display:grid;grid-template-columns:22px 110px 1fr 90px;gap:4px 8px;align-items:center;padding:7px 0;font-size:13px;border-bottom:1px solid var(--line)}.fnl{grid-template-columns:150px 1fr 70px}
.lg .rk{color:var(--dim);font-size:12px}.lg .l,.fnl .l{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.fnl .l i{color:var(--dim);font-style:normal;font-size:11px}
.lg .trk,.fnl .trk{display:block;height:10px;background:rgba(255,255,255,.08);border-radius:5px;overflow:hidden}.lg .fill{display:block;height:100%;background:var(--cyan);border-radius:5px}.fnl .fill{display:block;height:100%;background:var(--amber);border-radius:5px}
.lg .val,.fnl .val{text-align:right;font-variant-numeric:tabular-nums;font-weight:600;white-space:nowrap}.lg .val i,.fnl .val i{font-style:normal;font-size:11px;color:var(--dim);margin-left:2px}.lg .sub,.fnl .sub{grid-column:1/-1;font-size:11.5px;color:var(--dim)}
.tl{display:grid;grid-template-columns:repeat(12,1fr);gap:6px;align-items:end;height:180px}.tl .col{display:flex;flex-direction:column;align-items:center;justify-content:flex-end;height:100%;font-size:11px}.tl .bar{width:100%;height:100px;display:flex;align-items:flex-end;background:rgba(255,255,255,.05);border-radius:4px}.tl .fill{width:100%;background:var(--rose);border-radius:4px;opacity:.85}.tl .cnt{font-weight:600;height:14px}.tl .mm{color:var(--dim);margin-top:4px}.tl .mr{color:var(--amber);font-size:10.5px;height:13px;font-variant-numeric:tabular-nums}
.bar{display:flex;align-items:center;gap:10px;padding:4px 0;font-size:13px}
.bar .l{width:120px;flex:none;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bar .t{flex:1;height:13px;background:var(--card2);border-radius:7px;overflow:hidden}
.bar .f{height:100%;background:var(--cyan);border-radius:7px;min-width:2px;padding:0;border:0}   /* v53: 상세 칸 .f 의 padding·테두리가 붙어 작은 값도 최소 26px 이던 것 */
.bar .f.g{background:var(--ok)}.bar .f.a{background:var(--amber)}
.bar .n{width:150px;flex:none;text-align:right;color:var(--dim);font-variant-numeric:tabular-nums;font-size:12.5px}
.bar .n b{color:var(--text);font-weight:600}
.asec tbody tr.click{cursor:pointer}
.asec tbody tr.click:hover{background:#1b2432}

/* pager */
.pager{display:flex;gap:6px;flex-wrap:wrap;justify-content:center;
  align-items:center;margin-top:16px}
.pager:empty{display:none}
button.pg{background:var(--card);border:1px solid var(--line);color:var(--dim);
  min-width:40px;height:40px;padding:0 12px;border-radius:8px;font-size:13.5px;
  cursor:pointer;font-family:inherit;font-variant-numeric:tabular-nums}
button.pg:hover:not(:disabled):not(.on){color:var(--text);border-color:var(--dim)}
button.pg.on{background:var(--cyan);border-color:var(--cyan);color:#06131a;font-weight:650}
button.pg:disabled{opacity:.35;cursor:default}
.pager .gap{color:var(--dim);padding:0 2px}

/* detail modal */
/* v64: 닫힌 창도 display:block 으로 두고 visibility·opacity 로 숨긴다 — 열 때·닫을 때 모두 0.2초 흐려지며(fade) 바뀌게 (아래 '움직임' 절).
   닫힌 창은 보이지 않고(visibility) 눌리지 않으며(pointer-events) 칸으로 옮겨 가지도 않는다 */
.mask{position:fixed;inset:0;background:rgba(0,0,0,.72);display:block;visibility:hidden;pointer-events:none;
  z-index:50;padding:24px 16px;overflow-y:auto}
.mask.on{visibility:visible;pointer-events:auto}
.modal{max-width:820px;margin:0 auto;background:var(--card);
  border:1px solid var(--line);border-radius:14px;overflow:hidden}
.mhead{padding:20px 24px;border-bottom:1px solid var(--line);
  display:flex;justify-content:space-between;align-items:flex-start;gap:16px}
.mhead h3{margin:0 0 5px;font-size:19px;color:var(--hi)}
.mhead .loc{font-size:13px;color:var(--dim)}
.x{background:none;border:none;color:var(--dim);font-size:24px;cursor:pointer;
  line-height:1;padding:0 4px}
.x:hover{color:var(--text)}
.mbody{padding:20px 24px 26px}
.sec{margin-bottom:22px}
.sec h4{font-size:15px;color:#40e0d0;margin:0 0 12px;font-weight:700;
  letter-spacing:.06em;text-transform:uppercase}
.grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:12px}
.f{background:var(--card2);border:1px solid var(--line);border-radius:8px;padding:9px 12px}
.f .k{font-size:11px;color:var(--dim);margin-bottom:2px}
.f .v{font-size:14px;color:var(--text)}
.f .v.na{color:var(--faint);font-style:italic;font-size:13px}
.ctr{background:var(--card2);border:1px solid var(--line);border-radius:9px;
  padding:13px 15px;margin-bottom:9px}
.ctr .top{display:flex;justify-content:space-between;align-items:center;
  margin-bottom:8px;flex-wrap:wrap;gap:8px}
.ctr .pname{font-size:15px;color:var(--hi);font-weight:600}
.ctr .det{display:flex;gap:16px;flex-wrap:wrap;font-size:12.5px;color:var(--dim)}
.ctr .det b{color:var(--text);font-weight:500}
.ownrow{margin:-2px 0 9px;font-size:12.5px}
.owner{color:var(--amber)}
.owner .dim{color:var(--dim)}
.owner a{color:var(--cyan);text-decoration:none}
.owner a:hover{text-decoration:underline}
.owner.none{color:var(--faint);font-style:italic}
.none{color:var(--dim);font-size:13.5px;padding:12px;text-align:center;
  background:var(--card2);border-radius:8px;border:1px dashed var(--line)}

/* sql peek */
.sqlpeek{margin-top:22px;border-top:1px solid var(--line);padding-top:14px}
.sqlpeek summary{cursor:pointer;font-size:12.5px;color:var(--dim);list-style:none}
.sqlpeek summary::-webkit-details-marker{display:none}
.sqlpeek summary::before{content:"▸ ";color:var(--cyan)}
.sqlpeek[open] summary::before{content:"▾ "}
.sqlpeek pre{background:var(--card2);border:1px solid var(--line);border-radius:8px;
  padding:12px 14px;margin:10px 0 0;overflow-x:auto}
.sqlpeek code{font-family:Consolas,monospace;font-size:12px;color:#b8c4d4;line-height:1.6}
.kw{color:#f08fae}.st{color:var(--ok)}.cm{color:#5c6b7a;font-style:italic}
.fnj{color:var(--violet)}
/* v65 (사용자 2026-10-01): 단지 조회의 '번역된 SQL 보기' 는 테스트 DB 에 붙었을 때만 (app.js markEnv → html[data-env=test] · body.env-test). 운영에서는 숨김 */
#sqlPeek{display:none}
:root[data-env="test"] #sqlPeek,body.env-test #sqlPeek{display:block}

.err{background:#221417;border:1px solid #4a2a2e;color:#ffb3ba;padding:14px 18px;
  border-radius:10px;margin-bottom:16px;font-size:13.5px}
.err b{color:var(--rose)}
@media(max-width:700px){
  .hide-m{display:none}
  th,td{padding:9px 10px;font-size:12.5px}
  h1{font-size:17px}
}

/* 계약 정보 수정 신청 폼 */
#crModal input:not([type=checkbox]):not([type=file]),#crModal select,#crModal textarea{
  width:100%;background:var(--card2);border:1px solid var(--line);color:var(--text);
  padding:9px 11px;border-radius:7px;font-size:13.5px;font-family:inherit;min-width:0}
#crModal input[type=file]{width:100%;background:var(--card2);border:1px dashed var(--line);
  color:var(--text);padding:12px;border-radius:8px;font-size:12.5px;font-family:inherit;cursor:pointer}
#crModal .flabel .hint{margin-left:6px}
.crlist{margin:0 0 8px}
.crlist .cr{font-size:12.5px;padding:5px 8px;border-radius:6px;background:var(--card2);margin-bottom:4px}
.crlist .cr .dim{color:var(--dim)}
.badge.no{color:var(--rose);border-color:#4a2a2e;background:#241216}

/* 변경이력 (상세 섹션 · 탭 공용) */
.hist{list-style:none;margin:0;padding:0}
.hist li{padding:7px 0;border-bottom:1px solid var(--row);font-size:13px;display:flex;gap:10px;align-items:baseline}
.hist li:last-child{border-bottom:none}
.hist .d{color:var(--dim);flex:none;width:118px;font-variant-numeric:tabular-nums;font-size:12.5px}
.hist .cx{flex:none;width:190px;color:var(--amber);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hist .m{flex:1;min-width:0;overflow-wrap:anywhere}
.hist .m .hp{color:var(--cyan);font-size:12px;margin-right:6px}
.hist .m .na,.hist .m .dim{color:var(--dim)}
/* v65: 처리자(바꾼 사람)는 단지명 바로 오른쪽(상세는 시각 오른쪽) · 폭 고정이라 줄마다 내용이 같은 자리에서 시작한다. 긴 이름은 … (말풍선에 전체) */
.hist .who{color:var(--dim);flex:none;width:72px;font-size:12px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hist li.hh{padding:2px 0 6px;font-size:11px;letter-spacing:.02em}
.hist li.hh span,.hist li.hh .cx{color:var(--faint);font-size:11px}
#viewHist .tblwrap{padding:6px 16px}
@media(max-width:700px){
  /* 좁은 화면: 시각·단지명·처리자 한 줄, 내용은 그 아래 줄 전체 (전에는 내용 칸이 몇 글자 폭으로 눌렸다) */
  .hist li{flex-wrap:wrap;row-gap:2px}
  .hist .m{flex:1 1 100%}
  .hist .who{width:60px}
}
/* v65: 변경이력 팝업 (단지 상세 '전체 보기' — history.js histPopOpen). 상세·옆 첨부 뷰어(같은 z-index 50) 위에 뜬다 */
#histPopMask{z-index:55}
#histPopModal{max-width:960px}
#histPopModal:focus{outline:none}
.hpf{margin-bottom:10px}
.hpdates{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.histpop{max-height:calc(100vh - 300px);min-height:120px;overflow:auto;padding-right:4px}
/* v65: 목록 '계약제품' 칸의 끝난 서비스(만료·해지) — 회색 글자 (search.js prodTag) */
.pgone{color:#7a828e}

/* 세금계산서 대장 */
.txt th.mo,.txt td.mo{width:24px;min-width:24px;text-align:center;padding:8px 2px;font-size:12px;color:var(--dim)}
.txt td.mo.on{color:var(--ok);font-weight:700;font-size:15px}
.txt td.memo{max-width:200px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--dim);font-size:12.5px}
.txt .cover{color:var(--amber);font-size:12px}
.txt tbody tr{cursor:pointer}
.txt tbody tr:hover td{background:#161c26}
.txt td a{color:var(--cyan);text-decoration:none}
.txt.small{font-size:12.5px}
.txt.small th,.txt.small td{padding:6px 9px}
#txModal input:not([type=checkbox]),#txModal select,#txModal textarea{
  width:100%;background:var(--card2);border:1px solid var(--line);color:var(--text);
  padding:9px 11px;border-radius:7px;font-size:13.5px;font-family:inherit;min-width:0}
#txModal input[readonly]{color:var(--amber);font-weight:600}
.cxpick{margin:6px 0 2px;font-size:13.5px;min-height:20px}
.cxlist{display:flex;flex-direction:column;gap:2px;max-height:180px;overflow:auto}
.cxlist .cxi{text-align:left;background:var(--card2);border:1px solid var(--line);color:var(--text);
  padding:7px 10px;border-radius:6px;font-size:13px;cursor:pointer;font-family:inherit}
.cxlist .cxi:hover{border-color:var(--cyan)}
.months{display:grid;grid-template-columns:repeat(12,1fr);gap:4px;margin-top:6px}
.months label{display:flex;flex-direction:column;align-items:center;gap:3px;font-size:11.5px;color:var(--dim);
  background:var(--card2);border:1px solid var(--line);border-radius:6px;padding:6px 0;cursor:pointer}
.months label:has(input:checked){border-color:var(--ok);color:var(--ok)}
.months input{accent-color:var(--ok)}
.dim{color:var(--dim)}

/* ── 2026-09-09 화면 수정 ── */
/* 날짜 칸: 어두운 테마에서 달력 아이콘이 안 보이던 문제. 누르면 달력이 뜬다 */
input[type=date],input[type=month]{color-scheme:var(--scheme,dark);cursor:pointer;min-width:150px;font-family:inherit;font-size:13px}   /* v42: 월 입력도 같은 모양 */
input[type=date]::-webkit-calendar-picker-indicator,input[type=month]::-webkit-calendar-picker-indicator{cursor:pointer;opacity:.9}
/* 파일 뷰어: 열리면 상세 팝업은 왼쪽, 뷰어는 오른쪽 전체 높이 */
/* 뷰어 폭 = 창 높이에 맞춘 A4 세로 이미지 폭(높이×0.75) + 안쪽 여백. 상세 팝업은 나머지를 쓴다 */
:root{--fvw:calc(((100vh - 120px) * 0.75 + 44px) * 1.2)}
/* 상세 팝업은 원래 폭(최대 820px) 그대로, 뷰어에 안 가리게 왼쪽으로만 옮긴다 */
/* 뷰어가 열리면 상세 팝업을 왼쪽으로 '밀어서' 뷰어 왼쪽에 붙인다 (transform 이라 움직임이 보인다) */
:root{--mw:min(820px, calc(100vw - 32px))}
/* v65: 상세 폭(--mdw)이 820 보다 좁아지는 화면(1280·1366·1536 노트북)에서 상세 왼쪽이 화면 밖으로 잘리던 것 고침 —
   옛 식은 폭을 늘 820(--mw)으로 보고 옮겨서 좁아진 만큼 왼쪽으로 더 밀렸다. 이제 상세 오른쪽 끝 = 뷰어 왼쪽 - 16px, 왼쪽 끝은 16px 안쪽 (1920 화면 모양은 그대로) */
body.viewing #mask .modal{--mdw:min(820px, calc(100vw - var(--fvw) - 48px));width:var(--mdw);
  transform:translateX(calc((100vw - 32px - var(--mdw)) / 2 - var(--fvw) - 16px))}
body.viewing #fvMask{background:transparent;pointer-events:none}
/* v65 (사용자 2026-10-01): 뷰어가 상세 옆에 뜰 때 왼쪽 상세가 흐려지지 않게 — 뷰어 창(#fvMask, 화면 전체)의 유리 흐림(theme-glass .mask blur)을 끈다.
   두 창을 다 또렷하게 본다. 700px 이하(뷰어가 화면 전체)와 가운데 뷰어(상세 없이)는 그대로 */
@media (min-width:701px){
  body.viewing #fvMask{-webkit-backdrop-filter:none;backdrop-filter:none}
}
body.viewing .fv{pointer-events:auto;position:fixed;right:16px;top:16px;width:var(--fvw);height:calc(100vh - 32px);max-width:none;margin:0}
.fvbody{display:block;overflow:auto;padding:12px 14px}
.fvbody .pgwrap{margin:0 auto 18px;max-width:100%}
.fvbody .pgcap{font-size:12px;color:var(--dim);margin:0 0 6px;font-variant-numeric:tabular-nums}
/* 이미지는 창 높이에 맞춘다 (뷰어 높이 - 머리줄·캡션). 가로가 넘치면 가운데 정렬 */
.fvbody{--fvz:1}
.fvbody img.pg{display:block;width:auto;max-width:none;height:calc((100vh - 120px) * var(--fvz));margin:0 auto;object-fit:contain;background:#fff;border-radius:6px}
.fvhead .zoom{display:inline-flex;gap:4px;align-items:center;margin-right:6px}
.fvhead .zoom span{min-width:42px;text-align:center;font-variant-numeric:tabular-nums;font-size:12px}
.fvbody iframe.pg{display:block;width:100%;height:calc(100vh - 120px);border:0;background:#fff;border-radius:6px}
/* 변경이력: 10줄쯤 보이고 스크롤 */
.histbox{max-height:360px;overflow:auto;padding-right:4px}
/* 상태: 만료 (마지막 년-월) 빨강 */
.badge.exp{color:var(--rose);border-color:#4a2a2e;background:#241216;font-variant-numeric:tabular-nums}
/* 계약 카드 요약 줄 */
.ctr .csum{font-size:13px;margin:4px 0 8px;color:var(--text)}
.ctr .csum b{font-weight:600}
.ctr .csum .fee{color:var(--amber)}
/* 대시보드 만료 임박 본부 묶음 */
tr.grp td{background:#1a212c;color:var(--cyan);font-weight:600;font-size:12.5px}

/* ── 움직임 (전부 0.3초 이하). 팝업·뷰어는 살짝 미끄러지며 나타나고, 표와 탭은 부드럽게 떠오른다 ── */
@keyframes fadein{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
@keyframes rowin{from{opacity:0}to{opacity:1}}
/* v64 (사용자 2026-09-30 "모든 팝업창은 fade in, fade out"): 모든 창(.mask)이 0.2초에 나타나고 0.2초에 사라진다.
   닫을 때 visibility 는 0.2초 뒤에 바뀌어(흐려지는 동안은 보임) 그다음부터 안 보이고 안 눌린다 — 옛 display 전환(allow-discrete)은 브라우저마다 달라 뺐다 */
.mask{opacity:0;transition:opacity .2s ease-out, visibility 0s linear .2s}
.mask.on{opacity:1;transition:opacity .2s ease-out, visibility 0s linear 0s}
.mask .modal,.mask .fv{transform:translateY(14px);transition:transform .2s cubic-bezier(.2,.7,.2,1), width .28s ease}
.mask.on .modal,.mask.on .fv{transform:none}
/* 작은 펼침 목록(알림 종·프로필 메뉴)도 0.2초에 나타나고(popin), 닫을 때는 popHide(app.js)가 popout 을 붙였다 0.2초 뒤 숨긴다 */
@keyframes popin{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
@keyframes popout{from{opacity:1}to{opacity:0;transform:translateY(-4px)}}
.bellpanel,.umenu{animation:popin .2s ease-out}
.bellpanel.popout,.umenu.popout{animation:popout .2s ease-in forwards;pointer-events:none}
#modal{transition:transform .3s cubic-bezier(.2,.7,.2,1), width .3s ease}
#viewSearch,#viewDash,#viewUpsell,#viewTax,#viewHist,#viewAdmin{animation:fadein .22s ease-out}
.tblwrap table tbody tr{animation:rowin .25s ease-out}
.tiles .tile,.bar{animation:fadein .3s ease-out}
.pager button,.tab,.go,.mini,.ghost{transition:background .15s, color .15s, border-color .15s, transform .12s}
.tab:active,.go:active,.mini:active{transform:scale(.97)}
@media (prefers-reduced-motion: reduce){
  .mask,.mask.on,.mask .modal,.mask .fv,#modal{transition:none}
  .bellpanel,.umenu,.bellpanel.popout,.umenu.popout{animation:none}
  #viewSearch,#viewDash,#viewUpsell,#viewTax,#viewHist,#viewAdmin,.tblwrap table tbody tr,.tiles .tile,.bar{animation:none}
}

/* ═══ v18 — 계정 설정 (account.js) ═══ */
.uwrap{position:relative;display:inline-block}
.uchip{display:flex;align-items:center;gap:8px;background:var(--card2);border:1px solid var(--line);border-radius:999px;
  padding:3px 10px 3px 3px;cursor:pointer;color:var(--text);font-family:inherit}
.uchip:hover{border-color:var(--cyan)}
.avatar{width:30px;height:30px;border-radius:50%;background:var(--cyan);color:#0d1117;font-weight:700;display:inline-flex;
  align-items:center;justify-content:center;font-size:13px;overflow:hidden;flex:none}
.avatar img{width:100%;height:100%;object-fit:cover;display:block}
.avatar.md{width:40px;height:40px;font-size:16px}
.avatar.big{width:84px;height:84px;font-size:30px}
.avbig{cursor:pointer;display:inline-block;position:relative}
.avbig:hover .avatar{box-shadow:0 0 0 3px var(--cyan)}
.uname{display:flex;flex-direction:column;line-height:1.15;text-align:left;font-size:12px}
.uname b{color:var(--text);font-size:12.5px;font-weight:600}
.uname span{color:var(--dim);font-size:11px}
.caret{color:var(--dim);font-size:11px;margin-left:2px}
.umenu{position:absolute;right:0;top:calc(100% + 8px);width:250px;background:var(--card);border:1px solid var(--line);border-radius:12px;
  padding:8px;z-index:60;box-shadow:0 12px 30px rgba(0,0,0,.45);text-align:left}
.umenu .uhead{display:flex;gap:10px;align-items:center;padding:8px;border-bottom:1px solid var(--line);margin-bottom:6px;font-size:13px}
.umenu .uhead b{color:var(--hi)}
.uitem{padding:9px 10px;border-radius:8px;cursor:pointer;font-size:13.5px;display:flex;gap:10px;align-items:center;color:var(--text)}
.uitem span{width:18px;text-align:center;color:var(--dim)}
.uitem:hover{background:var(--card2)}
.setbtn{display:flex;gap:14px;align-items:center;width:100%;text-align:left;background:var(--card2);border:1px solid var(--line);
  border-radius:10px;padding:14px 16px;color:var(--text);cursor:pointer;margin-bottom:10px;font-size:14px;font-family:inherit;line-height:1.4}
.setbtn:hover{border-color:var(--cyan)}
.pf{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:10px}
.pf .f input,.pf .f select{width:100%;background:var(--card);border:1px solid var(--line);color:var(--text);padding:7px 9px;border-radius:6px;font-size:13px;font-family:inherit}
.pf .f input:focus,.pf .f select:focus{outline:none;border-color:var(--cyan)}
.mylog table{width:100%;border-collapse:collapse;font-size:12.5px}
.mylog th,.mylog td{padding:6px 8px;border-bottom:1px solid var(--line);text-align:left;vertical-align:top}
.mylog th{color:var(--dim);font-weight:600;font-size:11.5px;white-space:nowrap}
.mylog a{color:var(--cyan);text-decoration:none}
.res-ok{color:var(--ok);font-weight:600}.res-no{color:var(--rose);font-weight:600}.res-wait{color:var(--amber);font-weight:600}
.mfilter{display:flex;gap:10px;flex-wrap:wrap;align-items:end;margin-bottom:12px}
.mfilter label{font-size:11.5px;color:var(--dim);display:block;margin-bottom:3px}
.mfilter input,.mfilter select{background:var(--card2);border:1px solid var(--line);color:var(--text);padding:6px 8px;border-radius:6px;font-size:13px;font-family:inherit;color-scheme:var(--scheme,dark)}
.ucat{display:inline-block;font-size:11px;padding:1px 7px;border-radius:12px;border:1px solid var(--line);color:var(--dim);white-space:nowrap}
.asub{font-size:13px;color:var(--dim);margin:14px 0 6px;font-weight:600}
/* 목록 상태(고객·만료·비고객)와 계약제품의 재계약 지수·남은 일수 색 */
.badge.non{color:#7b8592;border-color:#2a3140;background:transparent}
sup.rn{font-size:9.5px;color:var(--amber);margin-left:1px;font-weight:700;line-height:0}
.dd-g{color:var(--ok)}
.dd-x{color:#6b7480}

/* v19: 테스트 DB 표시 띠 (app.js markEnv) */
#envBar{position:sticky;top:0;z-index:2000;background:#c0392b;color:#fff;text-align:center;font-size:12px;font-weight:600;letter-spacing:.02em;padding:4px 8px}

/* v24: 폼 칸 아래 빨간 안내(비밀번호 변경), 본부 탭(사용자 관리) */
.fmsg{min-height:16px;font-size:12px;color:var(--red,#e5534b);margin:3px 0 8px}
.fmsg.ok{color:var(--ok,#3fb950)}
.dtabs{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 10px}
.dtabs .dt{padding:5px 11px;border-radius:999px;border:1px solid var(--line,#2a3140);background:transparent;color:var(--dim);font-size:12.5px;cursor:pointer}
.dtabs .dt.on{background:var(--accent,#3b82f6);color:#fff;border-color:transparent}
.dtabs .dt .n{opacity:.75;margin-left:4px;font-size:11px}

/* ═══ v50: 관리자 — 끌어서 순서 바꾸기 · 본부 변경 저장 · 되돌리기 (admin.js) ═══ */
/* 손잡이: 점 6개 버튼. touch-action:none 이라야 터치로 끌 때 화면이 대신 스크롤되지 않는다 */
.asec th.dragc,.asec td.dragc{width:34px;padding-left:4px;padding-right:0}
button.dragh{display:inline-flex;align-items:center;justify-content:center;width:26px;height:30px;padding:0;
  background:transparent;border:1px solid transparent;border-radius:6px;color:var(--dim);cursor:grab;touch-action:none;opacity:.75}
button.dragh:hover{opacity:1;color:var(--text);border-color:var(--line);background:var(--card2)}
button.dragh:focus-visible{outline:2px solid var(--cyan);outline-offset:1px;opacity:1}
button.dragh:active{cursor:grabbing}
body.ds-dragging,body.ds-dragging *{user-select:none;-webkit-user-select:none;cursor:grabbing !important}
/* 끄는 동안 다른 행은 부드럽게 비켜 서고, 끌린 행은 포인터를 바로 따라온다(transition 없음). 놓으면 ds-settle 로 미끄러져 안착 */
tbody.ds-on>tr{transition:transform .18s ease}
tbody.ds-on>tr.ds-drag{transition:none;position:relative;z-index:3;box-shadow:0 10px 26px rgba(0,0,0,.45),0 0 0 1px var(--cyan)}
tbody.ds-on>tr.ds-drag>td{background:var(--card)}
tbody.ds-on>tr.ds-drag.ds-settle{transition:transform .18s ease}
/* 저장 안 한 칸 (본부 관리 초안) — 노란 테두리 */
.asec input.dirty,.asec select.dirty{border-color:var(--amber) !important;box-shadow:0 0 0 1px var(--amber)}
.asec button.mini.dirty{box-shadow:0 0 0 1.5px var(--amber)}
.asec td.dragc.dirty{box-shadow:inset 3px 0 0 var(--amber)}
.asec tr.newdiv>td{background:color-mix(in srgb,var(--amber) 8%,transparent)}
.divsave{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:12px;padding-top:12px;border-top:1px solid var(--line)}
.divsave #divN{margin-right:auto;font-size:13px}
.divsave .dirtyn{color:var(--amber);font-weight:600}
.divsave button:disabled{opacity:.45;cursor:default}
.okflash{margin:10px 0;padding:9px 14px;border-left:3px solid var(--ok);border-radius:0 8px 8px 0;font-size:13px;color:var(--ok);
  background:color-mix(in srgb,var(--ok) 10%,transparent)}
/* 사용자 관리 '계약' 수 — 누르면 담당 현황. 0 은 흐리게(퇴사자 이력 보기용으로 누를 수는 있다) */
.asec th.n{text-align:right}
a.ucnt{color:var(--cyan);font-weight:600;font-variant-numeric:tabular-nums;text-decoration:none;border-bottom:1px dotted currentColor}
a.ucnt.zero{color:var(--dim);opacity:.6;font-weight:400}
a.ucnt:hover{opacity:1;color:var(--text)}
/* 관리 작업 이력: 되돌리기 칸 */
.actwrap{overflow-x:auto}
.acttbl td.rvcell{white-space:nowrap}
.acttbl tr.reverted td{opacity:.7}
.acttbl tr.reverted td.rvcell{opacity:1}
@media (prefers-reduced-motion: reduce){
  tbody.ds-on>tr,tbody.ds-on>tr.ds-drag.ds-settle{transition:none}
}


/* ═══ v50: 담당 현황 (owner.js) ═══ */
.owfmsg{align-self:flex-end;color:var(--rose);font-size:12px;min-height:18px;padding-bottom:8px}   /* 이름으로 찾기 안내 */
.owmsg{margin:0 0 12px;padding:9px 14px;border:1px solid var(--line);border-left:3px solid var(--amber);border-radius:10px;background:var(--card);color:var(--amber);font-size:13px}
.owhead{margin:14px 0 12px;display:flex;flex-direction:column;gap:8px}
.owhead .who{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap}
.owhead .nm{font-size:22px;font-weight:700;color:var(--text);letter-spacing:-.01em}
.owhead .meta{color:var(--dim);font-size:13.5px}
/* 이전 요약 — 퇴사자 조회의 핵심이라 노란 띠로 */
.owmoved{font-size:13.5px;padding:9px 14px;background:var(--card);border:1px solid var(--line);border-left:3px solid var(--amber);border-radius:10px;display:flex;flex-wrap:wrap;gap:4px 8px;align-items:baseline}
.owmoved .k{color:var(--amber);font-weight:600}.owmoved b{color:var(--text)}.owmoved .sep{color:var(--dim)}
.owmoved a,.owto a{color:inherit;text-decoration:none;border-bottom:1px dotted currentColor}
/* 추이 그래프 두 개 나란히 (700px 이하는 위아래) */
.owtr-h{display:flex;align-items:center;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-bottom:12px}
.owtr-h h3{margin:0}
.owcharts{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.owcharts>.none,.owcharts>.err,.owcharts>.loading{grid-column:1/-1}
.owchart{position:relative;min-width:0;background:var(--card2);border:1px solid var(--line);border-radius:10px;padding:10px 10px 4px}
.owch{display:flex;justify-content:space-between;align-items:baseline;gap:8px;flex-wrap:wrap;font-size:13px;margin:0 4px 2px}
.owch .dim{font-size:12px}
.owchart svg{display:block;width:100%;height:auto;touch-action:pan-y;cursor:crosshair;user-select:none}
.owtip{display:none;position:absolute;z-index:5;pointer-events:none;max-width:100%;box-sizing:border-box;overflow:hidden;background:var(--card);color:var(--text);   /* 위치(left)는 owner.js owHover 가 그래프 칸 안으로 가둬 정한다 */
  border:1px solid var(--line);border-radius:8px;padding:7px 10px;font-size:12px;line-height:1.5;box-shadow:0 6px 20px rgba(0,0,0,.35);
  -webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}
.owtip b{display:block;margin-bottom:2px;white-space:nowrap}.owtip div{white-space:nowrap;font-variant-numeric:tabular-nums}
.owtip i{display:inline-block;width:8px;height:8px;border-radius:2px;margin-right:6px}
.owfoot{margin:10px 2px 0;font-size:11.5px;color:var(--dim);line-height:1.6}
#ownerRoot .bar .f.z{visibility:hidden}   /* MRR 없는 서비스는 막대 없이 건수만 */
/* 필터 칩 + 목록 표 */
.owlisth{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:18px 0 10px}
.owchips button .n{opacity:.8;font-size:12px;margin-left:2px;font-variant-numeric:tabular-nums}
.owtbl{overflow-x:auto}
table.ow{min-width:900px}
table.ow th .u{font-weight:400;color:var(--dim);font-size:11px}
table.ow tbody tr{cursor:default}table.ow tbody tr:hover{background:transparent}
table.ow td{padding:8px 11px}
table.ow td.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
table.ow td.nw{white-space:nowrap}
table.ow td.nm{font-weight:600;white-space:nowrap}
table.ow td.nm a{color:inherit;text-decoration:none;border-bottom:1px dotted var(--dim)}table.ow td.nm a:hover{color:var(--cyan)}
table.ow tr.owfirst td{border-top:1px solid var(--line)}
.owto{color:var(--amber);font-weight:600;white-space:nowrap}
.owk{font-size:10.5px;color:var(--violet);border:1px solid var(--line);border-radius:10px;padding:0 6px;margin-left:4px;white-space:nowrap}
.badge.owin{color:var(--cyan);border-color:var(--line);background:transparent}
.lglink{color:inherit;text-decoration:none;border-bottom:1px dotted var(--dim)}.lglink:hover{color:var(--cyan)}   /* 대시보드 영업자별 리그 이름 → 담당 현황 */
@media (max-width:700px){
  .owcharts{grid-template-columns:1fr}
  .owhead .nm{font-size:19px}
}
/* v50: 큰 금액(58,385.9만원 등)에서 단위가 다음 줄로 떨어지지 않게 — 숫자와 단위를 한 줄로, 좁으면 글자를 줄인다 */
.owtiles .tile .v{white-space:nowrap;font-size:clamp(17px,1.7vw,24px)}

/* ═══ v51: 담당자 이전 (단지 상세 · 신청 · 승인) ═══ */
/* 단지 상세 머리: 이름 오른쪽에 [담당자 이전] + × 를 한 줄로 · 머리 아래 대기 신청 알림 줄 */
.mhbtns{display:flex;align-items:center;gap:10px;flex-shrink:0}
.trnote{padding:9px 24px;border-bottom:1px solid var(--line);font-size:13px;color:var(--text);
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;background:var(--card2)}
/* 이전 창(#trModal): 항목 체크 목록 · 다른 담당자 항목 안내 · 신청 때 받는 사람(나) 고정 표시 */
.tritems{display:flex;flex-direction:column;gap:6px;border:1px solid var(--line);border-radius:8px;padding:10px 12px;background:var(--card2)}
.tritem{align-items:flex-start;color:var(--text);line-height:1.5}
.tritem input{margin-top:3px}
.trother{margin-top:8px;font-size:12.5px;color:var(--dim);opacity:.85}
.trother a{color:var(--cyan)}
.trme{background:var(--card2);border:1px solid var(--line);border-radius:7px;padding:9px 11px;font-size:13.5px}
#trModal select,#trModal textarea{width:100%;background:var(--card2);border:1px solid var(--line);color:var(--text);
  padding:9px 11px;border-radius:7px;font-size:13.5px;font-family:inherit;min-width:0}
#trModal textarea{resize:vertical}
#trModal :focus{outline:none;border-color:var(--cyan)}
#trModal .flabel .hint{margin-left:6px}
@media (max-width:700px){ .mhbtns{gap:6px} .trnote{padding:9px 16px}
  #trModal select,#trModal textarea{font-size:16px} /* 16px 미만이면 iOS 가 누를 때 확대한다 — 위 #trModal 규칙이 theme-glass 의 모바일 16px 를 이기므로 여기서 다시 */ }
/* 승인 화면(관리자 탭 #secTransferReq — v93: 없앰 · 이전 신청은 결재 탭 승인 대기함 줄 table.apq tr.trqx) · My page '내 담당자 이전 신청' */
table.trq{min-width:880px}
table.trq td{vertical-align:top}
table.trq td.nw{white-space:nowrap}
table.trq tr.trqdone td{opacity:.72}   /* 처리 끝난 신청은 흐리게 — 대기 건이 먼저 눈에 들어오게 */
.trqit{font-size:12px;line-height:1.55;margin-top:2px;white-space:nowrap}
/* v67 (W5): 담당자 이전 신청 — My page 에서 연 창의 머리 글 · 관리자 처리 칸(승인·반려·답변하고 닫기) · 휴대폰 카드 */
.trlead{background:var(--card2);border:1px solid var(--line);border-left:3px solid var(--amber);border-radius:8px;
  padding:10px 12px;margin:0 0 10px;font-size:13px;line-height:1.55;color:var(--text)}
.trqwarn{color:var(--amber);font-size:11.5px;margin-left:6px;white-space:normal}
#naOwnerMsg a{color:var(--cyan)}   /* My page 안내 칸의 [신청 현황에서 보기]·[단지 상세 열기] */
table.trq tr.trqx td{background:var(--card2);border-top:0}
.trqxbox{display:flex;flex-direction:column;gap:8px;max-width:640px;padding:4px 0}
.trqxbox .tritems{background:var(--card)}
.trqxbox input[type=text]{width:100%;box-sizing:border-box}
.trqxbtns{display:flex;gap:6px;flex-wrap:wrap}
.trqxseg{align-self:flex-start;flex-wrap:wrap}
.trqxseg button{padding:6px 12px}
@media (max-width:700px){
  table.trq{min-width:0}
  table.trq,table.trq tbody,table.trq tr,table.trq td{display:block;width:100%;box-sizing:border-box}
  table.trq thead{display:none}
  table.trq tr{background:var(--card);border:1px solid var(--line);border-radius:12px;margin-bottom:10px;padding:10px 14px}
  table.trq tr.trqx{margin-top:-10px;border-top:0;border-radius:0 0 12px 12px;background:var(--card2)}   /* 처리 칸 = 바로 위 카드에 붙은 블록 */
  table.trq td{border:0;padding:4px 0;white-space:normal;max-width:none!important;min-width:0!important}
  table.trq td.nw,.trqit{white-space:normal}
  table.trq td[data-l]::before{content:attr(data-l);display:block;font-size:11px;color:var(--dim);margin-bottom:1px}
  table.trq tr.trqdone td{opacity:.8}
}

/* ═══ v52: 신청 현황 (requests.js) ═══ */
.rqchips button .n{opacity:.8;font-size:12px;margin-left:2px;font-variant-numeric:tabular-nums}
.rqtbl{overflow-x:auto}
table.rq{min-width:1040px}
table.rq tbody tr{cursor:default}table.rq tbody tr:hover{background:transparent}
table.rq td{padding:10px 11px;vertical-align:top;font-size:13px;line-height:1.5}
table.rq td.nw{white-space:nowrap}
table.rq td.rqdet{min-width:220px;max-width:320px}
table.rq td.rqt{min-width:150px;max-width:220px}
table.rq td.rqh{min-width:190px;max-width:280px}
table.rq td.rqb{text-align:right}
table.rq tr.rq-wd td{opacity:.7}   /* 철회한 신청은 흐리게 */
.rqcx{color:inherit;font-weight:600;text-decoration:none;border-bottom:1px dotted var(--dim)}.rqcx:hover{color:var(--cyan)}
.rqsm{font-size:11.5px}
.rqkind{color:var(--violet)}
.rqst{margin-top:4px}
.rqwhy{margin-top:4px;font-size:12px;color:var(--text);opacity:.85}
.rqwho{font-size:12.5px}
.rqrep{margin-top:4px;font-size:12.5px}.rqrep.no{color:var(--rose)}
/* 진행 단계 ① 신청 → ② 검토 중 → ③ 결과. 대기는 호박색 강조(깜박이지 않음) */
.rqsteps{display:inline-flex;align-items:center;gap:4px;font-size:11.5px;white-space:nowrap}
.rqsteps .st{display:inline-flex;align-items:center;gap:4px;color:var(--dim)}
.rqsteps .st i{display:inline-block;width:9px;height:9px;border-radius:50%;border:1.5px solid var(--dim);box-sizing:border-box}
.rqsteps .ln{display:inline-block;width:14px;height:2px;background:var(--line);border-radius:1px}
.rqsteps .st.done i,.rqsteps .ln.done{background:var(--cyan);border-color:var(--cyan)}
.rqsteps .st.cur{color:var(--amber);font-weight:600}
.rqsteps .st.cur i{background:var(--amber);border-color:var(--amber);box-shadow:0 0 0 3px rgba(224,164,88,.25)}
.rqsteps .st.skip i{border-style:dashed;opacity:.6}
.rqsteps .st.ok{color:var(--ok);font-weight:600}.rqsteps .st.ok i,.rqsteps .ln.ok{background:var(--ok);border-color:var(--ok)}
.rqsteps .st.no{color:var(--rose);font-weight:600}.rqsteps .st.no i,.rqsteps .ln.no{background:var(--rose);border-color:var(--rose)}
.rqsteps .st.wd{color:#9aa3b0;font-weight:600}.rqsteps .st.wd i{background:#7b8592;border-color:#7b8592}
.rqlink{font-size:12px;font-weight:400;margin-left:10px;color:var(--dim)}.rqlink a{color:var(--cyan)}   /* My page 표 제목 옆 '모든 신청은 신청 현황 탭' */
/* 좁은 화면: 한 줄 = 카드 한 장 (표 가로 스크롤보다 읽기 쉽게). #reqRoot 로 theme-glass 의 .tblwrap 모바일 규칙을 이긴다 */
@media (max-width:700px){
  #reqRoot .tblwrap.rqtbl{background:transparent;border:0;box-shadow:none;overflow:visible;-webkit-backdrop-filter:none;backdrop-filter:none}
  table.rq,table.rq tbody,table.rq tr,table.rq td{display:block;width:100%;min-width:0;max-width:none}
  table.rq td.rqdet,table.rq td.rqt,table.rq td.rqh{min-width:0;max-width:none}   /* 위의 칸별 폭 제한(클래스 포함이라 더 셈)도 풀어 카드 폭을 다 쓴다 */
  table.rq thead{display:none}
  table.rq tr,table.rq tbody tr:hover{background:var(--card);border:1px solid var(--line);border-radius:12px;margin-bottom:10px;padding:10px 14px}   /* :hover 까지 — 터치로 누른 카드의 배경이 투명해지지 않게 */
  table.rq td{border:0;padding:4px 0;white-space:normal}
  table.rq td.nw{white-space:normal}
  table.rq td[data-l]::before{content:attr(data-l);display:block;font-size:11px;color:var(--dim);margin-bottom:1px}
  table.rq td.rqd,table.rq td.rqk{display:inline-block;width:auto;margin-right:8px}
  table.rq td.rqd::before,table.rq td.rqk::before{display:none}
  table.rq td.rqd{font-size:12px;color:var(--dim)}
  table.rq td.rqk .rqst{display:inline-block;margin:0 0 0 4px}
  table.rq td.rqb:empty{display:none}
  table.rq td.rqb button{width:100%;padding:9px;font-size:14px}
  .rqsteps{flex-wrap:wrap}
  .rqpre{display:none}   /* 카드에는 칸 이름 '처리' 가 이미 위에 있다 */
  .seg.rqchips{display:flex;flex-wrap:wrap;width:100%}
  .seg.rqchips button{flex:1 0 auto;white-space:nowrap;padding:8px 10px}
}

/* v53: 대시보드 12개월 추세 — 담당 현황 그래프 모양(.owtr-h · .owcharts · .owchart · .owch · .owtip · .owfoot)을 그대로 쓰고,
   범례와 증감 색만 더한다. (.owcharts 는 700px 이하 한 칸, theme-glass.css 의 .owtip 배경도 그대로 적용) */
.dtrend .owtr-h h3 .cnt{vertical-align:2px}
.dtleg{display:inline-flex;gap:12px;font-size:12px;color:var(--dim)}
.dtleg i{display:inline-block;width:8px;height:8px;border-radius:2px;margin-right:5px;vertical-align:middle}
.dtrend .owch .up{color:var(--ok)}.dtrend .owch .down{color:var(--rose)}
@media (max-width:700px){ .dtleg{display:none} }   /* 휴대폰은 말풍선·그래프 제목 색으로 충분 */

/* ═══ v53: 대시보드 지역 지도 (dashboard.js drawRegion) ═══ */
.rtop{display:flex;align-items:center;gap:8px 12px;flex-wrap:wrap;margin:0 0 14px}
.rbox{display:flex;flex-wrap:wrap;gap:16px 24px;align-items:flex-start}
.rmapwrap{flex:0 0 auto}
.rmap{display:grid;grid-template-columns:repeat(4,56px);grid-template-rows:repeat(7,50px);gap:5px}
.rt{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;margin:0;padding:2px;
  border:1px solid var(--line);border-radius:8px;background:transparent;color:#0d1117;font:inherit;line-height:1.2;
  cursor:pointer;font-variant-numeric:tabular-nums}
.rt>b{font-size:13px;font-weight:650}
.rt>.v{font-size:11.5px;white-space:nowrap}
/* 0 = 값 없음(점선·투명) · 1~5 = --map1~5. 2026-09-25 두 테마에서 단계마다 색 차 ΔE≈8~10, 가장 옅은 칸도 바탕 대비 2:1 이상, 글자 대비 4.5:1 이상 확인 */
.rt.l0{border-style:dashed;color:var(--dim)}
.rt.l1{background:var(--map1);color:#fff}
.rt.l2{background:var(--map2)}.rt.l3{background:var(--map3)}.rt.l4{background:var(--map4)}.rt.l5{background:var(--map5)}
.rt:hover{border-color:var(--text)}
.rt.on{border-color:var(--text);box-shadow:0 0 0 2px var(--text)}                  /* 고른 시도 */
.rt:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}
/* 말풍선 — 마우스가 있는 기기에서 올렸을 때, 또는 Tab 으로 왔을 때만. 터치는 누르면 오른쪽 목록이 같은 내용을 보여 준다 */
.rt .rtt{display:none;position:absolute;z-index:6;left:0;top:calc(100% + 6px);width:max-content;max-width:240px;text-align:left;
  background:var(--card);color:var(--text);border:1px solid var(--line);border-radius:8px;padding:7px 10px;
  font-size:12px;font-weight:400;line-height:1.55;white-space:normal;box-shadow:0 6px 20px rgba(0,0,0,.35);pointer-events:none}
.rt .rtt b{display:block;font-size:12.5px;margin-bottom:2px}
.rt.r .rtt{left:auto;right:0}                  /* 오른쪽 칸: 말풍선을 오른쪽에 맞춤 */
.rt.u .rtt{top:auto;bottom:calc(100% + 6px)}   /* 아래쪽 칸: 말풍선을 위로 */
@media (hover:hover){.rt:hover .rtt{display:block}}
.rt:focus-visible .rtt{display:block}
/* 범례 */
.rleg{display:flex;flex-wrap:wrap;gap:4px 10px;margin-top:10px;max-width:239px;font-size:11px;color:var(--dim);font-variant-numeric:tabular-nums}
.rleg span{display:inline-flex;align-items:center;gap:4px}
.rleg i.rt{display:inline-block;width:14px;height:14px;padding:0;border-radius:3px;cursor:default}
/* 오른쪽 목록 (시도 순위 / 시군구) — dashboard.js 의 bar() 를 그대로 쓴다 */
.rside{flex:1 1 250px;min-width:0}
.rsh{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 6px;font-size:12.5px;color:var(--dim)}
.rsh .rnm{color:var(--text);font-size:14px}
.rsum{margin:0 0 10px;font-size:12.5px;line-height:1.6}
.rrisk{color:var(--amber)}
.rrow{cursor:pointer;border-radius:6px}
.rrow:hover{background:rgba(255,255,255,.06)}
.rside .bar .l{width:72px}
.rside .bar .n{width:auto;min-width:90px}
@media (max-width:700px){
  .rmapwrap{width:100%}
  .rmap{grid-template-columns:repeat(4,1fr);grid-template-rows:repeat(7,52px)}   /* 폰: 칸이 화면 폭을 채운다 (칸 약 76px — 손가락으로 누르기 충분) */
  .rt>b{font-size:14px}
  .rleg{max-width:none}
}

/* ═══ v54: 계약서 양식 탭 (forms.js). A4 문서 자체의 모양은 tpl.css (테마와 무관한 흰 종이) ═══ */
body.fmwide .wrap{max-width:1680px}                         /* 편집·검토 화면은 왼쪽 편집 + 오른쪽 A4 라서 넓게 */
.fmhead{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;flex-wrap:wrap;margin:0 0 12px}
.fmhbtn{display:flex;gap:8px;flex-wrap:wrap}
.fmseal{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 14px;font-size:12.5px}
.fmseal-k{color:var(--dim)}
.fmseal img{width:44px;height:44px;object-fit:contain;background:#fff;border-radius:6px;padding:2px}
.fmcards{display:grid;grid-template-columns:repeat(auto-fill,minmax(330px,1fr));gap:14px}   /* 양식 카드 목록 (편집기의 table.fmgrid 와 이름을 나눔 — 겹치면 표가 grid 가 됐다) */
.fmcard{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:14px 16px;display:flex;flex-direction:column;gap:5px}
.fmcard.off{opacity:.55}
.fmc-top{display:flex;align-items:center;gap:8px;font-size:15px}
.fmcode{font:600 12px/1 Consolas,monospace;color:var(--cyan);border:1px solid var(--line);border-radius:6px;padding:3px 6px}
.fmnew{font-size:10px;font-weight:700;color:var(--ok);border:1px solid var(--ok);border-radius:4px;padding:0 5px}
.fmc-sub{font-size:12px;color:var(--dim)}
.fmc-l{font-size:13px}
.fmc-note{font-size:12px;color:var(--amber);margin-top:2px}
.fmc-btns{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.fmcrumb{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 12px}
.fmct{font-size:15px;font-weight:650}
.fmcrumb .seg{margin-left:auto}
.fmc-wip{color:var(--amber);font-size:12.5px}                     /* v76: 목록 카드 '내 임시저장 MM-DD HH:MM (반영 안 됨)' */
.fmc-wiperr{grid-column:1/-1}
.amber{color:var(--amber)} .rose{color:var(--rose)} .ok{color:var(--ok)} .mono{font-family:Consolas,monospace} .nw{white-space:nowrap}
/* 업데이트 내역 — 판마다 카드, 최신 판부터 */
.fmver{background:var(--card);border:1px solid var(--line);border-left:4px solid var(--line);border-radius:12px;padding:14px 18px;margin:0 0 14px}
.fmver.st-현재{border-left-color:var(--ok)} .fmver.st-예정{border-left-color:var(--amber)} .fmver.st-폐지{opacity:.6}
.fmv-h{display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.fmvno{font-weight:700;font-size:18px;line-height:1;color:var(--text);background:var(--card2);border:1px solid var(--line);border-radius:8px;padding:5px 9px}
.fmv-eff{font-size:13px}
.fmv-who{font-size:12px;color:var(--dim);margin-left:auto}
.fmv-sum{margin:10px 0 6px;padding-left:20px;line-height:1.6}
.fmv-note{font-size:12.5px;color:var(--dim);margin:4px 0}
.fmv-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:12px;color:var(--dim);margin-top:6px}
.fmdiff{margin-top:8px}
.fmdiff summary{cursor:pointer;color:var(--cyan);font-size:12.5px}
.fmd-g{margin:10px 0 3px;font-weight:700;font-size:12.5px}
.fmd-r{margin:3px 0 3px 8px;line-height:1.6;font-size:13px;word-break:break-all}
.fmop{display:inline-block;min-width:36px;text-align:center;font-size:11px;border-radius:4px;padding:0 6px;margin-right:6px;color:#fff;background:#6e7681}
.fmop.op-추가{background:#2da44e} .fmop.op-삭제{background:#cf222e} .fmop.op-변경{background:#bf8700} .fmop.op-칸{background:#8250df} .fmop.op-쪽{background:#57606a}
.fmd-ref{color:var(--dim);font-size:12px;margin-right:4px} .fmd-was{color:var(--dim);font-size:11px}
.fmd-r del,.fmpanel del{background:rgba(207,34,46,.22);color:var(--rose);text-decoration:line-through}
.fmd-r ins,.fmpanel ins{background:rgba(45,164,78,.22);color:var(--ok);text-decoration:none}
/* 미리보기 상자 (A4 를 칸 폭에 맞춰 줄임 — forms.js fmFit) */
.fmprevbox{background:#d9dce1;border-radius:10px;padding:12px 4px;overflow:hidden;min-height:200px}
/* v75: 편집기 미리보기는 화면 밖 상자에 다 그린 뒤 바꿔 끼운다 (forms.js fmEdPreview — 그리는 동안 미리보기가 비어 맨 위로 튀던 것). 보이는 상자여야 쪽 높이를 잰다 → visibility 만 숨김 */
.fmpvstage{position:fixed;left:-10000px;top:0;width:900px;visibility:hidden;pointer-events:none}
/* v75: '빨간 글자' 탭 — 미리보기에서 바로 고치기 · 끌어 고른 글자를 빨간 글자로 (forms.js fmEd* · fmRedApply). 빨간 I 마우스 · 빨간 커서 · 빨간 고르기 */
.fmredbar{position:sticky;top:0;z-index:3;display:flex;align-items:center;gap:6px;flex-wrap:wrap;background:rgba(30,32,40,.96);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);
  border:1px solid rgba(224,0,0,.5);border-radius:8px;padding:6px 8px;margin:0 0 8px;font-size:12.5px}   /* 미리보기(흰 종이) 위에 붙어 있으므로 비치지 않는 바탕 (글래스 테마의 --card 는 반투명) */
:root[data-theme="light"] .fmredbar{background:var(--card)}
.fmredbar[hidden]{display:none}
.fmredbar button.mini.rd{color:#fff;background:#c80000;border-color:#c80000}
.fmredbar button.mini.rd:hover{background:#e00000}
.fmredmsg{flex-basis:100%;font-size:12px;line-height:1.4}
.fmredmsg:empty{display:none}
.fmredhelp{border-left:3px solid rgba(224,0,0,.6);padding-left:8px}
.tpl-doc.ed .tb-u{cursor:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='24'%3E%3Cpath d='M4 3h3l1 1 1-1h3M4 21h3l1-1 1 1h3M8 4v16' fill='none' stroke='%23fff' stroke-width='3.5' stroke-linecap='round'/%3E%3Cpath d='M4 3h3l1 1 1-1h3M4 21h3l1-1 1 1h3M8 4v16' fill='none' stroke='%23d40000' stroke-width='1.6' stroke-linecap='round'/%3E%3C/svg%3E") 8 12,text;
  caret-color:#e00000;outline:none;border-radius:1px}
.tpl-doc.ed .tb-u:focus{background:rgba(255,0,0,.05)}
.tpl-doc.ed .tb-u::selection,.tpl-doc.ed .tb-u ::selection{background:rgba(255,0,0,.3);color:inherit}
.tpl-doc.ed .tb-tok{cursor:default}
.fmprev-meta{font-size:12.5px;color:var(--dim);margin:0 0 8px}
.fmprevbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 8px}
/* 편집기: 왼쪽 편집 · 오른쪽 A4 */
.fmed{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.05fr);gap:16px;align-items:start}
.fmed-r{position:sticky;top:calc(8px + var(--fm-envh,0px));max-height:calc(100vh - 16px - var(--fm-envh,0px));overflow:auto;overscroll-behavior:contain}
/* ↑ v75 검토: --fm-envh = 테스트 DB 띠(#envBar, 창 맨 위 sticky) 높이 (forms.js fmEnvTop) — 띠가 미리보기 칸 맨 위([빨간 글씨로] 막대)를 가리지 않게.
   contain = 미리보기 끝에서 더 굴려도 창이 따라 내려가 칸 맨 위(막대)가 화면 밖으로 밀리지 않게 (왼쪽이 짧으면 칸이 창에 붙지 못한다) */
.fmstat{font-size:12.5px;margin:0 0 8px}
.fmtabs{display:flex;gap:4px;flex-wrap:wrap;align-items:center;border-bottom:1px solid var(--line);margin:0 0 10px}
.fmtabs button:not(.mini){background:none;border:none;border-bottom:2px solid transparent;color:var(--dim);padding:7px 11px;font:inherit;font-size:13px;cursor:pointer;margin-bottom:-1px}
.fmtabs button.on{color:var(--cyan);border-bottom-color:var(--cyan);font-weight:600}
.fmtabs .grow{flex:1}
.fmpanel{font-size:13px}
.fmpanel textarea,.fmpanel input[type=text],.fmpanel input[type=number],.fmpanel input[type=date],.fmpanel select,.asec input[type=date]{
  background:var(--card2);border:1px solid var(--line);color:var(--text);border-radius:6px;padding:5px 8px;font:inherit;font-size:13px;min-width:0}
.fmpanel textarea{width:100%;resize:vertical;line-height:1.5;font-family:inherit}
.fmpanel :focus{outline:none;border-color:var(--cyan)}
.fmpanel .tb-cand{color:var(--rose);text-decoration:underline wavy var(--rose)}
.fmhelp{font-size:12.5px;color:var(--dim);line-height:1.6;margin:0 0 10px}
.fmhelp code{font-size:12px}
.fmpaste{min-height:110px;border:2px dashed var(--line);border-radius:10px;padding:16px;color:var(--dim);text-align:center;outline:none;max-height:160px;overflow:hidden}
.fmpaste:focus{border-color:var(--cyan);color:var(--text)}
.fmimp{margin-top:12px}
.fmbtns{display:flex;gap:8px;flex-wrap:wrap;margin:10px 0}
.fmchk{display:inline-flex;align-items:center;gap:4px;font-size:12.5px;color:var(--dim);margin-right:8px}
.fmfile{position:relative;overflow:hidden;display:inline-block;background:var(--card2);border:1px solid var(--line);color:var(--dim);padding:4px 11px;border-radius:6px;font-size:12px;cursor:pointer}
.fmfile:hover{color:var(--text);border-color:var(--dim)}
.fmfile input{position:absolute;inset:0;opacity:0;cursor:pointer}
.fbrow{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:5px 0;font-size:12.5px}
.ffgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:6px 10px;margin:8px 0 4px}
.ffgrid label{display:flex;flex-direction:column;gap:3px;font-size:11.5px;color:var(--dim)}
.ffgrid label.fmchk{flex-direction:row;align-items:center}
.ffgrid label.wide{grid-column:1/-1}
.fmwarn summary{cursor:pointer;color:var(--amber);font-size:12.5px;margin:6px 0}
.fmwarn ul,.fmpanel .err ul{margin:4px 0;padding-left:18px;font-size:12.5px;line-height:1.55}
table.fmtbl td{vertical-align:top}
table.fmtbl td:first-child{min-width:120px;max-width:260px;word-break:keep-all}   /* 빨간 글자 표: 글자 칸이 한 글자씩 꺾이지 않게 */
table.fmtbl td .hint{white-space:nowrap}
.fmrv-meta{font-size:12.5px;color:var(--dim);line-height:1.7}
.fmstart .go,.fmstart .ghost{margin-top:8px}
/* v76: 저장 막대 — 조금이라도 고치면 [저장] [임시저장] [취소] (forms.js fmBar). 편집 칸(.fmed) 바로 위에서 창에 붙어 굴려도 보인다.
   넓은 화면 = 왼쪽 칸 폭 (오른쪽 미리보기 칸은 따로 붙어 있어 겹치지 않음 — .fmed 의 1fr : 1.05fr · 사이 16px) · 좁은 화면 = 한 줄 전체.
   미리보기 위에도 지나가므로 비치지 않는 바탕 (글래스 테마의 --card 는 반투명 — .fmredbar 와 같은 까닭) */
.fmsavebar{position:sticky;top:var(--fm-envh,0px);z-index:4;width:calc((100% - 16px) / 2.05);box-sizing:border-box;margin:0 0 10px;
  background:rgba(30,32,40,.96);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px);border:1px solid var(--line);border-radius:10px;padding:6px 10px;font-size:12.5px}
.fmsavebar:empty{display:none}
.fmsavebar.dirty{border-color:var(--amber)}
:root[data-theme="light"] .fmsavebar{background:var(--card)}
.fmsb-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap;min-height:30px}
.fmsavebar .fmsb-row button.go,.fmsavebar .fmsb-row button.ghost{width:auto;padding:5px 14px;font-size:13px;min-height:30px}   /* 글래스 테마 좁은 화면의 button.go 한 줄 전체(width:100%)를 막대 안에서는 풀어 막대를 낮게 */
.fmsavebar button:disabled,.fmsubbox button:disabled{opacity:.45;cursor:default}   /* 꺼진 [저장]·[임시저장]·[확인 요청] 이 눈에 보이게 (button.go·ghost 는 꺼진 모양이 따로 없다) */
.fmsb-st{flex:1 1 220px;min-width:0;line-height:1.45}
.fmsb-st button.mini{margin-left:4px}
.fmsb-stale{margin:2px 0 6px;font-size:12.5px;line-height:1.5}
.fmsb-stale .fmbtns{margin:6px 0 4px}
.fmsb-loc{margin-top:3px}
/* v76: 수정내용 탭 아래 '확인 요청' 칸 (옛 확인 요청 탭 — forms.js fmSubmitPanel) */
.fmsubbox{margin-top:18px;padding-top:12px;border-top:1px solid var(--line)}
.fmsub-h{margin:0 0 8px;font-size:14px;font-weight:650}
/* v76: 수정내용 미리보기의 그림 위 [그림 올리기]·[그림 바꾸기] (forms.js fmImgOverlay — 편집기 미리보기에만 붙고 인쇄 안 됨).
   흰 종이 위라 테마 색(--card2 등)을 쓰지 않는다 · 블록은 절대 위치 기준만 (높이·쪽 나눔 그대로) · 쪽을 줄인 만큼 fmImgZoom 이 되돌린다 */
.tpl-doc .fmimgblk{position:relative}
.fmimgov{position:absolute;z-index:2;line-height:normal;text-indent:0;text-align:left;white-space:normal;-webkit-user-select:none;user-select:none}
.fmimgov-z{display:flex;flex-direction:column;align-items:flex-start;gap:3px;width:max-content;max-width:260px;font:12px/1.35 "Inter","Malgun Gothic","Apple SD Gothic Neo",sans-serif}
.fmimgov button.fmimgbtn{background:#1f2430;color:#fff;border:1px solid #1f2430;border-radius:6px;padding:4px 10px;font:inherit;font-weight:600;cursor:pointer;box-shadow:0 2px 6px rgba(0,0,0,.25)}
.fmimgov button.fmimgbtn:hover{background:#c80000;border-color:#c80000}
.fmimgov-h{display:none;background:rgba(31,36,48,.92);color:#fff;border-radius:5px;padding:3px 6px;font-size:11px}
.fmimgov:hover .fmimgov-h,.fmimgov:focus-within .fmimgov-h{display:block}   /* 안내는 단추에 마우스를 올릴 때만 (늘 띄우면 그림 아래 블록 글을 가린다 — 같은 글이 왼쪽 안내에도 있다) */
@media print{.fmimgov{display:none}}
@media (max-width:1000px){
  .fmed{grid-template-columns:minmax(0,1fr)}   /* 1fr 은 넓은 편집 표만큼 늘어나 폰에서 화면이 옆으로 밀렸다 */
  .fmed-r{position:static;max-height:none;overflow:visible}   /* v75 검토: 굴리지 않는 칸이 overflow:auto 면 [빨간 글씨로] 막대(sticky)의 기준이 되어 막대가 쪽과 같이 밀려 올라갔다 → 창 기준으로 붙게 */
  .fmredbar{top:calc(var(--fm-envh,0px) + var(--fm-barh,0px))}  /* 창에 붙을 때 테스트 DB 띠 바로 아래 (좁으면 띠가 두 줄). v76: 저장 막대가 있으면 그 아래 (--fm-barh — forms.js fmBarH) */
  .fmsavebar{width:auto}                                        /* v76: 위아래로 쌓이면 저장 막대는 한 줄 전체 — 미리보기까지 굴려도 맨 위에 */
}
@media (max-width:700px){
  .fmcards{grid-template-columns:1fr}
  .fmv-who{margin-left:0}
}

/* ═══ v55: 계약서 작성·발급 팝업 (docfill.js). 문서 쪽 모양은 tpl.css ═══ */
#dfModal{max-width:1500px}
.dfpick{display:flex;flex-direction:column;gap:6px;margin:0 0 10px;font-size:13.5px}
.dfrow{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.dfrow select{max-width:100%;min-width:0}
select option:disabled{color:#8b8f98}   /* v101 (명세 2-C): 고를 수 없는 줄 = 흐린 회색 (기본 어두운 화면 · glass 없는 밝은 화면 — glass 는 theme-glass.css 의 같은 규칙) */
.dfnone{display:flex;flex-direction:column;align-items:flex-start;gap:8px}   /* v101: 게시된 계약서 양식이 하나도 없을 때 드롭다운 대신 칸 안 글 */
.dfrow .chk{margin-right:4px}
.dfgrid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.1fr);gap:18px;align-items:start}
.dfinfo{margin:0 0 8px;font-size:12.5px}
.dfsec{border:1px solid var(--line);border-radius:10px;padding:6px 12px 8px;margin:0 0 12px;min-width:0}
.dfsec legend{padding:0 6px;font-size:13px;font-weight:700;color:var(--cyan)}
.dff{display:grid;grid-template-columns:minmax(110px,36%) minmax(0,1fr);gap:2px 10px;padding:7px 0;border-bottom:1px dashed var(--line);align-items:center}
.dff:last-child{border-bottom:0}
.dflab{font-size:12.5px;color:var(--text);line-height:1.35}
.dfin{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0}
.dfin input[type=text],.dfin input[type=date],.dfin select{flex:1 1 140px;min-width:0}
.dfin .chk{white-space:nowrap}
.dfhand{font-size:12px}
.dfro{font-size:13.5px;padding:4px 0}
.dfmeta,.dfmsg,.dfnote{grid-column:2;min-width:0}
.dfmeta{display:flex;gap:10px;flex-wrap:wrap;font-size:11.5px}
.dfsrc{color:var(--dim)} .dfsrc.rose{color:var(--rose)} .dfsrc.amber{color:var(--amber)}
.dfpol{color:var(--dim)}
.dfmsg{font-size:12px;line-height:1.45}
.dfmsg:empty{display:none}
.dfnote{font-size:11.5px;line-height:1.45}
.dff.bad .dfin input,.dff.bad .dfin select{border-color:var(--rose)!important}
.dff.warn .dfin input{border-color:var(--amber)!important}
.dff.dev-낮음 .dfin input{border-color:var(--rose)!important;box-shadow:0 0 0 2px rgba(226,112,122,.25)}
.dff.dev-다름 .dfin input{border-color:var(--amber)!important;box-shadow:0 0 0 2px rgba(224,164,88,.25)}
.dfdevline{font-weight:600} .dfdevline.k-낮음{color:var(--rose)} .dfdevline.k-다름{color:var(--amber)} .dfdevline.k-참고{color:var(--dim)}
.dfblk ul,.dfwarn ul,.dfdevs ul{margin:4px 0;padding-left:18px;font-size:12.5px;line-height:1.55}
.dfdevs{border:1px solid var(--line);border-radius:10px;padding:8px 12px;margin:10px 0;font-size:13px}
.dfdevs li{margin:2px 0}
.dfdh{font-size:13px}
.dfok{color:var(--ok);font-size:13px}
.dfissue{display:flex;flex-direction:column;gap:6px;margin:12px 0 4px}
.dfissue>button{align-self:flex-start}
.dfissue .hint{line-height:1.5}
.dfwait{color:var(--dim);font-size:13px;margin:0 0 8px}
.dfbusy .dfl{opacity:.6;pointer-events:none}
.dftabs{display:flex;gap:4px;flex-wrap:wrap;align-items:center;border-bottom:1px solid var(--line);margin:0 0 8px;min-height:30px}
.dftabs button{background:none;border:none;border-bottom:2px solid transparent;color:var(--dim);padding:6px 10px;font:inherit;font-size:13px;cursor:pointer;margin-bottom:-1px}
.dftabs button.on{color:var(--cyan);border-bottom-color:var(--cyan);font-weight:600}
.dfone{font-size:13px;color:var(--dim);padding:4px 0}
/* 발급 쪽을 그리는 화면 밖 무대 — 보이는 상자여야 높이를 잰다 (#docPrint 는 display:none) */
.dfstage{position:absolute;left:-10000px;top:0;width:auto;pointer-events:none}
/* v101 (명세 2-D): 계약서 작성 창 아래 '이 단지 발급 이력' 접는 칸 (#dfLogSec — 예전 단지 상세 칸) · 머리 = 진짜 단추 (화살표 = 카드의 .ctchev 규칙 그대로)
   클래스 이름 2026-10-27 grep: 없음 (.dflogsec · .dflogh · .dflogtog · .dflogbox) · display 를 준 칸의 [hidden] 은 따로 */
.dflogsec{flex:none;min-width:0;border-top:1px solid var(--line);padding:8px 24px 12px}
.dflogsec[hidden],.dflogbox[hidden]{display:none}
.dflogh{display:flex;align-items:center;gap:4px;min-width:0}
.dflogtog{display:inline-flex;align-items:center;flex-wrap:wrap;gap:4px 6px;min-width:0;padding:4px 2px;margin:0;background:none;border:0;border-radius:6px;color:var(--hi);font:inherit;font-size:13.5px;font-weight:600;text-align:left;cursor:pointer}
.dflogtog:hover{background:color-mix(in srgb,var(--cyan) 8%,transparent)}
.dflogtog:focus-visible{outline:2px solid var(--cyan);outline-offset:1px}
.dflogtog #dfLogCnt{font-weight:400;color:var(--dim)}
.dflogbox{padding-top:6px;min-width:0}
#dfLogBox .tblwrap{overflow-x:auto}
@media (min-width:701px){ .dflogbox{max-height:38vh;overflow:auto} }
@media (max-width:700px){ .dflogsec{padding:8px 16px 12px} }
/* '이 단지 발급 이력' 표 · [값 보기] (v101 전 = 단지 상세 '계약서 발급 이력') */
table.dflogt{min-width:720px} table.dflogt td{vertical-align:top} table.dflogt tr.mine td:first-child{box-shadow:inset 3px 0 0 var(--cyan)}
.dfvals{border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin:10px 0 0}
.dfvh{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px;margin:0 0 6px}
.dfvh button{margin-left:auto}
table.dfvalt{min-width:0} table.dfvalt td:first-child{color:var(--dim);width:45%}
/* 넓은 화면: 창 높이에 맞춘 두 칸(왼쪽 입력 · 오른쪽 A4)이 따로 스크롤 */
@media (min-width:701px){
  #dfModal{display:flex;flex-direction:column;height:calc(100vh - 48px)}
  #dfBody{flex:1;min-height:0;display:flex;flex-direction:column}
  #dfBody .dfgrid{flex:1;min-height:0}
  #dfBody .dfl,#dfBody .dfr{height:100%;overflow:auto;padding-right:4px}
}
/* 폰(700px 이하): 입력 위 · A4 아래 한 줄 */
@media (max-width:700px){
  /* 단지 상세 머리 버튼([계약서 작성]·[담당자 이전 신청]·×)이 단지 이름을 몇 글자 폭으로 밀지 않게: 버튼 칸은 55% 까지, 넘치면 아래 줄(오른쪽 정렬), × 는 맨 위 오른쪽 */
  .mhbtns{flex-shrink:1;max-width:55%;flex-wrap:wrap;flex-direction:row-reverse;justify-content:flex-start;row-gap:6px}
  .mhbtns .x{order:-1}
  .mhead>div:first-child{min-width:0}
  .dfgrid{grid-template-columns:minmax(0,1fr)}
  .dff{grid-template-columns:minmax(0,1fr)}
  .dfmeta,.dfmsg,.dfnote{grid-column:1}
  .dfin input[type=text],.dfin input[type=date],.dfin select{flex-basis:100%}
  .dfissue>button{align-self:stretch}
}

/* v56 발급본 연결·점검 (review.js) — 계약 등록 폼 발급본 · 계약 카드 칩·패널 · 승인 대기함 점검 줄 · 양식·가격 예외 목록 */
.rvbox{border:1px solid var(--line);border-radius:10px;padding:8px 12px;margin:6px 0;font-size:13px;line-height:1.55;background:var(--card2);text-align:left;white-space:normal}
.rvbox ul,.rvpanel ul{margin:4px 0 0 16px;padding:0}
.rvitems li{margin:2px 0;list-style:disc}
.rvitems li .badge{margin-right:4px;vertical-align:1px}
.rv-exc{color:var(--rose)}
.rv-changed{color:var(--rose);font-weight:600;margin:0 0 6px}
.rv-err{color:var(--rose)}
.rv-na{font-size:12.5px}
.rvload{color:var(--dim);font-size:12.5px;padding:4px 0}
/* 계약 카드 칩 (제품 이름 옆) · 누르면 아래 패널 */
.rvchip:empty{display:none}   /* 칩이 없으면 .ctr .top 의 flex 간격도 없게 */
.rvchip .badge{cursor:pointer}
.rvchip .badge.rvdim{cursor:default;opacity:.75}
button.rvbtn{font:inherit;font-size:11px;line-height:inherit;margin:0;cursor:pointer}
button.rvbtn:hover{filter:brightness(1.15)}
.rvpanel{border-top:1px dashed var(--line);margin:8px 0 0;padding:8px 0 0;font-size:13px;line-height:1.55}
/* 점검 덩어리: 머리 줄(발급본 · 판정일 · 버튼) · 요약 · 묶음 · 승인 때 기록 */
.rvhead{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px}
.rvhead .rvact{margin-left:auto;display:inline-flex;gap:6px;flex-wrap:wrap}
.rvsum{margin:4px 0 2px;color:var(--dim);font-size:12.5px}
.rvsum .a{color:var(--rose);font-weight:600}.rvsum .w{color:var(--amber);font-weight:600}
.rvg{margin:6px 0 0}
.rvgh{font-size:12px;color:var(--cyan);font-weight:600}
.rvmore summary,.rvsnap summary{cursor:pointer;color:var(--dim);font-size:12.5px;margin:4px 0 0}
.rvsnap{margin:8px 0 0;font-size:12.5px}
.rvsaved{margin:0 0 8px}
/* [연결 바꾸기] 그 자리 입력 */
.rvlinkf{display:flex;flex-wrap:wrap;gap:6px 10px;align-items:flex-end;margin:8px 0 0;padding:8px 10px;border:1px solid var(--line);border-radius:8px}
.rvlinkf label{display:flex;flex-direction:column;gap:2px;font-size:12px;color:var(--dim)}
.rvlinkf label.chk{flex-direction:row;align-items:center;padding-bottom:6px}
.rvlinkf input[type=text]{min-width:170px}
.rvlinkf input[type=date]{min-width:0}
.rvl-msg{flex-basis:100%;font-size:12.5px}
/* 승인 대기함 점검 줄 — 표가 가로로 넘쳐도(유리 테마 700px 이하 min-width:560px) 글은 화면 폭 안에 */
.apx td{background:transparent;border-top:0;padding-top:0}
tbody tr.apx{cursor:default}
tbody tr.apx:hover{background:transparent}
.apx .rvbox{position:sticky;left:0;max-width:calc(100vw - 48px);box-sizing:border-box;overflow-wrap:anywhere}
/* 계약 등록 폼 발급본 섹션 */
#kIssueInfo{margin:6px 0 0;line-height:1.5;font-size:12px}
#kIssueInfo .amber{color:var(--amber)}   /* 옛 판·다른 제품·이미 연결됨 안내 */
#kPolicyInfo{margin:8px 0 0}
#kIssueSec.rv-off .fgrid,#kIssueSec.rv-off #kPolicyInfo{display:none}
.rvph{font-size:12.5px;font-weight:600;color:var(--amber)}
/* 양식·가격 예외 목록 */
table.rvxt td{vertical-align:top}
table.rvxt .rvxc{min-width:260px;overflow-wrap:anywhere}
.rvacked{opacity:.7}
.rvxack input[type=text]{min-width:140px;margin:0 0 4px}
.rvx-msg{font-size:12px}
.rvcards{display:flex;flex-direction:column;gap:10px}
.rvcard{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:10px 14px;font-size:13px;line-height:1.55;overflow-wrap:anywhere}
.rvcard .rvch{display:flex;flex-wrap:wrap;gap:4px 8px;align-items:center}
.rvcard .rvcm,.rvcard .rvcd{font-size:12px}
.rvcard .rvct{margin:4px 0}
.rvcard .rvxack{margin-top:6px}
@media (max-width:700px){
  .rvbox,.rvpanel{font-size:12.5px}
  .rvhead .rvact{margin-left:0}
  .rvlinkf{flex-direction:column;align-items:stretch}
  .rvlinkf input[type=text],.rvlinkf input[type=date]{min-width:0;width:100%}
  .rvxack input[type=text]{min-width:0;width:100%}
  .rvcard .rvxack button{min-height:36px}
}
/* v57 판독 (review.js rvScan*) — 계약 카드 점검 패널 바로 뒤(#rvs-계약) · 승인 대기함 점검 칸 바로 뒤(#apxscan-배정) '계약서 스캔 판독' */
.rvscanp{margin:6px 0 0;padding:6px 0 0;font-size:13px;line-height:1.55;overflow-wrap:anywhere}
.rvpanel[hidden]+.rvscanp{display:none}   /* 점검 패널을 닫으면 판독 칸도 */
.rvscanp[hidden],.rvscanq[hidden]{display:none}
.rvscanq{overflow-wrap:anywhere}          /* 대기함: .apx .rvbox 의 sticky·폭 제한을 그대로 받는다 */
.rvscan .rvsh{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px}
.rvscan .rvs-st{min-width:0}
.rvscan .rvact{display:inline-flex;flex-wrap:wrap;align-items:center;gap:6px}
.rvscan .rvs-rf{margin-left:auto;font-size:12px;color:var(--dim)}
.rvscan .a{color:var(--rose);font-weight:600}
.rvscan .w,.rvscan .amber{color:var(--amber)}
.rvscan .w{font-weight:600}
.rvs-meta,.rvs-cost{font-size:12px;margin:2px 0 0}
.rvs-note{margin:2px 0 0}
.rvs-msg{font-size:12.5px;margin:4px 0 0}
.rvs-msg:empty{display:none}
.rvs-ph{display:inline-flex;font-size:12px}
.rvs-items{margin:6px 0 0}
.rvsg{margin:4px 0 0}
.rvsgh{font-size:12px;color:var(--dim);font-weight:600}
.rvs-earlier summary{color:var(--rose)}
.rvspin{display:inline-block;width:11px;height:11px;border:2px solid var(--line);border-top-color:var(--cyan);border-radius:50%;
  animation:rvspin .9s linear infinite;vertical-align:-2px}
@keyframes rvspin{to{transform:rotate(360deg)}}
@media (prefers-reduced-motion:reduce){.rvspin{animation:none}}
.rvfiles{margin:6px 0 0;font-size:12.5px}
.rvfiles summary{cursor:pointer;color:var(--dim)}
.rvfiles ol{margin:4px 0 0 18px;padding:0}
.rvfiles li{margin:2px 0;overflow-wrap:anywhere}
.rvfiles a{color:var(--cyan);white-space:nowrap}
.rvs-stop{font-size:12px;margin:4px 0 0}
.rvflash{outline:2px solid var(--amber);outline-offset:2px;border-radius:8px}
@media (max-width:700px){
  .rvscanp{font-size:12.5px}
  .rvscan .rvs-rf{margin-left:0}
  .rvscan .rvact button{min-height:36px}
}
/* v58 경영진 승인 · 정정 · 첨부 접기 · 발급 이력 처리 (review.js rvExc* · detail.js 계약 카드 · docfill.js dfLogLoad) */
/* 정정 = 주황 글자 (두 테마 같은 색 — glass 의 --amber 는 노랑이라 쓰지 않는다) */
.badge.fix{color:#ff8a1f;border-color:#ff8a1f;background:transparent;font-weight:700}
.st-fix,.ctr .st-fix b{color:#ff8a1f;font-weight:700}
.fixnote{margin:2px 0 4px}
/* 계약 카드 첨부 — v101 (명세 2-I): 접기 단추(.ctftog) · 종류 고르기(.fkind) 없앰 → 칩이 늘 보임 · [파일 추가] = 카드 머리 (.cthd>.ctbtns .ctaddf — 아래 v88 절) */
.ctfiles{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin:2px 0 10px}
.ctfiles[hidden]{display:none}
.ctfiles .ctfbox{flex-basis:100%;margin:0}
.ctfiles .fmsg:empty{display:none}
.ctfiles .auxhint{flex-basis:100%;margin:0}
/* 발급 이력: 시각(날짜/시간)·신청인(이름/본부) 두 줄 */
.dflogt td.dfl2{line-height:1.35}
/* 경영진 승인 목록 */
.rvxt a.rvxcx,.rvcard a.rvxcx{color:var(--text);text-decoration:none;border-bottom:1px dotted var(--dim)}   /* 단지 링크 = 보통 글자색 (파랑 아님, 두 테마) */
.rvxt a.rvxcx:hover,.rvcard a.rvxcx:hover{border-bottom-color:var(--text)}
.rvxi{margin:0;padding-left:16px}
.rvxi li{margin:2px 0;overflow-wrap:anywhere}
.rvxi li.done{opacity:.7}
.rvxi li.open b{color:var(--rose)}
table.rvxt td.rvxk{white-space:normal;min-width:64px}
table.rvxt td.rvxk .badge,.rvcard .rvch .badge{margin:0 2px 2px 0}
.rvxbtns{white-space:nowrap}
.rvxack .rvx-warn{color:var(--dim);font-size:11.5px;margin:4px 0 0;line-height:1.45}
.rvxdec+.rvxdec{margin-top:4px}
.rv-exec{margin-top:4px;color:var(--amber)}
.rvx-flash{margin:0 0 8px}

/* v61: 기능 공개 스위치 (features.js · DB schema_v53) — 꺼진 기능을 최고관리자에게 보일 때의 '미공개' 표시 · 관리자 '기능 공개' 섹션 */
.featoff{display:inline-block;margin-left:6px;padding:0 6px;border:1px dashed var(--amber);border-radius:8px;color:var(--amber);
  background:transparent;font-size:10.5px;font-weight:600;line-height:1.5;vertical-align:middle;white-space:nowrap;letter-spacing:0}
button .featoff{margin-left:5px}
.featoff[hidden],[data-feat][hidden]{display:none!important}
.featfail{margin:6px 0 0;padding:6px 10px;border:1px dashed var(--amber);border-radius:10px;color:var(--amber);font-size:12.5px;line-height:1.5;overflow-wrap:anywhere}   /* 기능 스위치를 처음부터 못 읽었을 때 탭 아래 한 줄 */
.featfail[hidden]{display:none}
.featfail a{color:inherit;text-decoration:underline}
.ftwarn:empty{display:none}
.ftwarn{margin-top:6px;font-size:12.5px}
span.ucnt{font-variant-numeric:tabular-nums;font-weight:600}                   /* 담당 현황이 꺼졌을 때 사용자 관리 '계약' 숫자 (누를 수 없음) */
span.ucnt.zero{color:var(--dim);opacity:.6;font-weight:400}
.rvpanel.rvsolo{border-top:0;padding-top:0}                                   /* 판독만 켜졌을 때 카드의 빈 점검 자리 */
tr.apx.apxscanonly:not(:has(.rvscanq:not([hidden]))){display:none}           /* 대기함: 판독 칸이 없으면 빈 줄을 숨긴다 */
#secFeatures .ftgrp h4{margin:14px 0 4px}
.ftrow{border-top:1px solid var(--line);padding:8px 0}
.ftmain{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px}
.ftname{flex:1 1 220px;min-width:0;font-size:13.5px;overflow-wrap:anywhere}
.ftname .hint{margin-left:4px}
.ftwho{font-size:12px;color:var(--dim);white-space:nowrap}
.ftbtn{margin-left:auto}
.ftask{margin:8px 0 2px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:var(--card2);font-size:13px;line-height:1.55;overflow-wrap:anywhere}
.ftask[hidden]{display:none}
.ftin{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:8px}
.asec .ftin input.ftreason{flex:1 1 220px;min-width:0;padding:6px 9px;font-size:13px}
.ftmsg{margin-top:6px;font-size:12.5px}
.ftbad{color:var(--rose)}
@media (max-width:700px){ .ftwho{white-space:normal} .ftbtn{margin-left:0} .asec .ftin input.ftreason{flex-basis:100%} }

/* v62 점검 모드·복원 안내 (maint.js · DB schema_v54) — 로그인 화면 빨간 안내 · 로그인 중 덮개 · 최고관리자 빨간 띠 · 관리자 '점검 모드' · 복원 안내 팝업 · 알림 종 '알림' 묶음 */
#login [hidden]{display:none!important}
.maintgate{margin:4px 0 6px;line-height:1.6;overflow-wrap:anywhere}
.mtitle{color:#ff5b5b;font-size:17px;font-weight:700;line-height:1.5;letter-spacing:-.01em}
.mmsg{margin-top:8px;font-size:14px;color:var(--text);white-space:pre-line;overflow-wrap:anywhere}
.msince{margin-top:6px;font-size:12.5px;color:var(--dim)}
.mnote{margin-top:10px;padding:8px 10px;border-left:3px solid #ff5b5b;border-radius:0 8px 8px 0;background:rgba(255,91,91,.10);font-size:13px;color:var(--text)}
.maintgate a.madmin{display:inline-block;margin-top:18px;font-size:11.5px;color:var(--dim);text-decoration:underline;text-decoration-color:rgba(139,149,165,.5)}
.maintgate a.madmin:hover{color:var(--text)}
.monly{margin-top:16px;font-size:11.5px;color:var(--dim)}
#maintBar{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:6px 12px;background:#b3261e;color:#fff;
  font-size:13px;font-weight:600;padding:6px 12px;text-align:center;line-height:1.45;overflow-wrap:anywhere}
#maintBar button{background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.75);color:#fff;border-radius:999px;
  padding:3px 12px;font:inherit;font-size:12.5px;cursor:pointer;min-height:28px}
#maintBar button:hover{background:rgba(255,255,255,.28)}
.mask.maintmask{z-index:1900;background:rgba(8,9,12,.9)}                 /* 다른 창·알림 종 위, 테스트 DB 띠(#envBar 2000) 아래 */
.maintbox{max-width:520px;margin:14vh auto 0}
.maintbox .mbody{text-align:center;padding:32px 28px}
.maintbox .mtitle{font-size:19px}
.mwait{margin-top:18px;font-size:13px;color:var(--dim)}
.mlinks{margin-top:14px;display:flex;flex-wrap:wrap;justify-content:center;gap:4px 10px;font-size:12.5px}
.mlinks a{color:var(--dim);text-decoration:underline}
.mlinks a:hover{color:var(--text)}
.mask.ntmask{z-index:70}                                                    /* 알림 종 목록(60) 위 */
.ntbox{max-width:560px;margin:10vh auto 0}
.ntbox:focus{outline:none}                                                  /* 팝업이 뜨면 창 자체에 포커스(maint.js ntPopup) — 테두리는 안 그림 */
.maintbox .mpw{color:var(--text)}
.ntbody{white-space:pre-line;overflow-wrap:anywhere;font-size:15px;line-height:1.75;color:var(--text)}
.ntact{margin-top:18px;display:flex;flex-wrap:wrap;gap:8px 12px;align-items:center}
.ntact .ntmsg{font-size:12.5px}
.ntfoot{margin-top:14px;font-size:12px;color:var(--dim)}
.bellpanel{max-height:calc(100vh - 90px);overflow-y:auto}
.bellpanel h5:not(:first-child){margin-top:12px}
.bellpanel .ntrow{padding:8px 4px;border-top:1px solid var(--line)}
.bellpanel .ntt{display:flex;justify-content:space-between;align-items:baseline;gap:8px;overflow-wrap:anywhere}
.bellpanel .ntd{flex:none;color:var(--dim);font-size:11.5px;white-space:nowrap}
.bellpanel .ntb{margin-top:3px;font-size:12px;color:var(--dim);white-space:pre-line;overflow-wrap:anywhere;line-height:1.5}
.bellpanel .ntrow.read .ntb{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;white-space:normal}
.bellpanel .ntrow.unread .ntt b{color:var(--text)}
.bellpanel .ntact{margin-top:6px;gap:8px}
.mtrow .mtcur{margin-top:6px;font-size:12.5px;color:var(--dim);overflow-wrap:anywhere;white-space:pre-line}
.mtrow .mtmsgv{color:var(--text)}
.asec .ftin input.mtmsgin{flex:1 1 100%;min-width:0;padding:6px 9px;font-size:13px}
#boxNotices .ntb{margin-top:4px;font-size:12.5px;color:var(--dim);white-space:pre-line;overflow-wrap:anywhere}
@media (max-width:700px){
  .maintbox{margin-top:8vh}
  .maintbox .mbody{padding:24px 16px}
  .ntbox{margin-top:7vh}
  #maintBar{font-size:12.5px}
}

/* v67 점검 예약 (maint.js · DB schema_v67d) — 예고 띠 · 10분 전 알림 · 로그인 화면 상자 · 관리자 날짜·시각 칸.
   띠·알림은 단색 바탕 + 흰 글자라 세 테마(기본·glass·light) 모두 같은 모양 (#envBar·#maintBar 와 같은 방식) */
#maintSoon{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:4px 12px;background:#8a5a12;color:#fff;
  font-size:13px;font-weight:600;padding:6px 12px;text-align:center;line-height:1.45;overflow-wrap:anywhere}
#maintSoon.urgent{background:#c2410c}
#maintSoon .mst b{font-weight:800}
#maintSoon .msmsg{flex-basis:100%;font-weight:500;font-size:12.5px;opacity:.95;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;white-space:pre-line}
#maintSoon button{background:rgba(255,255,255,.14);border:1px solid rgba(255,255,255,.75);color:#fff;border-radius:999px;
  padding:3px 12px;font:inherit;font-size:12.5px;cursor:pointer;min-height:28px}
#maintSoon button:hover{background:rgba(255,255,255,.28)}
#maintSoonPill{position:fixed;left:16px;bottom:16px;z-index:1800;max-width:min(420px,calc(100vw - 32px));display:flex;align-items:center;gap:10px;
  background:#c2410c;color:#fff;border-radius:14px;padding:10px 12px 10px 16px;font-size:13.5px;line-height:1.45;box-shadow:0 10px 28px rgba(0,0,0,.45)}
#maintSoonPill .mpt{flex:1 1 auto;min-width:0}
#maintSoonPill .x{flex:none;background:transparent;border:0;color:#fff;font-size:20px;line-height:1;cursor:pointer;padding:2px 6px;min-height:32px}
.maintsoon-login{margin:4px 0 12px;padding:10px 12px;border-left:3px solid var(--amber);border-radius:0 10px 10px 0;background:rgba(224,164,88,.12);
  font-size:13.5px;line-height:1.6;color:var(--text);overflow-wrap:anywhere}
.maintsoon-login .mst b{color:var(--amber)}
.maintsoon-login .msb{font-size:12.5px;color:var(--dim)}
.maintsoon-login .msmsg{margin-top:4px;white-space:pre-line}
.mtrow .ftmain{display:flex;flex-wrap:wrap}            /* W3 의 모바일 .ftmain 격자(기능 공개용)가 점검 줄을 덮지 않게 — 무게 0,2,0 */
.asec .mtwhen input.mtdate{flex:0 1 170px;min-width:0}
.asec .mtwhen select{flex:0 0 auto;width:auto;min-width:84px}
.mtwhenv{margin-top:6px;font-size:12.5px;overflow-wrap:anywhere}
.mtwhenv.bad{color:var(--rose)}
.mtrow .mtlag{margin-top:8px;font-size:12.5px}
@media (max-width:700px){
  #maintSoon{font-size:12.5px}
  #maintSoonPill{left:8px;right:8px;bottom:max(8px,env(safe-area-inset-bottom));max-width:none}
  .asec .mtwhen input.mtdate{flex:1 1 100%}
  .asec .mtwhen select{flex:1 1 0;width:auto;min-width:0}
  .asec .mtwhen .hint{flex-basis:100%}
}

/* ═══ v63 theme ═══ */
/* 머리 '화면 밝기' 스위치 (index.html <head> themeToggle · 저장 localStorage 'ui.theme'). 트랙 = 두 글자 Light·Dark,
   손잡이 = 유리 알약(반투명 그라데이션·흐림·흰 테두리 빛·그림자)이 고른 쪽 글자 위로 미끄러진다. 켜짐(aria-checked=true) = 어두운 화면 = 오른쪽.
   <button> 이라 Space·Enter 로도 바뀐다. 밝은 화면의 손잡이 색은 theme-light.css 끝 */
.thsw{position:relative;display:inline-flex;align-items:center;flex:none;width:108px;height:34px;padding:0;margin:0 6px 0 0;
  border:1px solid var(--line);border-radius:999px;background:var(--card2);color:var(--dim);cursor:pointer;
  font:inherit;font-size:12px;font-weight:600;letter-spacing:.02em;isolation:isolate;-webkit-tap-highlight-color:transparent}
.thsw-l,.thsw-d{position:relative;z-index:1;flex:1 1 0;text-align:center;line-height:32px;transition:color .25s}
.thsw-k{position:absolute;z-index:0;top:3px;left:3px;width:calc(50% - 3px);height:calc(100% - 6px);box-sizing:border-box;border-radius:999px;
  background:linear-gradient(160deg,rgba(255,255,255,.34),rgba(255,255,255,.08));border:1px solid rgba(255,255,255,.55);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.6),0 2px 8px rgba(0,0,0,.28);
  -webkit-backdrop-filter:blur(8px) saturate(160%);backdrop-filter:blur(8px) saturate(160%);
  transition:transform .25s cubic-bezier(.2,.7,.2,1)}
.thsw[aria-checked="true"] .thsw-k{transform:translateX(100%)}
.thsw[aria-checked="true"] .thsw-d,.thsw[aria-checked="false"] .thsw-l{color:var(--text)}
.thsw:hover{border-color:var(--dim)}
.thsw:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}
@media (prefers-reduced-motion:reduce){.thsw-k,.thsw-l,.thsw-d{transition:none}}
@media (max-width:700px){ .thsw{width:92px;height:32px;font-size:11.5px;margin-right:2px} .thsw-l,.thsw-d{line-height:30px} }
/* 관리자 '회원정보 변경' 표의 탈퇴 신청 줄 (admin.js — 예전 인라인 style="background:#221417"). 마우스를 올려도 그대로. 밝은 화면 색은 theme-light.css */
tbody tr.pcleave,tbody tr.pcleave:hover{background:#221417}
/* ═══ /v63 theme ═══ */

/* ═══ v63 ui_scope ═══ */
/* 사용자 관리 — 사업지원 '맡은 본부' 칸 (역할 칸 아래 둘째 줄 · admin.js scopeBox·editScope). 색은 변수만 (밝은 모드가 저절로 맞게) */
.uswrap{overflow-x:auto;-webkit-overflow-scrolling:touch}   /* 좁은 화면에서 사용자 표가 화면을 넓히지 않고 표 안에서 가로로 움직인다 */
.uscope{margin-top:4px;white-space:normal;font-size:12px;color:var(--dim);line-height:1.5}
.uscope .usl b{color:var(--text);font-weight:600}
.uscope.editing{min-width:220px;max-width:360px;margin-top:6px;padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:var(--card2)}
.uscope .uschk{display:flex;flex-wrap:wrap;gap:4px 12px;align-items:center;margin:6px 0 2px}
.uscope .uschk .chk{font-size:12.5px;color:var(--text);overflow-wrap:anywhere}
.uscope .usoff{color:var(--amber);font-size:11px}
.uscope .usnow{margin:2px 0 6px;font-size:12px;color:var(--cyan);overflow-wrap:anywhere}
.uscope .usrow{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.uscope .usrow input[type=text]{flex:1 1 140px;min-width:0}
.uscope .usmsg{margin-top:4px}
.uscope .usbad{color:var(--rose);font-size:12px}
.uscope .usok{margin-top:4px;color:var(--ok);font-size:12px}
@media (max-width:700px){ .uscope.editing{min-width:200px;max-width:calc(100vw - 72px)} }
/* ═══ /v63 ui_scope ═══ */

/* ═══ v63 ui_search ═══ */
/* 비고객만일 때 꺼진 제품 칩·제품 더 보기·본부 칸 (search.js nonLock) — 흐리게, 누를 수 없음 */
.chk:has(input:disabled){opacity:.45;cursor:default}
.chk:has(input:disabled) input{cursor:default}
.chk:has(input:disabled):hover{color:var(--dim)}
.fld select:disabled{opacity:.45;cursor:default}
/* 목록 요약의 '이 페이지 안에서' · 빈 계약제품 칸 (전에는 글자색을 직접 적었다 — 테마 색을 따르게) */
.sum .sumpg{color:var(--dim);opacity:.8}
.prod .nodash{color:var(--dim);opacity:.6}
/* 계약조회 탭 안내 한 줄 */
.cshint{margin:10px 0 0;font-size:12px;color:var(--dim);line-height:1.6}
/* 계약조회 탭도 단지 조회처럼 들어올 때 살짝 나타나게 (움직임 줄이기 설정이면 없음) */
#viewCt{animation:fadein .22s ease-out}
@media (prefers-reduced-motion: reduce){ #viewCt{animation:none} }
/* 좁은 화면(기본 테마): 탭이 한 줄을 넘으면 옆으로 밀어 보고(계약조회 탭이 늘어 화면 밖으로 밀려나던 것), 목록 표도 옆으로 밀어 본다.
   glass 테마는 theme-glass.css 가 이미 같은 일을 한다 (padding 은 그쪽이 이긴다) */
@media (max-width:700px){
  .tabs{overflow-x:auto;scrollbar-width:none;padding-bottom:1px}
  .tabs::-webkit-scrollbar{display:none}
  button.tab{white-space:nowrap}
  .tblwrap{overflow-x:auto}
  /* v87: 결재/관리 탭의 가입 · 회원정보 변경 · 본부 · 직책 · 제품 표가 375px 에서 화면을 넓히던 것 — 표 칸 안에서만 가로로 (v93: 가입 · 회원정보는 결재 탭 승인 대기함 카드로) */
  #viewAdmin div:has(> table.divtbl),#viewAdmin div:has(> table.listtbl){overflow-x:auto;-webkit-overflow-scrolling:touch}
}
/* ═══ /v63 ui_search ═══ */

/* ═══ v63 form ═══ 계약 등록 폼 (예산지원 스위치 · 부가세 버튼 · 오이패스 결제 방식 · 임시저장 파일·버튼) · 알림 종/신청 현황의 임시저장 · 상세 '작성 중' 표시.
   색은 토큰만 (밝은 모드·유리 테마가 저절로 맞게). [hidden] 은 display 를 준 칸에 따로 적는다 (작성자 CSS 의 display 가 [hidden] 을 이긴다) */
#ctModal .ctbud{margin:14px 0 2px;padding:10px 12px;border:1px solid var(--line);border-radius:9px;background:var(--card2)}
#ctModal .bsw{display:inline-flex;align-items:center;gap:10px;cursor:pointer;font-size:13.5px;color:var(--text);user-select:none}
#ctModal .bsw input{appearance:none;-webkit-appearance:none;flex:none;position:relative;width:38px;height:22px;margin:0;border-radius:11px;
  border:1px solid var(--line);background:var(--card);cursor:pointer;transition:background .2s,border-color .2s}
#ctModal .bsw input::after{content:"";position:absolute;top:2px;left:2px;width:16px;height:16px;border-radius:50%;background:var(--dim);transition:transform .2s,background .2s}
#ctModal .bsw input:checked{background:var(--cyan);border-color:var(--cyan)}
#ctModal .bsw input:checked::after{transform:translateX(16px);background:var(--text)}
#ctModal .bsw input:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}
#kBudgetBox{margin-top:4px}
#kBudgetBox[hidden]{display:none}
/* v96 (DB schema_v83l): 예산지원 비율 세 칸 · 합계 줄 — 옛 DB(.kb-old)면 예산지원 · 지앤톡부담 칸 · 자부담 칸의 * · 합계 줄을 숨김 (자부담 칸만 — 예전 self_burden_pct) */
#kBudgetBox.kb-old .kbsp{display:none}
#kBudgetBox .kbsum{margin:6px 0 0;line-height:1.5}
#kBudgetBox .kbsum:empty,#kBudgetBox .kbold[hidden]{display:none}
#kBudgetBox .kbsum.kbbad{color:var(--rose)}
#kBudgetBox .kbsum.kbwarn{color:var(--amber)}
#kBudgetBox .kbsum.kbok{color:var(--ok)}
#kBudgetBox .kbold{margin:6px 0 0;color:var(--amber)}
/* v96: 정보 수정 신청 '예산지원 비율' 줄 (#crBsRow — 한 줄 전체 · 세 칸 · 합계 줄) */
.crbsrow{grid-column:1/-1}
.crbsrow .crbs{margin-top:4px}
.crbssum{margin:6px 0 2px;line-height:1.5}
.crbssum:empty{display:none}
.crbssum.kbbad{color:var(--rose)}
.crbssum.kbwarn{color:var(--amber)}
.crbssum.kbok{color:var(--ok)}
/* v96: 계약 카드 금액 줄의 '− 지앤톡부담' (노란 — 실매출은 그만큼 적음 · 전체 금액은 그대로) */
.ctgn{color:var(--amber);white-space:nowrap}
.ctgn .dim{color:inherit;opacity:.8}
/* ═══ v98 (DB schema_v83n · budget.js): 실적 › 예산지원 · 등록 창 #bgtMask · 등록 폼 사업 고르기 · 정보 수정 칸 — 색은 테마 변수만 (세 테마 · 375px) ═══ */
#kBudgetBox.kb-prog .kbleg{display:none}                       /* 사업을 고르는 화면 = 지자체명 · 지원연도 칸 숨김 (서버가 사업에서 채움) */
#kBudgetBox .kbprog{margin:2px 0 8px}
#kBudgetBox .kbprog[hidden]{display:none}
#kBudgetBox .kbprog select{width:100%;min-width:0}
#kBudgetBox .kbprognote{margin:5px 0 0;line-height:1.6}
#kBudgetBox .kbprognote:empty{display:none}
#kBudgetBox .kbprognote .mini{margin:0 2px}
.crbprow{grid-column:1/-1}
.crbprow select{width:100%;min-width:0}
.crbprow[hidden]{display:none}
#bgtMask{z-index:57}                                            /* 계약 등록 창(#ctMask 50) · 단지 상세 위 */
#bgtMask .bgtvatc{display:flex;flex-direction:column;justify-content:flex-end;gap:6px}
#bgtMask .bgtvatc .chk{color:var(--text);min-height:36px}
#bgtMask #bgtVatHint{margin:6px 0 0;color:var(--amber);line-height:1.5}
#bgtMask .bgtlock{margin:8px 0 0;color:var(--amber);font-size:12px;line-height:1.5}   /* v98 검토 고침: 이어진 계약이 있어 지역 · 연도 · 사업종목 잠김 (수정 창) */
#bgtMask .bgtlock[hidden]{display:none}
#bgtMask textarea{width:100%;box-sizing:border-box}
#bgtMask input[type=text],#bgtMask select{width:100%;min-width:0;box-sizing:border-box}
#bgtMask .bgtfl .hint{display:block;margin-top:4px;overflow-wrap:anywhere}
#bgtMask .bgtfl .bgtbad{color:var(--rose)}
#bgtMask .bgtbtns{display:flex;gap:8px;margin-top:16px}
#bgtMask .bgtbtns .go{flex:1;padding:12px}
.bgtf .bgtaddf{margin-left:auto}
.bgtf .bgtaddf .go{white-space:nowrap}
.bgtmsg{margin:-6px 0 10px;font-size:13px;line-height:1.5}
.bgtmsg:empty{display:none}
.bgtmsg.ok{color:var(--ok)}
.bgtmsg.err{color:var(--rose)}
.bgtsum .rpsl{align-self:flex-start}                            /* 타일은 글 높이만 (오른쪽 사업 상자가 길어도 늘어나지 않게) */
.bgtsum .tile.bgtover{border-color:var(--rose)}
.bgtsum .tile.bgtover .k,.bgtsum .bgtovert{color:var(--rose)}
.bgtsr .bgthd{display:flex;justify-content:space-between;align-items:center;gap:8px;flex-wrap:wrap}
.bgtsr .bgtnav{display:flex;gap:6px;flex-wrap:wrap}
.bgtsr .bgtinfo{display:flex;gap:14px 18px;flex-wrap:wrap;width:100%;align-items:center}
.bgtsr .bgtdl{margin:0;display:grid;grid-template-columns:max-content minmax(0,1fr);gap:5px 12px;flex:1 1 280px;min-width:0}
.bgtsr .bgtdl>div{display:contents}
.bgtsr .bgtdl dt{color:var(--dim);font-size:12px;padding-top:2px}
.bgtsr .bgtdl dd{margin:0;font-size:13.5px;min-width:0;overflow-wrap:anywhere}
.bgtsr .bgtdl dd.bgtnote{white-space:pre-wrap;color:var(--dim);font-size:12.5px}
.bgtsr .bgtvat{font-size:11.5px;color:var(--amber);margin-left:4px;white-space:nowrap}
.bgtsr .bgtdd{font-size:12px;font-weight:700;color:var(--cyan);margin-left:6px;white-space:nowrap}
.bgtsr .bgtdd.bgtsoon{color:var(--amber)}
.bgtsr .bgtdd.dim{color:var(--dim);font-weight:400}
.bgtsr .bgtfile{display:inline-flex;align-items:center;gap:4px;margin:0 6px 4px 0;max-width:100%}
.bgtsr .bgtfile .mini{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.bgtsr .bgtfhid{opacity:.55}
.bgtsr .bgtpie{flex:0 1 auto;min-width:0}
.bgtsr .bgtpie .donut svg{width:150px;height:150px}
.bgtsr .bgtnosplit{width:100%;margin:6px 0 0;color:var(--amber)}
.bgtsr .bgtacts{width:100%;display:flex;gap:6px;flex-wrap:wrap;margin-top:8px}
.bgtask{width:100%;margin-top:8px;padding:10px 12px;border:1px dashed var(--line);border-radius:10px}
.bgtask .flabel{display:block;margin:0 0 6px}
.bgtaskrow{display:flex;gap:6px;flex-wrap:wrap;align-items:center}
.bgtaskrow input[type=text]{flex:1 1 220px;min-width:0}
.bgtaskrow .flabel{margin:0}
.bgtaskmsg{font-size:12.5px;margin-top:5px;color:var(--dim)}
.bgtaskmsg:empty{display:none}
.bgtaskmsg.err{color:var(--rose)}
.bgtlink{margin:0 0 14px;padding:12px 14px;border:1px solid var(--line);border-radius:12px;background:var(--card)}
.bgtlinkhd{display:flex;gap:8px;align-items:center;flex-wrap:wrap;justify-content:space-between;margin-bottom:8px}
.bgtlink .rtable{margin-bottom:10px;max-height:360px;overflow:auto}
table.bgtlt{width:100%;border-collapse:collapse;font-size:13px}
table.bgtlt th,table.bgtlt td{padding:6px 8px;border-bottom:1px solid var(--line);text-align:left;white-space:nowrap}
table.bgtlt th{color:var(--dim);font-weight:600;font-size:12px}
table.bgtlt td.num{text-align:right;font-variant-numeric:tabular-nums}
table.bgtlt td.bgtyr{color:var(--amber)}
.bgtvh{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
table.rp.bgtrp{min-width:1180px}                                /* 열 14 — 보고서 표(1500px)보다 좁게 */
table.rp.bgtrp td.bgtgn{color:var(--amber);font-weight:600}
table.rp.bgtrp td.bgtyr{color:var(--amber);font-weight:700;background:color-mix(in srgb, var(--amber) 14%, transparent)}
table.rp.bgtrp tr.rgrp.bgtg td{color:var(--cyan)}
table.rp.bgtrp td.rpc-stage .badge{white-space:nowrap}
.bgtempty{padding:36px 20px}
.bgtcl{white-space:nowrap}
@media (max-width:700px){
  .bgtf .frow{flex-direction:column;align-items:stretch}          /* 걸러 보기 한 열 */
  .bgtf .fld select,.bgtf .bgtaddf .go{width:100%;min-width:0}
  .bgtf .bgtaddf{margin-left:0}
  .bgtf .bgtaddf label{display:none}
  .bgtsr .bgtpie .donut svg{width:140px;height:140px}
  .bgtsr .bgtdl{flex-basis:100%}
  .bgtsr .bgtnav button,.bgtsr .bgtacts button{min-height:40px}
}
/* ═══ /v98 ═══ */
#ctModal .vatrow{display:flex;gap:6px;align-items:stretch}
#ctModal .vatrow input{flex:1 1 auto;width:auto;min-width:0}
#ctModal button.vatbtn{flex:none;white-space:nowrap;background:var(--card2);border:1px solid var(--line);color:var(--dim);
  padding:0 10px;border-radius:7px;font-size:12px;font-family:inherit;cursor:pointer}
#ctModal button.vatbtn:hover{color:var(--text);border-color:var(--dim)}
#ctModal button.vatbtn[aria-pressed="true"]{color:var(--amber);border-color:var(--amber);font-weight:650}
#ctModal button.vatbtn[hidden]{display:none}
#ctModal .vatnet{margin-top:3px;font-size:11.5px;color:var(--amber);line-height:1.4}
#ctModal .vatnet[hidden]{display:none}
#ctModal .kallshow{padding:9px 11px;border:1px dashed var(--line);border-radius:7px;font-size:13.5px;color:var(--dim)}
#ctModal .kallshow.on{color:var(--ok);border-style:solid}
#ctModal .drfiles{margin-top:8px;padding:8px 10px;border:1px dashed var(--line);border-radius:8px;font-size:12.5px}
#ctModal .drfiles[hidden]{display:none}
#ctModal .drfh{color:var(--dim);margin-bottom:4px;line-height:1.5}
#ctModal .drf{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:4px 0;border-top:1px solid var(--line)}
#ctModal .drfn{min-width:0;overflow-wrap:anywhere;color:var(--text)}
#ctModal .ctbtns{display:flex;gap:8px;margin-top:16px}
#ctModal .ctbtns button.go{flex:1 1 auto;padding:12px}
#ctModal .ctbtns button.ghost{flex:none;padding:12px 18px}
#ctModal .ctbtns button.ghost[hidden]{display:none}
#ctModal .ctbtns button:disabled{opacity:.45;cursor:default}
#ctModal .ctwhy{margin-top:8px;font-size:12px;color:var(--dim);line-height:1.5}
#ctModal .ctwhy[hidden]{display:none}
#ctNote .ctdrn{margin-top:8px;padding-top:8px;border-top:1px dashed var(--line);color:var(--text)}
#ctNote .ctdrn a{color:var(--cyan)}
#ctNote .ctdrerr{color:var(--rose)}
.drmark{display:inline-block;margin-left:4px;padding:0 6px;border:1px solid var(--amber);border-radius:10px;color:var(--amber);
  font-size:11px;line-height:16px;font-weight:600;white-space:nowrap;vertical-align:1px}
.bellpanel .drrow .drk{color:var(--dim);font-size:11.5px}
.rqdrafts{margin:0 0 18px}
.rqdrafts .rqdh{margin:0 0 4px;font-size:14px;color:var(--text)}
.rqdrafts .rqdh .n{color:var(--amber);margin-left:4px}
table.rq.rqdr{min-width:640px}
.rqdrafts .rqdrerr{color:var(--rose);font-size:12px;margin-top:4px}
.rqdrafts .rqdrerr:empty{display:none}
@media (prefers-reduced-motion:reduce){
  #ctModal .bsw input,#ctModal .bsw input::after{transition:none}
}
@media (max-width:700px){
  table.rq.rqdr{min-width:0}
  #ctModal .ctbtns button.ghost{padding:12px 14px}
}
/* ═══ /v63 form ═══ */

/* ═══ v63 ui_detail ═══ 단지 상세 머리(세대수·12자리) · 기본 정보(K-apt) 접기 · 우리 정보 [수정] · 전자투표 캐시 드롭다운 · 연락처 · 설치 이벤트 · 부가세 포함 표시 (cxinfo.js)
   색은 모두 :root 변수로 (밝은 모드·유리 테마가 저절로 맞게) */
.mhead h3 .sede{font-size:14px;font-weight:500;color:var(--dim);white-space:nowrap}
.mhead .loc.oi12{font-family:Consolas,monospace;letter-spacing:.06em;color:var(--cyan)}
.kapt>summary{list-style:none;cursor:pointer;display:flex;align-items:baseline;flex-wrap:wrap;gap:2px 12px;border-radius:6px}
.kapt>summary::-webkit-details-marker{display:none}
.kapt>summary h4{margin:0}
.kapt>summary h4::before{content:"▸";font-size:.8em;margin-right:2px}
.kapt[open]>summary h4::before{content:"▾"}
.kapt[open]>summary{margin-bottom:12px}
.kapt[open] .kaptsum{display:none}
.kapt>summary:focus-visible{outline:2px solid var(--cyan);outline-offset:3px}
.kaptsum{font-size:12px;color:var(--dim)}
.kaptsum .kaptph{color:var(--text);white-space:nowrap}   /* v76: 비고객 단지 — 접힌 기본 정보 머리 줄의 관리소 전화 (핵심 정보 칸이 없어 펼치지 않아도 보이게) · v101: 모든 단지 · 팩스도 */
/* v101 (명세 2-B): 접힌 머리 줄 = 주소 · 관리소 · 팩스 (모든 단지) — 긴 주소는 375px 에서 줄바꿈 (가로 넘침 없음) · 값 없음 = 흐린 기울임 · 클래스 이름 2026-10-27 grep: 없음 (.kaptad · .kaptna) */
.kapt>summary .kaptsum{min-width:0;overflow-wrap:anywhere}
.kaptsum .kaptad{color:var(--text);font-weight:600}
.kaptsum .kaptna{font-style:italic}
.cxf .k{display:flex;align-items:center;gap:6px}
.cxeb{margin-left:auto;flex:none}
.cxf .k button.mini{min-height:0;padding:1px 8px;font-size:11.5px;line-height:1.5;white-space:nowrap}
.cxed input[type],.cxed select,.cxform input[type],.cxform select{width:100%;min-width:0;max-width:100%;background:var(--card2);
  border:1px solid var(--line);color:var(--text);padding:7px 10px;border-radius:7px;font-size:13.5px;font-family:inherit}
.cxed input[type]:focus,.cxed select:focus,.cxform input[type]:focus,.cxform select:focus{outline:none;border-color:var(--cyan)}
.cxedb{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-top:6px}
.cxedb[hidden]{display:none}
.cxmsg{font-size:12px;margin-top:4px;overflow-wrap:anywhere}
.cxedb .cxmsg{margin-top:0}
.cxmsg.bad{color:var(--rose)} .cxmsg.wait{color:var(--dim)} .cxmsg.dimmsg{color:var(--amber)} .cxmsg.ok{color:var(--ok)}
/* v101 (명세 2-J): 활동 기록 창의 연락처 — 창 맨 위 입력 칸(#actCtForm — .cxform 그대로) · '연락처 N' 접는 줄(#actCtSec)
   클래스 이름 2026-10-27 grep: 없음 (.actctsec · .actcth · .actcttog · .actctnote · .actctlist · .cxctbad) · #actModal :focus{outline:none} 을 이기려고 초점 테는 #actModal 붙여 */
.actctsec{margin:0 0 14px;padding:0 0 10px;border-bottom:1px dashed var(--line);min-width:0}
.actctsec[hidden],.actctlist[hidden],.actcttog[hidden],.actctnote[hidden],#actCtForm[hidden]{display:none}
#actCtForm .cxform{margin:0 0 12px}
.actcth{display:flex;align-items:center;flex-wrap:wrap;gap:4px 10px;min-width:0}
.actcttog{display:inline-flex;align-items:center;gap:6px;padding:4px 2px;margin:0;background:none;border:0;border-radius:6px;color:var(--hi);font:inherit;font-size:13.5px;font-weight:600;text-align:left;cursor:pointer}
.actcttog:hover{background:color-mix(in srgb,var(--cyan) 8%,transparent)}
#actModal .actcttog:focus-visible{outline:2px solid var(--cyan);outline-offset:1px}
.actcttog #actCtCnt{font-weight:400;color:var(--dim)}
.actctnote{font-size:13.5px;font-weight:600;color:var(--hi);overflow-wrap:anywhere;min-width:0}
.actctnote .dim,.actctnote .cxctbad{font-weight:400;font-size:12.5px}
.cxctbad{color:var(--rose)}
#actCtSec .cxmsg{margin-top:0}
.actctlist{padding-top:8px;min-width:0}
.cxok{margin-left:8px;font-size:12px;color:var(--ok);font-weight:600}
.cxev{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.cxed.cxev select{flex:1 1 90px;width:auto}
.cxev .cxedb{margin-top:0}
.cxevamt{margin-top:4px;font-size:12px;overflow-wrap:anywhere}
.cxcts{display:flex;flex-direction:column;gap:6px}
.cxct{display:flex;flex-wrap:wrap;align-items:center;gap:4px 12px;padding:8px 12px;border:1px solid var(--line);border-radius:8px;
  background:var(--card2);font-size:13.5px;min-width:0}
.cxct.on{border-color:var(--cyan)}
.cxct .cxrole{font-size:12px;color:var(--cyan);border:1px solid var(--line);border-radius:10px;padding:0 8px;white-space:nowrap}
.cxct .cxname{font-weight:600;color:var(--text);overflow-wrap:anywhere}
.cxct a{color:var(--cyan);text-decoration:none;overflow-wrap:anywhere;min-width:0}
.cxct a:hover{text-decoration:underline}
.cxct .mini{margin-left:auto}
.cxwhen{font-size:12px}
.cxform{margin-top:8px;padding:10px 12px;border:1px solid var(--line);border-radius:8px;background:var(--card2)}
.cxfh{font-size:13px;font-weight:600;color:var(--text);margin-bottom:6px}
.cxfrow{display:flex;flex-wrap:wrap;gap:8px 12px;align-items:flex-end}
.cxfrow label{display:flex;flex-direction:column;gap:3px;font-size:12px;color:var(--dim);flex:1 1 150px;min-width:0}
.cxfrow label[hidden]{display:none}
.cxform .hint{margin-top:6px}
.ctr .det>span{min-width:0}
.cxinst{margin-top:8px;padding:8px 10px;border:1px dashed var(--line);border-radius:8px;font-size:12.5px;color:var(--dim)}
.cxinst[hidden]{display:none}
.cxinrow{display:flex;flex-wrap:wrap;align-items:center;gap:4px 12px}
.cxinrow .k{color:var(--text);font-weight:600}
.cxinrow b{color:var(--text);font-weight:500}
.cxinrow .mini{margin-left:auto}
.cxinform{margin-top:8px}
.vatb{font-size:11px;color:var(--amber);border:1px solid var(--line);border-radius:8px;padding:0 6px;white-space:nowrap}
@media (max-width:700px){
  .cxed input[type],.cxed select,.cxform input[type],.cxform select{font-size:16px}   /* 16px 미만이면 iOS 가 누를 때 확대한다 */
  .cxfrow label{flex-basis:100%}
  .cxct .mini,.cxinrow .mini{margin-left:0}
}
/* ═══ /v63 ui_detail ═══ */

/* ═══ v63 ui_activity ═══ */
/* 활동 기록 제안 칸: 고른 제품의 칸만 (actProdChange 가 hidden 을 켜고 끈다) */
#actModal [data-act-for][hidden]{display:none}
.actprop .actpnote{font-size:12.5px;line-height:1.5;margin:6px 0 0}
.actprop>.actpnote{grid-column:1/-1;margin:2px 0 6px}   /* 제품 안 고름·전용 칸 없음·옛 열화상 수량 안내 = 한 줄 전체 */
@media (max-width:700px){ .actprop .actsp{display:none} }   /* 한 열일 때는 옆 칸 높이 맞춤용 빈 제목이 필요 없다 */
/* ═══ /v63 ui_activity ═══ */

/* ═══ v63 parking ═══ */
/* 주차차단기 업체 (DB schema_v57) — 우리 정보 칸(.cxpkf, 한 줄 전체) · 오이천사 카드 한 줄(.cxpk — .cxinst 와 같은 모양) · 편집 칸(.cxpkform) · 계약 등록 폼(#kPkBox)
   색은 토큰만 (밝은 화면 theme-light.css 가 토큰을 바꾼다) */
.cxpkf{grid-column:1/-1}
.cxpkf .v{overflow-wrap:anywhere}
b.pkven{font-weight:600;color:var(--text)}
.pkst{color:var(--dim)}
.pkst.on{color:var(--ok)}
.pkst.stop{color:var(--rose)}
.pkmemo{color:var(--dim);font-size:12.5px;overflow-wrap:anywhere;min-width:0}
#cxPkV .pkmemo{display:block;margin-top:2px}
.cxpk{margin-top:8px;padding:8px 10px;border:1px dashed var(--line);border-radius:8px;font-size:12.5px;color:var(--dim)}
.cxpk[hidden]{display:none}
.cxpk .pkline{min-width:0;overflow-wrap:anywhere}
.cxpkform .pkmemol{flex:2 1 220px}
.cxpkform select:disabled{opacity:.6;cursor:not-allowed}
.cxpkform .pkhint{margin-top:6px;font-size:12px;line-height:1.5;color:var(--dim)}
.cxpkform .pkhint:empty{display:none}
.cxpkform .pkren{margin-top:6px;font-size:12px;width:fit-content;max-width:100%}   /* 같은 업체 — 이름만 고침 (다른 업체로 바꾸는데 날짜가 걸릴 때만) */
.cxpkform .pkren[hidden]{display:none}
.cxpkform .pkren input[type=checkbox]{width:auto;min-height:0;padding:0;margin:0;flex:none}
#cxPkV .pkold{display:block;margin-top:2px;font-size:12px;color:var(--amber)}   /* complex_extras 에 parking 키가 없음 = DB 판이 화면보다 옛날 */
#ctModal .kpkbox{grid-column:1/-1}
#ctModal .kpkbox[hidden]{display:none}
#ctModal .kpkrow{display:flex;flex-wrap:wrap;gap:6px}
#ctModal .kpkrow select,#ctModal .kpkrow input{flex:1 1 180px;width:auto;min-width:0}
#ctModal .kpkrow input[hidden]{display:none}
#ctModal .kpkinfo{margin-top:4px;font-size:12px;line-height:1.5;color:var(--dim)}
#ctModal .kpkinfo.pkwarn{color:var(--amber)}
.loginmsg .ctpkwarn{color:var(--amber)}
@media (max-width:700px){
  #ctModal .kpkrow select,#ctModal .kpkrow input{flex-basis:100%}
}
/* ═══ /v63 parking ═══ */
/* v65 thermal — 열화상 단가표 (thermal.js): 관리자 탭 #secThPrice 의 표·올리기·미리보기·지난 단가표 · 계약 등록 폼 견적 상자 .thq (#kThQuote 안).
   색은 토큰(--text·--dim·--line·--card2·--amber·--ok·--rose)만 — 어두운·glass·밝은 화면이 같이 맞는다. 좁은 화면에서는 표만 가로로 밀린다(.thp-tw) */
.thp-meta{font-size:12.5px;color:var(--dim);margin:0 0 6px;line-height:1.7;overflow-wrap:anywhere}   /* v67: 관리자 탭 #secThPrice → 자료실 (어디서나) */
.thp-meta b{color:var(--text)}
.thp-fn{overflow-wrap:anywhere;word-break:break-all}
.thp-tw{max-width:100%;overflow-x:auto;border:1px solid var(--line);border-radius:10px;margin:6px 0 10px}
table.thp-tbl{font-size:12.5px;min-width:560px}
table.thp-tbl th{white-space:nowrap}
table.thp-tbl td{padding:6px 10px;vertical-align:middle}
table.thp-tbl td.n{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
table.thp-tbl td.g{color:var(--dim)}
table.thp-tbl td.thp-chg{color:var(--amber);font-weight:650;box-shadow:inset 0 0 0 1.5px var(--amber);border-radius:4px}
table.thp-tbl .thp-was{display:block;font-size:11px;font-weight:400;color:var(--dim);text-decoration:line-through}
table.thp-tbl tr.thp-new td{background:color-mix(in srgb,var(--ok) 8%,transparent)}
table.thp-tbl tr.thp-gone td{color:var(--dim);text-decoration:line-through}
table.thp-htbl{min-width:620px}
table.thp-htbl td{white-space:nowrap}
table.thp-htbl td.thp-fn{white-space:normal;max-width:260px}
.thp-tag{display:inline-block;font-size:10.5px;line-height:1.4;border:1px solid currentColor;border-radius:4px;padding:0 4px;margin-left:6px;vertical-align:middle;text-decoration:none}
.thp-tag.new{color:var(--ok)}
.thp-tag.gone{color:var(--rose)}
.thp-up{display:flex;flex-wrap:wrap;gap:6px 10px;align-items:center;margin:4px 0 8px;font-size:12px;color:var(--dim);min-width:0}
.thp-up span{min-width:0;overflow-wrap:anywhere}
.thp-draft{margin:10px 0;padding:12px 14px;border:1px dashed var(--amber);border-radius:10px;min-width:0}
.thp-draft .thp-dh{font-size:13px;margin-bottom:6px;color:var(--text);overflow-wrap:anywhere}
.thp-warn{color:var(--amber);font-size:12.5px;margin:4px 0 8px}
.thp-warn ul{margin:2px 0;padding-left:18px}
.thp-sum{font-size:12.5px;color:var(--dim);margin:4px 0}
.thp-sum b{color:var(--text)}
.thp-form{display:flex;flex-wrap:wrap;gap:8px 12px;align-items:center;margin-top:8px;font-size:12.5px;color:var(--dim)}
.thp-form label{display:flex;align-items:center;gap:6px;min-width:0;white-space:nowrap}
.thp-form .thp-notel{flex:1 1 260px}
.thp-form .thp-notel input{flex:1 1 auto;width:auto;min-width:0}
.thp-form .thp-btns{display:flex;gap:6px}
.thp-hist{margin-top:12px}
.thp-hist summary,.thp-curd summary{cursor:pointer;font-size:13px;color:var(--dim);padding:4px 0}
.thp-hist summary:hover,.thp-curd summary:hover{color:var(--text)}
/* 견적 상자 (계약 등록 폼 — detail.js 가 #kThQuote 에 thQuoteHtml 결과를 넣는다) */
.thq{font-size:12.5px;line-height:1.5;border:1px solid var(--line);border-radius:10px;padding:8px 11px;background:var(--card2);color:var(--text);min-width:0;overflow-wrap:anywhere}
.thq.thq-empty{color:var(--dim)}
.thq-h{font-weight:650;margin-bottom:4px}
.thq-src{font-weight:400;color:var(--dim)}
.thq-r{display:flex;flex-wrap:wrap;gap:0 10px;align-items:baseline;padding:4px 0;border-top:1px solid var(--line)}
.thq-k{flex:1 1 150px;min-width:0}
.thq-s{color:var(--dim);font-size:11.5px}
.thq-m{color:var(--dim);font-variant-numeric:tabular-nums}
.thq-v{margin-left:auto;text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
.thq-sum .thq-k,.thq-sum .thq-v{font-weight:650}
.thq-na{color:var(--amber);white-space:normal}
.thq-note{margin-top:6px;padding-top:6px;border-top:1px solid var(--line);color:var(--dim);font-size:11.5px}
@media (max-width:700px){
  .thp-form label{flex:1 1 100%}
  .thp-form input[type=date]{flex:1 1 auto;min-width:0}
  .thq-m{flex-basis:100%;order:3;font-size:11.5px}
}
/* ═══ /v65 thermal ═══ */

/* v65 approval */
/* ═══ v65: 결재 (approval.js) — 탭 목록 · 문서 창(#apDocMask) · 새 결재 창(#apMask). 색은 토큰(var(--…))만 써서 세 테마(기본·glass·밝은)에서 그대로 맞는다.
   입력 칸 바탕은 :where() 로 우선순위를 낮춰 theme-glass·theme-light 의 입력 모양이 이기게 둔다 (기본 어두운 화면에서만 이 바탕) */
.appr-modal{max-width:760px}
.appr-modal [hidden]{display:none}                                   /* .fld{display:flex} 등이 hidden 을 이기지 않게 */
:where(.appr-modal) textarea,:where(.appr-modal) input[type=file],:where(.appr-modal) input[type=date]{background:var(--card2);border:1px solid var(--line);color:var(--text);border-radius:8px;padding:9px 11px;font-size:13.5px;font-family:inherit}
:where(.appr-modal) textarea{resize:vertical;line-height:1.5}
:where(.appr-modal) textarea:focus{outline:none;border-color:var(--cyan)}
.appr-modal textarea,.appr-in{width:100%;box-sizing:border-box}
.appr-modal input[type=file]{width:100%;box-sizing:border-box;border-style:dashed;cursor:pointer;margin-top:6px}
.appr-modal .mhead h3 .badge{vertical-align:3px;margin-right:4px}
.appr-modal .mhead h3{overflow-wrap:anywhere}
.appr-modal .mhead>div:first-child{min-width:0}
.appr-sm{font-size:11.5px}
/* 목록 */
.appr-newfld{margin-left:auto}
.seg.appr-boxes button .pill{margin-left:3px;vertical-align:1px}
.appr-tblw{overflow-x:auto}
table.appr-tbl{min-width:860px}
table.appr-tbl td{vertical-align:top;font-size:13px;line-height:1.5}
table.appr-tbl td.nw{white-space:nowrap}
table.appr-tbl td.appr-t{min-width:220px;max-width:360px;overflow-wrap:anywhere}
table.appr-tbl tr.turn td{background:color-mix(in srgb,var(--amber) 9%,transparent)}
table.appr-tbl tr.wd td{opacity:.7}
table.appr-tbl tr:focus-visible{outline:2px solid var(--cyan);outline-offset:-2px}
.badge.appr-kind{color:var(--violet);border-color:color-mix(in srgb,var(--violet) 45%,transparent);background:transparent}
.badge.appr-ret{color:var(--amber);border-color:color-mix(in srgb,var(--amber) 55%,transparent);background:color-mix(in srgb,var(--amber) 12%,transparent)}
.badge.appr-turn{color:var(--amber);border-color:var(--amber);background:transparent;font-weight:600}
.badge.appr-unck{color:var(--cyan);border-color:var(--cyan);background:transparent}
.appr-dots{display:inline-flex;gap:3px;vertical-align:middle}
.appr-dots i{display:inline-block;width:9px;height:9px;border-radius:50%;border:1.5px solid var(--dim);box-sizing:border-box}
.appr-dots i.done{background:var(--cyan);border-color:var(--cyan)}
.appr-dots i.cur{background:var(--amber);border-color:var(--amber)}
.appr-dots i.ret{border-color:var(--amber);border-style:dashed}
.appr-dots i.no{background:var(--rose);border-color:var(--rose)}
.appr-more{text-align:center;margin:12px 0}
.appr-sum{font-size:13px;color:var(--dim);margin:0 2px 10px}
.appr-sum b{color:var(--cyan);font-variant-numeric:tabular-nums}
/* 문서 창 */
.appr-sec h4{margin-bottom:10px}
.appr-grid{grid-template-columns:repeat(auto-fill,minmax(160px,1fr))}
.appr-grid .f .v{overflow-wrap:anywhere}
.appr-grid .f.appr-wide{grid-column:span 2}
.appr-bodyk{font-size:11.5px;color:var(--dim);margin:12px 0 4px}
.appr-body{background:var(--card2);border:1px solid var(--line);border-radius:8px;padding:10px 12px;font-size:13.5px;line-height:1.65;overflow-wrap:anywhere}
.appr-itw{margin-top:10px;overflow-x:auto}
table.appr-items{min-width:0}
table.appr-items tbody tr{cursor:default}
table.appr-items td{font-size:13px;overflow-wrap:anywhere}
table.appr-items tr.appr-tot td{font-weight:650}
.appr-files{display:flex;flex-wrap:wrap;gap:6px}
button.mini.appr-file{max-width:100%;text-align:left;overflow-wrap:anywhere;white-space:normal}
.appr-why{margin:0 0 16px;border-radius:0 8px 8px 0}
.appr-why.ret{border-left-color:var(--amber)}.appr-why.ret b{color:var(--amber)}
.appr-why.wd{border-left-color:var(--dim)}.appr-why.wd b{color:var(--dim)}
.appr-whyt{margin-top:4px;color:var(--text);overflow-wrap:anywhere}
.appr-rev{color:var(--amber)}
ol.appr-steps{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}
.appr-step{border:1px solid var(--line);border-left:3px solid var(--line);border-radius:8px;padding:8px 12px;background:var(--card2)}
.appr-step.cur{border-left-color:var(--amber);box-shadow:0 0 0 1px color-mix(in srgb,var(--amber) 35%,transparent)}
.appr-step.done{border-left-color:var(--ok)}
.appr-step.no{border-left-color:var(--rose)}
.appr-step.ret{border-left-color:var(--amber);border-left-style:dashed}
.appr-step.skip{opacity:.7}
.appr-sh{display:flex;flex-wrap:wrap;gap:6px;align-items:center;font-size:13px}
.appr-mode{font-size:11.5px;color:var(--dim)}
ul.appr-sus{list-style:none;margin:6px 0 0;padding:0}
.appr-su{padding:4px 0;border-top:1px solid var(--row)}
.appr-su:first-child{border-top:0}
.appr-sun{display:flex;flex-wrap:wrap;gap:4px 8px;align-items:center;font-size:13px}
.appr-suc{font-size:12.5px;color:var(--text);opacity:.88;margin:2px 0 0 2px;overflow-wrap:anywhere}
.appr-ro{font-size:13px;margin-top:4px;line-height:1.7}
.appr-refs{display:flex;flex-wrap:wrap;gap:6px}
.appr-ref{border:1px solid var(--line);border-radius:20px;padding:3px 10px;font-size:12.5px;overflow-wrap:anywhere}
.appr-ref.ok{border-color:color-mix(in srgb,var(--ok) 55%,transparent)}
.appr-act{margin:0 0 18px;padding:12px 14px;border:1px solid var(--line);border-radius:10px;background:var(--card2)}
.appr-actbtns{display:flex;flex-wrap:wrap;gap:8px;margin-top:6px;align-items:center}
button.mini.appr-bbig{padding:8px 16px;font-size:13px}
button.mini.appr-retb{color:var(--amber);border-color:color-mix(in srgb,var(--amber) 55%,transparent)}
.appr-actbox{margin:0 0 18px;padding:12px 14px;border:1px solid var(--line);border-left:3px solid var(--cyan);border-radius:0 10px 10px 0;background:var(--card2)}
.appr-actbox.ok{border-left-color:var(--ok)}.appr-actbox.no{border-left-color:var(--rose)}.appr-actbox.ret{border-left-color:var(--amber)}
.appr-acth{font-size:13px;font-weight:600}
.appr-actbtn{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:8px}
.appr-acterr{color:var(--rose);font-size:12.5px}
ul.appr-cms{list-style:none;margin:0 0 10px;padding:0}
ul.appr-cms li{padding:8px 0;border-top:1px solid var(--row)}
ul.appr-cms li:first-child{border-top:0}
.appr-cmh{font-size:12.5px}
.appr-cmb{font-size:13.5px;margin-top:2px;overflow-wrap:anywhere}
.appr-cmin{display:flex;gap:8px;align-items:flex-end}
.appr-cmin textarea{flex:1 1 auto;min-width:0}
.appr-cmin button{flex:none}
ul.appr-tl{list-style:none;margin:0;padding:0;font-size:12.5px}
ul.appr-tl li{padding:5px 0;border-top:1px solid var(--row);overflow-wrap:anywhere}
ul.appr-tl li:first-child{border-top:0}
.appr-tld{color:var(--dim);font-variant-numeric:tabular-nums}
.appr-tla{color:var(--cyan)}
.appr-tlc{color:var(--text);opacity:.85;margin:2px 0 0 2px;overflow-wrap:anywhere}
/* 작성 중 확인 (창 안) */
.appr-dirty{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin:0 0 14px;padding:10px 14px;border:1px solid var(--amber);border-radius:10px;background:color-mix(in srgb,var(--amber) 10%,transparent);font-size:13px}
.appr-dirty span{flex:1 1 220px}
/* 새 결재 창 */
.seg.appr-kinds button:disabled{cursor:default;opacity:.55}
.seg.appr-kinds button.on:disabled{opacity:1}
.appr-kgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:10px;margin-top:14px}
.appr-kgrid .fld select,.appr-kgrid .fld input{width:100%;min-width:0;box-sizing:border-box}
.appr-kgrid .appr-cxfld{grid-column:span 2}
.appr-dayhint{margin-top:6px}
.appr-bad{color:var(--rose)}
.appr-its{display:flex;flex-direction:column;gap:8px}
.appr-it{display:grid;grid-template-columns:minmax(150px,1.6fr) minmax(110px,1.2fr) 80px 110px minmax(90px,1fr) 34px;gap:8px;align-items:end;padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:var(--card2)}
.appr-it .fld input,.appr-it .fld select{width:100%;min-width:0;box-sizing:border-box}
.appr-itn input{margin-top:6px}
.appr-amt{padding:8px 0;font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap}
.appr-itx{display:flex;justify-content:flex-end;padding-bottom:4px}
.appr-itfoot{display:flex;flex-wrap:wrap;gap:8px;align-items:center;justify-content:space-between;margin-top:8px}
.appr-total{font-size:13.5px}
.appr-total b{color:var(--cyan);font-variant-numeric:tabular-nums}
.appr-lineh{display:flex;flex-wrap:wrap;gap:8px;align-items:flex-end;justify-content:space-between}
.appr-lineh .flabel{margin-bottom:6px}
.appr-lineh .mini{margin-bottom:6px}
ol.appr-line{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}
.appr-stepc{border:1px solid var(--line);border-radius:10px;padding:10px 12px;background:var(--card2)}
.appr-stch{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:8px}
.seg.appr-modes button{padding:5px 11px;font-size:12.5px}
.appr-stbtn{margin-left:auto;display:inline-flex;gap:4px}
.appr-stbtn .mini{min-width:32px}
.appr-addstep{margin-top:8px}
.appr-noline{padding:10px}
.appr-pick{position:relative}
.appr-chips{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:6px}
.appr-chips:empty{display:none}
.appr-chip{display:inline-flex;align-items:center;gap:4px;max-width:100%;border:1px solid var(--line);border-radius:20px;padding:3px 4px 3px 10px;font-size:12.5px;background:var(--card);overflow-wrap:anywhere}
.appr-x{background:none;border:0;color:var(--dim);cursor:pointer;font-size:15px;line-height:1;padding:2px 6px;border-radius:50%;font-family:inherit}
.appr-x:hover{color:var(--rose)}
.appr-pin{width:100%;box-sizing:border-box}
/* 제안 목록은 아래 글씨가 비치지 않게 불투명 (glass 의 --card 는 반투명이라 알림 종 목록처럼 어두운 바탕을 직접) · 밝은 화면은 같은 :where 모양으로 덮는다 */
.appr-sug{position:absolute;left:0;right:0;top:100%;z-index:3;margin-top:4px;max-height:260px;overflow-y:auto;background:rgba(32,34,41,.97);-webkit-backdrop-filter:blur(16px);backdrop-filter:blur(16px);border:1px solid var(--line);border-radius:10px;box-shadow:0 10px 26px rgba(0,0,0,.35);padding:4px}
:where(:root[data-theme="light"]) .appr-sug{background:var(--lt-pop);box-shadow:0 12px 32px rgba(60,45,20,.16)}
.appr-sugi{display:block;width:100%;text-align:left;background:none;border:0;color:var(--text);padding:7px 10px;border-radius:7px;cursor:pointer;font-size:13px;font-family:inherit;overflow-wrap:anywhere}
.appr-sugi:hover,.appr-sugi.hi{background:var(--card2);outline:1px solid var(--line)}
.appr-sugi:disabled{color:var(--dim);cursor:default;background:none;outline:0}
.appr-sugn{padding:8px 10px;color:var(--dim);font-size:12.5px}
.appr-cxchip{padding-left:12px}
.appr-flist{display:flex;flex-wrap:wrap;gap:6px}
.appr-flist:empty{display:none}
.appr-oldf{margin-bottom:6px;overflow-wrap:anywhere}
.appr-foot{display:flex;flex-wrap:wrap;gap:8px;margin-top:16px}
.appr-foot .go{flex:1 1 200px;padding:12px}
@media (max-width:700px){
  /* 목록 = 카드 한 장씩 (신청 현황과 같은 방식). #apprRoot 로 theme-glass 의 .tblwrap 모바일 규칙을 이긴다 */
  #apprRoot .tblwrap.appr-tblw{background:transparent;border:0;box-shadow:none;overflow:visible;-webkit-backdrop-filter:none;backdrop-filter:none}
  table.appr-tbl,table.appr-tbl tbody,table.appr-tbl tr,table.appr-tbl td{display:block;width:100%;min-width:0;max-width:none}
  table.appr-tbl thead{display:none}
  table.appr-tbl tr,table.appr-tbl tbody tr:hover{background:var(--card);border:1px solid var(--line);border-radius:12px;margin-bottom:10px;padding:10px 14px}
  table.appr-tbl tr.turn{border-color:var(--amber)}
  table.appr-tbl tr.turn td{background:transparent}
  table.appr-tbl td{border:0;padding:3px 0;white-space:normal}
  table.appr-tbl td.nw{white-space:normal}
  table.appr-tbl td.appr-t{min-width:0;max-width:none}
  table.appr-tbl td[data-l]::before{content:attr(data-l);display:inline-block;min-width:56px;font-size:11px;color:var(--dim);margin-right:6px}
  table.appr-tbl td.appr-d,table.appr-tbl td.appr-k{display:inline-block;width:auto;margin-right:8px}
  table.appr-tbl td.appr-d::before,table.appr-tbl td.appr-k::before,table.appr-tbl td.appr-t::before{display:none}
  table.appr-tbl td.appr-d{font-size:12px;color:var(--dim)}
  .seg.appr-boxes{display:flex;flex-wrap:wrap;width:100%}
  .seg.appr-boxes button{flex:1 0 auto;white-space:nowrap;padding:8px 10px}
  .appr-newfld{margin-left:0}
  .appr-grid .f.appr-wide{grid-column:1/-1}   /* 좁은 화면은 열 수가 테마마다 달라(glass 2열 · 기본 1열) 한 줄 전체로 */
  .appr-kgrid{grid-template-columns:1fr}
  .appr-kgrid .appr-cxfld{grid-column:auto}
  .appr-it{grid-template-columns:1fr 1fr;align-items:start}
  .appr-it .appr-itn,.appr-it .appr-its2{grid-column:1/-1}
  .appr-it .appr-ita{grid-column:1/2}
  .appr-it .appr-itx{grid-column:2/3;align-self:end}
  .appr-amt{text-align:left}
  table.appr-items,table.appr-items tbody,table.appr-items tr,table.appr-items td{display:block;width:100%}
  table.appr-items thead{display:none}
  table.appr-items tr{border-bottom:1px solid var(--line);padding:6px 0}
  table.appr-items td{border:0;padding:2px 0;text-align:left}
  table.appr-items td[data-l]::before{content:attr(data-l);display:inline-block;min-width:44px;font-size:11px;color:var(--dim);margin-right:6px}
  .appr-stbtn{margin-left:0}
  .appr-cmin{flex-direction:column;align-items:stretch}
  .appr-modal textarea{font-size:16px}   /* 16px 미만이면 iOS 가 누를 때 확대한다 */
}
/* ═══ /v65 approval ═══ */

/* ═══ v67 W1 — 두 줄 메뉴 (nav.js) · 자료실 (library.js) ═══ 색은 변수만 (밝은 화면 저절로) */
.navtop{display:flex;flex-wrap:wrap;gap:4px;margin:0 0 8px}
.navtop[data-solo="1"]{margin-bottom:18px}
button.navg{display:inline-flex;align-items:center;gap:4px;background:none;border:1px solid transparent;border-radius:10px;color:var(--dim);
  font-family:inherit;font-size:15px;font-weight:600;padding:8px 16px;min-height:40px;cursor:pointer;white-space:nowrap;
  transition:background .15s,color .15s,border-color .15s,transform .12s}
button.navg:hover{color:var(--text);background:var(--card2)}
button.navg.on{color:var(--cyan);background:var(--card);border-color:var(--line)}
button.navg:active{transform:scale(.97)}
button.navg:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}
button.navg .pill{margin-left:2px}
nav.tabs{flex-wrap:wrap;overflow:visible}            /* 넘치면 둘째 줄 — 숨긴 가로 스크롤로 자르지 않는다 (nav.tabs 가 .tabs 보다 구체적이라 style 700px 규칙·glass .tabs 를 이김) */
nav.tabs[data-empty="1"]{display:none}               /* 관리자처럼 아랫줄이 없는 묶음 */
.navsub{display:contents}
.navsub[hidden]{display:none}                        /* display:contents 가 브라우저 기본 [hidden] 을 이기므로 다시 */
@media (max-width:700px){
  .navtop{gap:2px}
  button.navg{flex:1 1 auto;justify-content:center;font-size:14px;padding:8px 8px}
  nav.tabs button.tab{flex:1 1 auto}
}
@media (prefers-reduced-motion:reduce){ button.navg{transition:none} }
/* 자료실 */
.libhead{display:flex;justify-content:space-between;align-items:flex-start;gap:12px;flex-wrap:wrap;margin:0 0 10px}
.libhead .adesc{margin:0;flex:1 1 320px;min-width:0}
.libfilter{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin:0 0 12px}
#propChips{display:contents}
.libchip{background:var(--card);border:1px solid var(--line);border-radius:16px;color:var(--dim);font:inherit;font-size:12.5px;padding:5px 12px;min-height:32px;cursor:pointer}
.libchip.on{color:var(--text);border-color:var(--cyan);font-weight:600}
.libfilter input.libq{flex:1 1 180px;min-width:0;width:auto}   /* 찾기 칸 = 글자 칸 (세 테마의 input[type=text] 모양 그대로) */
.libret{display:inline-flex;align-items:center;gap:4px;font-size:12.5px;color:var(--dim);white-space:nowrap}
.libcards{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px}
.libcard{min-width:0}
.libc-top{display:flex;align-items:center;gap:8px;font-size:15px;min-width:0}
.libc-t{overflow-wrap:anywhere;min-width:0}
.libext{flex:none;font:700 11px/1 Consolas,monospace;border:1px solid var(--line);border-radius:6px;padding:4px 6px;color:var(--cyan)}
.libext.x-ppt{color:var(--amber)} .libext.x-xls{color:var(--ok)} .libext.x-doc,.libext.x-hwp{color:var(--violet)} .libext.x-img{color:var(--rose)}
.libc-s{font-size:13px;color:var(--text);overflow-wrap:anywhere}
.libc-m{font-size:12px;color:var(--dim);overflow-wrap:anywhere}
.libc-nopv{align-self:center}
.libc-mg{margin-top:0;padding-top:6px;border-top:1px dashed var(--line)}   /* 관리 버튼 줄 (양식 담당) */
/* v85 (명세 4-2 · 4-4 — library.js libPCard* · libPvActsHtml · libDataOpen): 단가표 카드 · 카드 상태 한 줄 · 빈 제품 카드 · 편집 화면 머리줄 · 창 막대 단추 · 표 칸.
   색은 토큰만 (어두운·glass·밝은 화면 같이) · 새 모양 규칙은 :where (우선순위를 올리지 않음) · !important 없음 */
.libext.x-tbl{color:var(--sky)}                                       /* '표' 배지 (열화상 · 원칙 가격표) — 다른 확장자 배지와 같은 우선순위 */
:where(.libcard.libpc-empty){opacity:.62}                             /* 빈 제품 카드 (자료실 관리자에게만) — 흐리게 (.empty 는 빈 목록 글 규칙이 이미 있어 쓰지 않음) */
:where(.libcard.libpc-empty):hover,:where(.libcard.libpc-empty):focus-within{opacity:1}
:where(.libc-st){font-size:12px;line-height:1.5;color:var(--dim);overflow-wrap:anywhere}   /* 카드 상태 한 줄 (검토중 · 반려 — 띠는 [보기] 창에) */
:where(.libc-st) .badge{margin-right:2px}
:where(.libc-wip){color:var(--amber)}                                 /* '수정하던 내용 있음 — [이어서 수정]' */
:where(.libc-wip) .mini{margin-left:6px}
:where(#libPCards>.libpc-wide){grid-column:1/-1}
:where(.libpcrumb){margin:0 0 10px}                                   /* 편집 화면 '← 단가표 목록' 머리줄 (계약서 .fmcrumb 모양) */
:where(.libpcrumb) .fmct{font-size:14px;color:var(--dim);font-weight:600;overflow-wrap:anywhere;min-width:0}
:where(.libpv-acts){display:inline-flex;flex-wrap:wrap;gap:6px}
:where(.libpv-why){font-size:12px;color:var(--amber);overflow-wrap:anywhere}   /* 꺼진 [수정] 옆 까닭 (상황 글 — ⓘ 아님) */
.libpv-bar:empty,#libPvBand:empty{display:none}
#libPvModal.libpv-data{max-width:1100px}
:where(#libPvBand) .libpend,:where(#libPvBand) .librej{margin:0 0 10px}
:where(#libPvBand) .thl-pend{margin:0 0 10px}
:where(#libPvData){min-width:0;max-width:100%}
.libpp-tw{overflow-x:auto}                                            /* 원칙 가격표 창 표 — 375px 에서 표 칸 안에서만 가로 밀기 (.tblwrap 의 overflow:hidden 을 이겨야 해서 :where 아님) */
:where(table.libpp-tbl){min-width:600px}
:where(table.libpp-tbl) td.n,:where(table.libpp-tbl) th.n{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
.libform{background:var(--card2);border:1px solid var(--line);border-radius:10px;padding:12px 14px;margin:8px 0;display:grid;gap:8px;min-width:0}
.libform .lf-row{display:flex;flex-wrap:wrap;gap:8px;align-items:flex-end;min-width:0}
.libform label{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--dim);flex:1 1 180px;min-width:0}
.libform input[type=file]{max-width:100%}
.libf-err{color:var(--rose);font-size:12.5px;overflow-wrap:anywhere}
.libf-err:empty{display:none}
.libpseg{margin:0 0 12px}
#libPvModal{max-width:900px}
#libPvModal:focus{outline:none}
#libPvModal .mhead>div:first-child{min-width:0}
#libPvTitle{overflow-wrap:anywhere}
.libpv-bar{display:flex;flex-wrap:wrap;gap:8px;align-items:center;padding:10px 24px;border-bottom:1px solid var(--line)}
.fmprevbox.libpv-full{overflow-x:auto}
@media (max-width:700px){
  .libcards{grid-template-columns:1fr}
  .libpv-bar{padding:10px 16px}
  .libform label{flex-basis:100%}
  .libpseg{display:flex} .libpseg button{flex:1 1 0}
}
/* v67 W1 — 375px 가로 넘침 (v66 부터 있던 것): 대시보드 칸 묶음(.dgrid)과 관리자 탭의 표가 화면보다 넓어 페이지 전체가 옆으로 밀리던 것.
   칸 묶음은 화면보다 넓은 열을 만들지 않게(min(400px,100%) · 칸 min-width 0) 하고, 넓은 표·타임라인은 그 칸 안에서만 옆으로 밀어 본다 (.tblwrap 과 같은 방식) */
.dgrid{grid-template-columns:repeat(auto-fit,minmax(min(400px,100%),1fr))}
.dgrid>*{min-width:0}
#dExpiring,#dExpMonths{overflow-x:auto}
#boxDivs,#boxLists .dgrid>div{overflow-x:auto}
/* ═══ v67 W2 열화상 단가표 — 자료실 › 단가표 읽기(.thl* — thermal.js thlPaint) · 표 고치기 편집기(.thg* — thgPaint) · 등록 폼 카메라 칸(.kthc* — detail.js ctThCamsRender) ·
   정보 수정 신청 카메라 수량(.crth* — crThRender). 색은 토큰(--text·--dim·--line·--card·--card2·--amber·--rose·--ok·--cyan)만 — 어두운·glass·밝은 화면이 같이 맞는다.
   표는 .thp-tw 안에서만 가로로 밀린다 (문서 전체 가로 밀림 없음) ═══ */
.thl{min-width:0;max-width:100%}
.thl-head{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;margin:0 0 4px}
.thl-ttl{margin:0;font-size:16px;font-weight:650;flex:1 1 auto;min-width:0}
.thl-btns{display:flex;flex-wrap:wrap;gap:6px;margin-left:auto}
.thl-sub{font-size:12.5px;color:var(--dim);margin:2px 0 6px;line-height:1.6}
.thl-meta{font-size:12.5px;color:var(--dim);line-height:1.7;overflow-wrap:anywhere}
.thl-cat{margin:12px 0 4px;min-width:0}
.thl-cat h4{margin:0 0 2px;font-size:14px;font-weight:650;color:var(--text)}
.thl-cat h4 .dim{font-weight:400;color:var(--dim);font-size:12.5px}
.thl-help{font-size:12px;color:var(--dim);margin:0 0 8px;line-height:1.5}
table.thl-tbl td.thl-nm{white-space:nowrap}
table.thl-tbl th.n,table.thg-tbl th.n{text-align:right}   /* 숫자 열 머리도 오른쪽 (값과 같게) */
.thl-tierbar{display:none;margin:6px 0 2px}
.thl-empty{margin:8px 0}
.thl-emptybtns{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0}
.thl-resume{margin:6px 0;padding:8px 12px;border:1px dashed var(--amber);border-radius:10px;font-size:12.5px;color:var(--text);display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;overflow-wrap:anywhere}
.thl-hist{margin-top:14px}
table.thp-tbl tr.thl-hrow>td{padding:8px 10px 12px;background:var(--card2);white-space:normal}
table.thp-htbl td.thl-hbtn{white-space:nowrap}
/* 편집기 */
.thg-head{display:flex;flex-wrap:wrap;align-items:flex-start;gap:4px 10px;margin:0 0 6px;font-size:13px;overflow-wrap:anywhere}
.thg-head>div{flex:1 1 260px;min-width:0}
.thg-cat{margin:14px 0 4px;min-width:0}
.thg-cath{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;margin:0 0 4px}
.thg-cath input.thg-title{max-width:16em;min-width:0;font-weight:650}
.thg-n{font-size:12px}
table.thg-tbl{font-size:12.5px;min-width:760px;width:100%}
table.thg-tbl th{white-space:nowrap;font-size:12px}
table.thg-tbl td{padding:4px 6px;vertical-align:top}
table.thg-tbl td input.thg-in{width:100%;min-width:84px;box-sizing:border-box;padding:6px 8px}
table.thg-tbl td.n input.thg-in{text-align:right;font-variant-numeric:tabular-nums}
table.thg-tbl td input.thg-in[data-f="spec"],table.thg-tbl td input.thg-in[data-f="name"],table.thg-tbl td input.thg-in[data-f="label"]{min-width:120px}
.thg-tbl th.dragc,.thg-tbl td.dragc{width:34px;padding-left:4px;padding-right:0}   /* 손잡이 칸 (style.css 의 .asec 규칙은 관리자 탭 안에서만) */
table.thg-tbl input.thg-in.thg-bad{box-shadow:inset 0 0 0 1.5px var(--rose)}
table.thg-tbl td.thp-chg{box-shadow:inset 0 0 0 1.5px var(--amber);border-radius:4px}
table.thg-tbl .thp-was{display:block;font-size:11px;color:var(--dim);text-decoration:line-through;margin-top:2px}
table.thg-tbl tr.thp-new>td{background:color-mix(in srgb,var(--ok) 8%,transparent)}
table.thg-tbl tr.thg-del>td{opacity:.55}
table.thg-tbl tr.thg-del input.thg-in{text-decoration:line-through}
table.thg-tbl tr.thg-del>td.thg-act{opacity:1}
.thg-use{color:var(--dim);font-size:12px;white-space:nowrap}
.thg-act{white-space:nowrap;min-width:120px}
.thg-act .thp-tag{margin-left:4px}
.thg-rowwarn{display:block;white-space:normal;color:var(--amber);font-size:12px;line-height:1.45;margin-top:3px;min-width:180px;max-width:320px;text-decoration:none}
.thg-lnk{display:inline-block;margin-top:3px;font-size:10.5px;line-height:1.4;color:var(--cyan);border:1px solid currentColor;border-radius:4px;padding:0 4px;white-space:nowrap}
.thg-errs{color:var(--rose);font-size:12.5px;margin:4px 0 6px;padding-left:18px}
.thg-errs:empty,.thg-errs[hidden]{display:none}
.thg-warns{margin:6px 0}
.thg-warns ul{margin:2px 0;padding-left:18px}
.thg-warns[hidden]{display:none}
.thg-bar{position:sticky;bottom:0;background:var(--card);border-top:1px solid var(--line);padding:8px;display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;z-index:2;margin-top:14px;font-size:12.5px;color:var(--dim)}
.thg-bar label{display:flex;align-items:center;gap:6px;white-space:nowrap;min-width:0}
.thg-bar .thg-wide{flex:1 1 220px}
.thg-bar .thg-wide input{flex:1 1 auto;width:auto;min-width:0}
.thg-btns{display:flex;gap:6px}
.thg-bhint{flex:1 1 100%;margin:0}
#thgBarMsg{flex:1 1 100%;min-width:0;overflow-wrap:anywhere}
#thgBarMsg:empty{display:none}
#thgBarMsg .err{margin:0}
.thg-askbox{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;padding:8px 12px;border:1px dashed var(--amber);border-radius:10px;font-size:12.5px;color:var(--text);margin:6px 0;overflow-wrap:anywhere}
/* 등록 폼 카메라 칸 · 정보 수정 신청 카메라 수량 */
.kthcams-h{margin-top:8px}
.kthc-extra .flabel{color:var(--dim)}
.kthc-na{display:inline-block;font-size:10.5px;line-height:1.4;color:var(--amber);border:1px solid currentColor;border-radius:4px;padding:0 4px;margin-left:4px;font-weight:400}
.kthc-drop{margin-top:4px}
.crth{margin-top:10px}
.crth-h{margin-bottom:4px}
@media (max-width:700px){
  .thl-tierbar{display:inline-flex}
  .thl-only-c .th-d25,.thl-only-c .th-d30,.thl-only-d25 .th-c,.thl-only-d25 .th-d30,.thl-only-d30 .th-c,.thl-only-d30 .th-d25{display:none}
  .thl-only-c table.thl-tbl,.thl-only-d25 table.thl-tbl,.thl-only-d30 table.thl-tbl{min-width:0}
  .thg input.thg-in,.thg input.thg-title,.thg-bar input{font-size:16px}   /* 16px 미만이면 iOS 가 칸을 누를 때 화면을 확대한다 */
  .thg-bar label,.thg-bar .thg-wide{flex:1 1 100%}
  .thg-bar label input{flex:1 1 auto;min-width:0}
  .thg-bar{position:static}   /* 좁은 화면: 칸이 한 줄에 하나라 띠가 화면의 반을 덮는다 → 붙이지 않고 편집기 끝에 둔다 */
  .thl-head .thl-btns{margin-left:0}
}
/* ═══ /v67 W2 ═══ */
/* ═══ v68 3차 자료실 (library.js · forms.js · thermal.js — 명세 2·3·4·5-2절): 업데이트 날짜 · 제품마다 단가표 칸 · 문서 팝업 보기 · 새 파일 칸(Claude 초안) ·
   표 고치기 바뀐 칸(빨간 실선 상자 + 원래 값) / 오류 칸(빨간 점선). 색은 토큰만 (--rose·--amber·--ok·--cyan·--line·--card·--card2·--dim·--text — 어두운·glass·밝은 화면 같이) ═══ */
.libupd{white-space:nowrap}
.libupd b{color:var(--text);font-weight:600}
.libhit{outline:2px solid var(--cyan);outline-offset:2px;transition:outline-color .4s}
.warnbox.libinfo{margin:0 0 10px;font-size:12.5px;overflow-wrap:anywhere}
/* (단가표 칸 고르기 칩 .libpchips 는 v85 카드 목록으로 바뀌며 없앴다 — 위 '.libcards' 옆 v85 규칙) */
/* 서비스별 단가표 문서 */
.libpd-head{display:flex;flex-wrap:wrap;align-items:center;gap:6px 12px;margin:0 0 8px}
.libpd-t{margin:0;font-size:16px;font-weight:650;flex:0 1 auto;min-width:0;overflow-wrap:anywhere}
.libpd-head .libupd{font-size:12.5px;color:var(--dim)}
.libpd-head .go{margin-left:auto}
.libpd-note{font-size:12.5px;line-height:1.55;max-height:180px;overflow:auto;border-left:3px solid var(--line);padding:2px 0 2px 10px;overflow-wrap:anywhere}
.libpd-note ul{margin:0;padding-left:16px}
.libpd-note p{margin:0 0 2px}
.libpd-hist{margin-top:14px}
.libpd-hist>summary{cursor:pointer;font-size:13px;color:var(--dim);margin:0 0 8px}
.libpd-card .badge{margin-left:2px}
.libpd-head .libupd.amber{color:var(--amber)}   /* v68 3차 검토: 머리 '시행 예정 vN · 날짜' */
.libpd-sched{margin-top:14px}   /* v68 3차 검토: 시행 예정 판 (지금 판과 따로) */
.libpd-sh{font-size:13px;color:var(--amber);margin:0 0 8px;font-weight:600}
/* 새 파일 칸 · Claude 초안 (단가표 문서 · 제안서) · 계약서 확인 요청 요약 */
.libupf-h{font-size:13.5px}
.libupf-pv{max-height:420px;overflow:auto;border:1px solid var(--line);border-radius:8px;padding:8px;background:var(--card);overscroll-behavior:contain}
.libai{display:grid;gap:4px;min-width:0}
.libform .libai label.libai-l{flex:none}
.libai textarea.lu-note,#thgNote,#fmSum{width:100%;box-sizing:border-box;min-height:96px;resize:vertical;font:inherit;font-size:13px;line-height:1.5}
.libai-bar{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;font-size:12.5px;min-width:0}
.libai-bar:empty{display:none}
.libai-st{flex:1 1 220px;min-width:0;overflow-wrap:anywhere}
.libai-st.dim{color:var(--dim)} .libai-st.ok{color:var(--ok)} .libai-st.amber{color:var(--amber)} .libai-st.rose{color:var(--rose)}
.libai-warn{flex:1 1 100%;margin:2px 0 0;padding-left:18px;color:var(--amber);font-size:12px}
#fmSumAi{margin:4px 0 8px}
/* 문서 팝업 (#libPvMask 문서 칸) */
#libPvModal.libpv-file{max-width:1100px}
.libpv-nav{display:inline-flex;align-items:center;gap:6px;margin-left:auto}
.libpv-note{margin:0 0 12px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:var(--card2);font-size:13px;line-height:1.55;overflow-wrap:anywhere}
.libpv-note .libpv-nh{font-size:12px;color:var(--dim);font-weight:600;margin:0 0 4px}
.libpv-note ul{margin:0;padding-left:18px} .libpv-note p{margin:0 0 2px}
details.libpv-note>summary.libpv-nh{cursor:pointer;margin:0}   /* v68 3차 검토: 계약서 양식 팝업 '이 판에서 바뀐 점' (접힘) */
details.libpv-note[open]>summary.libpv-nh{margin:0 0 4px}
.libdv-host{min-width:0;max-width:100%}
.libdv-msg{display:flex;flex-wrap:wrap;align-items:center;gap:8px;overflow-wrap:anywhere}
.libdv{font-size:13px;line-height:1.55;color:var(--text);min-width:0;overflow-wrap:anywhere}
.libdv-pdf{display:block;width:100%;height:75vh;min-height:420px;border:1px solid var(--line);border-radius:8px;background:#fff}
.libdv-imgbox{margin:8px 0;text-align:center}
.libdv-imgbox .libdv-img{max-width:min(100%,520px);max-height:360px;height:auto;border:1px solid var(--line);border-radius:6px;background:#fff}
.libdv-imgbox.one .libdv-img{max-width:100%;max-height:none}
.libdv-note{margin:0 0 8px}
.libdv-tw{max-width:100%;overflow-x:auto;margin:8px 0}
table.libdv-tbl{border-collapse:collapse;font-size:12.5px;min-width:0;width:auto}
table.libdv-tbl td,table.libdv-tbl th{border:1px solid var(--line);padding:4px 8px;vertical-align:top;text-align:left;white-space:normal;min-width:48px;max-width:360px;overflow-wrap:anywhere}
table.libdv-tbl td.n{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
table.libdv-xl thead th,table.libdv-xl th.libdv-rn{background:var(--card2);color:var(--dim);font-weight:600;font-size:11.5px;text-align:center;min-width:28px}
.libdv-tabs{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 6px}
.libdv-h{font-weight:700;margin:12px 0 4px} .libdv-h.lv1{font-size:16px} .libdv-h.lv2{font-size:14.5px} .libdv-h.lv3{font-size:13.5px}
.libdv-p{margin:0 0 4px;white-space:normal}
.libdv-p.li{position:relative;padding-left:16px}
.libdv-p.li::before{content:"•";position:absolute;left:3px;color:var(--dim)}
.libdv-p.lv1{margin-left:16px} .libdv-p.lv2{margin-left:32px} .libdv-p.lv3{margin-left:48px} .libdv-p.lv4{margin-left:64px}
.libslide{border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin:0 0 12px;background:var(--card2);min-width:0}
.libslide-h{display:flex;align-items:baseline;gap:8px;margin:0 0 6px;font-size:14px;overflow-wrap:anywhere}
.libslide-no{flex:none;font:700 11px/1 Consolas,monospace;border:1px solid var(--line);border-radius:6px;padding:3px 6px;color:var(--cyan)}
/* 2026-10-06 슬라이드 보기 (pptview.js): 슬라이드 상자(.sld)가 CSS 컨테이너 → 안의 위치는 %, 글자·여백·선은 cqw(상자 너비의 1%)라 칸 너비만큼 같이 줄고 는다 (JS 다시 계산 없음).
   상자 안은 파일의 색 그대로(테마와 무관 — 정하지 않은 바탕은 흰색·글자는 검정), 상자 밖 번호·숨김 표시와 테두리만 테마 변수. 화면 전체 규칙(table·td·tr:hover)이 새지 않게 막는다 */
.libdv-vbar{margin:0 0 10px}
.sld-deck{display:flex;flex-direction:column;gap:16px;min-width:0}
.sld-fig{min-width:0}
.sld-cap{display:flex;align-items:center;gap:6px;margin:0 0 5px;font-size:12px;color:var(--dim)}
.sld-hid{font-size:11px;border:1px solid var(--line);border-radius:6px;padding:2px 7px;color:var(--dim)}
.sld-fr{padding:1px;background:#fff;box-shadow:0 0 0 1px var(--line),0 2px 10px rgba(0,0,0,.18)}   /* 1px 띠 = 슬라이드 배경색(pptview.js 가 칠함) → 상자 바로 바깥이 테마와 무관 · 테두리는 그 바깥 */
.sld{position:relative;width:100%;overflow:hidden;container-type:inline-size;background:#fff;color:#000;
  font:400 1.5cqw/1.2 'Malgun Gothic','맑은 고딕','Noto Sans KR',sans-serif;text-align:left;letter-spacing:normal;word-spacing:normal;text-transform:none;text-shadow:none;
  overflow-wrap:break-word;word-break:keep-all;-webkit-user-select:text;user-select:text}
.sld *{box-sizing:border-box}
.sld-bg,.sld-f,.sld-ic,.sld-svg{position:absolute;inset:0}
.sld-s,.sld-gp{position:absolute}
.sld-ic{overflow:hidden}
.sld .sld-img{position:absolute;max-width:none;max-height:none;margin:0;padding:0;border:0;display:block}
.sld-svg{width:100%;height:100%;overflow:visible}
.sld-tx{position:absolute;display:flex;flex-direction:column;min-width:0}
.sld-p{margin:0;white-space:pre-wrap;min-width:0}
.sld-tx.nw .sld-p{white-space:pre}
.sld-bu{display:inline-block;text-indent:0;line-height:0}   /* 글머리표는 다른 글꼴일 수 있어 줄 높이를 키우지 않게 */
.sld-ph{display:flex;align-items:center;justify-content:center;background:#f2f2f2;border:1px dashed #bdbdbd;color:#8c8c8c;font-size:1.4cqw}
.sld table.sld-tbl{border-collapse:collapse;table-layout:fixed;min-width:0;margin:0;font-size:inherit;background:transparent}
.sld .sld-tbl td{padding:0;border:0;vertical-align:top;background:transparent;white-space:normal;min-width:0;max-width:none;text-align:left;font-size:inherit;overflow:hidden}
.sld .sld-tbl tr,.sld .sld-tbl tbody tr:hover{background:transparent;cursor:default}
.sld-ct{position:absolute;left:0;right:0;text-align:center;white-space:nowrap;overflow:hidden;line-height:1.2}
.sld-cl{position:absolute;display:flex;flex-direction:column;justify-content:center;gap:.3em;line-height:1.2;overflow:hidden}
.sld-cl.row{flex-direction:row;flex-wrap:wrap;align-items:center;justify-content:center;gap:.3em 1.2em}
.sld-cl>div{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sld-cl i{display:inline-block;width:.6em;height:.6em;margin-right:.35em;vertical-align:0}
.sld-cpa,.sld-cp{position:absolute}
.sld-cg,.sld-cb,.sld-cv,.sld-cm{position:absolute}
.sld-cy{position:absolute;right:100%;margin-right:.5em;transform:translateY(50%);white-space:nowrap;line-height:1}
.sld-cy.h{right:auto;top:100%;margin:.55em 0 0;transform:translateX(-50%)}
.sld-cx{position:absolute;top:100%;margin-top:.55em;transform:translateX(-50%);text-align:center;line-height:1.15;overflow:hidden}
.sld-cx.h{top:auto;right:100%;margin:0 .45em 0 0;transform:translateY(50%);text-align:right;white-space:nowrap}
.sld-cv{transform:translate(-50%,-.25em);white-space:nowrap;line-height:1}
.sld-cv.h{transform:translate(.3em,50%)}
.sld-cm{width:.9cqw;height:.9cqw;margin:-.45cqw 0 0 -.45cqw;border-radius:2px}
.sld-cp svg{width:100%;height:100%}
/* 표 고치기 (thermal.js thg*) — 바뀐 칸 = 빨간 실선 상자 + 원래 값 · 오류 칸 = 빨간 점선 (두 모양을 같이 달아도 둘 다 보임) */
table.thg-tbl td.thg-chg{box-shadow:inset 0 0 0 2px var(--rose);border-radius:4px}
table.thg-tbl input.thg-in.thg-bad{box-shadow:none;outline:2px dashed var(--rose);outline-offset:1px}
.thg-orig{display:block;margin-top:2px;font-size:11px;line-height:1.35;color:var(--rose);font-weight:600;white-space:nowrap;text-decoration:none}
.thg-tw{display:inline-flex;flex-direction:column;align-items:flex-start;gap:2px;min-width:0}
.thg input.thg-chg,.thg input.thg-title.thg-chg{box-shadow:0 0 0 2px var(--rose);border-radius:4px}
.thp-tag.mv{color:var(--amber)}
.thg-memo{display:flex;flex-direction:column;gap:4px;margin:14px 0 0;font-size:12.5px;color:var(--dim)}
.thg-memo label{color:var(--text);font-weight:600}
.thg-memo label .hint{font-weight:400}
.thg-memobar{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px}
.thg-memobar .hint{flex:1 1 220px;min-width:0;overflow-wrap:anywhere}
.thg-memobar .hint.rose{color:var(--rose)} .thg-memobar .hint.amber{color:var(--amber)}
#thgSameHint{align-self:center;margin-left:4px}
/* 원칙 가격표 [바꾸기] 값 칸 (forms.js fmPpMark) */
input.lib-chg{box-shadow:0 0 0 2px var(--rose);border-radius:4px}
.lib-orig{display:block;font-size:11px;color:var(--rose);font-weight:600;margin-top:2px}
@media (max-width:700px){
  .libpd-head .go{margin-left:0}
  .libpv-nav{margin-left:0}
  .libdv-pdf{height:70vh;min-height:320px}
  table.libdv-tbl td,table.libdv-tbl th{max-width:220px}
  .libupf-pv{max-height:320px}
  .libai textarea.lu-note,#thgNote,#fmSum{font-size:16px}   /* 16px 미만이면 iOS 가 칸을 누를 때 화면을 확대한다 */
}
/* ═══ /v68 3차 자료실 ═══ */
/* ═══ v67 W3 updates · gsw · advset ═══ */
/* 머리 'Updates' (updates.js) — <h1> 바로 오른쪽 (.hleft 묶음). 펼침 목록은 버튼 왼쪽 기준, 화면 밖이면 updPanelPlace 가 당긴다 */
.hleft{display:flex;align-items:center;gap:10px;min-width:0;flex-wrap:wrap}
.updwrap{position:relative;display:inline-block}
button.updbtn{position:relative;min-height:32px;background:var(--card2);border:1px solid var(--line);border-radius:999px;color:var(--text);
  padding:4px 12px;margin:0;font:inherit;font-size:12px;font-weight:600;letter-spacing:.02em;line-height:1.5;cursor:pointer}
button.updbtn:hover{border-color:var(--cyan)}
button.updbtn:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}
button.updbtn .pill{position:absolute;top:-6px;right:-6px;margin:0;min-width:16px;text-align:center}
.updpanel{position:absolute;left:0;top:calc(100% + 8px);width:min(380px,calc(100vw - 32px));max-height:min(70vh,520px);overflow-y:auto;z-index:60;box-sizing:border-box;
  background:var(--card);border:1px solid var(--line);border-radius:12px;padding:10px 12px;box-shadow:0 12px 32px rgba(0,0,0,.35);
  font-size:12.5px;color:var(--text);text-align:left;animation:popin .2s ease-out}
.updpanel.popout{animation:popout .2s ease-in forwards;pointer-events:none}
.updpanel h5{display:flex;justify-content:space-between;align-items:center;gap:8px;margin:0 0 6px;font-size:12px;color:var(--dim);font-weight:600}
.updpanel .none{padding:6px 4px;margin:0}
.updrow{display:block;width:100%;text-align:left;background:none;border:0;border-top:1px solid var(--line);border-radius:0;color:var(--text);padding:8px 4px;margin:0;font:inherit;cursor:pointer}
.updrow:hover,.updrow:focus-visible{color:var(--cyan);outline:none}
.updrow .updt{display:flex;justify-content:space-between;gap:8px;align-items:baseline}
.updrow .updtt{font-weight:500;overflow-wrap:anywhere}
.updrow.unread .updtt{font-weight:700}
.updrow.unread .updtt::before{content:"";display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--cyan);margin-right:6px;vertical-align:1px}
.updrow .updk{flex:none;font-size:11px;color:var(--dim)}
.updrow .updd{display:block;font-size:11.5px;color:var(--dim)}
.updrow .upds{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:12.5px;color:var(--dim);overflow-wrap:anywhere}
.updrow.off{opacity:.55}
.updpanel .updfoot{border-top:1px solid var(--line);padding-top:8px;text-align:right}
.updpanel .updload{font-size:11.5px;color:var(--dim);padding:6px 4px 0}
/* 업데이트 소식 창 (#updMask) — 상세 창 50 · 변경이력 팝업 55 · 알림 종 목록 60 위, 복원 안내 70 아래 (둘은 차례로만 뜬다) */
.mask.updmask{z-index:66}
.updbox{max-width:600px;margin:9vh auto 0}
.updbox:focus{outline:none}
.updsum{font-weight:600;color:var(--hi);margin:0 0 10px;overflow-wrap:anywhere}
.updtext{max-height:56vh;overflow-y:auto;font-size:14px;line-height:1.65;overflow-wrap:anywhere}
.updtext p{margin:0 0 8px} .updtext ul{margin:0 0 8px;padding-left:20px} .updtext li{margin:2px 0}
.updfeat{margin-top:8px;font-size:12.5px;color:var(--dim)}
.updnav{display:flex;justify-content:space-between;align-items:center;gap:8px;margin-top:14px}
.updnav #updPos{font-size:12px;color:var(--dim);font-variant-numeric:tabular-nums}
.updact{display:flex;justify-content:flex-end;align-items:center;gap:8px;flex-wrap:wrap;margin-top:12px}
.updhint{font-size:12px;color:var(--dim);margin-right:auto}
.updmgr{margin-top:12px;padding-top:8px;border-top:1px dashed var(--line);font-size:12px;color:var(--dim);overflow-wrap:anywhere}
.updmgr a{color:var(--cyan)}
.updmgr .ftmsg{margin-left:8px}
.updok{color:var(--ok)}
.updretire .ftin input.ftreason{flex:1 1 200px;min-width:0;padding:6px 9px;font-size:13px}
.updedit label{display:block;margin:8px 0 2px;font-size:12.5px;color:var(--dim)}
.updedit label.chk{display:flex;margin-top:10px}
.updedit input[type=text],.updedit textarea,.updedit select{width:100%;box-sizing:border-box}
.updedit textarea,.ftapbox textarea{background:var(--card2);border:1px solid var(--line);border-radius:8px;color:var(--text);font:inherit;font-size:13.5px;padding:8px 10px;resize:vertical}
.updedit textarea:focus,.ftapbox textarea:focus{outline:none;border-color:var(--cyan)}
.updcnt{font-size:11px;color:var(--dim);font-variant-numeric:tabular-nums;margin-left:4px}
/* 유리 밀어 켜기 스위치 (v67 — 머리 .thsw 를 크기 변수로 일반화, features.js gswHtml). 왼쪽 끔 · 오른쪽 켬 · .chg = 적용 전 바뀜 */
.gsw{--gsw-w:84px;--gsw-h:34px;position:relative;display:inline-flex;align-items:center;flex:none;width:var(--gsw-w);height:var(--gsw-h);padding:0;margin:0;
  border:1px solid var(--line);border-radius:999px;background:var(--card2);color:var(--dim);cursor:pointer;font:inherit;font-size:12px;font-weight:600;
  isolation:isolate;-webkit-tap-highlight-color:transparent}
.gsw-l,.gsw-r{position:relative;z-index:1;flex:1 1 0;text-align:center;line-height:calc(var(--gsw-h) - 2px);transition:color .25s}
.gsw-k{position:absolute;z-index:0;top:3px;left:3px;width:calc(50% - 3px);height:calc(100% - 6px);box-sizing:border-box;border-radius:999px;
  background:linear-gradient(160deg,rgba(255,255,255,.34),rgba(255,255,255,.08));border:1px solid rgba(255,255,255,.55);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.6),0 2px 8px rgba(0,0,0,.28);
  -webkit-backdrop-filter:blur(8px) saturate(160%);backdrop-filter:blur(8px) saturate(160%);transition:transform .25s cubic-bezier(.2,.7,.2,1),background .25s}
.gsw[aria-checked="true"]{border-color:var(--cyan)}
.gsw[aria-checked="true"] .gsw-k{transform:translateX(100%);background:linear-gradient(160deg,rgba(77,201,192,.6),rgba(77,201,192,.2))}
.gsw[aria-checked="true"] .gsw-r,.gsw[aria-checked="false"] .gsw-l{color:var(--text)}
.gsw.chg{box-shadow:0 0 0 2px var(--amber)}
.gsw:hover:not(:disabled){border-color:var(--dim)}
.gsw:disabled{opacity:.5;cursor:not-allowed}
.gsw:focus-visible{outline:2px solid var(--cyan);outline-offset:3px}
/* 기능 공개 (v67) — 점검 모드 줄(maint.js)도 .ftrow/.ftmain 을 쓰므로 새 규칙은 #boxFeatures·새 클래스에만 */
#boxFeatures .ftrow.staged{background:rgba(224,164,88,.06)}
.ftsw{margin-left:auto}
.ftchg{color:var(--amber);font-size:12px;font-weight:600}
.ftnote{margin:6px 0 0;font-size:12.5px;color:var(--dim);line-height:1.55;overflow-wrap:anywhere}
.ftnote b{color:var(--amber)}
.ftapbar{position:sticky;bottom:10px;z-index:5;margin:12px 0 0;padding:10px 14px;border:1px solid var(--amber);border-radius:12px;background:var(--card);box-shadow:0 8px 24px rgba(0,0,0,.35)}
.ftapbar[hidden],.ftapbox[hidden]{display:none}
.ftap-head{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;font-size:13.5px}
.ftap-sum{flex:1 1 260px;min-width:0;overflow-wrap:anywhere}
.ftap-btns{margin-left:auto;display:flex;gap:6px}
.ftap-btns button.go{padding:7px 20px}
.ftapbox{margin:8px 0 4px;padding:10px 14px;border:1px dashed var(--line);border-radius:12px}
.ftapbox label{display:block;margin:8px 0 2px;font-size:12.5px;color:var(--dim)}
.ftapbox label.chk{display:flex}
.ftapbox input[type=text],.ftapbox textarea{width:100%;box-sizing:border-box}
.ftap-note{margin-top:10px;padding-top:10px;border-top:1px dashed var(--line)}
.ftap-note[hidden]{display:none}
.ftap-note.off .ftap-fields{opacity:.5}
.ftap-tools{margin-top:6px;font-size:12px}
.ftap-tools a{color:var(--cyan)}
.ftapbox .ftmsg{margin-top:8px;font-size:12.5px;overflow-wrap:anywhere}
/* v91: 기능 공개 '공개 기록'(.fthist) 칸 없앰 — 사용자 요청 2026-10-21 */
/* 고급설정 (v67) — <details id="setAdv"> 처음엔 접힘. 줄 전체를 누르면 펼침/접힘 */
.advset>summary{display:flex;align-items:center;gap:8px;cursor:pointer;list-style:none;min-height:44px}
.advset>summary::-webkit-details-marker{display:none}
.advset>summary h3{margin:0}
.advset .advchev{color:var(--dim);transition:transform .2s}
.advset[open] .advchev{transform:rotate(180deg)}
.advset>summary:focus-visible{outline:2px solid var(--cyan);outline-offset:4px;border-radius:6px}
#boxSettings{overflow-x:auto}   /* 좁은 화면에서 설정 표가 넓으면 칸 안에서 가로로 (페이지가 넘치지 않게 — 기본 테마 375px) */
@media (prefers-reduced-motion:reduce){
  .gsw-k,.gsw-l,.gsw-r,.advset .advchev{transition:none}
  .updpanel,.updpanel.popout{animation:none}
}
@media (max-width:700px){
  button.updbtn{font-size:11.5px;padding:3px 10px}
  .gsw{--gsw-h:36px}
  .updbox{margin-top:4vh}
  .updtext{max-height:60vh}
  #boxFeatures .ftmain{display:grid;grid-template-columns:1fr auto;gap:2px 10px;align-items:center}
  #boxFeatures .ftmain .ftname{grid-column:1} #boxFeatures .ftmain .ftwho{grid-column:1;white-space:normal}
  #boxFeatures .ftmain .ftsw{grid-column:2;grid-row:1 / span 2;margin-left:0}
  .ftap-btns{margin-left:0;width:100%} .ftap-btns button{flex:1}
}
/* ═══ /v67 W3 ═══ */
/* ═══ v67: 승인 대기함 하나로 (aprq.js) — 1차 검토 · 경영진 승인 · 사후 예외 (옛 #secDocExc 를 합침) ═══ */
.apq-bar{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;margin:0 0 10px}
.apq-bar .seg button .n{opacity:.8;font-size:12px;margin-left:3px;font-variant-numeric:tabular-nums}
.apq-bar .seg button.zero{opacity:.55}
.apq-bar .seg button.on.zero{opacity:1}
.apq-bar .seg button[hidden]{display:none}
.apq-bar select{min-width:140px}
.apq-bar label.chk{display:inline-flex;align-items:center;gap:6px;margin:0;font-size:13px}
.apq-bar label.chk[hidden]{display:none}
.apq-bar .apq-rl{margin-left:auto}
.badge.apq-s1{color:var(--cyan);border-color:color-mix(in srgb,var(--cyan) 45%,transparent);background:transparent}
.badge.apq-s2{color:var(--violet);border-color:color-mix(in srgb,var(--violet) 45%,transparent);background:transparent;font-weight:600}
.badge.apq-s3{color:var(--rose);border-color:color-mix(in srgb,var(--rose) 45%,transparent);background:transparent}
table.apq{min-width:980px}
table.apq td{vertical-align:top}
table.apq td.apq-st,table.apq td.apq-k{white-space:nowrap}
table.apq td.apq-k{white-space:normal;min-width:8.5em}
table.apq td.apq-c{min-width:220px;max-width:380px;overflow-wrap:anywhere}
table.apq td[data-l="단지"]{min-width:6.5em}
table.apq td.prod{white-space:nowrap}
table.apq td.prod .aprth{white-space:normal}
table.apq td[data-l="신청자/담당"],table.apq td[data-l="신청자"]{min-width:6.5em}
table.apq td[data-l="첨부"]{min-width:8em;overflow-wrap:anywhere}
table.apq td.apq-act{white-space:nowrap;text-align:right}
table.apq td.apq-act .hint,table.apq td.apq-act .apq-sum,table.apq td.apq-act .apq-x,
table.apq td.apq-act .rvx-msg,table.apq td.apq-act .rv-err,table.apq td.apq-act .rvx-warn{white-space:normal;text-align:left}
table.apq td.apq-k .badge{margin:0 2px 2px 0}
table.apq a.rvxcx{color:var(--text);text-decoration:none;border-bottom:1px dotted var(--dim)}   /* 단지 링크 = 보통 글자색 (옛 .rvxt 규칙과 같게, 세 테마) */
table.apq a.rvxcx:hover{border-bottom-color:var(--text)}
.apq-sum{font-size:12px;margin-top:4px;color:var(--dim)}
.apq-x{margin-top:6px;font-size:12px}
.apq-xk{margin-top:4px;font-size:12px}
.apq-memo{font-size:12.5px}
tr.apq-ro td{opacity:.78}
.apq-off{display:none!important}
.apq-empty[hidden]{display:none}
tr.apq-fr td{background:transparent;border-top:0;padding-top:0}
tbody tr.apq-fr{cursor:default}
tbody tr.apq-fr:hover{background:transparent}
.apq-form{position:sticky;left:0;max-width:calc(100vw - 48px);box-sizing:border-box;border:1px solid var(--line);border-radius:10px;
  padding:8px 12px;margin:2px 0 8px;background:var(--card2);font-size:13px;line-height:1.55;white-space:normal;text-align:left}
.apq-form .apq-q{margin:0 0 6px}
.apq-form .apq-warn{color:var(--amber);margin:0 0 6px}
.apq-form input.apq-why{min-width:260px;margin:0 6px 4px 0}
.apq-msg{font-size:12px;margin-top:4px}
.apq-done{margin-top:14px}
.apq-done[hidden]{display:none}
.apq-done table.apq{min-width:900px}
@media (max-width:700px){
  #secApprovals .tblwrap.apqw{background:transparent;border:0;box-shadow:none;overflow:visible;-webkit-backdrop-filter:none;backdrop-filter:none;padding:0}
  #secApprovals table.apq,#secApprovals table.apq tbody,#secApprovals table.apq tr,#secApprovals table.apq td{display:block;width:100%;min-width:0;max-width:none}
  #secApprovals table.apq thead{display:none}
  #secApprovals table.apq tr.apqr,#secApprovals table.apq tr.apqr:hover{background:var(--card);border:1px solid var(--line);border-radius:12px;margin:0 0 10px;padding:10px 14px;box-sizing:border-box}
  #secApprovals table.apq td{border:0;padding:3px 0;white-space:normal;text-align:left;box-sizing:border-box}
  #secApprovals table.apq td[data-l]::before{content:attr(data-l);display:block;font-size:11px;color:var(--dim);margin-bottom:1px}
  #secApprovals table.apq td.apq-st,#secApprovals table.apq td.apq-k{display:inline-block;width:auto;margin-right:6px}
  #secApprovals table.apq td.apq-st::before,#secApprovals table.apq td.apq-k::before{display:none}
  #secApprovals table.apq td.apq-act button{min-height:36px}
  #secApprovals table.apq tr.apx,#secApprovals table.apq tr.apq-fr{margin:-8px 0 10px;padding:0}
  #secApprovals table.apq tr.apx td,#secApprovals table.apq tr.apq-fr td{padding:0}
  #secApprovals table.apq tr[hidden]{display:none}                                                    /* 카드의 display:block 이 hidden 을 이기지 않게 (#apxcr- 줄) */
  #secApprovals table.apq tr.apx.apxscanonly:not(:has(.rvscanq:not([hidden]))){display:none}          /* 판독 칸 없는 빈 줄 (style.css v61 규칙을 카드에서도) */
  #secApprovals table.apq tr.apq-off{display:none}
  #secApprovals .apx .rvbox,#secApprovals .apq-form{position:static;max-width:none}
  #secApprovals .apq-form input.apq-why{min-width:0;width:100%;font-size:16px}
  .apq-bar .apq-rl{margin-left:0}
  .apq-bar select{flex:1 1 100%;font-size:16px}
  .apq-bar .seg{display:flex;flex-wrap:wrap;width:100%}
  .apq-bar .seg button{flex:1 0 auto;white-space:nowrap;padding:8px 10px}
}
/* ═══ v85: 승인자 검토 (사용자 결정 2026-10-20 A) — 승인 대기함 [검토] · 검토 창 #rvwMask (aprq.js apqRv*) · 회원 승인 칸 안 처리 (admin.js su* · pc*).
   색은 토큰만 (--card2 · --line · --text · --dim · --cyan · --amber · --rose · --violet — 어두운 · glass · 밝은 화면이 같이 맞음) · 375px = 한 열 · 칸 글 16px (iOS 확대 막기) ═══ */
table.apq td.apq-act .apq-rvm,table.apq td.apq-act .apq-rvg{white-space:normal;text-align:left;font-size:12px;margin-top:3px}
.apq-rvm:empty{display:none}
.apq-rvold{margin:0 0 8px}
.apq-xed{color:var(--violet);overflow-wrap:anywhere}
#rvwModal{max-width:760px}
#rvwModal .rvw-band{background:var(--card2);border-left:3px solid var(--cyan);border-radius:0 8px 8px 0;padding:9px 13px;font-size:13px;line-height:1.55;margin:0 0 6px;overflow-wrap:anywhere}
#rvwModal .rvw-note{margin:4px 0 0;font-size:12.5px;line-height:1.5;overflow-wrap:anywhere}
#rvwModal .rvw-grp .fst{font-size:13px;font-weight:600;color:var(--text);margin:16px 0 0;overflow-wrap:anywhere}
#rvwModal .rvw-f{min-width:0}
#rvwModal .rvw-f.wide{grid-column:1/-1}
#rvwModal .rvw-f[hidden]{display:none}
#rvwModal .rvw-v{font-size:13.5px;line-height:1.5;padding:2px 0 4px;overflow-wrap:anywhere;color:var(--text)}
#rvwModal .rvw-lk .flabel{opacity:.85}
#rvwModal .rvw-lktag{display:inline-block;font-size:10.5px;line-height:1.4;border:1px solid var(--line);border-radius:6px;padding:0 5px;margin-left:4px;color:var(--dim);vertical-align:1px}
#rvwModal .rvw-f.rvw-chg input:not([type=checkbox]),#rvwModal .rvw-f.rvw-chg textarea,#rvwModal .rvw-f.rvw-chg select{border-color:var(--amber);box-shadow:0 0 0 2px color-mix(in srgb,var(--amber) 30%,transparent)}
#rvwModal .rvw-f.rvw-chg .chk{color:var(--amber)}
#rvwModal .rvw-was{font-size:11.5px;color:var(--amber);margin-top:3px;overflow-wrap:anywhere}
#rvwModal .rvw-was[hidden]{display:none}
#rvwModal .rvw-amb{color:var(--amber)}
#rvwModal input:not([type=checkbox]),#rvwModal select,#rvwModal textarea{width:100%;box-sizing:border-box;background:var(--card2);border:1px solid var(--line);color:var(--text);
  padding:9px 11px;border-radius:7px;font-size:13.5px;font-family:inherit;min-width:0}
#rvwModal textarea{resize:vertical;line-height:1.5}
#rvwModal .rvw-cams{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:6px 10px}
#rvwModal .rvw-cam{display:flex;flex-direction:column;gap:3px;font-size:12px;color:var(--dim);min-width:0}
#rvwModal .rvw-cam span{overflow-wrap:anywhere}
#rvwModal .rvw-file{margin:2px 4px 2px 0;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;vertical-align:middle}
#rvwModal .rvw-foot{margin-top:18px;border-top:1px solid var(--line);padding-top:4px}
#rvwModal .rvw-info{font-size:12.5px;line-height:1.55;margin-top:8px;overflow-wrap:anywhere}
#rvwModal .rvw-msg{font-size:12.5px;margin-top:6px;min-height:1px;overflow-wrap:anywhere}
#rvwModal .rvw-btns{display:flex;gap:8px;margin-top:12px}
#rvwModal .rvw-btns button{width:auto}
#rvwModal .rvw-btns button.go{flex:1 1 auto;padding:12px}
#rvwModal .rvw-btns button.ghost{flex:none;padding:12px 18px}
#rvwModal .rvw-btns button:disabled{opacity:.45;cursor:default}
/* 회원 승인 · 회원정보 변경 — 줄 아래 칸 안 처리 (예전 확인 창 · 입력 창 대신 — CLAUDE.md '새 확인 창 금지') */
tr.su-fr td{background:transparent;border-top:0;padding-top:0}
tbody tr.su-fr:hover{background:transparent}
.su-form{position:sticky;left:0;max-width:calc(100vw - 48px);box-sizing:border-box;border:1px solid var(--line);border-radius:10px;
  padding:8px 12px;margin:2px 0 8px;background:var(--card2);font-size:13px;line-height:1.55;white-space:normal;text-align:left}
.su-form .su-q{margin:0 0 6px;overflow-wrap:anywhere}
.su-form .su-warn{color:var(--rose);margin:0 0 6px;overflow-wrap:anywhere}
.su-form .su-amb{color:var(--amber);margin:0 0 6px;overflow-wrap:anywhere}
.su-form .su-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(170px,1fr));gap:4px 12px;margin:0 0 6px}
.su-form .su-grid label{display:flex;flex-direction:column;gap:3px;font-size:12px;color:var(--dim);min-width:0}
.su-form .su-grid .su-chg input,.su-form .su-grid .su-chg select{border-color:var(--amber)}
.su-form .su-grid .su-was{font-size:11px;color:var(--amber)}
.su-form input[type=text],.su-form input[type=tel],.su-form input[type=date],.su-form select{min-width:0;width:100%;box-sizing:border-box}
.su-form input.su-why{min-width:260px;width:auto;margin:0 6px 4px 0}
.su-form .su-msg{font-size:12px;margin-top:4px;overflow-wrap:anywhere}
/* 신청 현황 '승인자 수정' 줄의 [바뀐 것 보기] (requests.js rqAe*) */
.rqaeb{margin-top:6px}
tr.rqae td{background:transparent;border-top:0;padding-top:0}
tbody tr.rqae:hover{background:transparent}
.rqaebox{position:sticky;left:0;max-width:calc(100vw - 48px);box-sizing:border-box;border:1px solid var(--line);border-radius:10px;padding:8px 12px;margin:2px 0 8px;
  background:var(--card2);font-size:12.5px;line-height:1.55;white-space:normal;overflow-wrap:anywhere}
.rqae1+.rqae1{margin-top:8px;padding-top:8px;border-top:1px dashed var(--line)}
.rqael{margin:4px 0;padding:0 0 0 2px;list-style:none}
.rqael li{margin:2px 0}
.rqael .rqaek{display:inline-block;min-width:7em;color:var(--text);font-weight:600}
.rqaen{margin-top:4px}
@media (max-width:700px){
  .rqaebox{position:static;max-width:none}
  table.rq tr.rqae,table.rq tbody tr.rqae:hover{background:transparent;border:0;padding:0;margin:-6px 0 10px}
  #rvwModal .mbody{padding:16px}
  #rvwModal .mhead{padding:16px}
  #rvwModal input:not([type=checkbox]),#rvwModal select,#rvwModal textarea{font-size:16px}
  #rvwModal .rvw-cams{grid-template-columns:repeat(2,minmax(0,1fr))}
  #rvwModal .rvw-btns button.ghost{padding:12px 14px}
  .su-form{position:static;max-width:none}
  .su-form input.su-why{min-width:0;width:100%;font-size:16px}
  .su-form input[type=text],.su-form input[type=tel],.su-form input[type=date],.su-form select{font-size:16px}
}

/* ═══ v68: 대시보드 개편 (dashboard.js · regionmap.js) — 타일 8개(누적 · 이번 달) · 기간 버튼 · 제품·리그 기간 글 · 실제 남한 지도 · 만료 임박 높이 맞춤.
   색은 토큰(--text·--dim·--line·--card·--card2·--cyan·--amber·--rose·--ok·--map1~5·--map-edge)만 — 어두운·glass·밝은 화면이 같이 맞는다.
   375px 에서 문서 전체가 옆으로 밀리지 않게: 칸은 min-width 0, 넓은 표는 그 칸 안에서만 스크롤 ═══ */
/* 타일: 4칸 × 2줄 (700px 이하 2칸) · 줄 머리 '누적' / '이번 달'. 큰 숫자는 한 줄로, 좁으면 글자를 줄인다 */
.dtiles{margin-bottom:16px}
.dtiles>.loading{padding:16px 0}
.dtrh{font-size:12px;font-weight:650;color:var(--dim);margin:0 2px 6px;letter-spacing:.02em}
.dtrh .hint{font-weight:400;margin-left:6px;letter-spacing:0}
.dtiles .tiles{grid-template-columns:repeat(4,minmax(0,1fr));margin-bottom:12px}
.dtiles .tiles:last-child{margin-bottom:0}
.dtiles .tile{min-width:0}
.dtiles .tile .v{white-space:nowrap;font-size:clamp(17px,2vw,24px)}
.dtiles .tile .v .na{color:var(--dim);font-weight:400}
@media (max-width:700px){ .dtiles .tiles{grid-template-columns:repeat(2,minmax(0,1fr));gap:8px} }
/* 기간 버튼 · 안내 · 다시 읽는 동안 흐리게 */
.dpseg{display:inline-flex;flex-wrap:wrap;max-width:100%}
.dpseg button{padding:6px 12px;font-size:12.5px;white-space:nowrap}
.dpseg button:disabled{opacity:.45;cursor:default}
.dpnote{margin:-4px 2px 10px;font-size:12px;color:var(--amber)}
.dpbusy{opacity:.5;transition:opacity .15s}
.dptot{margin:12px 0 0;font-size:12px;color:var(--dim)}
/* 리그: 값 아래 '+기간' (그 기간에 시작한 계약의 MRR) */
.lg{grid-template-columns:22px minmax(0,110px) minmax(30px,1fr) auto}
.lg .val small{display:block;font-size:11px;font-weight:500;color:var(--ok);line-height:1.3}
@media (max-width:700px){ .lg{grid-template-columns:20px minmax(0,84px) minmax(24px,1fr) auto} }
/* 지역 지도 · 만료 임박 한 줄 — 만료 임박은 지도 칸 높이에 맞추고(표는 절대 위치라 줄 높이를 늘리지 않는다) 칸 안에서 스크롤 */
.dregrow{display:grid;grid-template-columns:minmax(0,1.4fr) minmax(0,1fr);gap:16px;align-items:stretch}
.dregrow>*{min-width:0}
.dexp{display:flex;flex-direction:column}
.dexp .dexpbox{position:relative;flex:1 1 auto;min-height:320px}
#dExpiring{position:absolute;inset:0;overflow:auto;overscroll-behavior:contain}
#dExpiring table{font-size:12.5px}
#dExpiring th,#dExpiring td{padding:7px 8px}
#dExpiring thead th{position:sticky;top:0;z-index:2;background:var(--card)}   /* 머리줄은 스크롤해도 위에 (바탕이 비치지 않게 — glass·밝은 화면은 테마 파일이 덮는다) */
#dExpiring .dxsgg{display:block;color:var(--dim);font-size:11.5px;font-weight:400}
#dExpiring td:first-child{min-width:110px}
#dExpiring .dxd{display:block;font-size:11.5px;font-weight:600}
#dExpiring .dxwho{display:none}
@media (max-width:700px){   /* 휴대폰: 담당 칸을 단지 이름 아래 줄로 옮겨 표가 칸 폭 안에 들어오게 */
  #dExpiring table{min-width:0}   /* theme-glass 의 휴대폰 표 최소 폭 560px 를 이 작은 표에는 쓰지 않는다 */
  #dExpiring th,#dExpiring td{padding:7px 6px}
  #dExpiring th:last-child,#dExpiring td:last-child{display:none}
  #dExpiring tr.grp td:last-child{display:table-cell}
  #dExpiring .dxwho{display:inline}
  #dExpiring td:first-child{min-width:96px}
  #dExpiring td.prod{white-space:normal;min-width:4.2em}
}
#dExpChips:not(:empty){margin:0 0 10px}
.dxseg{display:flex;flex-wrap:wrap}
.dxseg button{padding:5px 10px;font-size:12.5px;white-space:nowrap}
.dxseg button .n{opacity:.8;font-size:11.5px;margin-left:2px;font-variant-numeric:tabular-nums}
/* v68 (검토): 0건 본부 칩도 누를 수 있는 버튼 — 글자를 흐리게(opacity) 하지 않는다 (어두운 2.4:1 · 밝은 2.3:1 로 대비 부족이었다). 0 이라는 숫자가 '없음' 을 알린다 */
@media (max-width:1100px){
  .dregrow{grid-template-columns:minmax(0,1fr)}
  .dexp .dexpbox{min-height:0}
  #dExpiring{position:static;max-height:440px;overscroll-behavior:auto}   /* 한 줄로 쌓이면 맞출 높이가 없어 최대 높이만 · v68 (검토): 휴대폰에서 표 끝에 닿으면 페이지가 이어서 스크롤 (contain 은 지도 옆 같은 높이 칸에서만) */
}
/* 실제 남한 지도 (KMAP) */
.rbox.km{align-items:flex-start}
.rmapwrap.km{flex:1 1 300px;max-width:520px;min-width:0}
.rbox.km .rside{flex:0 1 230px}
.rmcrumb{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-height:30px;margin:0 0 6px;font-size:13px}
.rmcrumb b{color:var(--text)}
.rmstage{position:relative}
.rmsvg{display:block;width:100%;height:auto;max-height:620px;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent}
.rmsvg .rg{stroke:var(--map-edge);stroke-width:.6px;vector-effect:non-scaling-stroke;stroke-linejoin:round;fill-rule:evenodd;cursor:pointer;transition:opacity .25s}
.rmsvg .rg.l0{fill:color-mix(in srgb,var(--text) 9%,transparent)}
.rmsvg .rg.l1{fill:var(--map1)}.rmsvg .rg.l2{fill:var(--map2)}.rmsvg .rg.l3{fill:var(--map3)}.rmsvg .rg.l4{fill:var(--map4)}.rmsvg .rg.l5{fill:var(--map5)}
.rmsvg .rg.off{opacity:.3}                                   /* 확대한 시도 밖 */
.rmsvg .rsb{fill:none;stroke:var(--text);stroke-opacity:.55;stroke-width:1.1px;vector-effect:non-scaling-stroke;stroke-linejoin:round;pointer-events:none}
.rmsvg .rsb.on{stroke-opacity:.95;stroke-width:2px}
.rmsvg .rhov,.rmsvg .rsel,.rmsvg .rselh{fill:none;vector-effect:non-scaling-stroke;stroke-linejoin:round;pointer-events:none}
.rmsvg .rhov{stroke:var(--text);stroke-width:1.6px}
.rmsvg .rselh{stroke:var(--svg-halo,rgba(0,0,0,.55));stroke-width:5px}   /* 고른 시군구 = 바깥 번짐 + 굵은 테두리 (어느 색 칸 위에서도 보이게) */
.rmsvg .rsel{stroke:var(--text);stroke-width:2.4px}
.rmsvg .rinsg{pointer-events:none}
.rmsvg .rins{fill:none;stroke:var(--dim);stroke-width:1px;stroke-dasharray:4 3;vector-effect:non-scaling-stroke}   /* 옮겨 그린 섬(울릉도·독도) 상자 — 실제 자리가 아님 */
.rmsvg .rinst{fill:var(--dim)}
.rmsvg .rlab{pointer-events:none}
.rmsvg .rlab text{fill:var(--text);stroke:var(--svg-halo,rgba(0,0,0,.6));paint-order:stroke;stroke-linejoin:round;font-weight:600;text-anchor:middle;dominant-baseline:central}
.rmtip{display:none;position:absolute;z-index:6;left:0;top:0;width:max-content;max-width:240px;text-align:left;
  background:var(--card);color:var(--text);border:1px solid var(--line);border-radius:8px;padding:7px 10px;
  font-size:12px;line-height:1.55;box-shadow:0 6px 20px rgba(0,0,0,.35);pointer-events:none}
.rmtip b{display:block;font-size:12.5px;margin-bottom:2px}
.rmattr{margin:6px 0 0;font-size:10.5px;line-height:1.5;color:var(--dim);opacity:.85}   /* 지도 출처 — 라이선스 조건 (CC BY 4.0 · 공공누리 제1유형) */
.rmattr a{color:inherit;text-decoration:underline;text-decoration-color:var(--line)}
/* 범례 칸 (지도·타일 같이) */
.rleg i.rsw{display:inline-block;width:14px;height:14px;border-radius:3px;border:1px solid var(--line)}
.rsw.l0{background:color-mix(in srgb,var(--text) 9%,transparent);border-style:dashed}
.rsw.l1{background:var(--map1)}.rsw.l2{background:var(--map2)}.rsw.l3{background:var(--map3)}.rsw.l4{background:var(--map4)}.rsw.l5{background:var(--map5)}
.rbox.km .rleg{max-width:none}
/* 옆 칸 목록 · 시군구 상세 */
.rlist{max-height:440px;overflow:auto;overscroll-behavior:contain}
.rside .roff{margin-top:8px}   /* v68 (검토): [고객 없는 시군구 N곳 보기] */
.rrow.on{background:rgba(255,255,255,.08)}
.rrow:focus-visible{outline:2px solid var(--cyan);outline-offset:-2px}
.rdet{margin:8px 0 4px;padding:10px 12px;border:1px solid var(--line);border-radius:10px;background:var(--card2)}
.rdh{display:flex;flex-direction:column;margin:0 0 8px;min-width:0}
.rdh .dim{font-size:12px}
.rdh b{font-size:16px;color:var(--hi);overflow-wrap:anywhere}
.rdl{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:4px 14px;margin:0 0 10px}
.rdl div{display:flex;justify-content:space-between;align-items:baseline;gap:8px;font-size:12.5px;border-bottom:1px dotted var(--line);padding:3px 0;min-width:0}
.rdl dt{color:var(--dim);white-space:nowrap}
.rdl dd{margin:0;font-weight:600;font-variant-numeric:tabular-nums;text-align:right;white-space:nowrap}
.rdet .rgo{white-space:normal;text-align:left}
@media (max-width:700px){
  .rmapwrap.km{max-width:none;flex-basis:100%}
  .rbox.km .rside{flex:1 1 100%}
  .rlist{max-height:320px;overscroll-behavior:auto}   /* v68 (검토): 휴대폰은 목록 끝에서 페이지가 이어서 스크롤 */
  .rdl{grid-template-columns:minmax(0,1fr)}
}
/* ═══ /v68 대시보드 ═══ */

/* ═══ v68 2차 (사용자 결정 2026-10-04 오후 ②⑦): 오이천사 종류 표기 · 등록 폼 · 열화상 오이천사 만들기 — 색은 토큰만 (세 테마 같이) ═══ */
.oisum{margin:0 0 10px;padding:7px 10px;border:1px dashed var(--line);border-radius:8px;font-size:12.5px;line-height:1.5;overflow-wrap:anywhere}   /* 계약 현황 '오이천사 계약 N건 (일반 · 열화상 · P형)' */
.badge.oipre{color:var(--violet);border-color:color-mix(in srgb,var(--violet) 45%,transparent);background:transparent}   /* 카드 '선불 3년' — 'p' 클래스를 같이 달지 않는다 (theme-glass·light 의 .badge.p 분홍이 이김) */
.badge.thadd{color:var(--cyan);border-color:color-mix(in srgb,var(--cyan) 45%,transparent);background:transparent}   /* v68 2차 검토: 열감지장치 카드 '추가 설치' (세 테마 모두 --cyan 이 테마마다 다시 정의돼 읽힌다) */
#ctModal .hint.kstartbad{color:var(--rose)}   /* 선불 오이천사 재계약 시작일이 선불 기간 안 */
/* v81: 열화상카메라 '추가 설치' 칸(#kThAddBox · .kthadd)은 없앴다 — 같은 종류 PRI 에 붙는 장비 (#kPriAttach) */
.tile .v .unit.oic{white-space:nowrap}          /* 대시보드 '오이천사 고객 438 (계약 445)' */
.lg .sub .oic,.rdl .oic{color:var(--dim);font-weight:400}
/* v81: '열감지만 있는 단지 — 오이천사(열화상) 만들기' 칸(.thobf · 카메라 대수 넣기)은 없앴다 (thermal.js · DB THERMAL_OI_GONE) */
.rnx{font-size:.85em;color:var(--dim);margin-left:1px;font-weight:600}   /* 단지 조회 계약제품 '오이천사(열화상)×2' */

/* ═══ v68 3차 (사용자 2026-10-04 — Updates = 모두에게 · 벨 = 나에게만): Updates 종류 표시 · 복원 안내 줄 · 알림 종 '내 신청 결과' · 신청 현황 줄 강조
   (updates.js · requests.js · admin.js bellPaint) — 색은 토큰만 (세 테마 같이) ═══ */
.updrow .updk.k-pub,.updrow .updk.k-lib,.updrow .updk.k-nt,.updrow .updk.k-dep{padding:0 7px;border:1px solid currentColor;border-radius:999px;line-height:16px;font-weight:600;white-space:nowrap}
.updrow .updk.k-pub{color:var(--cyan)}     /* 기능 공개 */
.updrow .updk.k-lib{color:var(--violet)}   /* 자료 (자료실 업데이트) */
.updrow .updk.k-nt{color:var(--amber)}     /* 안내 (서버 복원 안내 · 최고관리자 안내) */
.updrow .updk.k-dep{color:var(--dim)}      /* 배포 기록 (최고관리자) */
.updrow.nt.unread .updtt::before{background:var(--amber)}   /* 확인 안 한 복원 안내 = 주황 점 */
.updpanel .updscope{padding:0 4px 8px;line-height:1.5}
.updact .ntmsg{font-size:12.5px;overflow-wrap:anywhere}
.updact .ntmsg:empty{display:none}
/* 알림 종 '내 신청 결과' (requests.js mynBellHtml) */
.bellpanel .mynrow{align-items:flex-start}
.bellpanel .mynrow .mynt{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1 1 auto}
.bellpanel .mynrow .mynh{overflow-wrap:anywhere;line-height:1.45}
.bellpanel .mynrow .mynh b{font-weight:500}
.bellpanel .mynrow.new .mynh b{font-weight:700;color:var(--text)}
.bellpanel .mynrow.new .mynh b::before{content:"";display:inline-block;width:7px;height:7px;border-radius:50%;background:var(--cyan);margin-right:6px;vertical-align:1px}
.bellpanel .mynrow .mynres{font-size:10.5px;padding:0 7px;line-height:16px;vertical-align:1px;white-space:nowrap}
.bellpanel .mynrow .mynd{font-size:11.5px;color:var(--dim);display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;overflow-wrap:anywhere;line-height:1.45}
.bellpanel .mynrow .mynwhen{flex:none;font-size:11px;color:var(--dim);white-space:nowrap;font-variant-numeric:tabular-nums;padding-top:1px}
.bellpanel .mynrow:not(.new) .mynh b{color:var(--dim)}
.bellpanel .mynrow.nogo{cursor:default}
.bellpanel .mynrow.nogo:hover{color:inherit}
.bellpanel .mynrow:focus-visible{outline:2px solid var(--cyan);outline-offset:-2px;border-radius:6px}
.bellpanel .sub a{color:var(--cyan)}
/* 신청 현황: 종에서 온 신청 줄을 잠깐 강조 (requests.js rqHit) */
table.rq tr.rqhit>td{background:color-mix(in srgb,var(--cyan) 16%,transparent)}
table.rq tr.rqhit>td:first-child{box-shadow:inset 3px 0 0 var(--cyan)}
#reqMsg .rqhitmiss{margin:0 0 8px;font-size:12.5px}
/* ═══ /v68 3차 Updates · 벨 ═══ */
/* ═══ v68f 후속2 (사용자 답 2026-10-05 저녁) ═══ */
/* 정보 수정 신청 — 이 계약을 고치는 정정 계약이 기다리면 계약 상태 칸 아래 한 줄 (detail.js crFixPend · 해지·만료 선택지 꺼짐) */
#crGrid .crfixcell{grid-column:1/-1}
#crModal .hint.crfixblk{display:block;margin-top:6px;color:var(--rose);font-size:12px;line-height:1.5;overflow-wrap:anywhere}
/* 사용자 관리 '계약' 숫자 옆 '+충전기 n' (숫자는 충전기 제외 — admin.js usChgMap) */
.ucchg{margin-left:4px;font-size:11px;color:var(--dim);white-space:nowrap;font-weight:400}
/* 알림 종 '⚠ 계약 전환 멈춤' (사업지원 — admin.js ctaBellHtml) */
.bellpanel .ctarow{align-items:flex-start;cursor:default}
.bellpanel .ctarow:hover{color:inherit}
.bellpanel .ctarow .ctat{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1 1 auto;overflow-wrap:anywhere;line-height:1.45}
.bellpanel .ctarow .ctat[role=button]{cursor:pointer}
.bellpanel .ctarow .ctat[role=button]:hover b{color:var(--cyan)}
.bellpanel .ctarow .ctat b{font-weight:600;color:var(--text)}
.bellpanel .ctarow .ctad{font-size:11.5px;color:var(--dim);display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}
.bellpanel .ctarow .ctaerr{font-size:11.5px;color:var(--rose)}
.bellpanel .ctarow .mini{flex:none}
.bellpanel .ctarow .mini[aria-disabled="true"]{opacity:.4;cursor:default}
.bellpanel .ctarow .ctat:focus-visible{outline:2px solid var(--cyan);outline-offset:2px;border-radius:6px}
/* ═══ /v68f 후속2 ═══ */
/* ═══ v78 (사용자 결정 2026-10-13) — 상태 이름 · 서비스 시작일 · 단지 담당자 · 재신청 · 자료실 승인 ═══
   색은 토큰으로만 (밝은 화면 theme-light.css 가 같은 토큰을 바꾼다). 클래스는 S0(화면 바탕)이 미리 만들고 각 화면 파일이 쓴다 */
/* 계약 상태 '대기'(DB 등록완료) — 글씨 자체가 하늘색, 바탕은 칠하지 않는다 (config.js CT_ST '등록완료' → 'sky' · app.js ctStCls · ctDday cls 'dd-sky') */
.badge.sky{color:var(--sky);border-color:color-mix(in srgb,var(--sky) 45%,transparent);background:transparent}
.dd-sky{color:var(--sky)}
.st-sky,.warnbox .st-sky{color:var(--sky)}   /* 글 속 '대기' (<b class="st-sky">) — 안내 상자(.warnbox b 빨강) 안에서도 하늘색 */
/* 단지 머리 담당 줄 (detail.js — '담당자 {이름} ({본부}) · {전화}' · 둘이면 노란 글 · 없으면 '담당자 없음' + [담당자 신청]) */
.cxown{display:flex;flex-wrap:wrap;align-items:center;gap:4px 10px;margin:6px 0 0;font-size:13px;line-height:1.5;color:var(--text);overflow-wrap:anywhere}
.cxown b{font-weight:600}
.cxown .dim{color:var(--dim)}
.cxown .warn{color:var(--amber);font-weight:600}
.cxown button.mini{flex:none}
.cxown-none{color:var(--dim);font-style:italic}
/* 자료실 '검토중' 띠 (경영진·최고관리자 승인 전 — 직인 · 원칙 가격표 · 단가표 · 제안서) · 반려 띠 (반려 사유 + [고쳐서 다시 올리기]) */
.libpend,.librej{display:block;margin:6px 0;padding:6px 10px;border-radius:8px;font-size:12.5px;line-height:1.5;color:var(--text);overflow-wrap:anywhere}
.libpend{border:1px dashed color-mix(in srgb,var(--amber) 60%,transparent);background:color-mix(in srgb,var(--amber) 9%,transparent)}
.libpend b{color:var(--amber)}
.librej{border:1px solid color-mix(in srgb,var(--rose) 55%,transparent);background:color-mix(in srgb,var(--rose) 8%,transparent)}
.librej b{color:var(--rose)}
.libpend button.mini,.librej button.mini{margin:2px 0 0 6px}
/* 신청 현황 반려 줄 [정보 수정 후 재신청] 줄 (requests.js) */
.rqresub{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px;margin:6px 0 0}
.rqresub .hint{font-size:12px}
.rqresub .rqresub-err{color:var(--rose);font-size:12px;overflow-wrap:anywhere}
/* 계약 카드 [서비스 시작일 입력] — 같은 자리 칸 안 입력 줄 (날짜 + [저장] [취소], Enter · Esc) */
.ststart{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin:6px 0 0}
.ststart[hidden]{display:none}   /* v88 검토 고침: display 를 준 칸은 [hidden] 을 따로 — 빈 입력 줄이 카드 머리 아래 8px 틈으로 늘 보였다 */
.ststart input[type=date]{min-width:0;max-width:100%;width:auto;background:var(--card2);border:1px solid var(--line);color:var(--text);
  padding:5px 8px;border-radius:6px;font-family:inherit;font-size:13px;color-scheme:var(--scheme,dark)}
.ststart .hint{flex:1 1 100%;margin:0}
.ststart .ststart-msg{flex:1 1 100%;font-size:12.5px;overflow-wrap:anywhere}
.ststart .ststart-msg.err{color:var(--rose)}
.ststart .ststart-msg.ok{color:var(--ok)}
/* v81: 등록 폼 'API 재계약' 고르기(#kApiKindRow) 칸은 없앴다 — PRI통신시스템 카드의 재계약은 늘 같은 PRI 월 구독 (#kPriRenewBox) */
/* 승인 대기함 '자료실 승인' 단계 칩 (aprq.js APQ_ST.l — 옆 단계 칩 apq-s1~s3 과 같은 모양) */
.badge.apq-sl{color:var(--amber);border-color:color-mix(in srgb,var(--amber) 45%,transparent);background:transparent}
@media (max-width:700px){
  .ststart input[type=date]{font-size:16px;flex:1 1 160px}   /* 모바일 입력 확대 방지 (16px) · 좁으면 한 줄 */
}
/* v78 통합 (S2+S4 notes 5절): 열화상 단가표 '검토중 표 보기' 접힘 머리 · 원칙 가격표 검토중 줄 위 여백 */
details.thl-pend>summary{cursor:pointer;margin:6px 0}
tr.fmpp-req>td{padding-top:0}
/* ═══ /v78 ═══ */

/* ═══ v79 ═══ */
/* ⓘ 설명 아이콘 (app.js infoTip · itipWire) — 제목 옆 작은 동그라미 'i'. 누르는 자리는 보이는 것보다 넓게(::after, 휴대폰 손가락) ·
   설명 원문(.itip-src)은 늘 숨김 — 상자(#itipPop, body 바로 아래 하나)에 복사해 보인다. 색은 토큰만 (세 테마 — glass·light 는 상자 바탕만 덮는다) */
.itip{position:relative;display:inline-flex;align-items:center;justify-content:center;width:16px;height:16px;margin:0 0 0 6px;border-radius:50%;
  border:1.5px solid currentColor;color:var(--dim);font:italic 700 11px/1 Georgia,"Times New Roman",serif;letter-spacing:0;text-transform:none;
  cursor:help;vertical-align:2px;flex:none;box-sizing:border-box;-webkit-user-select:none;user-select:none;opacity:.8}
.itip::before{content:"i"}
.itip::after{content:"";position:absolute;inset:-9px}
.itip:hover,.itip.on{color:var(--cyan);opacity:1}
.itip:focus{outline:none}
.itip:focus-visible{outline:2px solid var(--cyan);outline-offset:2px;opacity:1}
.itip-src{display:none}
.itip-pop{position:fixed;left:0;top:0;z-index:2100;box-sizing:border-box;width:max-content;max-width:min(380px,calc(100vw - 16px));max-height:min(60vh,460px);overflow:auto;
  padding:10px 13px;border:1px solid var(--line);border-radius:10px;background:var(--card);color:var(--text);box-shadow:0 12px 30px rgba(0,0,0,.45);
  font-size:12.5px;line-height:1.65;font-weight:400;font-style:normal;text-align:left;white-space:normal;overflow-wrap:anywhere;word-break:keep-all;letter-spacing:0;text-transform:none}
.itip-pop[hidden]{display:none}
.itip-pop b:not([class]){color:var(--hi)}   /* 색 class 가 있는 글(.st-sky '대기' 하늘색 등)은 그 색 그대로 */
.itip-pop p{margin:0 0 6px}.itip-pop p:last-child{margin:0}
.itip-pop ul{margin:4px 0;padding-left:18px}
/* 제목 줄에 ⓘ 를 단 섹션 — 아래 설명 문단이 빠진 만큼 제목 아래 여백 (asec h3 기본 4px) */
.asec h3.ith,.ith{margin-bottom:10px}
.fmhead .ith,.libhead .ith{margin:0;font-size:15px;color:var(--hi);font-weight:650;flex:1 1 auto}
/* 결과 줄을 키보드로 여는 단추 (search.js listTableHtml — 단지 조회·계약조회 · 대시보드 만료 목록) — 겉모양은 글자 그대로, 초점 테두리만 */
.rowbtn{background:none;border:0;padding:0;margin:0;color:inherit;font:inherit;text-align:left;cursor:pointer;letter-spacing:inherit}
.rowbtn:focus{outline:none}
.rowbtn:focus-visible{outline:2px solid var(--cyan);outline-offset:2px;border-radius:4px}
tbody tr.rowl:focus-within{background:#1b2432}
/* 승인 대기함 불러오는 중 '…' · 실패 '!' 숫자 칩 (aprq.js apqBarSync) */
.apq-st .n.load{opacity:.7}
.apq-st .n.bad,.cnt.bad{color:var(--rose)}
/* 서비스 시작일 저장 결과 — 상세를 다시 그린 뒤에도 그 카드에 한 번 남김 (detail.js DT_ST_NOTE) */
.ststart-msg.keep{display:block;margin:4px 0 0;font-size:12.5px;color:var(--ok)}
/* ═══ /v79 ═══ */
/* ═══ v80 ═══ 보고서 표 (report.js — 보고서 · My page, 사용자 요청 2026-10-14): 칸 사이 세로줄 · 같은 단지 줄 묶음(tbody.rpcx — 마우스를 올리면 묶음 전부 색) ·
   줄 누르면 상세(단지명 = 단추) · 실패 ✕ 빨간 칸 · 검토중 · 제안값(흐린 기울임) · 누적 MRR · 엑셀 결과 글 */
:root{--rp-hov:rgba(124,196,245,.13)}
table.rp th,table.rp td{border-right:1px solid var(--line)}
table.rp th:last-child,table.rp td:last-child{border-right:0}
table.rp td{border-bottom-color:var(--line)}
table.rp th .u{display:block;font-size:10.5px;font-weight:400;color:var(--dim);margin-top:1px}
table.rp tbody tr:hover{background:transparent}
table.rp tbody.rpcx{cursor:pointer}
table.rp tbody.rpcx:hover td,table.rp tbody.rpcx:focus-within td{box-shadow:inset 0 0 0 999px var(--rp-hov)}
table.rp tbody.rpcx:hover td.chg,table.rp tbody.rpcx:focus-within td.chg{box-shadow:inset 0 0 0 1.5px rgba(46,204,113,.7),inset 0 0 0 999px var(--rp-hov)}
/* v80 고침: 다른 묶음(UPDATE · Pending · Finished)에 있는 같은 단지 줄도 같이 — report.js rpGrpBind 가 .hov(마우스) · .fw(초점) 를 붙임 */
table.rp tbody.rpcx.hov td,table.rp tbody.rpcx.fw td{box-shadow:inset 0 0 0 999px var(--rp-hov)}
table.rp tbody.rpcx.hov td.chg,table.rp tbody.rpcx.fw td.chg{box-shadow:inset 0 0 0 1.5px rgba(46,204,113,.7),inset 0 0 0 999px var(--rp-hov)}
.rpsl .tile.rpmrr .rppre{margin-top:2px;font-size:11px}
table.rp td.nm .rowbtn{font-weight:600;border-bottom:1px dotted var(--dim)}
table.rp tbody tr td.rpx{background:rgba(214,69,69,.8);color:#fff;font-weight:800;font-size:15px}
table.rp td.rpwait{color:var(--amber);font-weight:600}
table.rp td.rpest{color:var(--dim);font-style:italic}
table.rp td.rpnil{color:var(--faint)}
table.rp td.rpfailt{color:var(--rose);font-weight:600}
.rpsl .tile.rpmrr .rpacc{margin-top:8px;padding-top:7px;border-top:1px dashed var(--line)}
.rpsl .tile.rpmrr .rpacc .k{display:block;margin:0 0 2px;font-size:11px}
.rpsl .tile.rpmrr .rpacc b{font-size:16px;color:var(--cyan);font-variant-numeric:tabular-nums}
.rpxmsg{font-size:12px;margin-top:4px;max-width:280px}
.rpxmsg.dim{color:var(--dim)}.rpxmsg.okm{color:var(--ok)}.rpxmsg.errm{color:var(--rose)}
.rpold{margin:0 0 10px}
@media (max-width:700px){.rpxmsg{max-width:none}}
/* ═══ /v80 ═══ */
/* ═══ v80 (사용자 요청 2026-10-14) — 화면 갈래(S) ═══ */
/* ② ⓘ 설명 = 개조식 평어체 — 한 줄 = <span class="ib">• …</span>. 줄이 길어 접히면 둘째 줄부터 글머리(•) 뒤로 들여 쓴다 */
.itip-pop .ib{display:block;padding-left:.8em;text-indent:-.8em}
.itip-pop .ib+.ib{margin-top:2px}
/* ① 사용자 관리 이름 칸 — 이름 + [담당 이전] 한 줄 (admin.js renderUsers .usnm · .ustr). 예전: 버튼이 이름 아래 줄 · 좁은 칸에서 '담당 이 / 전' 으로 접힘.
     표는 .uswrap 안에서 가로로 움직이므로(375px) 칸을 줄바꿈 없이 두어도 페이지가 넓어지지 않는다 */
.uswrap td.usnm{white-space:nowrap}
.uswrap td.usnm>div{white-space:normal}               /* [담당 이전]을 누른 뒤의 받을 사람 고르기 · 결과 글은 접혀도 됨 */
.uswrap td.usnm .ustr{margin-left:8px;vertical-align:middle}
.uswrap td button.mini{white-space:nowrap}            /* [수정] 등 작은 버튼 글이 두 줄로 접히지 않게 */
.uswrap td{word-break:keep-all}                       /* '계정없 / 음' 처럼 낱말 가운데서 접히지 않게 */
.uswrap td.em{white-space:nowrap}                     /* 이메일 */
/* ③ 대시보드 지역 지도 옆 목록 — 스크롤 없이 다 보이게 (예전 최대 높이 440px · 휴대폰 320px). 목록이 지도보다 길면 지도는 칸 안에서 따라 내려온다 */
.rlist{max-height:none;overflow:visible}
@media (min-width:701px){ .rbox.km .rmapwrap.km{position:sticky;top:40px} }   /* 40px = 시험 DB 빨간 띠(#envBar — 화면 위에 고정) 아래 */
/* ═══ /v80 S ═══ */

/* v80 (사용자 요청 2026-10-14): 가입 승인 줄 — 중앙본부 사업지원 가입 경고 (admin.js suHqWarn) */
.suhq{font-size:12px;margin-top:4px;line-height:1.45;max-width:280px;white-space:normal}

/* ═══ v81 (사용자 결정 2026-10-14): 장비 = 일회성 · PRI통신시스템(30ch) — 카드 배지 · 등록 폼 PRI 칸 · 대시보드 PRI 조각 (색은 토큰만 — 세 테마 같이) ═══ */
.badge.b-once{color:var(--dim);border-color:color-mix(in srgb,var(--dim) 55%,transparent);border-style:dashed;background:transparent}   /* 장비 카드 '일회성' (기간 없음) */
.badge.b-lump{color:var(--violet);border-color:color-mix(in srgb,var(--violet) 45%,transparent);background:transparent}   /* PRI '일시불 n년' — 'p' 를 같이 달지 않는다 (theme-glass·light 의 .badge.p 분홍이 이김) */
.badge.b-sub{color:var(--cyan);border-color:color-mix(in srgb,var(--cyan) 45%,transparent);background:transparent}      /* PRI '월 구독' (종료일 없음) */
#ctModal .kpribox .fst .hint{margin-left:4px;font-weight:400}
#ctModal .kpribox select{min-width:0}
#ctModal .hint.kpriwarn{color:var(--amber)}            /* 기본 금액과 다름 — 승인 때 예외 조건 (상황 글 — ⓘ 아님) */
#ctModal .hint.kpriwarn.bad{color:var(--rose)}         /* 숫자가 아님 */
#ctModal .kpriatt{margin:2px 0 4px;color:var(--text);overflow-wrap:anywhere}   /* 기존 PRI 에 붙음 — 장비만 */
#ctModal .kpriatt .dim{margin-top:2px}
#ctModal .kpriamb{color:var(--amber)}
#ctModal .kdevnote .itip{margin-left:4px}
.dppri{color:var(--dim);font-size:11.5px}               /* 대시보드 제품별 MRR — PRI 셋 나눔 */
/* ═══ /v81 S ═══ */

/* ═══ v82 (사용자 요청 2026-10-14): 기록 › 오이패스 (oipass.js — 진행단지 현황 표 · 발주 이력) · 오이패스 발주서 (poform.js — 카드 줄 · 발주서 창 · 자료실 › 발주서) ═══
   줄 색 = 시트 조건부 서식 (설치완료 초록 · 해지·마이타운 빨강) · 단지명 왼쪽 노란 띠 = 가동오픈일 있음 (시트 B 노랑 — 줄 색 위에서도 보이게 띠로).
   색은 변수 --oip-* 만 (기본·glass = 같은 뜻 옅은 색 · 밝은 화면 = 시트 색 그대로 — theme-light.css). 머리줄·단지명 칸은 굴려도 붙어 있으므로 불투명 바탕 (glass·light 는 테마 파일이 덮음) */
:root{--oip-done-bg:rgba(0,255,0,.22);--oip-stop-bg:rgba(255,0,0,.30);--oip-open-bg:rgba(255,255,0,.25);--oip-open-bar:#e8d400;
  --oip-head-bg:#1a212c;--oip-head-ink:#c9d3e0;--oip-cell-bg:#161b24;--oip-pop-bg:#1b2230;--oip-ink:var(--text);--oip-auto-ink:var(--dim)}
.oiphead{display:flex;align-items:center;justify-content:space-between;gap:10px 16px;flex-wrap:wrap;margin:0 0 10px}
.oiphead h3{margin:0}
.oiptools{display:flex;flex-direction:column;gap:8px;margin:0 0 8px}
.oipchips{display:flex;flex-wrap:wrap;gap:6px}
.oipchips .libchip .cnt{margin-left:3px;font-variant-numeric:tabular-nums;color:var(--dim)}
.oipfrow{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px}
.oipfrow select,.oipfrow input[type=text],.oipfrow input[type=date]{min-width:0;max-width:100%}
.oipfrow .libq{flex:1 1 180px;min-width:140px;max-width:320px}
.oiplab{font-size:12.5px;color:var(--dim)}
.oipsum{font-size:12.5px;color:var(--dim)}
.oipnote{margin:0 0 8px;font-size:12.5px;color:var(--dim)}
#oipMsg .err,#oipMsg .okflash{margin:0 0 8px}
/* v89 (사용자 요청 2026-10-21 — '계약조회 화면과 비슷하게 · 지금 표는 촌스러움'): 진행 현황 표 = 계약조회와 같은 그릇(.tblwrap) · 거르기 상자(.filters) ·
   요약 줄(.sumrow) · 테마의 표 규칙(th · td · tr.rowl · .rowbtn · td.n · .hide-m · .badge)을 그대로 쓴다 — 유리 · 밝은 테마도 계약조회와 같은 모양.
   v85 ~ v88 의 시트 모양(줄 초록·빨강 · 노란 띠 · 칸 테두리 · 안쪽 굴림 상자 .oipwrap · 고정 열 너비 table.oipt · oipv6)은 뺐다 (엑셀은 시트 모양 그대로).
   아래는 이 표만의 작은 것 — 색은 테마 변수만 (--rose · --dim · --text · --line · --cyan) */
.oipfilters .oipqf{flex:1 1 220px;max-width:360px}
.oipfilters .oipqf input{width:100%}
.oipfilters .chks{align-items:center;gap:6px 8px}
.oipxl{display:flex;gap:8px;flex-wrap:wrap}
#oipTable .tblwrap.oiptw{overflow-x:auto}                     /* v89 검토 고침: 701 ~ 820px(태블릿 세로)에서 표(단지명 · 메모 최소 너비 · 숫자 칸 줄바꿈 없음)가 상자보다 넓어 오른쪽이 잘렸다 —
                                                                  모든 너비에서 상자 안 가로 굴림 (기본 .tblwrap 의 overflow:hidden 을 이겨야 해서 :where 아님 · 발주 이력 표와 같음) */
table.oipv .nodash{color:var(--dim);opacity:.6}                 /* v89 검토 고침: 빈 칸 '-' · '—' 흐리게 (계약조회 .prod .nodash 와 같음) */
table.oipv th{padding:0}                                       /* 머리 칸 = 정렬 단추가 칸 전체 (padding 은 단추에) */
table.oipv th.n .oipsortb{text-align:right}
table.oipv td.oc-B{min-width:150px;word-break:keep-all;overflow-wrap:anywhere}
table.oipv td.oc-D,table.oipv td.oc-X,table.oipv td.oc-UP,table.oipv td.oc-END{white-space:nowrap}
table.oipv td.oc-Y{min-width:180px;max-width:380px}
table.oipv .oipname{font-weight:600;text-decoration:none}
table.oipv tr.oip-newrow>td{border-top:1px dashed var(--line)}
table.oipv td.oipnone{padding:28px;color:var(--dim);text-align:center;cursor:default}
.oipmemo{display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;line-clamp:3;overflow:hidden;white-space:pre-line;word-break:keep-all;overflow-wrap:anywhere}   /* 메모 = 세 줄까지 (전체는 마우스 글 · 창) */
.oipall{margin:0 6px 2px 0}                                    /* 메모 앞 '전세대' 배지 (계약 is_all_units — 저장한 메모는 그대로) */
.oipend{font-variant-numeric:tabular-nums}
.oipendt{display:block;font-size:11px;font-weight:600;margin-top:1px}
.oipend-term{color:var(--rose);font-weight:600}                /* 만료일 칸 — 해지 예정 (DB v83g) */
.oipend-off{color:var(--dim)}                                   /* 만료 · 해지된 계약 */
.oipsub{display:none;font-size:11.5px;color:var(--dim);margin-top:2px}   /* 단지명 아래 지역 — 700px 이하에서만 (시도·시군구 열 대신) */
.oipsortb{display:block;width:100%;padding:10px 13px;background:transparent;border:0;color:inherit;font:inherit;font-weight:inherit;text-align:left;cursor:pointer;white-space:nowrap}
.oipsortb:hover{color:var(--hi)}
.oipsortb:focus-visible{outline:2px solid var(--cyan);outline-offset:-2px}
.oipar{margin-left:3px;font-size:10px}
@keyframes oipok{0%{box-shadow:inset 0 0 0 2px var(--ok)}100%{box-shadow:inset 0 0 0 2px transparent}}   /* 창 · 단지 상세 칸 저장 표시 (.oipwf.oip-okf) */
.oipb{display:flex;align-items:center;gap:4px;flex-wrap:wrap}
.oipname{background:none;border:0;padding:2px 0;color:inherit;font:inherit;font-weight:600;text-align:left;cursor:pointer;text-decoration:underline;text-decoration-color:color-mix(in srgb,currentColor 35%,transparent);text-underline-offset:3px}
.oipname:hover{color:var(--cyan)}
.oipname:focus-visible{outline:2px solid var(--cyan);outline-offset:1px;border-radius:3px}
.oipcell{display:block;width:100%;min-height:26px;min-width:36px;padding:2px 4px;background:transparent;border:1px dashed transparent;border-radius:4px;color:inherit;font:inherit;text-align:inherit;cursor:pointer;white-space:inherit}
.oipcell:hover{border-color:color-mix(in srgb,var(--cyan) 60%,transparent)}
.oipcell:focus-visible{outline:2px solid var(--cyan);outline-offset:-1px}
.oipcell.oipcell-mini{display:inline-block;width:auto;min-width:0;min-height:22px;padding:0 4px;font-size:11px;color:var(--dim)}
.oipempty{color:var(--faint)}
.oipnew{font-size:10.5px;padding:0 6px;border:1px dashed var(--line);border-radius:10px;color:var(--dim);white-space:nowrap}
.oip-st{font-size:11px;color:var(--amber);margin-top:2px;white-space:nowrap}
.oipwarnt{display:block;font-size:10.5px;color:var(--amber);white-space:nowrap}
/* 칸 안 고치기 상자 (표 안 요소 — 새 창 아님) */
.oiped{position:absolute;z-index:6;top:100%;left:0;min-width:160px;max-width:calc(100vw - 32px);width:max-content;padding:8px;background:var(--oip-pop-bg);color:var(--text);
  border:1px solid var(--cyan);border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.35);text-align:left;white-space:normal}
.oiped input[type=text],.oiped select,.oiped textarea{width:100%;min-width:150px;max-width:min(360px,calc(100vw - 52px));box-sizing:border-box;font-size:13px}
.oiped textarea{min-width:min(320px,calc(100vw - 52px));resize:vertical}
.oiped .hint{margin-top:3px}
.oipedb{display:flex;gap:6px;margin-top:6px}
.oipedmsg{font-size:12px;color:var(--rose);margin-top:4px;max-width:320px}
.oipedmsg:empty{display:none}
.oipedwarn{font-size:12px;margin-top:4px;max-width:320px}   /* v95: 마스터키 칸 — 권장보다 적게 친 값 (노란 글 · 막지 않음 — oipass.js oipEdMk) */
.oipedwarn:empty{display:none}
.oiped select+input{margin-top:6px}
/* 시트에 없던 계약 단지 (접힌 묶음) · 발주 이력 */
.oipold{margin:14px 0 0;border:1px solid var(--line);border-radius:10px;padding:8px 12px}
.oipold summary{cursor:pointer;font-size:13px}
.oipold .hint{margin:6px 0}
.oipold table td,.oipold table th{padding:6px 8px;font-size:12.5px}
.oipold table tbody tr{cursor:default}
table.oiphist{font-size:12.5px;min-width:760px}
table.oiphist td,table.oiphist th{padding:7px 8px}
table.oiphist tbody tr{cursor:default}
table.oiphist tr.oip-oldver td{opacity:.62}
table.oiphist tr.oip-cancel td{opacity:.55}
#oipHistBox .oipfrow{margin:0 0 8px}
#oipHistBox .tblwrap,.oipold .tblwrap{overflow-x:auto}
.oip-st{white-space:normal}
/* v90 (사용자 결정 2026-10-21 — DB schema_v83h): 상태 자동 표시 (계약이 끝나 만료 · 해지 — 점선 테두리 + 작은 '자동' · 배지 색은 테마 그대로) · 현황에서 빠진 줄 (흐림 · '빠짐') ·
   요약 줄 '빠진 단지 N곳 보기' · 줄 창 [현황에서 빼기] 칸 안 입력 · 빠짐 줄. 색은 테마 변수만 (세 테마 같은 규칙) */
td.oc-X .badge.oipauto,.oipwf .badge.oipauto{outline:1px dashed currentColor;outline-offset:2px}
.oipautot{margin-left:5px;font-size:10.5px;color:var(--dim);white-space:nowrap}
table.oipv tr.oip-xrow>td{opacity:.55}
table.oipv tr.oip-xrow:hover>td,table.oipv tr.oip-xrow:focus-within>td{opacity:.8}
.oipxtag{font-size:10.5px;padding:0 6px}
.oipxbtn[aria-pressed="true"]{border-color:color-mix(in srgb,var(--cyan) 60%,transparent)}
.oipwsub{display:block;font-size:10.5px;color:var(--dim);margin-top:2px;overflow-wrap:anywhere}
.oipxline{margin:0 0 10px;font-size:12.5px;overflow-wrap:anywhere}
.oipxline .oipxr{font-weight:600}
.oipxline .mini{margin-left:4px}
.oipxbar{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;margin:0 0 10px;font-size:12px}
.oipxask{margin:0 0 12px;padding:8px 10px;border:1px dashed var(--line);border-radius:8px}
.oipxask label{display:block;font-size:12px;color:var(--dim);margin:0 0 4px}
.oipxask input[type=text]{width:100%;max-width:420px;box-sizing:border-box}
.oipxask .hint{margin-top:4px}
@media (max-width:700px){
  table.oipv .oipsub{display:block}
  .oipsortb{padding:9px 10px}
  table.oipv td.oc-Y{min-width:140px}
  .oipfrow .libq{flex-basis:100%;max-width:none}
  .oipfrow>select{flex:1 1 120px}
}

/* ── v85: 오이패스 창 (#oipwMask — oipass.js oipwOpen · 명세 5-3 ~ 5-5) — 계약 카드(.ctr — 단지 상세와 같은 규칙) · 발주서 줄(.pofline) · 현황 칸 · 변경이력 ── */
#oipwModal{max-width:960px}
#oipwModal:focus{outline:none}
#oipwModal .mhead>div:first-child{min-width:0}
#oipwTitle{overflow-wrap:anywhere}
.oipwtop{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:6px 10px;margin:0 0 12px;font-size:12.5px;color:var(--dim)}
.oipwmeta{min-width:0;overflow-wrap:anywhere}
.oipwmeta:empty{display:none}
#oipwMsg .err,#oipwMsg .okflash,#oipwMsg .oipnote{margin:0 0 10px}
.oipwct .oipwfoot{margin-top:8px;padding-top:6px;border-top:1px dashed var(--line);font-size:12px;color:var(--dim);overflow-wrap:anywhere}
.oipwlink{background:none;border:0;padding:0;margin:0;color:var(--cyan);font:inherit;cursor:pointer;text-decoration:underline;text-underline-offset:2px}
.oipwlink:focus-visible{outline:2px solid var(--cyan);outline-offset:2px;border-radius:3px}
.oipwgrp{margin:0 0 12px}
.oipwgrp>.gh{font-size:12px;color:var(--dim);font-weight:600;margin:0 0 6px}
.oipwgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(160px,1fr));gap:8px}
.oipwf{position:relative;min-width:0;background:var(--card2);border:1px solid var(--line);border-radius:8px;padding:6px 8px}
.oipwf.ed{border-color:color-mix(in srgb,var(--cyan) 35%,var(--line))}   /* 수정할 수 있는 칸 */
.oipwf.wide{grid-column:1/-1}
.oipwf>.k{display:block;font-size:11px;color:var(--dim);margin:0 0 2px}
.oipwf>.v{display:block;font-size:13px;overflow-wrap:anywhere}
.oipwf.oip-auto>.v{color:var(--oip-auto-ink)}
.oipwf.oip-auto .oipcell{color:var(--oip-auto-ink)}   /* v95 검토 고침: 고칠 수 있는 칸의 자동 값(마스터키 계약 값 · '권장 N' · E · G · T · J)도 흐리게 — 저장 값과 구별 */
.oipwf .oipcell{font-size:13px;text-align:left;white-space:normal;overflow-wrap:anywhere;padding:2px 4px;min-height:28px}
.oipwf.oc-Y .oipcell{white-space:pre-wrap}   /* 메모 줄바꿈 그대로 */
.oipwf.oip-open{box-shadow:inset 4px 0 0 var(--oip-open-bar)}
.oipwf.oip-warn{background:var(--oip-open-bg)}
.oipwf.oip-bad{box-shadow:inset 0 0 0 2px var(--rose)}
.oipwf.oip-okf{animation:oipok 1.4s ease-out}
.oipwf .oipwarnt{white-space:normal}
#oipwBody .oiped,#oipdSite .oiped{position:static;width:auto;min-width:0;max-width:100%;margin-top:6px;box-shadow:none}   /* 창 · 단지 상세(v88) 칸 안 수정 상자 = 칸 안에 그대로 (표처럼 떠 있지 않음) */
#oipwBody .oiped input[type=text],#oipwBody .oiped select,#oipwBody .oiped textarea,#oipdSite .oiped input[type=text],#oipdSite .oiped select,#oipdSite .oiped textarea{min-width:0;max-width:100%}
.oipwhist{margin-top:6px;border:1px solid var(--line);border-radius:10px;padding:8px 12px}
.oipwhist summary{cursor:pointer;font-size:13px}
.oipwhist ul{list-style:none;margin:8px 0 0;padding:0;font-size:12.5px}
.oipwhist li{padding:5px 0;border-top:1px dashed var(--line);overflow-wrap:anywhere}
.oipwhist .none{margin-top:8px}
@media (prefers-reduced-motion:reduce){.oipwf.oip-okf{animation:none;box-shadow:inset 0 0 0 2px var(--ok)}}
.oipwnoct{background:var(--card2);border:1px solid var(--line);border-radius:9px;padding:10px 15px;margin-top:9px}   /* v88: 오이패스 계약이 없거나 못 읽은 창 — 진행 현황만 */

/* ── v88 (사용자 요청 2026-10-21): 계약 카드 접기 (detail.js dtCardShell — 단지 상세 · 기록 › 오이패스 창) ──
   머리 = 진짜 단추 .cttog (제품 · 상태 · 기간 · D-day · 담당 · aria-expanded) + 카드 단추 .ctbtns (접혀도 보임 — 눌러도 접히지 않음) · 몸통 .ctbody (hidden = 접힘) */
.cthd{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;min-width:0}
.cttog{flex:1 1 300px;min-width:0;display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px;padding:3px 4px;margin:0;background:none;border:0;border-radius:8px;color:inherit;font:inherit;font-size:13px;text-align:left;cursor:pointer}
.cttog:hover{background:color-mix(in srgb,var(--cyan) 8%,transparent)}
.cttog:focus-visible{outline:2px solid var(--cyan);outline-offset:1px}
.cttog .pname{overflow-wrap:anywhere}
.cttog .badge{white-space:nowrap}
.ctper{color:var(--text);font-weight:600;overflow-wrap:anywhere}
.ctper .ctterm,.det .ctterm{color:var(--rose);font-weight:700}   /* v89: 카드 머리 기간 끝 '해지 예정' · 몸통 해지 예정 줄 (DB v83g — 색은 테마 변수 --rose) */
.ctwho{color:var(--dim);font-size:12.5px;overflow-wrap:anywhere}
.ctchev{display:inline-block;flex:none;width:12px;text-align:center;color:var(--dim);font-size:11px;transition:transform .15s ease}
.ctchev::before{content:"▸"}
[aria-expanded="true"]>.ctchev{transform:rotate(90deg)}
/* v88 검토 고침: 카드 머리 안만 (.cthd>) — 같은 이름 .ctbtns 가 계약 등록 폼의 [임시저장]·[등록] 줄(#ctModal .ctbtns)에도 있어 align-items 등이 새어 [등록] 이 2px 낮아졌다 */
.cthd>.ctbtns{display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;gap:6px;min-width:0;max-width:100%;margin-left:auto}
.cthd>.ctbtns .mini{margin:0}
/* v101 (명세 2-I): 카드 머리 맨 오른쪽 [파일 추가] — label(.addfile 의 테마 색 그대로) + 숨은 file 칸 · 크기만 머리 단추에 맞춤 · 클래스 이름 2026-10-27 grep: 없음 (.ctaddf) */
.cthd>.ctbtns .addfile.ctaddf{padding:4px 11px;min-height:28px;font-size:12px;gap:4px;white-space:nowrap}
.cthd>.ctbtns .ctaddf input{display:none}
.cthd>.ctbtns .ctaddf:focus-visible{outline:2px solid var(--cyan);outline-offset:2px}
.pofhb{display:inline-flex;flex-wrap:wrap;align-items:center;gap:6px;min-width:0;max-width:100%}
.pofhb:empty,.ststartb:empty{display:none}
.pofhb .pofnew .amber{flex:1 1 100%;font-size:12.5px;overflow-wrap:anywhere}   /* [새 발주서] 경고 (pofNewAsk — 머리 자리에서 펼침) */
.ctbody{margin-top:10px;padding-top:10px;border-top:1px dashed var(--line);min-width:0}
.ctbody>.top{justify-content:flex-start}   /* 상태 · 제품 이름은 머리로 — 몸통 배지 줄은 왼쪽부터 */
.ctacc>.ststart,.ctacc>.ststart-msg.keep{margin-top:8px}
.ctr.ctacc:not(.on){padding-top:9px;padding-bottom:9px}   /* 접힌 카드는 낮게 */
/* 오이패스 카드 안 진행 현황 (oipass.js oipSiteSecHtml — 단지 상세 처음 접힘 · 창 처음 펼침) */
.oipsite{margin-top:10px;border:1px solid var(--line);border-radius:10px;padding:6px 10px;min-width:0}
.oipwnoct>.oipsite{margin-top:0;border:0;padding:0}
.oipsitehd{display:flex;align-items:center;gap:4px;min-width:0;margin:0;font:inherit;color:inherit}   /* v88 검토 고침: 제목(h5) — 기본 h5 여백·글자 크기를 없앰 (안 단추가 글 모양을 정함) */
.oipsitetog{flex:1 1 auto;min-width:0;display:flex;align-items:center;flex-wrap:wrap;gap:4px 6px;padding:4px 2px;margin:0;background:none;border:0;border-radius:6px;color:var(--hi);font:inherit;font-size:13.5px;font-weight:600;text-align:left;cursor:pointer}
.oipsitetog:hover{background:color-mix(in srgb,var(--cyan) 8%,transparent)}
.oipsitetog:focus-visible{outline:2px solid var(--cyan);outline-offset:1px}
.oipsitesum{font-weight:400;font-size:12.5px;color:var(--dim);overflow-wrap:anywhere}
.oipsitebody{padding:8px 0 4px}
#oipdMsg .err,#oipdMsg .okflash,#oipdMsg .oipnote{margin:0 0 10px}
@media (prefers-reduced-motion:reduce){.ctchev{transition:none}}
@media (max-width:700px){
  .cttog{flex-basis:100%}
  .cthd>.ctbtns{justify-content:flex-start;margin-left:0}
}

/* ── 오이패스 카드의 발주서 줄 (poform.js pofCardPaint — detail.js #pofl-계약) ── */
.pofline{margin-top:8px;padding-top:8px;border-top:1px dashed var(--line)}
.pofcard{display:flex;flex-direction:column;gap:6px;font-size:12.5px}
.pofcard.dim{color:var(--dim)}
.pofrow{line-height:1.6;overflow-wrap:anywhere}
.pofrow.sent b{color:var(--ok)}
.pofrow.pend{color:var(--amber)}
.pofrow.old{color:var(--dim)}
.pofrow .mini,.pofbtns .mini{margin:1px 0}
.pofbtns{display:flex;flex-wrap:wrap;align-items:center;gap:6px}
.pofnew{display:inline-flex;flex-wrap:wrap;align-items:center;gap:6px}
.pofask:empty{display:none}
.pofask .pofaskin{min-width:160px;max-width:min(320px,100%);font-size:12.5px}
.pofaskmsg{font-size:12px}
.pofaskmsg:empty{display:none}
.pofnote{font-size:12.5px;padding:6px 10px;border-left:3px solid var(--cyan);border-radius:0 6px 6px 0;background:var(--card2);overflow-wrap:anywhere}

/* ── 발주서 창 (#pofMask — pofOpen · pofPvReq) ── */
#pofModal{max-width:1500px}
#pofModal:focus{outline:none}
.pofband{margin:0 0 10px;padding:8px 12px;border-radius:8px;font-size:13px;font-weight:600}
.pofband.test{background:#b3261e;color:#fff;border:1px solid #7a1712}
.pofband.warn{background:var(--card2);color:var(--amber);border:1px solid color-mix(in srgb,var(--amber) 55%,transparent)}
.pofinfo{margin:0 0 10px;font-size:12.5px;padding:8px 12px;border:1px solid var(--line);border-radius:8px;overflow-wrap:anywhere}
.pofgrid{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.1fr);gap:18px;align-items:start}
.pofl,.pofr{min-width:0}
.pofprevbox{overflow:hidden;border-radius:6px;background:#9aa0a8;padding:8px 4px}
.pofzoom .pofpage{margin:0 auto}
.dff.pofchg .dfin input,.dff.pofchg .dfin select,.dff.pofchg .dfin textarea{box-shadow:0 0 0 2px color-mix(in srgb,var(--amber) 45%,transparent)}
.pofwas{color:var(--amber)}
.pofwas:empty{display:none}
.pofcalc{font-size:12px;color:var(--dim);white-space:nowrap}
.pofl .dfin textarea,.pofedbox .dfin textarea{flex:1 1 100%;min-width:0;width:100%;box-sizing:border-box}
.pofl textarea,.pofedbox textarea,.oiped textarea{background:var(--card2);border:1px solid var(--line);color:var(--text);border-radius:8px;padding:8px 10px;font:inherit;font-size:13px;line-height:1.5;resize:vertical}
.pofl textarea:focus,.pofedbox textarea:focus,.oiped textarea:focus{outline:none;border-color:var(--cyan)}
@media (max-width:700px){ .pofl textarea,.pofedbox textarea,.oiped textarea,.oiped input[type=text],.oiped select,.pofask .pofaskin{font-size:16px} }   /* 16px 미만이면 iOS 가 칸을 누를 때 화면을 확대한다 */
.pofmail{display:flex;flex-direction:column;gap:4px;font-size:13px;overflow-wrap:anywhere}
.pofmailbody{white-space:pre-wrap;margin:2px 0;padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:var(--card2);font:inherit;font-size:12.5px;line-height:1.55;overflow-wrap:anywhere}
.pofact{display:flex;flex-direction:column;gap:6px;margin:4px 0 0}
.pofwhy{font-size:12.5px}
.pofwhy:empty{display:none}
.pofprog{font-size:13px;color:var(--cyan)}
.pofprog:empty{display:none}
.pofaskbox{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;padding:8px 12px;border:1px solid var(--amber);border-radius:8px;font-size:13px;overflow-wrap:anywhere}
.pofresult{display:flex;flex-wrap:wrap;align-items:center;gap:6px;padding:8px 12px;border:1px solid var(--line);border-radius:8px;font-size:13px;overflow-wrap:anywhere}
.pofbusy .pofl{opacity:.75}
/* v82 고침 (검토 화면-2): 발주 줄이 생긴 뒤(올리기 실패) 칸·[보내기] 가 잠긴 것이 눈에 보이게 — button.go 는 꺼진 모양이 따로 없다 (위 .fmsavebar 와 같은 까닭) */
#pofBody button.go:disabled{opacity:.45;cursor:default}
#pofBody .pofl input:disabled,#pofBody .pofl select:disabled,#pofBody .pofl textarea:disabled{opacity:.6;cursor:not-allowed}
@media (min-width:701px){
  #pofModal{display:flex;flex-direction:column;max-height:calc(100vh - 48px)}
  #pofBody{flex:1;min-height:0;overflow:auto}
  #pofBody .pofr{position:sticky;top:0}
}
@media (max-width:700px){
  .pofgrid{grid-template-columns:minmax(0,1fr)}
}
/* ── 자료실 › 발주서 (pofLibInit) ── */
.poflib{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.1fr);gap:18px;align-items:start}
.poflib-l,.poflib-r{min-width:0}
.pofverh{font-size:13.5px;margin:0 0 10px}
.pofmailtpl{display:flex;flex-direction:column;gap:4px;font-size:13px;margin:0 0 14px;overflow-wrap:anywhere}
.pofvers .fmver{padding:10px 14px;margin:0 0 10px}
.pofvers .fmv-h{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px}
.pofvers .fmv-who{font-size:12px;color:var(--dim)}
.pofvers .fmv-sum{margin:6px 0 0;padding-left:18px;font-size:12.5px}
.pofedbox{border:1px solid var(--cyan);border-radius:12px;padding:12px 14px;margin:0 0 16px}
.pofedgrid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 14px}
.pofedtok{margin:4px 0 10px;line-height:1.9}
.pofedtok code{font-size:11.5px;padding:1px 4px;border:1px solid var(--line);border-radius:4px;margin-right:2px}
.pofedprev{display:grid;grid-template-columns:minmax(0,1.1fr) minmax(0,1fr);gap:14px;align-items:start}
/* v84: [고치기] 임시저장 · 취소 (poform.js pofEd* — 사용자 결정 2026-10-20) — 상태 줄 · 이어서 줄 · 그 사이 새 판(빨강) · 둘 다 바뀐 칸 · [고치기] 옆 내 임시저장 */
.pofedst{flex:1 1 220px;min-width:0;font-size:12.5px;line-height:1.45;overflow-wrap:anywhere}
.pofedst:empty{display:none}
.pofedst .hint{font-size:12px}
.pofedst button.mini{margin:2px 0 0 6px}
.pofedres{margin:0 0 8px;padding:6px 10px;border-left:3px solid var(--cyan);border-radius:0 6px 6px 0;background:var(--card2);font-size:12.5px;line-height:1.5;overflow-wrap:anywhere}
.pofedres button.mini{margin:4px 0 0 6px}
.warnbox.pofconfbox{margin:0 0 10px;overflow-wrap:anywhere}
.pofconfbox button.mini{margin:6px 0 0}
.dff.pofconf .dfin input,.dff.pofconf .dfin textarea{box-shadow:0 0 0 2px color-mix(in srgb,var(--rose) 60%,transparent)}
.pofconfm{color:var(--rose)}
.pofconfm:empty{display:none}
#pofLibBtn{display:inline-flex;flex-wrap:wrap;align-items:center;gap:4px 10px;max-width:100%}
.pofwipln{font-size:12px;color:var(--dim);line-height:1.45;overflow-wrap:anywhere;min-width:0}
.ftverify{margin:4px 0 0;font-size:12.5px;display:flex;flex-wrap:wrap;align-items:center;gap:6px}
.ftverify:empty{display:none}
.pofvmsg:empty{display:none}
@media (max-width:700px){
  .poflib,.pofedgrid,.pofedprev{grid-template-columns:minmax(0,1fr)}
}
/* 변경이력 — 오이패스 현황의 옛 시트 값(JSON) 접어 보기 (history.js) */
details.hjson{display:inline-block;vertical-align:top;max-width:100%}
details.hjson summary{cursor:pointer;color:var(--cyan);font-size:12px}
details.hjson code{display:block;white-space:pre-wrap;overflow-wrap:anywhere;font-size:11.5px;max-width:min(560px,80vw)}
/* ═══ /v82 S ═══ */
/* ═══ v91 (사용자 요청 2026-10-21) — 결재/관리 탭: 관리 칸 = 보기 기본 · [수정] → [저장]/[취소] (admin.js us* · div* · lst*) · 승인 대기함 = 처리한 줄만 접힘 (aprq.js apqCollapse)
   색은 토큰만 (--card · --card2 · --line · --text · --dim · --amber · --rose · --ok — 기본 · glass · 밝은 화면이 같이 맞음) · 375px = 머리 단추가 제목 아래로 접힘 · 칸 글 16px (iOS 확대 막기) ═══ */
.ashead{display:flex;align-items:flex-start;flex-wrap:wrap;gap:6px 12px;margin:0 0 10px}
.ashead>h3.ith{margin:0;flex:1 1 auto;min-width:0}
.asedit{display:flex;align-items:center;flex-wrap:wrap;gap:6px 8px;margin-left:auto}
.asedit:empty,.asedit[hidden]{display:none}
.asedit button.go,.asedit button.ghost,.asask button.go,.asask button.ghost{width:auto;padding:5px 14px;font-size:13px;min-height:30px}   /* 글래스 테마 좁은 화면의 button.go 한 줄 전체(width:100%)를 여기서는 풀어 둠 */
.asedit button:disabled,.asask button:disabled{opacity:.45;cursor:default}
.asedit .asedn{font-size:12.5px;color:var(--dim)}
.asedit .asedn.dirtyn{color:var(--amber);font-weight:600}
.asedit-foot{margin:10px 0 0;justify-content:flex-end}
.asask{border:1px solid var(--amber);border-radius:10px;background:var(--card2);padding:10px 14px;margin:0 0 12px;font-size:13px;line-height:1.55;overflow-wrap:anywhere}
.asask:empty{display:none}
.asask .asask-h{margin:0 0 4px}
.asask ul{margin:4px 0 8px 18px;padding:0}
.asask li{margin:1px 0}
.asask .asask-row{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.asask input.asask-why{flex:1 1 240px;min-width:0}
.asask .asask-msg{margin-top:6px;font-size:12.5px}
.asask .asask-msg:empty{display:none}
.asbad{color:var(--rose)}
.asec .asro{color:var(--dim)}   /* 보기 칸의 '(없음)' 같은 빈 값 */
.asec select.bad,.asec input.bad{border-color:var(--rose) !important;box-shadow:0 0 0 1px var(--rose)}
.useerr{color:var(--rose);font-size:12px;line-height:1.4;white-space:normal;margin-top:3px;overflow-wrap:anywhere}
.uswrap>table{width:max-content;min-width:100%}   /* 칸을 좁혀 글 · 고르기 칸이 한 글자씩 접히지 않게 — 넓으면 표 칸 안에서 가로로 (375px) */
.uswrap td select.usf{max-width:180px;min-width:6.5em}
.ustrsel{margin-top:4px;white-space:normal;font-size:12px;color:var(--dim)}
.ustrsel select{margin-left:4px;max-width:170px}
.usrt{margin-top:4px;white-space:normal;font-size:12px;color:var(--amber)}
.usrt select{margin-left:4px;max-width:170px}
.uscope.usced{min-width:200px;max-width:250px;margin-top:6px;padding:6px 9px;border:1px solid var(--line);border-radius:8px;background:var(--card2)}
.uscope.usced.dirty{border-color:var(--amber);box-shadow:0 0 0 1px var(--amber)}
.uscope.usced .uschk{margin:4px 0 0}
/* 검토 고침: 수정 중 표가 1440 에서도 칸 상자 안에 들게 — 맡은 본부 상자 좁게(위 250px · 본부 이름이 두세 개씩 접힘) · 읽기만인 이메일 칸은 수정 중에 숨김 (보기에서는 그대로) */
.uswrap table.usedt>thead>tr>th:nth-child(2),.uswrap table.usedt td.em{display:none}
#boxLists .lstnew td{background:color-mix(in srgb,var(--amber) 8%,transparent)}
#boxLists .addrow,#boxDivs .addrow{margin:8px 0 0}
@media (max-width:700px){
  .asedit{justify-content:flex-end}
  .asask input.asask-why,.uswrap td select.usf,.ustrsel select,.usrt select,#boxDivs input[type=text],#boxLists input[type=text]{font-size:16px}
  .uscope.usced{min-width:180px;max-width:calc(100vw - 72px)}
  /* 검토 고침: 글래스 좁은 화면 규칙(.chk = 40px 알약 — theme-glass.css)이 맡은 본부 체크 8개를 사업지원 줄마다 쌓아 줄이 270px 쯤 → 작은 체크 줄로 */
  .uscope.usced .uschk{gap:2px 10px}
  .uscope.usced .uschk .chk{min-height:0;padding:2px 6px;border:0;background:none}
  /* 검토 고침: 보기 표(본부 · 직책 · 제품 — 2 ~ 4칸)는 글래스 좁은 화면의 표 최소 너비 560px 를 풀어 칸 상자 안에 (수정 표는 그대로 가로로) */
  .asec table.asview{min-width:0}
}
/* 관리 작업 이력 — 일시 = 날짜 / 시각 두 줄 (좁은 칸) · 남는 너비는 작업 칸 */
.acttbl td.actdt{white-space:nowrap;font-size:12px;line-height:1.35;width:1%}
.acttbl td.actdt .actt{display:block;color:var(--dim)}
.acttbl td.actk{white-space:nowrap}   /* 검토 고침: 작업 이름(8자 안팎)이 '회원정보변경승 / 인' 처럼 낱말 가운데서 접히지 않게 — 칸이 제 너비를 가짐 */
.acttbl tr[style] td.actdt .actt{color:inherit;opacity:.8}   /* 비상 계정 빨간 줄은 시각도 빨강 */
.dtabs .dt .dirtyn{color:var(--amber);opacity:1;font-weight:600}
.dtabs .dt.on .dirtyn{color:inherit}
/* 승인 대기함 — 처리한 줄(과 그 아래 점검 줄 · 입력 줄)이 투명 + 높이 0 으로 접혀 빠짐 · 새로 생긴 줄은 살짝 나타남 */
#secApprovals tr.apq-gone{transition:opacity .25s ease,height .25s ease,padding .25s ease,margin .25s ease,border-width .25s ease;pointer-events:none}
#secApprovals tr.apq-gone>td{transition:padding .25s ease,border-width .25s ease}
#secApprovals .apq-clip{overflow:hidden;transition:height .25s ease}
#secApprovals tr.apq-new{animation:apqIn .3s ease}
@keyframes apqIn{from{opacity:0}to{opacity:1}}
@media (prefers-reduced-motion:reduce){
  #secApprovals tr.apq-gone,#secApprovals tr.apq-gone>td,#secApprovals .apq-clip{transition:none}
  #secApprovals tr.apq-new{animation:none}
}
/* 승인 대기함 — 점검 대상이 아닌 줄(v87: 글 없이 빈 .rvnotes)의 빈 회색 칸 · 그 줄 전체를 숨김 (판독 칸이 보이면 줄은 남기고 빈 칸만) */
.apx .rvbox:not(.rvscanq):has(> .rvnotes:only-child:empty){display:none}
#secApprovals table.apq tr.apx:has(> td > .rvbox > .rvnotes:only-child:empty):not(:has(.rvscanq:not([hidden]))){display:none}
#secApprovals .apq-sum:empty{display:none}
/* 승인 대기함 처리 결과 글 — 화면 아래에 떠 있음 (표를 밀지 않게 — aprq.js aprFlash) */
#aprFlash{position:fixed;left:50%;bottom:18px;transform:translateX(-50%);z-index:45;width:max-content;max-width:min(720px,calc(100vw - 32px));pointer-events:none}
#aprFlash:empty{display:none}
#aprFlash .okflash{margin:0;pointer-events:none;background:color-mix(in srgb,var(--ok) 12%,var(--card));border:1px solid color-mix(in srgb,var(--ok) 40%,var(--line));border-left-width:3px;border-radius:8px;box-shadow:0 8px 24px rgba(0,0,0,.3);overflow-wrap:anywhere}
/* ═══ /v91 ═══ */

/* ═══ v92 — 세금계산서 받는 곳 (taxparty.js) · 청구 줄 · 매달 홈택스 파일 (hometax.js) — 색은 모두 토큰 (세 테마 그대로) · 이름은 pty · hxf · tx 머리글자 ═══ */
.ptysr{position:absolute;left:0;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}   /* v101 qa: left:0 — 가로 굴림 표 칸 안(ERP 제안 '묶음')에서 제자리(오른쪽 칸)에 남으면 기본 테마 375px 문서를 넓혔음 (굴림 상자가 감싸지 않는 절대 위치) */
.show-m{display:none}
@media(max-width:700px){ .show-m{display:block} }
/* 단지 상세 칸 — 머리 = 진짜 단추(펼치기) + 단추 자리 (접혀도 보임 — v88 계약 카드 머리와 같은 모양) */
.ptysec{margin-top:12px;border-top:1px dashed var(--line);padding-top:10px}
.ptyhd{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px}
.ptytog{display:flex;flex-wrap:wrap;align-items:baseline;gap:2px 10px;background:transparent;border:0;padding:2px 0;color:var(--text);font:inherit;text-align:left;cursor:pointer;flex:1 1 220px;min-width:0}
.ptytog:focus-visible{outline:2px solid var(--cyan);outline-offset:3px;border-radius:6px}
.ptyttl{font-size:13px;font-weight:700;color:var(--hi)}
.ptyttl::before{content:"▸";font-size:.8em;margin-right:4px;display:inline-block}
.ptytog[aria-expanded="true"] .ptyttl::before{content:"▾"}
.ptysub{font-size:12px;color:var(--dim);font-weight:400}
.ptysum{font-size:12px;color:var(--dim);overflow-wrap:anywhere}
.ptysum.bad{color:var(--rose)}
.ptybtns{margin-left:auto}
.ptybody{margin-top:10px}
.ptybody[hidden]{display:none}
.ptyp{border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:10px;background:var(--card);min-width:0}
.ptyp.on{border-color:var(--cyan)}
.ptyph{display:flex;flex-wrap:wrap;align-items:center;gap:6px 8px;margin-bottom:8px}
.ptypn{font-weight:600;color:var(--hi);overflow-wrap:anywhere}
.ptykind{font-size:12px;color:var(--cyan);border:1px solid var(--line);border-radius:10px;padding:0 8px;white-space:nowrap}
.ptypbtns{margin-left:auto;display:flex;flex-wrap:wrap;gap:6px}
.ptygrid .f .v{overflow-wrap:anywhere}
.ptygrid .f .v.dim{color:var(--dim);font-size:12.5px}
.ptychk{margin-top:8px;font-size:12.5px}
.ptychk.ok{color:var(--ok)} .ptychk.warn{color:var(--amber)} .ptychk.dim{color:var(--dim)}
.ptylines{margin-top:8px;font-size:12.5px;color:var(--text)}
.ptylh{font-size:12px;color:var(--dim);margin-bottom:2px}
.ptyline{overflow-wrap:anywhere}
.ptysrc{margin-top:6px;font-size:11.5px;color:var(--dim)}
.ptywarnl{color:var(--amber);font-size:12.5px;margin-top:4px}
.ptynote{margin:0 0 8px;font-size:12.5px;color:var(--dim);overflow-wrap:anywhere}
.ptynote[hidden]{display:none}
.ptylog{margin-top:6px}
.ptylogt{width:100%;font-size:12.5px}
.ptylogd{overflow-wrap:anywhere;min-width:160px}
/* 칸 편집 상자 (단지 상세 · 단지 없는 받는 곳 · 설정 회사 정보) */
.ptyform{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 12px}
.ptyfld{display:flex;flex-direction:column;gap:3px;min-width:0}
.ptyfld.wide{grid-column:1/-1}
.ptyfld label{font-size:12px;color:var(--dim)}
.ptyform input,.ptyform select{width:100%;min-width:0;max-width:100%;background:var(--card2);border:1px solid var(--line);color:var(--text);padding:7px 10px;border-radius:7px;font-size:13.5px;font-family:inherit}
.ptyform input:focus,.ptyform select:focus{outline:none;border-color:var(--cyan)}
.ptyform input.ptybad{border-color:var(--rose)}
.ptyform input.ptywarn{border-color:var(--amber)}
.ptyform input.ptybiz{border-color:var(--amber);box-shadow:0 0 0 1px var(--amber) inset}
.ptyed .cxfh{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px}
/* 기록 › 세금계산서 — 칸 고르기 · [공급받는자] 목록 */
.txhead{display:flex;flex-wrap:wrap;align-items:center;gap:8px 16px;margin-bottom:12px}
.txhead h3{margin:0}
.txseg{flex-wrap:wrap;max-width:100%}
.ptylhd,.hxfhd{display:flex;flex-wrap:wrap;align-items:center;gap:8px 12px;margin:4px 0 10px}
.ptylhd h3,.hxfhd h4{margin:0}
.ptylhd .go,.hxfhd .go{margin-left:auto}
.ptyfilters .chks,.hxffilters .chks{gap:6px 8px}
.ptyqf input{min-width:200px}
.ptylt td,.hxflt td,.hxfmt td,.hxfpt td{vertical-align:top}
.hxffilters .chks:first-child,.ptyfilters .chks:first-child{margin-top:0;padding-top:0;border-top:0}
table.hxflt{min-width:980px} table.hxfmt{min-width:1060px} table.hxfpt{min-width:760px} table.ptylt{min-width:760px}
.ptynocx{margin-left:6px}
.ptylt tr.rowl.on td{background:var(--card2)}
.ptynchost .ptyed{margin:10px 0 0;border-color:var(--cyan)}   /* v92 검토: 단지 없는 받는 곳 편집 = 표 밖 (표 너비 760px 와 상관없이 보이는 너비) */
/* 가져오기 — 같은 칸 안 3단계 */
.ptyimp{border:1px solid var(--line);border-radius:12px;padding:12px 14px;margin:0 0 14px;background:var(--card);min-width:0}
.ptyimph{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;margin-bottom:8px}
.ptyimph h4{margin:0}
.ptyimph>.mini{margin-left:auto}
.ptyimpf{display:flex;flex-wrap:wrap;align-items:center;gap:8px}
.ptyimpf label{font-size:12.5px;color:var(--dim)}
.ptyimpf input[type=file]{max-width:100%;color:var(--text)}
.ptyimpinfo{display:flex;flex-direction:column;gap:4px;font-size:13px;margin-bottom:8px;overflow-wrap:anywhere}
.ptyimpb{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px}
.ptyimpb select{background:var(--card2);border:1px solid var(--line);color:var(--text);padding:6px 10px;border-radius:7px;font:inherit;font-size:13px}
.ptyimpred{margin:6px 0;font-size:12.5px;color:var(--rose)}
.ptyimpred ul{margin:4px 0 0 18px;padding:0}
.ptyimpg{margin:8px 0;border-top:1px solid var(--line);padding-top:6px}
.ptyimpg>summary{cursor:pointer;font-size:13.5px}
.ptyimpl{display:flex;flex-direction:column;gap:8px;margin-top:8px}
.ptyimpr{border:1px solid var(--line);border-radius:10px;padding:9px 11px;background:var(--card2);min-width:0}
.ptyimpr.done{border-left:3px solid var(--ok)}
.ptyimprh{font-size:13px;overflow-wrap:anywhere}
.ptyimpit{font-size:12.5px;color:var(--text)}
.ptycands{display:flex;flex-direction:column;gap:4px;margin-top:6px}
.ptycand{display:flex;gap:8px;align-items:flex-start;padding:6px 8px;border:1px solid var(--line);border-radius:8px;cursor:pointer;font-size:13px;overflow-wrap:anywhere;min-width:0}
.ptycand.on{border-color:var(--cyan)}
.ptycand input{margin-top:3px;flex:none}
.ptysig{display:inline-block;font-size:11px;color:var(--cyan);border:1px solid var(--line);border-radius:10px;padding:0 6px;margin:0 2px}
.ptycts{display:block;font-size:12px;color:var(--dim)}
.ptyregd{font-size:12px}
.ptycandb{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
.ptycandb .mini.on,.ptycandb .mini[aria-pressed="true"]{border-color:var(--cyan);color:var(--text);font-weight:600}
.ptyfind{display:flex;flex-direction:column;gap:4px;margin-top:6px}
.ptyfind label{font-size:12px;color:var(--dim)}
.ptyfind input{background:var(--card);border:1px solid var(--line);color:var(--text);padding:7px 10px;border-radius:7px;font:inherit;font-size:13.5px;max-width:320px;width:100%}
.ptyfindl{display:flex;flex-wrap:wrap;gap:6px;margin-top:4px}
.ptyfindl .cxi{text-align:left;background:var(--card2);border:1px solid var(--line);color:var(--text);border-radius:8px;padding:6px 10px;cursor:pointer;font:inherit;font-size:13px;max-width:100%;overflow-wrap:anywhere}
.ptyfindl .cxi:hover,.ptyfindl .cxi:focus-visible{border-color:var(--cyan)}
.ptyimpp{margin-top:6px;font-size:12.5px;overflow-wrap:anywhere}
.ptyimpp label{display:inline-flex;align-items:center;gap:4px;margin-right:10px}
.ptytake{display:flex;flex-direction:column;gap:4px;margin-top:4px}
.ptytk{display:flex;flex-wrap:wrap;align-items:center;gap:4px 10px;padding:4px 6px;border-radius:6px;background:var(--card)}
.ptytkl{font-weight:600;min-width:72px}
.ptyask{margin-top:10px;padding:10px 12px;border:1px solid var(--amber);border-radius:10px;background:var(--card2);font-size:13px;overflow-wrap:anywhere}
.ptyimpsave{margin-top:10px}
/* [청구 줄] · ERP 제안 */
.hxfcx{color:var(--text);text-decoration:none;border-bottom:1px dotted var(--dim)}
.hxfcx:hover{color:var(--cyan)}
.hxfw{display:inline-block;font-size:11px;border:1px solid var(--line);border-radius:10px;padding:0 6px;margin:1px 2px;max-width:220px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;vertical-align:middle}
.hxfw.r{color:var(--rose);border-color:color-mix(in srgb,var(--rose) 45%,transparent)}
.hxfw.y{color:var(--amber);border-color:color-mix(in srgb,var(--amber) 45%,transparent)}
.hxfw.more{color:var(--dim)}
.hxflt tr.rowl.on td{background:var(--card2)}
.hxfed{margin:0}
.hxfedhost .hxfed{margin:10px 0 0;border-color:var(--cyan)}   /* v92 검토: 줄 편집 = 표 밖 (표 너비 980px 와 상관없이 보이는 너비) */
.hxfit{border-top:1px dashed var(--line);margin-top:8px;padding-top:6px}
.hxfith{font-size:12.5px;font-weight:600;display:flex;gap:8px;align-items:center}
.hxfrow{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px 12px;margin-top:6px}
.hxffld{display:flex;flex-direction:column;gap:3px;min-width:0}
.hxffld.w2{grid-column:span 2}
.hxffld label{font-size:12px;color:var(--dim);display:flex;align-items:center;gap:6px}
.hxffld input,.hxffld select{width:100%;min-width:0;max-width:100%;background:var(--card);border:1px solid var(--line);color:var(--text);padding:7px 10px;border-radius:7px;font-size:13.5px;font-family:inherit}
.hxffld input:focus,.hxffld select:focus{outline:none;border-color:var(--cyan)}
.hxfcalc{font-size:11.5px;color:var(--dim)}
.hxfwarnl{margin-top:6px}
.hxfph{margin:22px 0 8px;display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px}
.hxfpact{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.hxfpact select{background:var(--card2);border:1px solid var(--line);color:var(--text);padding:5px 8px;border-radius:7px;font:inherit;font-size:12.5px}
.hxfpno{display:flex;flex-wrap:wrap;gap:6px;align-items:center;width:100%;margin-top:4px}
.hxfpno label{font-size:12px;color:var(--dim)}
.hxfpno input{flex:1 1 160px;min-width:0;background:var(--card);border:1px solid var(--line);color:var(--text);padding:6px 9px;border-radius:7px;font:inherit;font-size:13px}
/* [매달 홈택스 파일] */
.hxfbatches{flex-wrap:wrap;margin-bottom:10px;max-width:100%}
.hxfbst{font-size:11.5px;opacity:.85;margin-left:4px}
.hxfhred,.hxfhyel{margin:8px 0;font-size:13px}
.hxfruns{font-size:12.5px;margin:6px 0;overflow-wrap:anywhere}
.hxfdl{display:flex;flex-wrap:wrap;gap:6px 10px;align-items:center}
.hxftpl{color:var(--cyan)}
.hxfmchips{margin:6px 0}
.hxfmt tr.hxfred td{opacity:.7}
.hxfmt tr.hxfred td:first-child{border-left:3px solid var(--rose)}
.hxfmt tr.hxfout td{opacity:.6}
.hxfmt tr.hxfadj td:first-child{border-left:3px solid var(--amber)}
.hxfex{display:inline-flex;align-items:center;gap:4px;font-size:12.5px;white-space:nowrap}
.hxfexr{display:block;margin-top:4px;width:100%;min-width:110px;background:var(--card2);border:1px solid var(--line);color:var(--text);padding:5px 8px;border-radius:7px;font:inherit;font-size:12.5px}
.hxfmi{display:flex;flex-wrap:wrap;align-items:center;gap:4px 6px;margin-bottom:4px}
.hxfmi input{width:120px;max-width:100%;background:var(--card2);border:1px solid var(--line);color:var(--text);padding:5px 8px;border-radius:7px;font:inherit;font-size:12.5px;text-align:right}
.hxfmi input:disabled{opacity:.5}
.hxfmil{font-size:12px;color:var(--dim);flex-basis:100%}
.hxforig{font-size:11.5px;color:var(--amber)}
.hxfwhy{max-width:260px}
.hxfset{margin-top:22px;border-top:1px solid var(--line);padding-top:8px}
.hxfset>summary{cursor:pointer;list-style:none}
.hxfset>summary::-webkit-details-marker{display:none}
.hxfset>summary h4{margin:0;display:inline}
.hxfset>summary h4::before{content:"▸";font-size:.8em;margin-right:4px}
.hxfset[open]>summary h4::before{content:"▾"}
.hxfset h5{margin:14px 0 6px;font-size:13px;display:flex;flex-wrap:wrap;align-items:center;gap:8px}
.hxfseth{margin-top:8px}
.hxfst{font-size:13px}
.hxfst input[type=text],.hxfst select{width:100%;min-width:70px;background:var(--card2);border:1px solid var(--line);color:var(--text);padding:5px 8px;border-radius:7px;font:inherit;font-size:13px}
@media(max-width:700px){
  .ptyform{grid-template-columns:1fr}
  .hxfrow{grid-template-columns:1fr}
  .hxffld.w2{grid-column:auto}
  .ptyform input,.ptyform select,.hxffld input,.hxffld select,.ptyfind input,.hxfpno input,.hxfmi input,.hxfexr{font-size:16px}   /* 16px 미만이면 iOS 가 누를 때 확대한다 */
  .ptyqf input{min-width:0}
  .ptypbtns,.ptybtns{margin-left:0}
  .hxfwhy{max-width:none}
  .ptylhd .go,.hxfhd .go{margin-left:0}
}
/* ═══ /v92 ═══ */

/* ═══ v101 설치 발주 · 연락처 (명세 2-H · 결정 ②) ═══
   설치 이벤트 줄 단추 묶음 [수정] [발주] (.cxinbtns — 예전 .cxinrow .mini 의 margin-left:auto 를 묶음 하나가 가짐) · 줄 아래 '발주 N건' 목록 (.cxinords — cxinfo.js cxInOrdHtml) ·
   새 결재 창 '설치 이벤트 반영 대상' 줄 (.appr-ctline — approval.js apprKindRender) · 단지 상세 '연락처' 칸 (#cxdCtSec — activity 꺼짐 · 예전 모양 그대로 .cxcts · .cxform)
   클래스 이름 2026-10-27 grep: 없음 (.cxinbtns · .cxinords · .cxinordh · .cxinordl · .cxinord · .cxinordt · .cxinordno · .cxinap · .cxinapn · .appr-ctline · #cxdCt*) · 색 = 테마 변수만 (세 테마) */
.cxinbtns{margin-left:auto;display:inline-flex;flex-wrap:wrap;gap:6px;align-items:center}
.cxinrow .cxinbtns .mini{margin-left:0}
.cxinbtns .mini[hidden]{display:none}
.cxinords{margin-top:8px;padding-top:6px;border-top:1px dashed var(--line);min-width:0}
.cxinordh{font-size:12px;font-weight:600;color:var(--text);margin-bottom:4px}
.cxinordl{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:4px}
.cxinord{display:flex;flex-wrap:wrap;align-items:center;gap:2px 8px;font-size:12px;color:var(--dim);min-width:0}
.cxinord .badge{font-size:11px}
.cxinord .cxinordt{color:var(--text);overflow-wrap:anywhere;min-width:0}
.cxinord .mini{margin-left:auto}
.cxinord .cxinordno{margin-left:auto;font-size:11.5px}
.cxinap{font-weight:600;white-space:nowrap}
.cxinap.ok{color:var(--ok)}
.cxinap.no{color:var(--amber)}
.cxinapn{overflow-wrap:anywhere;min-width:0}
.appr-ctline{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px;margin:8px 0 2px;padding:7px 10px;font-size:12.5px;line-height:1.5;color:var(--text);
  border:1px dashed var(--line);border-radius:8px;overflow-wrap:anywhere;min-width:0}
.appr-ctline b{font-weight:600}
/* v101 3단계 (사용자 결정 ④): 설치 이벤트 발주의 마지막 결재자 (approval.js apprInstNoteHtml · apprPickHtml) — 규칙 글 · 노란 글 (상황 글 — ⓘ 아님) · 자격 없는 사람 칩
   클래스 이름 2026-10-27 grep: 없음 (.appr-instnote · .appr-instwarn · .appr-chipbad · .appr-instno) · 색 = 테마 변수만 */
.appr-instnote{margin:8px 0 0;padding:6px 10px;font-size:12.5px;line-height:1.5;color:var(--text);border:1px dashed var(--line);border-radius:8px;overflow-wrap:anywhere;min-width:0}
.appr-instwarn{margin:6px 0 0;padding:7px 10px;font-size:12.5px;line-height:1.5;color:var(--text);background:color-mix(in srgb,var(--amber) 10%,transparent);
  border-left:3px solid var(--amber);border-radius:0 8px 8px 0;overflow-wrap:anywhere;min-width:0}
.appr-chip.appr-chipbad{flex-wrap:wrap;border-color:color-mix(in srgb,var(--amber) 70%,transparent)}   /* 좁으면 표가 다음 줄로 (이름을 조각내지 않게) */
.appr-instno{display:inline-block;flex:none;padding:0 6px;font-size:11px;line-height:1.6;color:var(--amber);border:1px solid color-mix(in srgb,var(--amber) 55%,transparent);border-radius:999px;white-space:nowrap}
#cxdCtSec .cxform{margin-top:8px}
#cxdCtSay:empty{display:none}
@media (max-width:700px){
  .cxinbtns{margin-left:0}
  .cxinord .mini,.cxinord .cxinordno{margin-left:0}
}

/* ═══ v101 (사용자 결정 2026-10-27 Q5 · Q6 — 명세 v101 2-K) — 세금계산서 발급 정보 · [계산서 등록] · 확인 대기 · 발급 이력 · [발급 완료로 기록] (taxparty.js · hometax.js · aprq.js)
   색은 토큰만 (--amber · --ok · --rose · --line · --card · --card2 · --text · --dim · --cyan — 기본 · glass · 밝은 화면이 같이 맞음) · 375px = 한 열 · 칸 글 16px · 발급 이력 표 = 상자 안에서만 가로 굴림 ═══ */
.badge.hxfpend{color:var(--amber);border-color:var(--amber);border-style:dashed;background:transparent;font-weight:600}   /* 확인 대기 (멈춤 .rev 와 구별 — 점선) */
.libchip.hxfpendc{border-color:var(--amber)}
.hxfcalc.bad,.ptyrcalc.bad{color:var(--rose)}
.ptyold{margin:0 0 8px}
/* 단지 상세 청구 정보 줄 */
.ptyln{border-top:1px dashed var(--line);padding:6px 0 4px;min-width:0}
.ptyln:first-of-type{border-top:0}
.ptyln.pend{border-left:3px solid var(--amber);padding-left:8px}
.ptylnh{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px;overflow-wrap:anywhere}
.ptylnd{color:var(--hi);font-weight:600}
.ptylnl{margin:4px 0 0;padding:0 0 0 16px}
.ptylnl li{margin:1px 0;overflow-wrap:anywhere}
.ptylna{color:var(--dim);font-size:12px}
.ptylnf{margin-top:2px;font-size:12px;overflow-wrap:anywhere}
.ptypend{margin-top:6px;font-size:12.5px}
.ptypendt{color:var(--amber);overflow-wrap:anywhere}
.ptyrep{margin-top:4px;padding:6px 8px;border-radius:7px;background:var(--card2);overflow-wrap:anywhere}
.ptypendb{display:flex;flex-wrap:wrap;gap:6px;margin-top:6px}
/* [계산서 등록] 칸 */
.ptyreg{margin:0 0 12px;border-color:var(--cyan)}
.ptyrsec{margin-top:10px;padding-top:8px;border-top:1px dashed var(--line);min-width:0}
.ptyrsec:first-of-type{border-top:0;padding-top:0}
.ptyrh{font-size:12.5px;font-weight:600;color:var(--hi);display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;margin-bottom:6px}
.ptyrpick{max-width:420px;margin-bottom:8px}
.ptyrlk{font-size:12px;color:var(--dim)}   /* v101 검토 고침: 내 확인 대기 줄로 고정된 청구 줄 (고르기 없음) */
.ptyrlock{color:var(--text);overflow-wrap:anywhere}
.ptyrlockh{margin-top:2px}
.ptyruse{color:var(--text);margin-bottom:6px}
.ptyreg .ptyruse input[type=checkbox]{width:auto;min-height:0;padding:0;margin:0;flex:none}   /* .cxform input[type] (width 100% · 유리 min-height 40px) 가 체크 상자를 칸 너비로 키우던 것 (2026-10-28 qa 73) — .cxpkform .pkren 과 같은 예외 */
.ptyrrow{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:8px 12px;margin-top:6px}
.ptyrrow .ptyfld.w2{grid-column:span 2}
.ptyreg .ptyrrow input,.ptyreg .ptyrrow select,.ptyreg .ptyrpick select{width:100%;min-width:0;max-width:100%;background:var(--card2);border:1px solid var(--line);color:var(--text);padding:7px 10px;border-radius:7px;font-size:13.5px;font-family:inherit}
.ptyreg .ptyrrow input:focus,.ptyreg .ptyrrow select:focus,.ptyreg .ptyrpick select:focus{outline:none;border-color:var(--cyan)}
.ptyrit{border-top:1px dashed var(--line);margin-top:8px;padding-top:6px;min-width:0}
.ptyrith{font-size:12.5px;font-weight:600;display:flex;gap:8px;align-items:center}
.ptyrsp{display:flex;gap:6px;align-items:center;min-width:0}
.ptyrsp input{flex:1 1 auto}
.ptyrsp .mini{flex:none;white-space:nowrap}
.ptyrbar{display:flex;flex-wrap:wrap;gap:6px 10px;align-items:center;margin-top:8px;font-size:12.5px}
/* 발급 이력 표 (연도 × 1 ~ 12월) */
.ptyih{margin-top:12px;padding-top:8px;border-top:1px dashed var(--line);min-width:0}
.ptyihh{display:flex;align-items:center;gap:4px;margin-bottom:6px}
.ptyihw{overflow-x:auto;max-width:100%;-webkit-overflow-scrolling:touch}
table.ptyiht{border-collapse:collapse;font-size:12px;min-width:720px;width:100%}
table.ptyiht th,table.ptyiht td{border:1px solid var(--line);padding:2px;text-align:center;vertical-align:middle}
table.ptyiht thead th{color:var(--dim);font-weight:500;padding:4px 2px}
table.ptyiht tbody th{color:var(--hi);font-weight:600;white-space:nowrap;padding:4px 6px}
.ptyihe{background:transparent}
.ptyihc{display:flex;flex-direction:column;align-items:center;gap:0;width:100%;background:transparent;border:0;border-radius:5px;padding:3px 2px;color:var(--text);font:inherit;cursor:pointer}
.ptyihc:hover,.ptyihc.on{background:var(--card2)}
.ptyihc:focus-visible{outline:2px solid var(--cyan);outline-offset:1px}
.ptyihk{color:var(--ok);font-weight:700;line-height:1.1}
.ptyiha{font-size:11px;white-space:nowrap}
.ptyihd{margin-top:6px;font-size:12.5px;overflow-wrap:anywhere;padding:6px 8px;border-radius:7px;background:var(--card2)}
.ptyihm{margin-top:6px}
/* 기록 › 세금계산서 — 확인 대기 줄 칸 · 매달 파일 발급 완료 기록 */
.hxfcfb{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}
.hxfcfd{font-size:13px;display:flex;flex-direction:column;gap:3px;overflow-wrap:anywhere;margin:4px 0}
.hxfnote{margin:8px 0;padding:8px 12px;border-left:3px solid var(--amber);border-radius:6px;background:var(--card2);color:var(--amber);font-size:13px;overflow-wrap:anywhere}
.hxfnote .mini{margin-left:6px}
.hxfiss{display:flex;flex-wrap:wrap;align-items:center;gap:6px 10px;margin:8px 0;font-size:13px;overflow-wrap:anywhere}
.hxfiss.ok>span:first-child{color:var(--ok);font-weight:600}
.hxfissask input{width:100%;max-width:420px;margin:4px 0;background:var(--card);border:1px solid var(--line);color:var(--text);padding:6px 9px;border-radius:7px;font:inherit;font-size:13px}
table.apq .apq-txnew{margin-top:2px;font-size:12px}
table.apq .apq-c .apq-warn{color:var(--amber);font-size:12px;margin-top:2px}   /* v101 검토 고침: 바꿀 대상 줄이 매월이 아님 */
@media(max-width:700px){
  .ptyrrow{grid-template-columns:1fr}
  .ptyrrow .ptyfld.w2{grid-column:auto}
  .ptyreg .ptyrrow input,.ptyreg .ptyrrow select,.ptyreg .ptyrpick select,.hxfissask input{font-size:16px}   /* 16px 미만이면 iOS 가 누를 때 확대한다 */
  .ptyrpick{max-width:none}
}
/* ═══ /v101 세금계산서 ═══ */

/* ═══ v93 (사용자 요청 2026-10-21) — 탭 '결재/관리' → '관리' · 회원 승인 · 승인 대기함 · 담당자 이전 신청 → 내 업무 › 결재 '승인 대기함' 한 표 (aprq.js · admin.js su* · trq*)
   색은 토큰만 (--card · --card2 · --line · --text · --dim · --ok · --rose · --sky — 기본 · glass · 밝은 화면이 같이 맞음) · 375px = 카드 · 칸 글 16px (iOS 확대 막기) ═══ */
.badge.apq-su{color:var(--sky);border-color:color-mix(in srgb,var(--sky) 45%,transparent);background:transparent}   /* 단계 칩 '회원 승인' (옆 단계 칩 apq-s1 ~ s3 · sl 과 같은 모양) */
table.apq .apq-em{font-size:11.5px;overflow-wrap:anywhere}   /* 가입 · 회원정보 줄의 이메일 */
table.apq td .trqit{white-space:normal}                        /* 이전 신청 줄 '항목 · 원래 담당' (좁은 칸 — 예전 표처럼 한 줄로 늘이지 않음) */
table.apq tr.trqx td{background:var(--card2);border-top:0}      /* 이전 신청 처리 칸 = 그 줄 바로 아래 (예전 table.trq tr.trqx 와 같은 바탕) */
table.apq tr.trqx td,table.apq tr.su-fr td{white-space:normal;text-align:left}
tbody tr.trqx:hover{background:transparent}
.trqxbox .trqxseg button[aria-pressed="true"]{font-weight:600}
/* 저절로 사라지지 않는 글 (가입 역할이 신청과 다름) — [닫기] 단추만 누름. v93 검토 고침: 글 상자 전체(pointer-events:auto)였더니
   375px 에서 아래로 지나가는 다음 줄 처리 칸([승인하기] · [취소])을 가려 누를 수 없었다 → 상자는 지나가게 · 단추만 받음 */
#aprFlash .okflash.keep{pointer-events:none}
#aprFlash .okflash .apq-flx{margin-left:8px;vertical-align:baseline;pointer-events:auto}
#aprFlash .okflash.bad{color:var(--rose);background:color-mix(in srgb,var(--rose) 12%,var(--card));border-color:color-mix(in srgb,var(--rose) 40%,var(--line))}
@media (max-width:700px){
  #secApprovals table.apq tr.su-fr,#secApprovals table.apq tr.trqx{margin:-8px 0 10px;padding:0;background:transparent;border:0}   /* 칸 = 바로 위 카드에 붙은 블록 (승인 · 반려 입력 줄 tr.apq-fr 과 같게) */
  #secApprovals table.apq tr.su-fr td,#secApprovals table.apq tr.trqx td{padding:0}
  #secApprovals table.apq tr.trqx td{background:transparent}
  #secApprovals .su-form,#secApprovals .trqxbox{position:static;max-width:none}
  #secApprovals .trqxbox{border:1px solid var(--line);border-radius:10px;background:var(--card2);padding:8px 12px;box-sizing:border-box}
  #secApprovals .su-form input,#secApprovals .su-form select,#secApprovals .trqxbox input[type=text]{font-size:16px}
  #secApprovals .su-form input.su-why{min-width:0;width:100%}
  #secApprovals table.apq td.apq-act .apq-1{white-space:normal}
}
/* ═══ /v93 ═══ */

/* ═══ v94 변경이력 (history.js hv* 표 · hc* 건 팝업 — 명세 v94 5-4 ~ 5-6) ═══
   기록 › 변경이력 · 단지 상세 '변경이력' 칸 · [전체 보기] 팝업 · 건 팝업 #hcMask 가 같은 표(table.hvt)를 쓴다. 색은 테마 변수만 (--cyan · --ok · --rose · --amber · --sky ·
   --violet · --dim · --line · --text · --card2) → 유리 · 밝은 테마는 변수를 다시 정의하므로 따로 규칙이 없다. 옛 목록(ul.hist — 옛 DB · 오이패스 창)은 위 규칙 그대로.
   클래스 이름 2026-10-22 grep: 없음 (.hvt · .hvopen · .hvd · .hcmodal · .hctech · .hcfoot · .badge.hk-*) · display 를 준 칸의 [hidden] 은 따로 적는다 */
#hvFilters[hidden],#hOldFilters[hidden],#hpOld[hidden],.hpnew[hidden],.hcnav[hidden]{display:none}
.hpnew{display:contents}                                       /* [전체 보기] 팝업 새 칸 넷 = 바로 .frow 의 칸 (옛 DB 면 통째 숨김) */
.hvlab{display:flex;align-items:center;gap:2px}                /* 칸 이름 + ⓘ (ⓘ 는 label 밖) */
.hvbtns{display:flex;gap:8px;flex-wrap:wrap}
#viewHist .tblwrap.hvw{padding:0;overflow-x:auto}              /* 표 = 상자 끝까지 · 좁으면 상자 안에서만 가로 굴림 (기본 .tblwrap 의 overflow:hidden 을 이겨야 해서 :where 아님) */
table.hvt{table-layout:fixed;width:100%}
table.hvt th,table.hvt td{padding:9px 8px;vertical-align:top}
table.hvt th.hv-d{width:96px}
table.hvt th.hv-w{width:88px}
table.hvt th.hv-k{width:100px}
table.hvt th.hv-a{width:96px}
table.hvt th.hv-c{width:200px}
table.hvt td.hv-d{font-variant-numeric:tabular-nums;white-space:nowrap}
.hvd,.hvtm{display:block}
.hvtm{color:var(--dim);font-size:12px}
table.hvt td.hv-w,table.hvt td.hv-a{font-size:13px;overflow-wrap:anywhere}
.hvsys{color:var(--dim)}
.hvcx,.hvloc{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hvloc{color:var(--dim);font-size:11.5px}
.hvnone{color:var(--dim);opacity:.6}
table.hvt td.hv-m{overflow-wrap:anywhere}
.hvopen,.hvhead{font-weight:600;color:var(--text);line-height:1.45}
.hvopen{text-align:left;max-width:100%}
.hvopen:hover{color:var(--cyan)}
.hvits{list-style:none;margin:3px 0 0;padding:0;font-size:12.5px;color:var(--dim);line-height:1.5}
.hvits b{color:var(--text);font-weight:600}
.hvmore{display:block;margin-top:2px;font-size:11.5px;color:var(--dim)}
.hvsideg{color:var(--gold);font-weight:600;font-size:12px;white-space:nowrap}   /* v101 (명세 2-A): 제목 바로 뒤 '(딸린 변경 N)' — 금색 (세 테마 --gold · 바탕 대비 4.5:1 이상) · 클래스 이름 2026-10-27 grep: 없음 */
.hvside{margin-top:4px;font-size:11.5px;color:var(--dim);line-height:1.5}
.hvside b{color:var(--dim);font-weight:600}
.hvoldmsg{color:var(--amber);margin-left:6px}
table.hvt tbody tr.hvr.on>td{background:color-mix(in srgb,var(--cyan) 9%,transparent)}   /* 고른 줄 (건 팝업을 연 줄) */
table.hvt tbody tr.hvr.on>td:first-child{box-shadow:inset 3px 0 0 var(--cyan)}
table.hvt tbody tr.hvr:not(.rowl){cursor:default}                                      /* 건 팝업 안 처리 과정 줄 — 누르는 줄이 아님 */
/* 유형 배지 (명세 2-4 — 글이 뜻 · 색은 덤) */
.badge.hk-req{color:var(--cyan);border-color:color-mix(in srgb,var(--cyan) 50%,transparent);background:transparent}
.badge.hk-re{border-style:dashed}
.badge.hk-wd{color:var(--dim);border-color:color-mix(in srgb,var(--dim) 45%,transparent);background:transparent}
.badge.hk-ok{color:var(--ok);border-color:color-mix(in srgb,var(--ok) 50%,transparent);background:transparent}
.badge.hk-edit{color:var(--amber);border-color:color-mix(in srgb,var(--amber) 55%,transparent);background:color-mix(in srgb,var(--amber) 12%,transparent)}
.badge.hk-no{color:var(--rose);border-color:color-mix(in srgb,var(--rose) 50%,transparent);background:color-mix(in srgb,var(--rose) 10%,transparent)}
.badge.hk-ans{color:var(--sky);border-color:color-mix(in srgb,var(--sky) 50%,transparent);background:transparent}
.badge.hk-reg{color:var(--text);border-color:var(--line);background:transparent}
.badge.hk-del{color:var(--rose);border-color:var(--rose);background:transparent}
.badge.hk-doc{color:var(--violet);border-color:color-mix(in srgb,var(--violet) 50%,transparent);background:transparent}
.badge.hk-sys{color:var(--dim);border-color:color-mix(in srgb,var(--dim) 45%,transparent);border-style:dashed;background:transparent}
/* 건 팝업 #hcMask — 단지 상세(#mask 50) · [전체 보기](#histPopMask 55) 위 */
#hcMask{z-index:56}
.hcmodal{max-width:1100px}
#hcModal:focus{outline:none}
#hcModal .mhead>div:first-child{min-width:0}
#hcSub .badge{vertical-align:1px}
.hcnav{margin:0 0 6px}
.hcnote{margin:0 0 8px;font-size:12.5px;color:var(--dim)}
#hcBody{overflow-x:auto}
#hcBody:empty{display:none}
#hcPager{margin-top:12px}
.hcfoot{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end;padding:12px 24px 18px;border-top:1px solid var(--line)}
.hcfoot:empty{display:none}
/* 기술 정보 (줄 바로 아래 칸 — 최고관리자 · 비상 최고관리자) */
.hctbtn{margin-top:6px;font-size:11.5px}
table.hvt tbody tr.hctech{cursor:default}
table.hvt tbody tr.hctech:hover{background:transparent}
table.hvt tbody tr.hctech>td{background:var(--card2);padding:10px 12px}
.hctbox{font-size:12px;line-height:1.5;color:var(--text)}
.hctdl{display:grid;grid-template-columns:max-content minmax(0,1fr);gap:3px 12px;margin:0 0 10px}
.hctdl dt{color:var(--dim)}
.hctdl dd{margin:0;min-width:0;overflow-wrap:anywhere}
.hctbox code,.hctbox pre{font-family:Consolas,"D2Coding",monospace;font-size:11.5px}
.hctbox code{white-space:pre-wrap;overflow-wrap:anywhere}
.hctbox pre{margin:4px 0 0;white-space:pre-wrap;overflow-wrap:anywhere;max-height:360px;overflow:auto;background:var(--card);border:1px solid var(--line);border-radius:6px;padding:6px 8px}
.hctw{overflow-x:auto;margin:0 0 8px}
table.hctt{table-layout:auto;min-width:720px;font-size:11.5px}
table.hctt th,table.hctt td{padding:5px 6px;vertical-align:top;white-space:normal}
table.hctt th{position:static}
table.hctt tbody tr{cursor:default}
table.hctt td.hctix{min-width:200px;width:30%;color:var(--dim)}
table.hctt td:nth-child(2) code,table.hctt td:nth-child(3) code{white-space:nowrap}   /* 표 · 칸 원래 이름은 끊지 않음 ('change_reque / sts' 처럼 보이지 않게) */
.hcraw summary{cursor:pointer;color:var(--cyan)}
.hctside ul{margin:4px 0 8px;padding-left:18px}
.hctact{display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.hccopymsg{color:var(--dim);font-size:12px}
/* 크기별 (5-4): 1440 = 위 · 태블릿(768) = 단지명 140 · 표가 상자보다 넓으면 상자 안에서만 가로로 · 375 = 표 최소 너비 720 (계약조회 · 기록 › 오이패스와 같게) */
@media (max-width:1100px){ table.hvt th.hv-c{width:140px} }
@media (max-width:900px){
  table.hvt{min-width:720px} table.hvt.nocx{min-width:560px}
  /* v94 검토 고침: 기술 정보 칸 = 상자의 보이는 너비에 붙임 (표가 상자보다 넓어도 긴 값이 보이는 곳에서 줄 바꿈 — .apx .rvbox 와 같은 방식)
     100vw - (창 둘레 16 × 2 + 테두리 2 + 본문 24 × 2 + 표 상자 테두리 2 + 칸 안 12 × 2) = 100vw - 108px (유리 테마 좁은 화면은 둘레가 작아 조금 덜 넓음 — 괜찮음) */
  .hctbox{position:sticky;left:0;max-width:calc(100vw - 108px);box-sizing:border-box}
}
/* v94 검토 고침: 태블릿(701 ~ 900) = 표가 상자 너비 그대로 (최소 720 은 휴대폰만 — 768 에서 건 팝업 내용 칸이 상자 밖으로 34px 잘리던 것 · 손가락 화면은 옆으로 굴릴 수 있는지 안 보임) */
@media (min-width:701px) and (max-width:900px){
  table.hvt,table.hvt.nocx{min-width:0}
  table.hvt th.hv-d{width:92px}
  table.hvt th.hv-w{width:80px}
  table.hvt th.hv-k{width:88px}
  table.hvt th.hv-a{width:80px}
  table.hvt th.hv-c{width:112px}
}
/* v94 검토 고침: 단지 상세 '변경이력 (최근 30건 · 전체 N건)' 머리의 [전체 보기] 가 375 에서 두 줄로 꺾이지 않게 (머리 글이 대신 줄 바꿈) */
.secbtns.hvsecb{flex:none}
.secbtns.hvsecb .mini{white-space:nowrap}
@media (max-width:700px){
  table.hvt.nocx{min-width:640px}                               /* 단지 상세 칸 · [전체 보기] — 내용 칸이 너무 좁아 줄이 길게 늘어나지 않게 (상자 안 가로 굴림) */
  .hcfoot{padding:12px 16px 16px}
  .hvbtns button{flex:1 1 auto;min-height:44px}
}
/* ═══ /v94 ═══ */
/* ═══ v97 (사용자 결정 2026-10-23 Q8 (가) · Q9 (가) · Q10 (나)) — 연간 매출목표 (target.js · DB schema_v83m): 대시보드 '올해 목표' 타일 줄 · 칸 '연간 목표 달성' ·
   관리 탭 '연간 매출 목표'. 색은 토큰만 (--card2 · --line · --cyan · --ok · --amber · --hi · --dim · --text — 기본 · glass · 밝은 화면이 같이 맞음) ·
   진도 눈금 = --tg-pace (기본 = --hi: 어두운 화면 흰 · 밝은 화면 진한 글자색) · 375px = 줄이 두 줄로 접힘 (이름 · 숫자 / 막대) · 관리 표는 상자 안에서만 가로로 ═══ */
:root{--tg-pace:var(--hi)}
.dtarget[hidden]{display:none}
#dTgTiles:empty{display:none}
#dTgTiles>.tiles{margin-bottom:12px}   /* 검토 고침: .dtiles .tiles:last-child{margin-bottom:0} 이 이 줄에도 걸려 '누적' 머리에 붙던 것 — '누적' · '이번 달' 사이와 같은 12px */
.tgtile{min-width:0}
.tgtile .tgamt{color:var(--dim);font-variant-numeric:tabular-nums;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tgtile .tgamt b{color:var(--text);font-weight:600}
.tgtile .tgpacet,.tgtile .tgpend{white-space:normal}
.tgtile .tgpend{color:var(--dim)}
.tgbar{position:relative;height:10px;background:var(--card2);border:1px solid var(--line);border-radius:6px;margin:8px 0 4px}
.tgfill{height:100%;border-radius:5px;background:var(--cyan);max-width:100%}
.tgfill.ahead{background:var(--ok)}
.tgfill.behind{background:var(--amber)}
.tgpace{position:absolute;top:-4px;bottom:-4px;width:2px;margin-left:-1px;background:var(--tg-pace);border-radius:1px;opacity:.85;pointer-events:none}
.tghead{display:flex;align-items:flex-start;flex-wrap:wrap;gap:6px 12px}
.tghead>h3.ith{margin:0;flex:1 1 auto;min-width:0}
.tgnav{display:flex;gap:6px;align-items:center;flex-wrap:wrap;margin-left:auto}
.tgnav button.mini:disabled{opacity:.4;cursor:default}
.tgpacel{margin:4px 0 10px;font-size:12px;color:var(--dim)}
.tgpacel:empty{display:none}
.tgrows{display:flex;flex-direction:column;gap:6px}
.tgrow{display:grid;grid-template-columns:minmax(110px,200px) minmax(0,1fr) minmax(140px,auto);gap:4px 12px;align-items:center;font-size:13px}
.tgrow .tgl{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.tgrow .tgm{min-width:0}
.tgrow .tgm .tgbar{margin:0}
.tgrow .tgn{text-align:right;font-variant-numeric:tabular-nums;color:var(--dim);white-space:nowrap}
.tgrow .tgn b{color:var(--hi);margin-right:4px}
.tgrow .tgn .tgpend{display:block;font-size:11px}
.tgrow.tgsum{border-top:1px dashed var(--line);padding-top:6px}
.tgrow.tgsum .tgl b{color:var(--hi)}
.tgnone{margin-top:12px;opacity:.8}
.tgnoneh{font-size:12px;color:var(--dim);margin:0 0 6px}
/* 관리 탭 '연간 매출 목표' */
.tgatop{display:flex;align-items:center;flex-wrap:wrap;gap:8px 14px;margin:0 0 8px}
.tgasum{font-size:12.5px;color:var(--dim)}
.tgasum b{color:var(--text)}
.tganote{margin:0 0 8px}
.tgawrap{overflow-x:auto;max-width:100%}
.tgatbl{width:100%}
.tgatbl th.n,.tgatbl td.n{text-align:right;white-space:nowrap}
.tgatbl td.tgdv,.tgatbl td.tgwho{white-space:nowrap;font-size:12.5px}
.tgatbl td.tgnm{white-space:nowrap}
.tgatbl input.tgamt{width:150px;text-align:right}
.tgatbl input.tgnote{width:100%;min-width:140px}
.tgatbl .tgamth{font-size:11px;color:var(--dim);min-height:15px;text-align:right}
.tgatbl.tgaed{min-width:820px}
@media (max-width:700px){
  .tgrow{grid-template-columns:minmax(0,1fr) auto;grid-template-areas:"l n" "m m"}
  .tgrow .tgl{grid-area:l}
  .tgrow .tgm{grid-area:m}
  .tgrow .tgn{grid-area:n}
  .tgatbl.tgaview{min-width:620px}
  .tgatbl input.tgamt,.tgatbl input.tgnote{font-size:16px}
}
/* ═══ /v97 ═══ */

/* ═══ v100 신청 탭 (requests.js — 명세 v100 2-B · 2-C · 2-G) ═══
   클래스 이름 2026-10-27 grep: 없음 (.rqtop · .rqnew · .rqnote · .rqsum · .rq6 · .rqdd · .rqtm · .rqopen · .rqttl · .rqd1 · .rqs · .rqv* · .rqwdbtns · .appr-unpub · .appr-nosee)
   색은 테마 변수만 (--amber · --cyan · --card · --card2 · --line · --dim · --text) → 유리 · 밝은 테마는 변수를 다시 정의 · display 를 준 칸의 [hidden] 은 따로 적는다 */
.rqtop{display:flex;align-items:center;justify-content:space-between;gap:8px 14px;flex-wrap:wrap;margin:0 0 12px}
.rqnew{display:inline-flex;align-items:center;gap:6px}
.rqnew:empty{display:none}
.rqnote{margin:0 0 8px;font-size:12.5px;line-height:1.5}
.rqsum{margin:0 0 8px;font-size:12.5px;color:var(--dim)}
.rqsum b{color:var(--text)}
/* 표 6열 — 신청일 · 종류 · 대상 · 내용 · 상태 · 처리 (줄 = 상세 팝업) */
table.rq.rq6{min-width:900px}
table.rq.rq6 td.rqd{width:92px}
table.rq.rq6 td.rqs{width:130px}
.rqdd,.rqtm{display:block}
.rqtm{color:var(--dim);font-size:12px}
table.rq tbody tr.rowl{cursor:pointer}
table.rq tbody tr.rowl:hover{background:color-mix(in srgb,var(--cyan) 6%,transparent)}
.rqopen{display:inline-block;max-width:100%}
.rqopen .badge{cursor:pointer}
.rqopen:hover .badge{border-color:var(--cyan)}
.rqttl{font-weight:600;color:var(--text);overflow-wrap:anywhere}
.rqd1{overflow-wrap:anywhere}
/* 상세 팝업 #rqvMask (z 50 — 건 팝업 #hcMask 56 이 위) */
.rqvmodal{max-width:900px}
#rqvModal:focus{outline:none}
#rqvModal .mhead>div:first-child{min-width:0}
#rqvSub .badge{vertical-align:1px}
.rqvsec{margin-bottom:16px}
.rqvsec h4{font-size:14px;margin-bottom:8px}
.rqvtg{display:flex;flex-wrap:wrap;align-items:center;gap:4px 8px;overflow-wrap:anywhere}
.rqvpv{margin-top:4px;overflow-wrap:anywhere}
.rqvlist{margin:0;padding:0 0 0 18px;font-size:13px;line-height:1.55;overflow-wrap:anywhere}
.rqvlist li{margin:2px 0}
#rqvAe.rqaebox{position:static;max-width:none}
.rqvhw{overflow-x:auto;max-width:100%}
.rqvlinks{display:flex;gap:8px;flex-wrap:wrap;margin-top:8px}
.rqvold{margin:0}
.rqvgone{padding:24px 12px}
#rqvAct:empty,#rqvMsg:empty{display:none}
#rqvAct .rqwdbox{border:1px solid var(--line);border-radius:10px;padding:10px 12px;background:var(--card2);margin:0 0 10px}
#rqvAct .rqwdbox input{width:100%;box-sizing:border-box;margin:0 0 8px}
.rqwdbtns{display:flex;gap:8px;flex-wrap:wrap}
.rqvfoot{display:flex;gap:8px;flex-wrap:wrap;justify-content:flex-end;padding:12px 24px 18px;border-top:1px solid var(--line)}
.rqvfoot:empty{display:none}
/* 전자결재 미공개 안내 (상황 글 — ⓘ 아님) · '아직 못 봄' 칩 (approval.js · requests.js rqFlash) */
.appr-unpub{margin:8px 0;padding:8px 12px;font-size:12.5px;line-height:1.5;color:var(--text);background:color-mix(in srgb,var(--amber) 10%,transparent);
  border-left:3px solid var(--amber);border-radius:0 8px 8px 0;overflow-wrap:anywhere}
.appr-unpub[hidden]{display:none}
#reqMsg .appr-unpub{margin:0 0 10px}
#apDocBody>.appr-unpub{margin:0 0 14px}
.appr-nosee{display:inline-block;margin-left:4px;padding:0 6px;font-size:11px;line-height:1.6;color:var(--amber);border:1px solid color-mix(in srgb,var(--amber) 55%,transparent);border-radius:999px;white-space:nowrap}
@media (max-width:700px){
  table.rq.rq6{min-width:0}
  table.rq.rq6 td.rqd,table.rq.rq6 td.rqs{width:100%}
  table.rq.rq6 td.rqd{width:auto}
  .rqdd,.rqtm{display:inline}
  table.rq tbody tr.rowl:hover{background:var(--card)}
  .rqvfoot{padding:12px 16px 16px}
  #rqvModal .mbody{padding:16px}
  .rqtop{align-items:flex-start}
}
/* v100 단계 B — 결재 탭 (aprq.js — 명세 v100 2-D · 2-E): 처리할 것의 전자결재 줄 · '처리 못 하는 줄도 보기' · 처리 이력 (#apqHist — history.js 표 table.hvt)
   클래스 이름 2026-10-27 grep: 없음 (.apq-se · .apq-er · .apq-eturn · .apq-etl · .apq-ronote · .apqh-* · .apqhw · .hk-ret · table.hvt.noact) · 색은 테마 변수만 */
.badge.apq-se{color:var(--violet);border-color:color-mix(in srgb,var(--violet) 45%,transparent);background:transparent}   /* 단계 칩 '전자결재' (옆 단계 칩 apq-s1 ~ s3 · sl · su 와 같은 모양) */
.apq-etl{font-weight:600;color:var(--text);overflow-wrap:anywhere}
.apq-eturn{color:var(--amber);font-size:12px}
.apq-bar .apq-ronote{font-size:12px;color:var(--dim);margin:0}
.apq-bar .apq-ronote[hidden]{display:none}
.badge.hk-ret{color:var(--amber);border-color:color-mix(in srgb,var(--amber) 55%,transparent);border-style:dashed;background:transparent}   /* 유형 '보완 요청' ([전자결재 전체]) */
#apqHist .apqh-bar{margin:6px 0 10px}
#apqHist .apqh-bar[hidden]{display:none}
#apqHist .apqh-bar .seg button:disabled{opacity:.5;cursor:default}
#apqHist .apqh-bar .apqh-rl{margin-left:auto}
#apqHist .apqh-bar .apqh-all.on{color:var(--cyan);border-color:var(--cyan)}
#apqHist .apqh-bar .apqh-all[hidden]{display:none}
#apqHist input.apqh-cx{padding:5px 8px;font-size:12.5px;min-width:150px;width:170px}
.apqh-sum{margin:0 0 8px;font-size:12.5px;color:var(--dim)}
.apqh-sum b{color:var(--text)}
#apqHist .tblwrap.apqhw{padding:0;overflow-x:auto}                  /* 표 = 상자 끝까지 · 좁으면 상자 안에서만 가로 굴림 (#viewHist 의 .hvw 와 같은 규칙) */
#apqHist .tblwrap.apqw{overflow-x:auto}                              /* 옛 DB 길의 처리한 것 표 (table.apq.apqd — 9열) */
#apqHist table.hvt tbody tr.hvr.rowl{cursor:pointer}               /* .asec 의 '줄 = 누르지 않음' 을 이김 — 줄 → 건 팝업 · 문서 창 */
#apqHist table.hvt tbody tr.hvr.rowl:hover{background:color-mix(in srgb,var(--cyan) 6%,transparent)}
.apqh-more{margin-top:10px;text-align:center}
.apqh-more:empty{display:none}
.apqh-old{margin:0 0 8px}
.apqh-oldmsg{color:var(--amber);margin-left:6px}
#apqHistMsg:empty{display:none}
#apqHistMsg .err{margin:0 0 8px}
@media (max-width:900px){ table.hvt.noact{min-width:720px} }   /* 휴대폰 = 상자 안 가로 굴림 (내용 칸이 너무 좁아 줄이 길게 늘지 않게 — 변경이력 표와 같은 최소 너비) */
@media (min-width:701px) and (max-width:900px){ table.hvt.noact{min-width:0} }
@media (max-width:700px){
  #apqHist .apqh-bar .apqh-rl{margin-left:0}
  #apqHist .apqh-bar .seg{display:flex;width:100%}
  #apqHist .apqh-bar .seg button{flex:1 0 auto;padding:8px 10px}
  #apqHist .apqh-bar select,#apqHist input.apqh-cx{flex:1 1 100%;width:100%;font-size:16px}
  #apqHist table.hvt tbody tr.hvr.rowl:hover{background:transparent}
  #apqHist table.hvt th.hv-c{width:130px}
}
/* ═══ /v100 ═══ */

/* ═══ v101 방문차량예약 (명세 2-E · 2-F · 2-G · 2-L) ═══ — visitcar.js (vc* · apf*) · detail.js 계약 등록 폼 (#kVisit · #kStickerBox · #kConsentBox · #kVcFileRow)
   색은 테마 변수만 (--amber 희망 · --sky 개발중 · --ok 개발완료 · --dim 흐림) — 세 테마(기본 · glass · light)가 변수로 맞춘다 · 바탕은 칠하지 않음 (glass 의 .badge 흰 반투명은 이 규칙이 덮음) */
/* 상태 배지 (config.js VC_STAGE cls) */
.badge.vcst{background:transparent;border-color:color-mix(in srgb,currentColor 45%,transparent)}
.badge.vcst.vc-wish{color:var(--amber)}
.badge.vcst.vc-dev{color:var(--sky)}
.badge.vcst.vc-on{color:var(--ok);font-weight:600}
.badge.vcst.vc-off{color:var(--dim)}
/* 핵심 정보 칸 (#cxPkV.vcv) · 카드 줄 (.cxpk > .vcrow) — 값 줄 · 단추 줄 · 칸 안 입력 */
.vcrow{min-width:0}
.vcrow>span,.vcrow>button{min-width:0;overflow-wrap:anywhere}
.vcrow .vcday,.vcrow .vcopen,.vcrow .vcwhy{color:var(--dim)}
.vcrow .vcwarn{color:var(--amber)}
#cxPkV.vcv .vcrow{display:flex;flex-wrap:wrap;align-items:center;gap:4px 10px}
.vcbtns{display:flex;flex-wrap:wrap;align-items:center;gap:6px;margin-top:6px}
.vcbtns:empty{display:none}
button.vcfchip{display:inline-flex;align-items:center;gap:6px;max-width:100%;min-width:0;padding:2px 8px 2px 4px;border:1px solid var(--line);border-radius:7px;
  background:transparent;color:var(--text);font:inherit;font-size:12px;cursor:pointer}
button.vcfchip:hover,button.vcfchip:focus-visible{border-color:var(--cyan)}
.vcfchip .vcfic{flex:none;font:700 10px/1 Consolas,monospace;border:1px solid var(--line);border-radius:4px;padding:2px 4px;color:var(--cyan)}
.vcfchip .vcfn{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:220px}
.vcfold{font-size:11.5px}
/* [양식 내려받기] · 자료실 [보기] [내려받기] — 링크지만 작은 단추 모양 (button.mini 와 비슷한 크기) */
a.vcdl{display:inline-block;padding:4px 10px;border:1px solid var(--line);border-radius:6px;font-size:12px;line-height:1.4;color:var(--cyan);
  text-decoration:none;background:var(--card2);white-space:nowrap}
a.vcdl:hover,a.vcdl:focus-visible{border-color:var(--cyan);color:var(--text)}
a.vcdl.ok{color:var(--ok)}
.vcform .vcnote{margin-top:6px;font-size:12px;line-height:1.5;color:var(--dim)}
.vcform .vcnote:empty{display:none}
.vcform .pkren{margin-top:6px;font-size:12px;width:fit-content;max-width:100%}
.vcform .pkren[hidden]{display:none}
.vcform .pkren input[type=checkbox]{width:auto;min-height:0;padding:0;margin:0;flex:none}   /* v101 검토 고침: .cxform input[type] (width 100% · 유리 min-height 40px) 가 '같은 업체 — 이름만 수정' 체크 상자를 칸 모양으로 키우던 것 — .cxpkform .pkren · .ptyreg .ptyruse 와 같은 예외 */
.vcform .vcfile,.vcform .vcreason{flex:2 1 260px;min-width:0}
.vcform input[type=file]{max-width:100%;min-width:0}
.vcform label[hidden]{display:none}
/* 오이천사 카드 칩 줄 (detail.js dtCardShell 의 hx — 머리 아래 · 접혀도 보임 · 단추 아님) */
.ctr>.vcchips{display:flex;flex-wrap:wrap;align-items:center;gap:4px 6px;margin:8px 0 0;min-width:0}
.vcchip{display:inline-flex;align-items:center;gap:3px;max-width:100%;padding:1px 8px;border:1px solid var(--line);border-radius:12px;
  font-size:11.5px;line-height:1.6;color:var(--dim);white-space:nowrap}
.vcchip.on{color:var(--text);border-color:color-mix(in srgb,var(--ok) 55%,transparent)}
.vcchip.on>span[aria-hidden]{color:var(--ok);font-weight:700}
.vcchip .vcx{color:var(--dim);font-size:11px}
.vcchip.base{border-style:dashed}
.vcchip.vcv.on{color:var(--ok);font-weight:600}
.vcchip.vcv.vc-wish{color:var(--amber);border-color:color-mix(in srgb,var(--amber) 50%,transparent)}
.vcchip.vcv.vc-dev{color:var(--sky);border-color:color-mix(in srgb,var(--sky) 50%,transparent)}
.vcchips.ended{opacity:.6}
.vcsr{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}
/* 계약 등록 폼 — 체크해야 나오는 칸 · 방문차량예약 */
#ctModal .chk[hidden],#ctModal #kVisitNote[hidden],#ctModal #kStickerBox[hidden],#ctModal #kConsentBox[hidden],#ctModal .kvcfile[hidden]{display:none}
#ctModal .kvisitnote{margin:0 0 8px;font-size:12px;line-height:1.5;color:var(--dim)}
#ctModal .kvcrow{margin-top:8px;display:flex;flex-direction:column;align-items:flex-start;gap:6px;min-width:0}
#ctModal .kvcfile{width:100%;min-width:0}
#ctModal .kvcfile input[type=file]{max-width:100%}
#ctModal #kVcInfo:empty{display:none}
/* 자료실 › 신청서 */
.apfcard .libc-top .itip{margin-left:auto}
@media (max-width:700px){
  .vcfchip .vcfn{max-width:160px}
  .vcform .vcfile,.vcform .vcreason{flex-basis:100%}
  .vcchip{white-space:normal}
}
/* ═══ /v101 방문차량예약 ═══ */
