:root { --danger:#b00020; --ok:#1b8a2f; --bg:#101317; --card:#1a1f26; --fg:#e8eaed; }
* { box-sizing: border-box; }
body { margin:0; font-family: system-ui, "Segoe UI", sans-serif; background:var(--bg); color:var(--fg); }
header { display:flex; align-items:center; gap:12px; padding:12px 16px; background:#0a0c0f; }
header > h1 { flex:1 1 0; }                          /* 좌측 */
header > .hdr-right { flex:1 1 0; justify-content:flex-end; }   /* 우측 → 가운데 버튼 중앙 정렬 */
/* 헤더 중앙 전체해제 버튼 (로그아웃 폭의 약 3배, 발령 없을 땐 비활성) */
.hdr-clear { flex:0 0 auto; min-width:220px; padding:7px 22px; border:0; border-radius:10px;
  background:var(--danger); color:#fff; font-size:18px; font-weight:700; cursor:pointer; white-space:nowrap; }
.hdr-clear:hover:not(:disabled) { background:#d4002a; }
.hdr-clear:disabled { opacity:.4; cursor:not-allowed; }
.hdr-clear[hidden] { display:none; }
h1 { font-size:23px; margin:0; }
h2 { font-size:15px; opacity:.8; margin:18px 16px 6px; }
/* 섹션 제목 + 버튼 한 줄 */
.sec-head { display:flex; align-items:center; flex-wrap:wrap; gap:10px; margin:18px 16px 6px; }
.sec-head h2 { margin:0; }
.sec-head .small { margin:0; }
.badge { font-size:12px; padding:3px 10px; border-radius:999px; white-space:nowrap; }
.badge.on { background:var(--ok); }
.badge.off { background:#555; }
.badge.link { background:#2a313a; color:#fff; text-decoration:none; }
.hdr-right { display:flex; align-items:center; gap:10px; }
.username { width:130px; padding:6px 10px; border-radius:8px; border:1px solid #333; background:#0d0f12; color:var(--fg); font-size:14px; }
.username[readonly] { opacity:.85; cursor:default; }   /* 이름 = 서버(admin) 지정 read-only */
#conn { font-size:14px; }                 /* 패널 상태 뱃지(감시중/연결안됨)만 — 다른 .badge 영향 없음 */
#audioGate .warn { font-size:16px; }      /* 패널 경보음 게이트 경고문만 — 대시보드 loginErr 영향 없음 */
.muted { color:var(--text-muted, #9aa0a6); font-size:12px; }
.user-row { display:flex; align-items:center; gap:10px; background:var(--card); padding:6px 14px; border-radius:8px; margin-bottom:4px; }
.dot { width:9px; height:9px; border-radius:50%; background:#555; }
.dot.on { background:var(--ok); }
.user-row.alarming { background:#3a0d12; border:1px solid var(--danger); }
.user-row.alarming .dot { background:var(--danger); }
.user-row.offline { opacity:.6; }
.alarm-tag { font-size:12px; padding:2px 8px; border-radius:999px; background:var(--danger); color:#fff; }
.user-row .muted { margin-left:auto; }
.user-row .del { padding:3px 10px; }
.user-row .user-set { padding:3px 12px; background:#2a313a; color:#fff; border:0; border-radius:8px; cursor:pointer; }
.user-row .user-set:hover { background:#3a434f; }
.user-row .map { padding:3px 10px; }

/* 설정 모달 */
.modal[hidden] { display:none !important; }
.modal:not([hidden]) { position:fixed; inset:0; background:rgba(0,0,0,.55); display:flex; align-items:center; justify-content:center; z-index:2000; }
.modal-card { background:var(--card); border:1px solid #333; border-radius:12px; padding:22px 24px; width:min(540px,94vw); max-height:90vh; overflow:auto; }
.modal-card h2 { font-size:18px; opacity:1; margin:0 0 10px; }
.modal-card > .muted, .modal-card p.muted { font-size:13.5px; line-height:1.5; }
.modal-card label { display:flex; justify-content:space-between; align-items:center; gap:12px; font-size:16px; margin:10px 0; }
.modal-card input, .modal-card select { width:70%; padding:9px 11px; border-radius:6px; border:1px solid #333; background:#0d0f12; color:var(--fg); font-size:16px; }
.modal-card .addr-row { display:flex; gap:6px; width:70%; }
.modal-card .addr-row input { width:auto; flex:1; }
.modal-card .modal-actions .small, .modal-card .modal-actions button { font-size:15px; padding:4px 16px; }
.set-section { font-size:13px; color:var(--text-secondary,#9aa0a6); margin:12px 0 4px; border-top:0.5px solid var(--border,#333); padding-top:10px; }
.modal-actions { display:flex; gap:10px; justify-content:flex-end; margin-top:14px; }
.small.save { background:var(--ok); color:#fff; border:0; }

/* 지도 팝업: 드래그 이동 + 크기 조절 가능한 플로팅 창 (백드롭 없음 → 대시보드 계속 보임) */
#mapModal { position:fixed; left:80px; top:80px; width:min(680px,92vw); height:460px;
  min-width:300px; min-height:220px; z-index:60; display:flex; flex-direction:column;
  background:var(--card); border:1px solid #444; border-radius:12px; overflow:hidden;
  box-shadow:0 14px 44px rgba(0,0,0,.6); }
#mapModal[hidden] { display:none; }
#mapHead { cursor:move; user-select:none; display:flex; align-items:center; justify-content:space-between;
  gap:10px; padding:8px 12px; background:#1a1d21; border-bottom:1px solid #333; }
#mapHead h2 { margin:0; font-size:16px; }
#mapFrame { flex:1; width:100%; border:0; }
#mapModal .mapfoot { padding:6px 12px; font-size:12px; }
#mapResize { position:absolute; right:0; bottom:0; width:18px; height:18px; cursor:nwse-resize;
  background:linear-gradient(135deg, transparent 45%, #888 45%, #888 55%, transparent 55%, transparent 70%, #888 70%, #888 80%, transparent 80%); }

.gate { max-width:560px; margin:40px auto; padding:24px; text-align:center; background:var(--card); border-radius:12px; }
.gate button { font-size:18px; padding:14px 22px; border:0; border-radius:10px; background:var(--ok); color:#fff; cursor:pointer; }
.warn { color:#f0b400; font-size:13px; margin-top:16px; }

.banner { position:relative; margin:16px; padding:28px 16px; border-radius:12px; text-align:center; font-size:22px; font-weight:700; }
/* 패널 발령 배너 우측 "위치 보기" 버튼 */
.banner-map { position:absolute; right:16px; top:50%; transform:translateY(-50%);
  font-size:14px; font-weight:600; padding:8px 14px; border:0; border-radius:10px;
  background:rgba(255,255,255,.18); color:#fff; cursor:pointer; white-space:nowrap; }
.banner-map:hover { background:rgba(255,255,255,.32); }
.banner.idle { background:var(--card); color:#9aa0a6; }
.banner.alarm { background:var(--danger); color:#fff; animation: flash .6s steps(1) infinite; }
@keyframes flash { 50% { background:#7a0016; } }

.controls { display:flex; gap:12px; margin:0 16px; }
.big { position:relative; overflow:hidden; flex:1; font-size:20px; padding:18px; border:0; border-radius:12px; cursor:pointer; background:#2a313a; color:#fff;
  user-select:none; -webkit-user-select:none; -webkit-touch-callout:none; touch-action:none; }
.big small { font-size:14px; opacity:.75; }
/* 관리자 통화(§22) — 발령 버튼보다 작게 */
.call-row { display:flex; justify-content:center; align-items:center; gap:10px; flex-wrap:wrap; }
.call-btn { font-size:16px; font-weight:600; padding:8px 20px; border:0; border-radius:10px; background:#2a6f4b; color:#fff; cursor:pointer; white-space:nowrap;
  user-select:none; -webkit-user-select:none; -webkit-touch-callout:none; touch-action:manipulation; }
.call-btn small { font-size:13px; opacity:.75; }
.call-btn.holding { filter:brightness(1.35); }
/* 방법순찰 버튼 — 관리자 통화 라인 오른쪽 끝, 흐린 청색 */
.patrol-btn { margin-left:auto; font-size:16px; font-weight:600; padding:8px 18px; border:0; border-radius:10px; background:#37527a; color:#dbe6f5; cursor:pointer; white-space:nowrap;
  user-select:none; -webkit-user-select:none; -webkit-touch-callout:none; touch-action:manipulation; }
.patrol-btn small { font-size:12px; opacity:.7; }
.patrol-btn.holding { filter:brightness(1.3); }
/* 모바일 반응형(§22.10 A-1) — 좁은 폰: 발령/해제 세로 스택 + 터치 확대 */
@media (max-width:480px){
  .controls { flex-direction:column; }
  .big { font-size:21px; padding:20px 16px; }
  .call-row { margin-top:16px; }
  .call-btn { font-size:17px; padding:11px 22px; }
  h1 { font-size:20px; }
  /* 패널 헤더 한 줄 정리(대시보드엔 .username 없어 미적용): 제목 자연폭 + 이름칸 유연 + 배지 자연폭 */
  header:has(.username) { gap:8px; }
  header:has(.username) > h1 { flex:0 0 auto; }
  header:has(.username) > .hdr-right { flex:1 1 auto; min-width:0; gap:6px; }
  .username { flex:1 1 auto; min-width:0; width:auto; max-width:130px; }
  #conn { font-size:13px; padding:3px 8px; }
}
#callQueueHint { margin-top:8px; font-size:12px; color:#c9a227; }
.call-rec { display:block; margin-top:8px; font-size:12px; color:#9aa0a6; cursor:pointer; }
#callRecDot { color:#e0245e; font-weight:700; margin-left:6px; animation:recblink 1s steps(1) infinite; }
@keyframes recblink { 50% { opacity:.2; } }
.tx-body { background:#0d0f12; border:1px solid #2a2f38; border-radius:6px; padding:10px 12px; margin:2px 0; font-size:13px; line-height:1.55; white-space:pre-wrap; color:#cfd3d8; }
/* 방송 수신 패널 버튼 — 호버=툴팁, 클릭=펼침(§PA 방송목록). 일반 .small 버튼 스타일 */
.dtable .bc-rcpt { background:#2a3550; color:#cdd8f0; }
/* 방법순찰 — 위치버튼(청색) + 대시보드 토스트 */
.dtable .pat-map { background:#2f6fb0; color:#fff; }
#ebToast { position:fixed; right:18px; bottom:18px; z-index:4000; background:#14181e; border:1px solid #37527a; color:#dbe6f5; padding:12px 18px; border-radius:10px; box-shadow:0 6px 30px rgba(0,0,0,.5); font-size:14px; opacity:0; transform:translateY(12px); pointer-events:none; transition:opacity .25s, transform .25s; }
#ebToast.show { opacity:1; transform:translateY(0); }
.call-wrap { margin:17px 16px 0; text-align:center; }
.call-stat { font-size:17px; color:#8fe0b0; margin-bottom:6px; min-height:22px; }
.call-stat.connected { color:#2ecc55; font-weight:700; }
.call-ico { color:#ff5b8a; }                       /* 전화기 아이콘(☎) — 요청/연결 중 핑크 */
.call-stat.connected .call-ico { color:#2ecc55; }  /* 연결되면 초록 */
.call-btn:disabled, .call-end:disabled { opacity:.4; cursor:not-allowed; filter:none; }
.call-end { font-size:15px; padding:5px 14px; border:0; border-radius:8px; background:var(--danger); color:#fff; cursor:pointer; }
/* 대시보드 통화 위젯(§22) — 고정, 수신 시 펄스 */
#callWidget[hidden] { display:none; }
#callWidget { position:fixed; top:72px; left:50%; transform:translateX(-50%); z-index:3000; background:#14181e; border:2px solid #2a6f4b; border-radius:12px; padding:14px 24px; box-shadow:0 6px 30px rgba(0,0,0,.55); text-align:center; min-width:250px; }
#callWidget.ringing { animation:ringpulse 1s ease-in-out infinite; }
#callWidget #callInName { font-size:18px; font-weight:700; color:#8fe0b0; }
#callWidget #callStateT { margin:4px 0 10px; font-size:14px; }
#callWidget .call-acts { display:flex; gap:10px; justify-content:center; }
#callWidget .call-acts .small { margin:0; }
@keyframes ringpulse { 50% { box-shadow:0 0 26px 5px rgba(42,111,75,.75); } }
/* 통화요청 리스트(§22) — 항상 위 고정, 요청자·상태(통화중/대기) 목록 */
#callReqList[hidden] { display:none; }
#callReqList { position:fixed; top:8px; right:8px; z-index:3100; background:#14181e; border:1px solid #2a6f4b; border-radius:10px;
  padding:8px 10px; box-shadow:0 6px 24px rgba(0,0,0,.5); min-width:210px; max-width:290px; }
#callReqList .crl-head { font-size:13px; font-weight:700; color:#8fe0b0; margin-bottom:6px; }
#callReqList .crl-row { display:flex; align-items:center; gap:8px; padding:5px 0; font-size:13px; border-top:1px solid #232830; }
#callReqList .crl-row:first-of-type { border-top:0; }
#callReqList .crl-name { flex:1; min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; color:#e6e9ec; }
#callReqList .crl-st { font-size:11px; padding:2px 9px; border-radius:999px; white-space:nowrap; }
#callReqList .crl-st.talk { background:#1f5133; color:#8fe0b0; }
#callReqList .crl-st.wait { background:#5a4a1f; color:#f0d890; }
#callReqList .crl-st.ring { background:#1f3a5a; color:#90c0f0; }
#callReqList .crl-x { background:#3a2530; color:#e6a0b0; border:0; border-radius:6px; padding:2px 8px; cursor:pointer; font-size:11px; white-space:nowrap; }
#callReqList .crl-x:hover { background:#5a2535; }
.big.danger { background:var(--danger); }
/* 0.3초 길게누름 진행 표시(흰 오버레이가 차오름) */
.big.danger.holding::after { content:""; position:absolute; left:0; top:0; bottom:0; width:0;
  background:rgba(255,255,255,.35); animation: fillhold .3s linear forwards; }
@keyframes fillhold { to { width:100%; } }
.big.fired { background:#7a0016; }

.log, .nodes { list-style:none; margin:0 16px 0 30px; padding:0; }   /* 내용(테이블·로그)을 헤더(좌16px)보다 안쪽으로 들여쓰기 — 설정과 동일 규칙 */
.log li { background:var(--card); padding:8px 12px; border-radius:8px; margin-bottom:6px; font-size:13px; font-family:ui-monospace, monospace; }

.gate input { display:block; width:100%; margin:8px 0; padding:10px; border-radius:8px; border:1px solid #333; background:#0d0f12; color:var(--fg); }
.small { font-size:13px; padding:1px 12px; border:0; border-radius:8px; background:#2a313a; color:#fff; margin:0 16px 8px; cursor:pointer; }

.node-card { background:var(--card); margin:0 16px 10px; padding:12px; border-radius:10px; }
.node-head { display:flex; align-items:center; gap:10px; margin-bottom:8px; }
.node-head .sync { font-size:12px; opacity:.8; margin-left:auto; }
.node-card label { display:flex; justify-content:space-between; align-items:center; gap:8px; font-size:12px; margin:4px 0; opacity:.9; }
.node-card input { width:55%; padding:6px; border-radius:6px; border:1px solid #333; background:#0d0f12; color:var(--fg); }
.node-card .save { margin-top:8px; padding:8px 14px; border:0; border-radius:8px; background:var(--ok); color:#fff; cursor:pointer; }

/* 상단 탭 네비게이션 (MobKBD식 뷰 전환, 해시 라우팅) */
.topnav { display:flex; gap:2px; padding:6px 12px 0; margin-bottom:6px; overflow-x:auto; border-bottom:1px solid #222; background:#0c0e11; }
.topnav .tab-top { background:transparent; border:0; color:#9aa0a6; padding:11px 16px; cursor:pointer; font-size:19px; border-bottom:2px solid transparent; white-space:nowrap; }
.topnav .tab-top:hover:not(.disabled) { color:#cfd2d6; }
.topnav .tab-top.active { color:var(--fg); border-bottom-color:var(--danger); font-weight:600; }
.topnav .tab-top.disabled { opacity:.35; cursor:default; }
/* 장치관리 서브탭 바(§통합) — 상단탭 아래 2차 네비 */
.subnav { display:flex; gap:2px; padding:4px 12px 0; margin:0 0 6px; overflow-x:auto; border-bottom:1px solid #1a1d22; background:#0a0c0f; }
.subnav[hidden] { display:none; }
.subnav .subtab { background:transparent; border:0; color:#9aa0a6; padding:8px 14px; cursor:pointer; font-size:16px; border-bottom:2px solid transparent; white-space:nowrap; }
.subnav .subtab:hover { color:#cfd2d6; }
.subnav .subtab.active { color:var(--fg); border-bottom-color:#5b9bff; font-weight:600; }
.view[hidden] { display:none; }
/* (구) 모니터링 외 탭 zoom:1.5 해킹 제거 — 탭마다 배율이 달라 글자 크기가 불일치하던 원인.
   대신 실제 폰트를 정규화해 전 탭 동일 스케일(§UI검토 #4). 지도는 zoom과 무관. */

/* 노드 지도: 왼쪽 지도 + 오른쪽 리스트 */
.nm-wrap { display:flex; gap:12px; margin:8px 16px 16px; height:calc(100vh - 150px); min-height:440px; }
.nm-map { flex:1.5; border-radius:10px; overflow:hidden; border:1px solid #222; }
#nmap { width:100%; height:100%; }
.leaflet-container { background:#0d0f12; }
.nm-side { display:flex; flex-direction:column; flex:1; min-width:300px; max-width:480px; }
.nm-list { overflow-y:auto; flex:1; padding-right:2px; }
.nm-row { display:flex; align-items:center; gap:10px; background:var(--card); padding:10px 12px; border-radius:8px; margin-bottom:6px; cursor:pointer; }
.nm-row:hover { background:#1f2530; }
.nm-row.sel { outline:2px solid #5b9bff; }
.nm-row.alarming { background:#3a0d12; border:1px solid var(--danger); }
.nm-row.alarming .dot { background:var(--danger); }
.nm-row > b { color:#fbbf24; min-width:78px; }
.nm-row .nm-loc { flex:1; min-width:0; font-size:12px; color:#9aa0a6; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.nm-row .nm-set { padding:4px 10px; background:#2a313a; color:#fff; border:0; border-radius:8px; cursor:pointer; font-size:12px; white-space:nowrap; }
.nm-row .nm-set:hover { background:#3a434f; }
.nm-row .nm-del { background:#4c1d24; }
.nm-row .nm-del:hover:not(:disabled) { background:#6b2a33; }
.nm-row .nm-miss { font-size:11px; color:#777; white-space:nowrap; }
.nm-row .nm-loc-btn { margin-left:auto; padding:4px 10px; background:#2a313a; color:#fff; border:0; border-radius:8px; cursor:pointer; font-size:12px; white-space:nowrap; }
.nm-row .nm-loc-btn:hover { background:#3a434f; }
/* 공용 확인 모달 — 삭제(빨강) 버튼 */
.small.cf-danger { background:var(--danger); color:#fff; }
.small.cf-danger:hover { background:#7a0016; }
/* 지도 마커: 상태색 점 + 이름 라벨 */
.nm-pin { width:14px; height:14px; border-radius:50%; border:2px solid #fff; box-shadow:0 0 0 1px rgba(0,0,0,.55); }
.nm-pin.on { background:#1b8a2f; } .nm-pin.off { background:#8b95a1; }
/* 발령 마커: 크고 선명하게(굵은 흰테 + 적색 글로우 + 펄스) */
.nm-pin.alarm { width:24px; height:24px; background:#ff1f2c; border:3px solid #fff;
  box-shadow:0 0 0 2px rgba(0,0,0,.6), 0 0 12px 3px rgba(255,31,44,.75); animation:nmpulse 1s ease-out infinite; }
@keyframes nmpulse { 0% { box-shadow:0 0 0 0 rgba(225,29,39,.6); } 100% { box-shadow:0 0 0 12px rgba(225,29,39,0); } }
.leaflet-tooltip.nm-lbl { background:rgba(10,12,15,.82); border:0; color:#fff; font-size:11px; padding:1px 6px; box-shadow:none; }
.leaflet-tooltip.nm-lbl::before { display:none; }
@media (max-width:760px){ .nm-wrap { flex-direction:column; height:auto; } .nm-map { height:50vh; } .nm-side { max-width:none; } }

/* 설정 모달 탭 */
.tabs { display:flex; gap:2px; margin:6px 0 12px; border-bottom:1px solid #333; flex-wrap:nowrap; overflow-x:auto; -webkit-overflow-scrolling:touch; }
.tabs::-webkit-scrollbar { height:0; }
.tab { background:transparent; border:0; color:#9aa0a6; padding:8px 12px; cursor:pointer; font-size:14px; border-bottom:2px solid transparent; white-space:nowrap; flex:0 0 auto; }
.tab.active { color:var(--fg); border-bottom-color:var(--danger); font-weight:600; }
.tab-panel[hidden] { display:none; }

/* 위치 선택 피커 (Leaflet) — 다른 모달 위에 */
#geoPick:not([hidden]) { z-index:80; }
.gp-pin { background:transparent; border:0; font-size:24px; line-height:1; text-align:center; }
.leaflet-container { background:#0d0f12; }

/* 노드 한 줄 요약 + [설정] 버튼 (상세는 노드별 모달) */
.node-row { display:flex; align-items:center; gap:10px; background:var(--card); padding:10px 14px; border-radius:8px; margin-bottom:6px; }
.node-row.alarming { background:#3a0d12; border:1px solid var(--danger); }
.node-row.alarming .dot { background:var(--danger); }
.node-row .spacer { flex:1; }
.node-row .nloc { font-size:12px; }
.node-row .sync { font-size:12px; color:#9aa0a6; }
.node-row .node-set { padding:6px 16px; background:#2a313a; color:#fff; border:0; border-radius:8px; cursor:pointer; }
.node-row .node-set:hover { background:#3a434f; }
.node-row .map { padding:6px 12px; }
.node-row .nkey { font-size:12px; }

/* 입고관리 등 — 인라인 폼카드 + 데이터 테이블 (MobKBD식) */
.form-card { background:var(--card); margin:0 16px 12px; padding:14px 16px; border-radius:10px; }
.form-card .panel-title { font-weight:600; margin-bottom:8px; }
.frow { display:flex; align-items:center; gap:10px; margin:7px 0; }
.frow label { width:80px; font-size:13px; color:#9aa0a6; flex-shrink:0; }
.frow input, .frow select { flex:1; min-width:0; padding:7px 10px; border-radius:6px; border:1px solid #333; background:#0d0f12; color:var(--fg); font-size:14px; }
.dtable { width:100%; border-collapse:collapse; font-size:15px; }   /* zoom 제거 후 모니터링(.ntable)과 동일 스케일로 정규화 */
.dtable th { text-align:left; color:#9aa0a6; font-weight:600; font-size:14px; padding:5px 10px; border-bottom:1px solid #333; white-space:nowrap; }
.dtable td { padding:5px 10px; line-height:1.4; border-bottom:1px solid #1e242c; vertical-align:middle; }   /* 행높이 균일 */
.dtable tbody tr:hover td { background:#1a1f26; }
.dtable .empty { text-align:center; color:#666; padding:18px; }
/* 모든 셀·뱃지·버튼은 한 줄로(줄바꿈 금지). 긴 자유텍스트 칸은 .ell 로 말줄임 */
.dtable th, .dtable td { white-space:nowrap; }
.dtable button, .st-recent, .st-idle, .abadge, .cat-badge, .qbar + b, .dl-go { white-space:nowrap; }
.dtable .ell { max-width:200px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.qbar { display:inline-block; width:120px; height:8px; border-radius:4px; background:#334155; overflow:hidden; vertical-align:middle; margin-right:8px; }
.qbar > i { display:block; height:100%; border-radius:4px; }

/* 자료실/정품 업로드·입력 줄 */
.dl-up { display:flex; gap:8px; margin:0 16px 10px; flex-wrap:wrap; align-items:center; }
.dl-up input[type=text], .dl-up input[type=date], .dl-up input:not([type]) { padding:6px 10px; border-radius:8px; border:1px solid #333; background:#0d0f12; color:var(--fg); font-size:13px; color-scheme:dark; }
.dl-up a.small { text-decoration:none; }
.node-row a.small { text-decoration:none; }
.dl-up select { padding:6px 8px; border-radius:8px; border:1px solid #333; background:#0d0f12; color:var(--fg); font-size:13px; }
/* 데이터테이블 공통 색/폰트 (MobKBD 룩: 이름 주황 · IP/입고일 파랑 · MAC·날짜 monospace) */
.dtable .mono, .mono { font-family: ui-monospace, "Consolas", monospace; }
.dtable .idlink, .idlink { color:#fbbf24; }                 /* 이름/node_id */
.dtable .iplink, .iplink { color:#5b9bff; }                 /* 작업자 IP */
.dtable .datelink, .datelink { color:#5b9bff; }             /* 입고일 */
/* 장치 상태 뱃지: ● 대기(회색) / ● 최근(주황 pill) */
.st-idle { color:#8b95a1; font-size:13px; }
.st-recent { display:inline-block; padding:2px 10px; border-radius:999px; font-size:13px;
  background:#3a2c0a; color:#fbbf24; border:1px solid #5a4410; }
/* 자료실 업로드 진행바 + 카테고리 뱃지 + 2줄 파일명 */
.dlbar { height:8px; border-radius:4px; background:#334155; overflow:hidden; margin:8px 0; }
.dlbar > i { display:block; height:100%; width:0; background:var(--ok); transition:width .15s; }
.dl-name2 { display:block; max-width:220px; }
.dl-name2 b { font-size:14px; display:block; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.dl-name2 small { display:block; color:#9aa0a6; font-size:12px; white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.cat-badge { display:inline-block; padding:2px 7px; border-radius:6px; font-size:13px; background:#2a313a; }
.dtable .dlacts { display:inline-flex; align-items:center; gap:6px; white-space:nowrap; }   /* 조작 버튼 한 줄 */
/* 표 안 버튼 공통(작게·균일): 모든 .dtable 행 버튼 12px·padding 3/9 */
.dtable .small, .dtable button.small { font-size:12px; padding:1px 9px; margin:0 0 0 6px; min-width:0; border-radius:6px; }
.dtable .dl-go { background:var(--ok); color:#fff; padding:1px 9px; border-radius:6px; text-decoration:none; font-size:12px; }
.dtable .dl-del { padding:1px 9px; margin:0; font-size:12px; }   /* .small의 좌우 16px 마진 제거 → 줄바꿈 방지 */
/* 작업내용 액션 뱃지 */
.abadge { display:inline-block; padding:2px 8px; border-radius:6px; font-size:13px; background:#2a313a; color:#cbd5e1; white-space:nowrap; }
.abadge.node-create, .abadge.batch-add, .abadge.download-add, .abadge.login, .abadge.worker-add { background:#064e3b; color:#6ee7b7; }
.abadge.node-delete, .abadge.batch-del, .abadge.download-del, .abadge.clear-all, .abadge.worker-del { background:#4c1d24; color:#fda4af; }
.abadge.config { background:#422006; color:#fcd34d; }

/* 버튼 비활성(활성/비활성) + 두 섹션 행 버튼 동일 모양(padding·폭) → 위아래 일치 */
button:disabled { opacity:.38; cursor:not-allowed; }
.user-row .small, .node-row .small { min-width:54px; text-align:center; padding:5px 14px; }
/* 이름 컬럼 폭 고정 → 상태 뱃지(접속/미접속)가 위아래 한 줄로 정렬 */
.user-row > b, .node-row > b { min-width:84px; }

/* ── 그룹(§17): 필터·배지·배정 모달 ── */
.grp-filter { padding:4px 8px; border-radius:6px; }
.grps { display:inline-flex; gap:3px; flex-wrap:wrap; vertical-align:middle; }
.gb { background:#2a3550; color:#cdd8f0; border-radius:4px; padding:1px 6px; font-size:12px; line-height:1.6; }
.gb.none { background:transparent; color:#6b7688; border:1px dashed #3a4560; }
.pk-list { max-height:46vh; overflow:auto; border:1px solid #2a3550; border-radius:6px; }
.pk-row { display:flex; align-items:center; gap:8px; padding:6px 10px; border-bottom:1px solid #212a3d; cursor:pointer; }
.pk-row:last-child { border-bottom:0; }
.pk-row:hover { background:#1a2234; }
.pk-row input { width:16px; height:16px; flex:0 0 auto; }

/* 그룹 표(설정 모달): 조작 버튼 컴팩트 → 가로 스크롤 방지 */
.gacts { display:flex; gap:5px; align-items:center; }
.gacts button.small { margin:0; padding:1px 9px; font-size:12px; }
.gtable td:nth-child(2), .gtable td:nth-child(3) { max-width:120px; overflow:hidden; text-overflow:ellipsis; }

/* 대시보드 경고음 활성화 버튼(오디오 잠금 해제) — 발령 중 잠겨있으면 펄스로 강조 */
.hdr-sound { flex:0 0 auto; padding:5px 14px; border:0; border-radius:8px; background:#f0b400; color:#111; font-weight:700; font-size:16px; cursor:pointer; white-space:nowrap; }
header .small { font-size:16px; }                 /* 헤더 버튼(설정·로그아웃) +3px — 표/폼 .small엔 영향 없음 */
header .hdr-right .badge.link { font-size:15px; }  /* 패널→ +3px */
.hdr-sound[hidden] { display:none; }
.hdr-sound.pulse { animation: soundpulse .7s ease-in-out infinite; }
@keyframes soundpulse { 0%,100% { box-shadow:0 0 0 0 rgba(240,180,0,.65); } 50% { box-shadow:0 0 0 9px rgba(240,180,0,0); } }

/* 비상벨 ON/OFF 토글 색: ON=녹색, OFF=회색 */
.hdr-sound { background:var(--ok); color:#fff; }
.hdr-sound.off { background:#555; color:#e8eaed; }
/* 방송(§PA) 버튼 — 대기=남색, 방송 중=주황 펄스 */
.hdr-bcast { flex:0 0 auto; padding:5px 14px; border:0; border-radius:8px; background:#37527a; color:#dbe6f5; font-weight:700; font-size:16px; cursor:pointer; white-space:nowrap; }
.hdr-bcast[hidden] { display:none; }
.hdr-bcast.on { background:#e0731a; color:#fff; animation:soundpulse .7s ease-in-out infinite; }
/* 방송 사이렌(§PA) 버튼 + 종류 드롭다운 */
.hdr-siren { flex:0 0 auto; padding:5px 12px; border:0; border-radius:8px; background:#7a2f37; color:#f5d6da; font-weight:700; font-size:16px; cursor:pointer; white-space:nowrap; }
.hdr-siren[hidden] { display:none; }
.hdr-siren.on { background:#d10024; color:#fff; animation:soundpulse .6s ease-in-out infinite; }
.hdr-siren-sel { flex:0 0 auto; padding:4px 6px; border-radius:8px; border:1px solid #4a2a30; background:#0d0f12; color:#e8eaed; font-size:14px; }
.hdr-siren-sel[hidden] { display:none; }
/* 헤더 버튼 높이 통일 + 기능별 그룹 간격(§UI) */
.hdr-right > a.badge, .hdr-right > button { height:34px; box-sizing:border-box; display:inline-flex; align-items:center; justify-content:center; white-space:nowrap; flex-shrink:0; margin:0; line-height:1; }
.hdr-right > select { height:34px; box-sizing:border-box; flex-shrink:0; margin:0; vertical-align:middle; }
.hdr-right > #btnBroadcast, .hdr-right > #btnSound, .hdr-right > #btnSettings { margin-left:18px; }   /* 그룹 시작: 패널 | 방송·사이렌 | 비상벨 | 설정·로그아웃 */
/* 텍스트가 바뀌어도 폭 고정(방송↔방송 중, 사이렌↔사이렌 중, 비상벨 ON↔OFF) → 오른쪽 버튼 밀림/줄바꿈 방지.
   min-width는 각 버튼의 '가장 긴 상태'가 들어갈 폭 이상이어야 폭이 안 늘어남 */
#btnBroadcast { min-width:134px; } #btnSiren { min-width:152px; } #btnSound { min-width:142px; }
/* 패널 방송 수신 표시 */
#bcastInd[hidden] { display:none; }
#bcastInd { position:fixed; top:8px; left:50%; transform:translateX(-50%); z-index:9000; background:#e0731a; color:#fff; font-weight:700; font-size:15px; padding:8px 18px; border-radius:999px; box-shadow:0 4px 18px rgba(0,0,0,.5); }

/* 미배정 경고 칩 + 미배정 노드 행 강조(발령 불가 명확화) */
.gb.none { background:rgba(245,158,11,.14); color:#f5a623; border:1px solid #b9791f; font-weight:600; }
.node-row.unassigned, .user-row.unassigned { border-left:3px solid #f5a623; }

/* 노드/사용자 목록: 표처럼 열 정렬(grid). 이름·상태·위치·입고·그룹·조작 세로 정렬 */
.nodes { overflow:auto; max-height:42vh; }   /* 섹션별 세로 스크롤(대량 대비) */
.ntable thead th { position:sticky; top:0; background:var(--bg); z-index:2; box-shadow:0 1px 0 #2a2f37; }   /* 헤더 고정 */
/* 리스트 컨트롤(검색·발령먼저·라인수) — sec-head 우측 정렬 */
.sec-head .list-search { margin-left:auto; padding:4px 10px; border-radius:6px; border:1px solid #333; background:#0d0f12; color:var(--fg); font-size:13px; width:190px; }
.sec-head .list-limit { padding:3px 6px; border-radius:6px; border:1px solid #333; background:#0d0f12; color:var(--fg); font-size:13px; }
.sec-head .mini-chk { font-size:13px; color:#9aa0a6; display:inline-flex; align-items:center; gap:4px; white-space:nowrap; }
.sec-head .mini-chk input { width:auto; }
.list-page { margin:6px 16px 2px 30px; font-size:13px; display:flex; align-items:center; gap:8px; }
.list-page .small { margin:0; padding:1px 10px; }
.node-row { display:grid; align-items:center; gap:6px 10px; grid-template-columns: 150px 76px minmax(0,1fr) 86px auto auto; }
.user-row { display:grid; align-items:center; gap:6px 10px; grid-template-columns: 150px 76px minmax(0,1fr) auto auto; }
.c-name { display:flex; align-items:center; gap:8px; min-width:0; }
.c-name b { white-space:nowrap; overflow:hidden; text-overflow:ellipsis; }
.c-loc { min-width:0; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; color:#9aa0a6; font-size:12px; }
.c-batch { color:#9aa0a6; font-size:12px; white-space:nowrap; }
.c-grp { display:flex; gap:3px; align-items:center; white-space:nowrap; }   /* 그룹 칩 한 줄 */
.c-act { display:flex; align-items:center; gap:6px; justify-content:flex-end; }
.c-act .small, .c-act .map { margin:0 0 0 6px; padding:1px 9px; font-size:12px; }

/* 노드/사용자 목록: 표(table) — 열폭 자동공유(완벽 정렬) + 왼쪽 정렬 + 그룹 칩 전부표시 */
.ntable { border-collapse:separate; border-spacing:0 3px; font-size:15px; table-layout:fixed; width:100%; }   /* 모니터링 표 본문(+2px). fixed=두 표 컬럼 폭 일치(접속사용자·노드상태 세로 정렬) */
/* 컬럼 폭 고정(thead 첫 행이 fixed 레이아웃 폭 결정). 두 표 동일 순서라 자동 정렬 */
.ntable thead th:nth-child(1) { width:190px; }   /* 이름 */
.ntable thead th:nth-child(2) { width:84px; }    /* 상태 */
.ntable thead th:nth-child(3) { width:200px; }   /* 전화/위치 */
.ntable thead th:nth-child(4) { width:300px; }   /* 그룹(칩 최대 4개) */
.ntable thead th:nth-child(5) { width:150px; }   /* id/입고 */
.ntable thead th:nth-child(7) { width:270px; }   /* 조작 (6번 c-sp는 나머지 자동) */
/* 넘치는 내용 말줄임(고정폭 넘침 방지) */
.ntable td.c-name, .ntable td.c-batch, .ntable td.c-grp { overflow:hidden; text-overflow:ellipsis; }
.gb.more { background:#3a4560; color:#aab6d0; }   /* 그룹칩 초과분 +N */
.ntable th { text-align:left; color:#8a919b; font-weight:600; font-size:14px; padding:0 10px 2px; white-space:nowrap; }
.ntable td { background:var(--card); padding:5px 10px; line-height:1.4; vertical-align:middle; }   /* 행높이 균일(폰트 편차 무관) */
.ntable td:first-child { border-radius:8px 0 0 8px; }
.ntable td:last-child { border-radius:0 8px 8px 0; }
.ntable tr.alarming td { background:#3a0d12; }
.ntable tr.unassigned td:first-child { box-shadow: inset 3px 0 0 #f5a623; }
.ntable tr.offline td { opacity:.6; }
.ntable .dot { display:inline-block; vertical-align:middle; }
.ntable td.c-name { white-space:nowrap; }
.ntable td.c-name b { margin-left:8px; }
.ntable td.c-loc { color:#9aa0a6; font-size:14px; max-width:240px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.ntable td.c-batch { color:#9aa0a6; font-size:14px; white-space:nowrap; }
.ntable .badge, .ntable .alarm-tag, .ntable .gb { font-size:14px; }   /* 상태·그룹칩도 +2px */
.ntable td.c-grp { white-space:nowrap; }
.ntable td.c-grp .gb { margin-right:3px; }
.ntable td.c-act { white-space:nowrap; text-align:right; }
.ntable td.c-act .sync { margin-right:6px; }
.ntable td.c-act .small, .ntable td.c-act .map { margin:0 0 0 6px; padding:1px 9px; font-size:12px; }
/* 발령 중 위치 버튼: 발령 배지 높이 + ~2배 폭 + 강렬(적색·굵게·글로우·펄스). 모니터링·노드지도 공통 */
.ntable td.c-act .map, .nm-row .nm-loc-btn {
  background:var(--danger); color:#fff; font-weight:700; font-size:14px;
  padding:4px 12px; min-width:118px; border-radius:8px; border:0; text-align:center; white-space:nowrap;
  box-shadow:0 0 0 1px rgba(255,255,255,.25), 0 0 10px 2px rgba(209,0,36,.6);
  animation:locpulse 1.1s ease-in-out infinite; cursor:pointer;
}
.ntable td.c-act .map:hover, .nm-row .nm-loc-btn:hover { background:var(--danger); filter:brightness(1.13); }
@keyframes locpulse { 50% { box-shadow:0 0 0 1px rgba(255,255,255,.32), 0 0 16px 4px rgba(209,0,36,.9); } }

/* 표 전환: 이전 grid용 .c-* {display:flex} 가 td에 걸려 표가 깨지는 것 방지 */
.ntable td.c-name, .ntable td.c-status, .ntable td.c-loc, .ntable td.c-batch, .ntable td.c-grp, .ntable td.c-act { display:table-cell; }

/* 조작 열을 오른쪽 끝으로: 표 100% + 스페이서 열이 남는 폭 흡수 */
.ntable { width:100%; }
.ntable td.c-sp, .ntable th.c-sp { width:100%; background:transparent; padding:0; }
/* 전체해제는 배너 우측 전용 버튼(.banner-clear)에서만 — 배너 본체는 클릭 대상 아님(오클릭 방지) */
.banner.alarm, .banner.idle { cursor:default; }

/* 행을 하나의 연속 카드로: 스페이서도 카드색 + 상태 한 줄(줄바꿈 방지) */
.ntable td.c-sp { background:var(--card); }
.ntable tr.alarming td.c-sp { background:#3a0d12; }
.ntable td.c-status, .ntable td.c-name, .ntable td.c-batch, .ntable .badge, .ntable .alarm-tag { white-space:nowrap; }

/* 발령 배너 경광등: 글자 양옆 빈 칸만 좌=청 / 우=적 번갈아 점멸 (패널·대시보드 공통, §17) */
.banner.alarm {
  display:flex; align-items:center; justify-content:center;
  padding:0; overflow:hidden;
  background:#14181e; color:#fff; animation:none;   /* flash 무력화, 배경은 어둡게 고정 */
}
.banner.alarm::before, .banner.alarm::after {   /* 글자 양옆 빈 공간을 채우는 색 바 */
  content:""; flex:1 1 40px; align-self:stretch;
}
.banner.alarm::before { background:#1560ff; animation: pol-left  1.2s infinite; }  /* 좌: 청 */
.banner.alarm::after  { background:#d10024; animation: pol-right 1.2s infinite; }  /* 우: 적 */
.banner.alarm > #alarmText { flex:0 1 auto; z-index:1; padding:28px 20px; text-shadow:0 1px 3px rgba(0,0,0,.6); }
.banner.alarm > .banner-map { z-index:1; }   /* 📍 위치보기 버튼은 색 위로 */
/* 전용 "전체 해제" 버튼: 배너 우측 고정, 경광등 바 위(z-index). 발령 중에만 노출(hidden 토글) */
.banner-clear { position:absolute; right:16px; top:50%; transform:translateY(-50%); z-index:2;
  padding:10px 18px; border:none; border-radius:8px; cursor:pointer;
  background:#fff; color:#b91c1c; font-size:16px; font-weight:700; box-shadow:0 2px 6px rgba(0,0,0,.35); }
.banner-clear:hover { background:#ffe4e6; }
.banner-clear[hidden] { display:none; }
/* 헤더 경광등 라인 중앙 비상해제 버튼(발령 중만). h1·hdr-right 양쪽 flex:1이 균형 → 정중앙 */
.hdr-clear { background:var(--danger); color:#fff; border:0; border-radius:8px; padding:8px 22px; font-size:16px; font-weight:700; cursor:pointer; white-space:nowrap; box-shadow:0 0 0 2px rgba(255,255,255,.18); animation:hdrclearpulse 1.1s ease-in-out infinite; }
.hdr-clear:hover { filter:brightness(1.12); }
.hdr-clear[hidden] { display:none; }
@keyframes hdrclearpulse { 50% { box-shadow:0 0 14px 4px rgba(209,0,36,.65); } }
/* 좌청↔우적 번갈아: 0~25% 청 ON, 25~50% off, 50~75% 적 ON, 75~100% off */
@keyframes pol-left  { 0%,24%{opacity:1} 25%,100%{opacity:0} }
@keyframes pol-right { 0%,49%{opacity:0} 50%,74%{opacity:1} 75%,100%{opacity:0} }

/* 발령 행 시야 진입 시 잠깐 강조(A안 scrollAlarmIntoView) */
.ntable tr.flash td { animation: rowflash 0.6s ease-in-out 3; }
@keyframes rowflash { 50% { background:#5a1620; box-shadow:inset 0 0 0 9999px rgba(209,0,36,.25); } }

/* 헤더 경광등 칩(§ 비상벨 관리 옆): 좌=청 / 우=적 두 구역. 대기=반반 정지, 발령 중=좌청↔우적 번갈아 점멸(배너와 동기) */
.alarm-chip { position:relative; display:inline-block; width:110px; height:29px; border-radius:8px; overflow:hidden;
  vertical-align:middle; margin-left:12px; background:#14181e; box-shadow:0 0 0 1px rgba(255,255,255,.18) inset; }
.alarm-chip::before, .alarm-chip::after { content:""; position:absolute; top:0; bottom:0; width:50%; opacity:.4; }   /* 대기=흐리게 */
.alarm-chip::before { left:0;  background:#1560ff; }   /* 좌: 청 */
.alarm-chip::after  { right:0; background:#d10024; }   /* 우: 적 */
.alarm-chip.alarming { box-shadow:0 0 8px 1px rgba(209,0,36,.55), 0 0 0 1px rgba(255,255,255,.18) inset; }
/* 플래시(스트로브): 순간 밝게 번쩍 → 빠르게 감쇠. 좌청·우적 엇갈려 터짐 */
.alarm-chip.alarming::before { opacity:0; animation: chipflash-l 1.2s infinite; }
.alarm-chip.alarming::after  { opacity:0; animation: chipflash-r 1.2s infinite; }
@keyframes chipflash-l {
  0%   { opacity:1; filter:brightness(2.4); }   /* 번쩍! */
  8%   { opacity:1; filter:brightness(1); }
  22%  { opacity:0; }                            /* 빠르게 사라짐 */
  100% { opacity:0; }
}
@keyframes chipflash-r {
  0%, 49% { opacity:0; }                          /* 절반까지 꺼짐 유지(페이드 방지) */
  50%  { opacity:1; filter:brightness(2.4); }    /* 반대편 번쩍! */
  58%  { opacity:1; filter:brightness(1); }
  72%  { opacity:0; }                             /* 빠르게 감쇠 */
  100% { opacity:0; }
}

/* 패널 감시상태 경고 배지(백그라운드) */
.badge.warn { background:#c98a00; color:#111; }
/* 패널 발령 중: 화면 전체 가장자리 적색 점멸 — 소리를 못 내도 강하게 인지(§UI검토 #2 시각 폴백) */
body.panel-alarming::after {
  content:""; position:fixed; inset:0; pointer-events:none; z-index:9999;
  box-shadow: inset 0 0 0 12px rgba(209,0,36,.92);
  animation: panelflash .7s steps(1) infinite;
}
@keyframes panelflash { 50% { box-shadow: inset 0 0 0 12px rgba(209,0,36,.12); } }

/* 설정창: zoom 제거 → 메인 화면(.ntable) 규칙에 정렬(글자·색·간격). 폭 넓게 + 안쪽 들여쓰기(전 탭) */
#settings .modal-card { width: min(680px, 94vw); max-height: 88vh; padding: 20px 38px; }
#settings .modal-card h2 { font-size:18px; margin:0 0 10px; }
#settings .tabs .tab { font-size:14px; }
/* 라벨행(라벨 왼쪽 · 입력 고정폭 우측) — 전 탭 동일, 메인 스케일(14px) */
#settings .modal-card label { font-size:14px; margin:8px 0; align-items:center; gap:14px; }
#settings .modal-card input, #settings .modal-card select { font-size:14px; flex:0 0 62%; width:62%; padding:6px 10px; }
#settings .modal-card > .muted, #settings .modal-card p.muted { font-size:13px; line-height:1.5; margin:6px 0; }
/* .frow(그룹 탭 등)도 같은 스케일·정렬 */
#settings .frow { margin:8px 0; }
#settings .frow label { font-size:14px; }
#settings .frow input, #settings .frow select { font-size:14px; padding:6px 10px; }
/* 리스트(표) = 메인 .ntable 규칙: td 15 · th 14 · 칩/뱃지 14 · 조작 12 · 이름 주황(.idlink) */
#settings .dtable, #settings .dtable td { font-size:15px; }
#settings .dtable th { font-size:14px; }
#settings .dtable td, #settings .dtable th { padding:5px 9px; }
#settings .dtable .badge, #settings .dtable .gb, #settings .dtable .alarm-tag { font-size:14px; }
#settings .dtable .small, #settings .dtable button.small { font-size:12px; padding:2px 8px; }
#settings .modal-card .modal-actions .small, #settings .modal-card .modal-actions button { font-size:14px; padding:5px 14px; }
/* 원격설정 "고급 설정" 인라인 접기(기본 접힘) */
.adv-toggle { background:none; border:0; color:#7fa8ff; cursor:pointer; font-size:13px; padding:4px 0; margin:2px 0; }
.adv-toggle:hover { text-decoration:underline; }
#cfgAdv[hidden], #ncAdv[hidden] { display:none; }
#cfgAdv, #ncAdv { border-left:2px solid #2a3550; padding-left:10px; margin:2px 0 4px; }
/* 설정 탭·노드 원격설정 모달의 내용(body)을 안쪽으로 들여쓰기(제목/탭 대비, 가독성) */
#settings .tab-panel { padding-left:14px; }
#nodeCfg .modal-card > *:not(h2) { padding-left:14px; }
/* 평면도 관리표 파일명 말줄임(가로 스크롤 방지, 전체는 title 툴팁) */
#settings .fp-fname { max-width:200px; overflow:hidden; text-overflow:ellipsis; }

/* 이미지 라이트박스 (도면 더블클릭 → 원본) — 설정 모달(z 2000) 위로 */
.imglb { position:fixed; inset:0; background:rgba(0,0,0,.85); display:flex; align-items:center; justify-content:center; z-index:3000; cursor:zoom-out; }
.imglb img { max-width:92vw; max-height:92vh; background:#fff; border-radius:6px; box-shadow:0 6px 40px #000; }
.fp-thumb { cursor:zoom-in; }

/* 평면도 위치 지정 픽커 핀 */
#fpPickPin { position:absolute; transform:translate(-50%,-100%); font-size:28px; line-height:1; pointer-events:none; z-index:2; filter:drop-shadow(0 1px 2px #000); }
.nc-fp-item { display:inline-flex; align-items:center; gap:4px; background:#2a3550; color:#cdd8f0; border-radius:6px; padding:2px 6px; margin:2px 4px 2px 0; font-size:12px; }
.nc-fp-item .nc-fp-edit { background:none; border:0; color:inherit; cursor:pointer; font:inherit; padding:0; }
.nc-fp-item .nc-fp-edit:hover { text-decoration:underline; }
.nc-fp-item .nc-fp-del { background:none; border:0; color:#f88; cursor:pointer; font-size:13px; padding:0 2px; }
.nc-fp-item .nc-fp-up, .nc-fp-item .nc-fp-dn { background:none; border:0; color:#9fb4e0; cursor:pointer; font-size:10px; padding:0 1px; line-height:1; }
.nc-fp-item .nc-fp-up:hover, .nc-fp-item .nc-fp-dn:hover { color:#fff; }
.nc-fp-item .nc-fp-up:disabled, .nc-fp-item .nc-fp-dn:disabled { color:#556; cursor:default; }
