@font-face {
  font-family: "Pretendard Variable";
  font-weight: 45 920;
  font-style: normal;
  font-display: swap;
  src: url(PretendardVariable.woff2) format("woff2");
}
/* AX 모니터링 화면 세트 — 셸 스타일 (DEV-2026-0008)
 *
 * 자리: 옛 보고판과 **같은 문서** 안에 산다(서빙 지점이 파일 하나뿐이다 —
 * `dashboard/AGENTS.md` "서빙 방식"). 그래서 이 파일의 모든 규칙은 `#ns-root` 또는
 * `body.ns-on` 아래로 범위를 좁힌다: 옛 화면(`?legacy=1`)을 열었을 때 이 스타일이
 * 한 줄도 닿지 않아야 한다. 전역으로 새는 규칙은 딱 둘이고(아래 "전환 이음새"),
 * 옛 보고판을 지우는 날 그 둘만 없애면 된다.
 *
 * 토큰은 자기완결이다 — 옛 화면의 `--stage-*` 같은 변수를 참조하지 않는다(참조하면
 * 옛 화면을 지우는 순간 색이 사라진다). 다만 **뜻이 있는 색**은 사용자가 이미 배운
 * 것을 물려받는다: 단계 4색, 인용 하이라이트(서고 원문 뷰의 하이라이트와 같은 노랑).
 */

/* ---- 전환 이음새 (옛 보고판 제거 시 지울 두 규칙) ------------------------- */
body.ns-on { overflow: hidden; }
body.ns-on .ax-app { display: none; }

#ns-root { display: none; }
body.ns-on #ns-root { display: grid; }

/* ---- 토큰 ------------------------------------------------------------------ */
#ns-root {
  --desk: #e9ecf0;          /* 화면 바닥 — 판(pane)들이 얹히는 책상 */
  --paper: #ffffff;         /* 판 표면 */
  --paper-2: #f7f8fa;       /* 판 안쪽 구획(머리·바닥줄) */
  --ink: #171a20;
  --ink-2: #545c68;         /* 보조 설명 */
  --ink-3: #7e8794;         /* 라벨 */
  --rule: #d5dae1;
  --rule-strong: #b9c1cb;
  --accent: #1f5aa8;        /* 선택·링크 */
  --accent-soft: #e8f0fb;
  --ok: #0b7a3b;            /* 승인 */
  --ev-normal: #0b7a3b; --ev-caution: #a35f00; --ev-risk: #c0392b; --ev-unmeasured: #3d5a8a;
  --ev-not_applicable: #7e8794; --ev-no_premise: #6b4fa0;
  --no: #c0392b;            /* 반려 */
  --hold: #9a6b00;          /* 보류 */
  --recheck: #5d4a86;       /* 재검토 — 전제가 움직인 상태 */
  --quote-bg: #fff8e0;      /* 인용문 — 서고 원문 뷰 하이라이트와 같은 계열 */
  --quote-bar: #e8b93a;
  --stage-계획: #4a3aa7;
  --stage-진행: #2a78d6;
  --stage-완료: #0ca30c;
  --stage-운영중: #0b7f7a;
  --stage-중단: #898781;
  /* 과제 일정(DEV-2026-0058) — 이름 칸 폭은 **한 곳**에서만 온다: 줄의 칸 나눔과
     눈금·오늘 선을 얹는 겹이 같은 값을 읽어야 창 폭이 변해도 좌표계가 하나로 남는다. */
  --gt-lab: 264px;
  --gt-today: #d8232a;      /* 오늘 — 이 화면에서 빨강은 이 선 하나의 몫이다 */
  --gt-grid: #e6eaf0;       /* 눈금 선 — 실선 한 겹, 읽는 것을 방해하지 않는 굵기 */
  --gt-past: rgba(31, 45, 66, .045);   /* 오늘 왼쪽 — 이미 지난 자리 */
  /* 승인 뒤 과제 현황(DEV-2026-0592) — 달라진 자리 셋의 색. 단계 색(막대 바탕)과 겹치지 않게 테두리 · 바탕 물로만 쓴다. */
  --pv-new: #138a4a;  --pv-new-bg: #e5f5eb;
  --pv-gone: #b23a2e; --pv-gone-bg: #fbecea;
  --pv-chg: #b97800;  --pv-chg-bg: #fff2cf;
  --pv-hit: #ffd866;
  /* 글꼴 (DEV-2026-0074) — 본문은 Pretendard 다. 파일은 산출물 안에 실려 있어(build.py 가
     @font-face 를 만든다) 바깥 망에 나가지 않는다. 그래도 못 실리는 경우가 있으므로
     떨어질 자리를 적어 두고, **떨어졌다는 사실은 머리줄이 말한다**(90-boot.js fontWatch). */
  --font: "Pretendard Variable", Pretendard, "Malgun Gothic", "Apple SD Gothic Neo",
          system-ui, sans-serif;
  --mono: "Cascadia Mono", Consolas, "D2Coding", "Courier New", monospace;

  /* 글자 크기 — **한 단씩 위로** (사용자 2026-09-18 "전반적인 글자 사이즈 키워").
     기준은 13 → 15px 이고 나머지는 같은 표를 따라 올라간다: 해설 문장을 뺀 자리에서
     라벨·값이 스스로 읽혀야 하기 때문이다. 촘촘한 자리(눈금 글자·그래프 이름표)는
     가장 작은 두 단을 쓰므로 +1~2px 만 오른다 — 표와 간트가 그만큼만 넓어진다. */
  --fs-2xs: 10px;      /* 그래프 이름표 */
  --fs-xs: 12px;       /* 눈금 글자 · 절 라벨 */
  --fs-sm: 13px;       /* 보조 값 */
  --fs-md: 14px;
  --fs-base: 15px;     /* 기준 */
  --fs-lg: 16px;
  --fs-xl: 17px;
  --fs-2xl: 18px;
  --fs-3xl: 23px;
  --fs-4xl: 26px;

  position: fixed; inset: 0;
  grid-template-columns: 208px minmax(0, 1fr);
  /* 머리줄 · 자회사 줄 · 본체 — 앞의 둘은 폭을 다 쓴다 */
  grid-template-rows: auto auto minmax(0, 1fr);
  background: var(--desk);
  color: var(--ink);
  font-family: var(--font);
  font-size: var(--fs-base);
  line-height: 1.55;
}
#ns-root *, #ns-root *::before, #ns-root *::after { box-sizing: border-box; }
#ns-root button, #ns-root input, #ns-root select, #ns-root textarea {
  font-family: inherit; font-size: inherit;
}
/* 글자색 상속만 특이도 0(:where) — 채운 단추(.ns-btn--go · --ok 류)의 흰 글자를 이기지 않게(DEV-2026-0499). */
:where(#ns-root) :where(button, input, select, textarea) { color: inherit; }
#ns-root :focus-visible {
  outline: 2px solid var(--accent); outline-offset: 1px; border-radius: 2px;
}

/* ---- 머리줄 ---------------------------------------------------------------- */
.ns-top {
  grid-column: 1 / -1;
  display: flex; align-items: center; gap: 16px; flex-wrap: wrap;
  padding: 8px 16px;
  background: var(--paper); border-bottom: 1px solid var(--rule-strong);
}
.ns-brand { display: flex; align-items: baseline; gap: 8px; }
.ns-brand-name { font-size: var(--fs-xl); font-weight: 700; letter-spacing: -0.01em; }
.ns-brand-scope { font-size: var(--fs-sm); color: var(--ink-3); }
.ns-top-gate { display: flex; align-items: center; gap: 6px; }
.ns-top-gate label { font-size: var(--fs-sm); color: var(--ink-3); }
.ns-top-spacer { flex: 1; }
.ns-top-fact { font-size: var(--fs-sm); color: var(--ink-2); }
.ns-top-fact b { font-weight: 700; color: var(--ink); }

.ns-input, .ns-select, .ns-area {
  background: var(--paper); border: 1px solid var(--rule-strong); border-radius: 3px;
  padding: 4px 7px; min-width: 0;
}
.ns-input:disabled { background: var(--paper-2); color: var(--ink-3); }
.ns-area { resize: vertical; line-height: 1.5; }
.ns-input--reviewer { width: 128px; }
.ns-input--reviewer:placeholder-shown { border-color: var(--no); background: #fff6f5; }

/* ---- 좌측 화면 목록 -------------------------------------------------------- */
/* 왼쪽은 두 겹이다 (DEV-2026-0031, 강의 참조 화면) — 얇은 그림 줄(48px) + 이름 줄(160px).
   그림만 두면 무엇인지 알 수 없다는 것이 이 화면 세트의 규약이라 이름 줄을 지우지 않는다.
   접으면(is-rail-off) 둘 다 접히고 그 208px 을 내용이 쓴다(룰링 11:45). */
.ns-rail {
  display: grid; grid-template-columns: 48px minmax(0, 1fr);
  overflow: hidden; border-right: 1px solid var(--rule-strong); background: var(--paper);
}
.ns-applist {
  display: flex; flex-direction: column; align-items: center; gap: 2px;
  padding: 10px 0; overflow-y: auto; background: #1c2127;
}
.ns-appbtn {
  appearance: none; cursor: pointer; text-decoration: none;
  width: 36px; height: 36px; flex: none;
  display: flex; align-items: center; justify-content: center;
  background: transparent; border: none; border-radius: 8px;
  color: rgba(255, 255, 255, 0.82); line-height: 1;
  /* 글꼴에 없는 모양은 빈칸으로 떨어진다 — 기호를 갖온 글꼴을 먼저 불러 쓴다. */
  font-family: "Segoe UI Symbol", "Segoe UI", var(--font); font-size: var(--fs-2xl);
}
/* 자리 묶음이 바뀌는 곳에 가는 줄 — 이름 줄의 묶음 머리와 같은 경계다. */
.ns-appgap { width: 24px; height: 1px; flex: none; margin: 6px 0;
             background: rgba(255, 255, 255, 0.22); }
.ns-appbtn:hover { background: rgba(255, 255, 255, 0.1); color: #fff; }
.ns-appbtn.is-on { background: rgba(255, 255, 255, 0.18); color: #fff; }
.ns-menu {
  display: flex; flex-direction: column; gap: 2px;
  padding: 10px 6px; overflow-y: auto;
}
.ns-nav--away { text-decoration: none; }
.ns-rail-group {
  font-size: var(--fs-xs); color: var(--ink-3); padding: 10px 8px 4px;
}
.ns-nav {
  appearance: none; text-align: left; cursor: pointer;
  display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: center; gap: 4px;
  background: transparent; border: 1px solid transparent; border-radius: 4px;
  padding: 7px 7px; font-size: var(--fs-base); color: var(--ink);
}
/* 0501 — 이름은 한 줄(1680 레일 '온톨로지 매니저 25' 꺾임). */
.ns-nav > span:first-child { white-space: nowrap; }
.ns-nav:hover { background: var(--paper-2); }
.ns-nav.is-on { background: var(--accent-soft); border-color: #c6dcf6; font-weight: 700; }
.ns-nav[disabled] { cursor: default; color: var(--ink-3); }
.ns-nav[disabled]:hover { background: transparent; }
.ns-count {
  font-variant-numeric: tabular-nums; font-size: var(--fs-sm); color: var(--ink-2);
  background: var(--paper-2); border: 1px solid var(--rule); border-radius: 3px;
  padding: 0 4px; min-width: 22px; text-align: center;
}
.ns-count.is-warm { background: #fdf3e3; border-color: #e8cf9f; color: #7a5200; }

/* ---- 화면 본체 ------------------------------------------------------------- */
.ns-screen { overflow: hidden; display: grid; grid-template-rows: minmax(0, 1fr); }
.ns-screen--panes3 { grid-template-columns: 300px minmax(0, 1fr) var(--side-w, 400px); }
.ns-screen--panes2 { grid-template-columns: 340px minmax(0, 1fr); }
.ns-screen--panes2r { grid-template-columns: minmax(0, 1fr) var(--side-w, 420px); }
.ns-screen--flow { grid-template-columns: minmax(0, 1fr); }
/* 서고 (DEV-2026-0135) — 찾기 · 결과 · 쓰임 세 판 */
.ns-screen--vault { grid-template-columns: 300px minmax(0, 1fr) var(--side-w, 340px); }

.ns-pane {
  display: grid; grid-template-rows: auto minmax(0, 1fr);
  overflow: hidden; border-right: 1px solid var(--rule-strong); background: var(--paper);
}
.ns-pane:last-child { border-right: none; }
.ns-pane--desk { background: var(--desk); }
.ns-pane-head {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 8px 12px; background: var(--paper-2); border-bottom: 1px solid var(--rule);
}
.ns-pane-title { font-size: var(--fs-md); font-weight: 700; }
.ns-pane-titles { display: flex; flex-direction: column; min-width: 0; }
.ns-pane-origin { font-size: var(--fs-sm); color: var(--ink-2); }
.ns-pane-note { font-size: var(--fs-sm); color: var(--ink-2); }
.ns-pane-body { overflow: auto; padding: 10px 12px; }
.ns-pane-body--flush { padding: 0; }

.ns-h { font-size: var(--fs-md); font-weight: 700; margin: 14px 0 6px; }
.ns-h:first-child { margin-top: 0; }
.ns-p { margin: 0 0 8px; color: var(--ink-2); max-width: 74ch; }
.ns-muted { color: var(--ink-2); }
.ns-id { font-family: var(--mono); font-size: var(--fs-sm); color: var(--ink-2); }
.ns-num { font-variant-numeric: tabular-nums; }

/* 빈 상태·실패 — 무엇을 하면 되는지까지 적는다 */
.ns-empty {
  border: 1px dashed var(--rule-strong); border-radius: 4px;
  padding: 18px 16px; color: var(--ink-2); background: var(--paper-2);
}
.ns-empty b { display: block; color: var(--ink); font-size: var(--fs-base); margin-bottom: 4px; }
/* 상자의 테두리는 네 변이 같다 (사용자 2026-09-23 "카드왼쪽에만 테두리넣지말고") —
   뜻은 테두리 **색**과 안의 라벨이 진다. 왼쪽만 굵게 두지 않는다. */
.ns-fail {
  border: 1px solid var(--no); border-radius: 3px;
  background: #fdf4f3; padding: 9px 11px; margin: 0 0 8px; color: #7d2118;
}
.ns-fail b { display: block; margin-bottom: 2px; }
/* 셀 수 없는 수 — 숫자 자리에 숫자가 아닌 것이 서면 숫자처럼 굵게 쓰지 않는다. */
.ns-unknown-num { font-weight: 500; color: #8a6a1e; }

/* 모르는 것 — 서고에 못 닿아 이 절의 답이 비었다. 실패(빨강)와 색을 나눠 둔다. */
.ns-unknown {
  border: 1px solid #b8892b; border-radius: 3px;
  background: #fdf8ec; padding: 9px 11px; margin: 0 0 8px; color: #6b4e14;
}
.ns-unknown b { display: block; margin-bottom: 2px; color: #4d3708; }
.ns-unknown-why { display: block; margin-bottom: 2px; }

.ns-note-box {
  border: 1px solid var(--ink-3);
  background: var(--paper-2); border-radius: 3px; padding: 9px 11px; margin: 0 0 8px;
  color: var(--ink-2);
}
.ns-note-box b { color: var(--ink); }

/* ---- 버튼 ------------------------------------------------------------------ */
.ns-btn {
  appearance: none; cursor: pointer; border-radius: 3px; padding: 5px 11px;
  background: var(--paper); border: 1px solid var(--rule-strong); color: var(--ink);
  white-space: nowrap;
}
.ns-btn:hover:not([disabled]) { border-color: var(--accent); color: var(--accent); }
.ns-btn[disabled] { cursor: not-allowed; opacity: 0.5; }
.ns-btn--go { background: var(--accent); border-color: var(--accent); color: #fff; font-weight: 700; }
.ns-btn--go:hover:not([disabled]) { background: #17457f; color: #fff; }
.ns-btn--ok { background: var(--ok); border-color: var(--ok); color: #fff; font-weight: 700; }
.ns-btn--ok:hover:not([disabled]) { background: #095e2e; color: #fff; }
.ns-btn--no { border-color: var(--no); color: var(--no); }
.ns-btn--no:hover:not([disabled]) { background: #fdf4f3; }
.ns-btn--hold { border-color: #d7ae5c; color: var(--hold); }
.ns-btn--sm { padding: 2px 7px; font-size: var(--fs-sm); }
.ns-btn--link {
  border: none; background: transparent; color: var(--accent); padding: 0;
  text-decoration: underline; text-underline-offset: 2px;
}
.ns-a { color: var(--accent); text-underline-offset: 2px; }

.ns-seg { display: inline-flex; border: 1px solid var(--rule-strong); border-radius: 3px; overflow: hidden; max-width: 100%; }
/* 좁은 판에서 단추가 잘리지 않게 — 검토 목록의 자리 단추는 여섯이라 280px 판에서 넘친다
   (실측: '반려됨' 이 잘려 눌리지 않았다). 넘치면 줄을 바꾼다. */
.ns-seg--wrap { flex-wrap: wrap; overflow: visible; }
.ns-seg--wrap .ns-seg-btn { border: 1px solid var(--rule); margin: -1px 0 0 -1px; }
.ns-seg-btn {
  appearance: none; cursor: pointer; border: none; background: var(--paper);
  padding: 4px 9px; border-right: 1px solid var(--rule); white-space: nowrap;
}
.ns-seg-btn:last-child { border-right: none; }
.ns-seg-btn.is-on { background: var(--accent); color: #fff; font-weight: 700; }

.ns-check { display: inline-flex; align-items: center; gap: 5px; cursor: pointer; }
.ns-row { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-bottom: 8px; }
.ns-row--tight { margin-bottom: 4px; }

/* ---- 표 -------------------------------------------------------------------- */
.ns-table { width: 100%; border-collapse: collapse; }
.ns-table th, .ns-table td {
  text-align: left; padding: 5px 8px; border-bottom: 1px solid var(--rule);
  vertical-align: top;
}
.ns-table th {
  font-size: var(--fs-xs); color: var(--ink-3); font-weight: 700; background: var(--paper-2);
  position: sticky; top: 0; z-index: 1;
}
.ns-table td.ns-wrap { white-space: pre-line; word-break: break-word; }
/* 누를 것은 표에서도 **맨 앞 한 열**이다 (DEV-2026-0077 R2) — 폭을 내용에 맞춰 좁히고
   줄마다 같은 x 에 세운다. */
.ns-table th.ns-th-act, .ns-table td.ns-td-act { width: 1%; white-space: nowrap; padding-right: 4px; }
/* 표기와 대상이 다른 줄에만 붙는 한 줄 — 같은 줄들 사이에서 이것만 눈에 걸리게 한다. */
.ns-syn-target { color: var(--ink-1); font-weight: 600; }
/* 동의어 사전 (DEV-2026-0285) — 사전 · 제안 · 기록. 펼친 줄은 같은 표의 아래 줄이고
   왼쪽 띠로 어느 줄의 속살인지 잇는다. */
.ns-syn-table td { vertical-align: top; }
.ns-num-cell { white-space: nowrap; font-variant-numeric: tabular-nums; }
.ns-syn-chips { display: flex; flex-wrap: wrap; gap: 4px; align-items: center; }
.ns-syn-chipbtn { cursor: pointer; font: inherit; font-size: var(--fs-sm); }
.ns-syn-chipbtn:hover { border-color: var(--accent); color: var(--accent); }
.ns-syn-open-row > td { padding: 0 0 10px 0; background: var(--paper); }
.ns-syn-detail {
  border-left: 3px solid var(--accent); background: var(--paper-2);
  padding: 10px 12px; display: grid; gap: 8px;
}
.ns-syn-names { background: var(--paper); }
.ns-syn-names td { vertical-align: top; }
.ns-syn-evcell { min-width: 260px; }
.ns-syn-ev .ns-ev { margin: 0 0 4px; }
.ns-syn-why { font-size: var(--fs-sm); }
.ns-syn-why-body { font-size: var(--fs-sm); color: var(--ink-2); margin: 4px 0 0; }
.ns-syn-hits { border-top: 1px dashed var(--rule); margin-top: 4px; padding-top: 4px; }
.ns-syn-hit { display: flex; flex-wrap: wrap; gap: 8px; align-items: baseline; font-size: var(--fs-sm); }
.ns-syn-hit-name { color: var(--ink); font-weight: 600; word-break: break-all; }
.ns-syn-deeds { display: grid; gap: 6px; }
.ns-syn-form {
  background: var(--paper); border: 1px solid var(--rule); border-radius: 3px; padding: 8px 10px;
}
.ns-syn-pick { flex-wrap: wrap; gap: 4px; }
.ns-syn-chip { display: inline-flex; align-items: center; gap: 4px; }
.ns-syn-chip-x {
  appearance: none; border: none; background: transparent; cursor: pointer;
  color: var(--ink-3); padding: 0 2px; font-size: var(--fs-sm);
}
.ns-syn-chip-x:hover { color: var(--no); }
.ns-syn-phrase.is-on { background: var(--accent-soft); border-color: var(--accent); color: var(--accent); }
.ns-syn-facts { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 1fr); gap: 12px; }
.ns-syn-compare { background: var(--paper); }
.ns-syn-compare td { vertical-align: middle; }
.ns-syn-keep { margin: 0 0 6px; font-weight: 700; }
.ns-syn-quote { color: var(--ink-2); }
@media (max-width: 720px) {
  .ns-syn-facts { grid-template-columns: minmax(0, 1fr); }
  .ns-syn-evcell { min-width: 0; }
}
.ns-table tr.is-on td { background: var(--accent-soft); }

/* 처리 경로의 **갈래 하나**(DEV-2026-0092 R3) — 계보가 다르면 사슬도 둘이라 표도 둘이다.
   갈래가 하나뿐인 보통의 문서는 아무 장식도 얻지 않고, 둘째 갈래부터 앞 갈래와 사이에
   줄이 선다 — 경계는 갈래가 실제로 갈릴 때만 그린다. */
.ns-chain { margin-bottom: 12px; }
.ns-chain + .ns-chain { padding-top: 12px; border-top: 2px solid var(--rule); }
/* 갈래끼리는 **같은 자로 재야** 읽힌다 — 표마다 제 내용대로 칸을 나누면 같은 열의
   글자가 갈래마다 다른 x 에 서서 두 표가 남남으로 보인다. 칸 너비를 갈래 밖에서 정한다. */
.ns-chain .ns-table { table-layout: fixed; }
.ns-chain .ns-table th.ns-th-act, .ns-chain .ns-table td.ns-td-act { width: 152px; }
.ns-chain .ns-table th:nth-child(2) { width: 30%; }
.ns-chain .ns-table th:nth-child(3) { width: 76px; }
.ns-chain .ns-table th:nth-child(4) { width: 26%; }
.ns-chain .ns-table td { word-break: break-word; }

/* ---- 목록 항목 (검토 큐 · 수신 문서 · 표기) -------------------------------- */
.ns-list { display: flex; flex-direction: column; }
.ns-item {
  appearance: none; text-align: left; cursor: pointer; width: 100%;
  display: grid; gap: 2px;
  background: var(--paper); border: none; border-bottom: 1px solid var(--rule);
  border-left: 3px solid transparent; padding: 8px 11px;
}
.ns-item:hover { background: var(--paper-2); }
.ns-item.is-on { background: var(--accent-soft); border-left-color: var(--accent); }
.ns-item.is-recheck { border-left-color: var(--recheck); }
.ns-item.is-done { color: var(--ink-3); }
.ns-item-title {
  font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ns-item-meta {
  display: flex; gap: 6px; align-items: center; flex-wrap: wrap;
  font-size: var(--fs-sm); color: var(--ink-2);
}

/* ---- 표시 조각 ------------------------------------------------------------- */
.ns-tag {
  display: inline-block; border: 1px solid var(--rule-strong); border-radius: 2px;
  background: var(--paper-2); padding: 0 5px; font-size: var(--fs-sm); color: var(--ink-2);
  white-space: nowrap;
}
.ns-tag--recheck { border-color: #c3b6dd; background: #f1ecfa; color: var(--recheck); font-weight: 700; }
.ns-tag--amb { border-color: #e8cf9f; background: #fdf3e3; color: #7a5200; }
.ns-tag--struct { border-color: #a9c8ea; background: var(--accent-soft); color: #17457f; }
.ns-tag--esc { border-color: #e7bdb7; background: #fdf4f3; color: var(--no); }
.ns-tag--ok { border-color: #a8d5b9; background: #eef8f1; color: var(--ok); }
.ns-tag--stage { color: #fff; border: none; font-weight: 700; }

/* 대상·발의자·일자 — 점으로 이은 한 줄이 아니라 서류 머리처럼 격자에 앉힌다 */
.ns-facts { display: grid; grid-template-columns: max-content minmax(0, 1fr); gap: 2px 12px; }
.ns-facts dt { font-size: var(--fs-sm); color: var(--ink-3); }
.ns-facts dd { margin: 0; overflow-wrap: anywhere; }

/* ---- 검토 카드 ------------------------------------------------------------- */
.ns-card { background: var(--paper); }
.ns-card-head { padding: 12px 16px 10px; border-bottom: 1px solid var(--rule); }
.ns-card-title { font-size: var(--fs-2xl); font-weight: 700; margin: 0 0 2px; line-height: 1.35; }
.ns-card-tags { display: flex; gap: 5px; flex-wrap: wrap; margin-bottom: 7px; }
/* 카드 오른쪽 위 [카드 수정] · [수정 완료] (DEV-2026-0366) */
.ns-card-tools { margin-left: auto; display: inline-flex; gap: 5px; align-items: center; flex: none; }
.ns-card-sec { padding: 12px 16px; border-bottom: 1px solid var(--rule); }
.ns-card-sec:last-child { border-bottom: none; }
.ns-sec-label { font-size: var(--fs-xs); color: var(--ink-3); display: block; margin-bottom: 5px; }
.ns-prose { margin: 0; white-space: pre-line; max-width: 78ch; }

/* 재검토 띠 — 사선 해칭은 "지금 통과할 수 없다" 는 표시다(장식이 아니다) */
.ns-recheck-band {
  border: 1px solid var(--recheck); border-radius: 3px;
  background:
    repeating-linear-gradient(135deg, rgba(93, 74, 134, 0.07) 0 7px, transparent 7px 14px),
    #f7f4fd;
  padding: 10px 12px; margin: 0 16px 12px; color: #3f3160;
}
.ns-recheck-band b { display: block; margin-bottom: 3px; color: var(--recheck); }

.ns-diff { display: grid; grid-template-columns: max-content 1fr; gap: 3px 10px; }
.ns-diff dt { font-size: var(--fs-sm); color: var(--ink-3); }
.ns-diff dd { margin: 0; display: flex; gap: 7px; align-items: baseline; flex-wrap: wrap; }
.ns-diff-from { color: var(--ink-2); text-decoration: line-through; }
.ns-diff-to { font-weight: 700; }
.ns-diff-arrow { color: var(--ink-3); }

/* 근거 인용 — 이 화면에서 시각 무게를 몰아주는 한 곳 */
/* 근거 카드 (DEV-2026-0143) — 테두리 한 장 + 노란 인용문. 테두리 **전체**가 가닥 종류
   색이고(0176 R6: 왼쪽만 굵게 두지 않는다) 종류 이름은 카드 안 칩에 글자로 선다 —
   색만으로 가르지 않는다. 노란 인용 배경은 서고 원문 뷰 하이라이트와 같은 계열이라
   [원문 열기]로 건너간 자리와 눈으로 이어진다. */
.ns-ev {
  border: 1px solid var(--ev-bar, var(--rule-strong));
  border-radius: 4px; background: var(--paper); padding: 9px 11px; margin-bottom: 9px;
  box-shadow: 0 1px 2px rgba(16, 20, 28, .07);
}
.ns-ev-quote {
  margin: 0 0 6px; white-space: pre-line; font-size: var(--fs-sm);
  background: var(--quote-bg); border-left: 3px solid var(--quote-bar);
  border-radius: 0 3px 3px 0; padding: 4px 8px;
}
/* 문서 근거(ADR-049 · 0458) — 인용문 자리에 구절이 없다: 노란 인용 바탕 대신 점선 띠 · 역할 글자 · 한 줄 사유. */
.ns-ev-whole { background: transparent; border: 1px dashed var(--ink-3); border-left: 3px dashed var(--quote-bar);
  white-space: normal; display: flex; flex-wrap: wrap; gap: 2px 10px; align-items: baseline; }
.ns-ev-whole-open { font-weight: 600; }
.ns-ev-note { color: var(--ink-2); }
.ev-doc select, .ev-doc input { min-width: 0; }
.cw-step.is-off { opacity: .6; }
.ns-ev-meta { display: flex; gap: 8px; flex-wrap: wrap; align-items: baseline; font-size: var(--fs-sm); color: var(--ink-2); }
.ns-ev-kind {
  font-size: var(--fs-xs); font-weight: 700; color: var(--ev-bar, var(--quote-bar));
  border: 1px solid var(--ev-bar, var(--quote-bar)); border-radius: 999px; padding: 0 7px;
}
.ns-ev--conf   { --ev-bar: #b88a12; }
.ns-ev--log    { --ev-bar: #2a78d6; }
.ns-ev--flag   { --ev-bar: #0f7b8a; }
.ns-ev--intake { --ev-bar: #2f7d4f; }
.ns-ev--prop   { --ev-bar: #5d4a86; }
.ns-ev--area   { --ev-bar: #a05a2c; }
.ns-ev-none { border-color: var(--rule-strong); background: var(--paper-2); color: var(--ink-2); }

/* 근거 목록 바로 아래 추가 자리 (0176 R6) — 목록의 마지막 칸으로 보이게 한 줄을 다
   쓴다. 점선은 "아직 없는 카드" 라는 표시다(걸음 추가 `.ns-step--add` 와 같은 꼴). */
.ns-ev-add { margin: 0 0 10px; }
.ns-ev-add .ns-btn {
  width: 100%; padding: 9px 11px; border-style: dashed; border-color: var(--rule-strong);
  background: var(--paper-2); color: var(--ink-2); font-weight: 700;
}
.ns-ev-add .ns-btn:hover:enabled { border-color: var(--accent); color: var(--accent); }

/* 근거와 영향 판 (0176 R6) — 책상 바닥 위에 근거 카드가 흰 종이로 떠 있다. */
.ns-review-side .ns-pane-body { padding: 12px; }
.ns-review-side .ns-tabs { padding: 7px 10px 0; }
.ns-review-side .ns-fold { background: var(--paper); }
/* 검토판 [과제 현황] 탭 첫 줄 — 그 과제 이름(DEV-2026-0595, 과제 현황 곁판 머리와 같은 taskPaneTitle). */
.ns-side-task-title { margin: 0 0 10px; }

/* 하단 고정 업무 액션바 */
.ns-actbar {
  grid-row: 2; align-self: end;
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 9px 16px; background: var(--paper-2);
  border-top: 1px solid var(--rule-strong);
  position: sticky; bottom: 0;
}
.ns-actbar .ns-input { flex: 1; min-width: 180px; }
.ns-actbar-gate { font-size: var(--fs-sm); color: var(--no); }
.ns-card-wrap { display: grid; grid-template-rows: minmax(0, 1fr) auto; overflow: hidden; }
/* 카드가 판 바닥에서 떨어져 보인다 (사용자 2026-09-23 "카드 좀더 선명하게 보이게") —
   흰 카드가 흰 판 위에 있으면 경계가 1px 회색 선 하나뿐이었다. */
.ns-card-scroll { overflow: auto; background: var(--desk); padding: 12px; }
/* 테두리를 셸의 라벨 색(--ink-3)으로 올렸다 — 더 잘 보이는 색, 네 변 모두
   (사용자 2026-09-24 "카드들 색깔 잘보이는걸로 테두리 둘러줄래?", DEV-2026-0240). */
.ns-card-scroll > .ns-card {
  border-color: var(--ink-3); box-shadow: 0 1px 3px rgba(16, 20, 28, .10);
  margin-bottom: 0;
}

/* 검토 카드 상단 고정 — 과제명 · 대상 · 사유 (DEV-2026-0176) */
.ns-card-top {
  position: sticky; top: 0; z-index: 3; background: var(--paper);
  max-height: 46vh; overflow: auto;
  border-bottom: 1px solid var(--rule-strong);
}
.ns-subject-row { margin: 5px 0 2px; }
/* 대상이 둘 이상인 묶음 카드 — 종류별 수 접힘 · 펼치면 이름 목록(DEV-2026-0631). */
.ns-card-head:has(> .ns-subject-row > .ns-tgt-fold) { flex-wrap: wrap; }
.ns-subject-row:has(> .ns-tgt-fold) { flex: 1 1 100%; flex-wrap: nowrap; align-items: flex-start; }
.ns-subject-row > .ns-sec-label { flex: none; }
.ns-tgt-fold { flex: 1 1 auto; min-width: 0; margin: 0; }
.ns-tgt-list { margin: 0; padding: 0 0 0 18px; display: grid; gap: 3px; max-height: 260px; overflow: auto; }
.ns-tgt-list > li { min-width: 0; overflow-wrap: anywhere; }
.ns-item-tgts { min-width: 0; flex: 1 1 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* 근거와 영향은 이제 카드 본문의 한 절이다 — 안에서 따로 구르지 않는다. */
.ns-card-sec > .ns-pane-body, .ns-evidence-body { overflow: visible; padding: 0; }

/* 판정 결과(영수증) — 카드가 그 자리에서 결과로 접힌다 */
.ns-receipt {
  border: 1px solid var(--ok); border-radius: 3px;
  background: var(--paper-2); padding: 11px 13px; margin: 12px 16px;
}
.ns-receipt--no { border-color: var(--no); }
.ns-receipt--hold { border-color: var(--hold); }
.ns-receipt-head { font-weight: 700; margin-bottom: 6px; }

/* ---- 접이식 -------------------------------------------------------------- */
.ns-fold { border: 1px solid var(--rule); border-radius: 3px; margin-bottom: 9px; background: var(--paper); }
.ns-fold > summary {
  cursor: pointer; padding: 7px 11px; font-weight: 700; background: var(--paper-2);
  border-radius: 3px;
}
.ns-fold[open] > summary { border-bottom: 1px solid var(--rule); border-radius: 3px 3px 0 0; }
.ns-fold-body { padding: 11px; }

/* ---- 토스트 -------------------------------------------------------------- */
.ns-toast {
  position: fixed; right: 16px; bottom: 16px; z-index: 60;
  display: flex; flex-direction: column; gap: 6px; align-items: flex-end;
  pointer-events: none;
}
.ns-toast-item {
  background: var(--ink); color: #fff; border-radius: 3px; padding: 7px 12px;
  max-width: 420px; box-shadow: 0 2px 10px rgba(0, 0, 0, 0.25);
}
.ns-toast-item.is-err { background: var(--no); }
.ns-toast-item.is-ok { background: var(--ok); }

/* ---- 과제 찾기 창 (DEV-2026-0253) ------------------------------------------ */
.ns-modal-backdrop {
  position: fixed; inset: 0; z-index: 70; background: rgba(23, 26, 32, .45);
  display: flex; align-items: center; justify-content: center; padding: 24px;
}
.ns-modal {
  background: var(--paper); border-radius: 4px; width: min(480px, 100%);
  max-height: min(560px, 86vh); display: flex; flex-direction: column;
  overflow: hidden; box-shadow: 0 8px 28px rgba(0, 0, 0, .28);
}
/* 관련 문서 검색 결과 창 (DEV-2026-0274) — 서고 화면과 같은 폭·칸을 담을 만큼 넓다. */
.ns-modal.ns-modal--wide {
  width: min(960px, 96vw); max-height: min(720px, 92vh);
}
.ns-modal-head {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  padding: 11px 14px; border-bottom: 1px solid var(--rule); background: var(--paper-2);
  font-weight: 700;
}
.ns-modal-body { padding: 11px 14px; overflow: auto; }
.ns-modal-list { display: flex; flex-direction: column; gap: 4px; margin-top: 8px; }
.ns-modal-list button { text-align: left; }
/* 찾기 창의 과제 줄 — [화살] + [이름], 펼치면 줄 아래 연결 문서 (DEV-2026-0384). */
.ns-pick-row { display: flex; gap: 4px; align-items: stretch; }
.ns-pick-row .ns-pick-fold { flex: 0 0 auto; min-width: 28px; text-align: center; }
.ns-pick-row .ns-pick-name { flex: 1 1 auto; min-width: 0; }
.ns-pick-docs { display: flex; flex-direction: column; gap: 4px;
  margin: 0 0 4px 32px; padding: 6px 8px; border-left: 2px solid var(--rule); }
.ns-pick-doc { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; }
.ns-pick-doc-name { flex: 1 1 200px; min-width: 0; overflow-wrap: anywhere; }

/* ---- 좁은 화면 ----------------------------------------------------------- */
@media (max-width: 1180px) {
  #ns-root { grid-template-columns: 1fr; }
  /* 좁은 화면에서는 그림 줄을 접고 이름 줄만 가로로 편다 — 둘을 겹쳐 두면 줄이 두 겹이다. */
  .ns-rail { grid-template-columns: minmax(0, 1fr); border-right: none;
             border-bottom: 1px solid var(--rule-strong); }
  .ns-applist { display: none; }
  .ns-menu {
    flex-direction: row; overflow-x: auto; padding: 6px 8px;
  }
  .ns-rail-group { display: none; }
  .ns-nav { grid-template-columns: auto auto; white-space: nowrap; flex: none; }
  #ns-root { grid-template-rows: auto auto auto minmax(0, 1fr); }
  .ns-screen--panes3, .ns-screen--panes2, .ns-screen--panes2r {
    grid-template-columns: minmax(0, 1fr); grid-template-rows: 200px minmax(0, 1fr) auto;
  }
  /* 판 셋이 한 칸에 설 때 셋째 줄을 auto 로 두면 그 판의 내용 높이가 가운데 카드를
     1px 까지 눌러 버린다(실측 1100px, 0176 R6). 아래 둘이 남는 높이를 반씩 쓴다. */
  .ns-screen--panes3 { grid-template-rows: 180px minmax(0, 1fr) minmax(0, 1fr); }
  .ns-pane { border-right: none; border-bottom: 1px solid var(--rule-strong); }
}

@media (prefers-reduced-motion: reduce) {
  #ns-root * { transition: none !important; animation: none !important; }
}

/* ---- 과제 현황 (DEV-2026-0012) --------------------------------------------
 *
 * 옛 '자회사별' 탭은 한 자회사가 4,401px 한 줄이었다. 여기서는 판을 셋으로 나눠
 * **판단**(가운데)과 **탐색**(오른쪽)을 갈라 놓고, 각 판이 자기 스크롤을 갖는다.
 * 그래서 "한 자회사 화면" 의 높이는 가운데 판의 높이다.
 */
.ns-screen--panes3s { grid-template-columns: 232px minmax(0, 1fr) 380px; }

/* 판 안의 한 덩이 — 덩이 사이를 띄워 ①②③④ 가 눈으로 갈린다(밀도 낮추기) */
.ns-block {
  background: var(--paper); border: 1px solid var(--rule); border-radius: 4px;
  padding: 13px 15px; margin: 0 0 12px;
}
.ns-block .ns-h:first-child { margin-top: 0; }

/* 단계 분포 막대 — 숫자 넉 줄보다 "어디에 몰려 있나" 가 먼저 읽힌다 */
.ns-bar {
  display: flex; height: 7px; border-radius: 4px; overflow: hidden;
  background: var(--paper-2); border: 1px solid var(--rule); margin: 6px 0;
}
.ns-bar-seg { display: block; height: 100%; }

.ns-chips { display: flex; flex-wrap: wrap; gap: 7px; margin: 8px 0; }
.ns-chip {
  display: inline-flex; align-items: baseline; gap: 5px;
  border: 1px solid var(--rule); border-radius: 3px; background: var(--paper-2);
  padding: 3px 9px; font-size: var(--fs-md); color: var(--ink-2);
}
.ns-chip b { font-size: var(--fs-xl); color: var(--ink); font-weight: 700; }
.ns-chip--warn b { color: var(--no); }
.ns-chip--warm b { color: var(--hold); }
.ns-dot { display: inline-block; width: 8px; height: 8px; border-radius: 2px; }
/* 0 은 빨갛지 않다 — 없는 것이 값일 뿐이다(DEV-2026-0077). 같은 붉은 글씨가 넷이면
   어느 것이 진짜 큰 수인지 색이 말해 주지 못한다. */
.ns-chip.is-zero b, .ns-chip--warn.is-zero b, .ns-chip--warm.is-zero b { color: var(--ink-3); }
.ns-chip.is-zero { color: var(--ink-3); }
.ns-chip--proposal { font-size: var(--fs-xs); border-style: dashed; }
.ns-chip--proposal .ns-tag--stage { font-size: var(--fs-xs); }

/* ---- 진행 상태 — 막대가 곧 수다 (DEV-2026-0077) --------------------------- */
.ns-measure { margin: 9px 0 4px; }
.ns-measure-bar {
  display: flex; height: 30px; border-radius: 4px; overflow: hidden;
  background: var(--paper-2); border: 1px solid var(--rule);
}
.ns-measure-seg {
  display: flex; align-items: baseline; justify-content: flex-start; gap: 5px;
  height: 100%; min-width: 0; padding: 0 9px; overflow: hidden; white-space: nowrap;
  color: #fff; font-size: var(--fs-sm);
}
.ns-measure-seg b { font-size: var(--fs-lg); font-weight: 700; }
.ns-measure-seg--thin { padding: 0; }
.ns-measure-rest { display: flex; flex-wrap: wrap; gap: 4px 14px; margin-top: 6px; }
.ns-measure-chip {
  display: inline-flex; align-items: baseline; gap: 5px;
  font-size: var(--fs-sm); color: var(--ink-2);
}
.ns-measure-chip b { font-size: var(--fs-md); color: var(--ink); font-weight: 700; }
.ns-measure-chip.is-zero, .ns-measure-chip.is-zero b { color: var(--ink-3); font-weight: 400; }
.ns-measure-chip.is-zero .ns-dot { opacity: .35; }

.ns-h--with { display: flex; align-items: baseline; justify-content: space-between; gap: 12px; }
.ns-h-count { display: inline-flex; align-items: baseline; gap: 5px; font-weight: 400; color: var(--ink-3); font-size: var(--fs-sm); }
.ns-h-count b { font-size: var(--fs-2xl); color: var(--ink); font-weight: 700; }

/* ---- 늦은 과제 — 날수는 한 열, 길이는 자(尺) (DEV-2026-0077) -------------- */
/* 판의 첫 절이다: 사람이 판을 열자마자 눈이 닿는 자리라 테두리를 한 단 올린다. */
.ns-block--first { border-color: var(--rule-strong); }
/* 이름과 자(尺)가 **한 눈길 안**에 있어야 길이가 이름에 붙어 읽힌다 — 판이 1,660px 로
   넓어도 줄은 그만큼 늘어나지 않는다(막대가 이름에서 1,000px 떨어지면 남남이다). */
.ns-rows--late, .ns-rows--wait { margin-top: 10px; max-width: 1120px; }
.ns-laterow {
  appearance: none; text-align: left; width: 100%; cursor: pointer;
  display: grid; grid-template-columns: 88px minmax(0, 520px) minmax(60px, 260px);
  justify-content: start; align-items: center; gap: 0 16px;
  background: transparent; border: none; border-bottom: 1px solid var(--rule);
  border-left: 3px solid transparent; padding: 9px 8px; color: var(--ink);
}
.ns-laterow:hover { background: var(--paper-2); }
.ns-laterow.is-on { background: var(--accent-soft); border-left-color: var(--accent); }
.ns-laterow-day { display: flex; flex-direction: column; line-height: 1.05; }
.ns-laterow-day b {
  font-size: var(--fs-3xl); font-weight: 700; color: var(--no);
  font-variant-numeric: tabular-nums; letter-spacing: -0.02em;
}
.ns-laterow-unit { font-size: var(--fs-xs); color: var(--ink-3); }
.ns-laterow-body { min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.ns-laterow-name {
  font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  text-align: left;
}
.ns-laterow-meta {
  display: inline-flex; align-items: center; gap: 6px; flex-wrap: wrap;
  font-size: var(--fs-sm); color: var(--ink-2);
}
.ns-laterow-bar { display: block; height: 10px; border-radius: 2px; background: #f2e3e1; }
.ns-laterow-bar i { display: block; height: 100%; border-radius: 2px; background: var(--no); }

/* ---- 판단 대기 — 누를 것이 맨 앞 열 (DEV-2026-0077) ----------------------- */
.ns-waitrow {
  display: grid; grid-template-columns: 64px minmax(0, 1fr); align-items: center;
  gap: 0 14px; border-bottom: 1px solid var(--rule); padding: 9px 8px;
}
.ns-waitrow-go { width: 100%; text-align: center; }
.ns-waitrow-body { min-width: 0; display: flex; flex-direction: column; gap: 3px; }

/* ---- 되돌림 표시 — 단추의 왼쪽 모서리 (DEV-2026-0077) --------------------- */
.ns-act--back { border-left: 4px solid var(--ok); }
.ns-act--noback { border-left: 4px solid var(--no); }
.ns-keyline { display: flex; gap: 14px; margin: 2px 0 9px; }
.ns-keymark {
  display: inline-flex; align-items: center; gap: 6px;
  font-size: var(--fs-xs); color: var(--ink-3); padding-left: 7px;
}
.ns-warn { color: var(--no); }
.ns-warm { color: var(--hold); }

/* 과제 한 줄 — 표가 아니라 줄이다. 옛 과제 목록의 주관부서 열은 한 글자씩 세로로
   접혀 행 하나가 400px 가까이 됐다. 줄에는 접힐 열이 없다. */
.ns-rows { display: flex; flex-direction: column; margin: 7px 0 0; }
.ns-rowitem {
  appearance: none; text-align: left; width: 100%; cursor: pointer;
  display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 2px 10px;
  background: transparent; border: none; border-bottom: 1px solid var(--rule);
  border-left: 3px solid transparent; padding: 6px 8px; color: var(--ink);
}
.ns-rowitem:hover { background: var(--paper-2); }
.ns-rowitem.is-on { background: var(--accent-soft); border-left-color: var(--accent); }
.ns-rowitem--static { cursor: default; }
.ns-rowitem--static:hover { background: transparent; }
.ns-rowitem-name {
  font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  text-align: left;
}
.ns-rowitem-meta {
  display: inline-flex; align-items: center; gap: 6px; flex-wrap: wrap;
  font-size: var(--fs-sm); color: var(--ink-2); justify-self: end;
}
.ns-rowitem-org {
  grid-column: 1 / -1; font-size: var(--fs-sm); color: var(--ink-3);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}

/* 영역 머리 — 접었을 때 한 줄, 펼치면 그 영역 과제만 나온다 */
.ns-areahead {
  appearance: none; width: 100%; text-align: left; cursor: pointer;
  display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 2px 8px;
  background: var(--paper-2); border: 1px solid var(--rule); border-radius: 3px;
  padding: 6px 9px; margin: 6px 0 0; color: var(--ink);
}
.ns-areahead:hover { border-color: var(--accent); }
.ns-areahead.is-on { background: var(--accent-soft); border-color: #c6dcf6; }
.ns-areahead-name {
  font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ns-areahead-meta { display: inline-flex; align-items: center; gap: 7px; font-size: var(--fs-sm); }
.ns-areahead-meta b { font-size: var(--fs-base); }
.ns-areahead-caret { color: var(--ink-3); }
.ns-areahead .ns-bar { grid-column: 1 / -1; height: 5px; margin: 4px 0 0; }

/* ---- 층 — 영역 → 상위 과제 → 아래 (DEV-2026-0056) --------------------------
 *
 * 펼침 단추를 줄 **바깥**에 둔다: 줄 자체가 이미 단추(그 과제를 훑어본다)라 그 안에
 * 또 단추를 넣을 수 없다. 왼쪽 20px 칸이 그 자리고, 펼칠 것이 없는 상위는 같은 칸을
 * 비워 이름이 같은 세로선에 선다.
 */
.ns-toprow { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: stretch; }
.ns-foldbtn {
  appearance: none; cursor: pointer; background: transparent; border: none;
  border-bottom: 1px solid var(--rule); padding: 6px 0; color: var(--ink-3);
  font-size: var(--fs-sm); line-height: 1.3; text-align: center;
}
.ns-foldbtn:hover { color: var(--accent); }
.ns-foldbtn--none { cursor: default; color: var(--rule-strong); }
/* 하위 펼침(0730) — 줄 오른쪽 끝의 '▸ 하위 N' 하나. 줄을 누르면 과제 판, 이 단추만 아래를 편다. */
.ns-kidsbtn { padding: 6px 10px; white-space: nowrap; color: var(--ink-2); }
.ns-kidsbtn.is-on { color: var(--accent); }
.ns-kidsbtn:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
/* 번호 — 서버가 준 값(원문자 · 숫자)을 이름 앞에 세운다 */
.ns-no {
  font-style: normal; color: var(--ink-2); margin-right: 5px;
  font-variant-numeric: tabular-nums;
}
.ns-rowitem--top .ns-rowitem-name { font-weight: 700; }
.ns-rowitem--step .ns-rowitem-name { font-weight: 400; color: var(--ink-2); }
.ns-sub { margin: 0 0 6px 20px; border-left: 2px solid var(--rule); padding-left: 9px; }
.ns-sublabel { margin: 6px 0 0; font-size: var(--fs-sm); font-weight: 700; color: var(--ink-3); }
.ns-bar--roll { grid-column: 1 / -1; height: 4px; margin: 4px 0 0; }

.ns-item--sub { gap: 3px; padding: 9px 11px; }

@media (max-width: 1180px) {
  .ns-screen--panes3s {
    grid-template-columns: minmax(0, 1fr); grid-template-rows: 180px minmax(0, 1fr) auto;
  }
}

/* ---- 메뉴 접기 (사용자 룰링 2026-09-11 11:45) ------------------------------ */
.ns-railbtn {
  appearance: none; cursor: pointer; border: 1px solid var(--rule-strong); border-radius: 3px;
  background: var(--paper); color: var(--ink-2); padding: 2px 8px; line-height: 1.4;
}
.ns-railbtn:hover { border-color: var(--accent); color: var(--accent); }
#ns-root.is-rail-off { grid-template-columns: minmax(0, 1fr); }

/* ---- 한 화면에 한 가지 (사용자 룰링 2026-09-11 11:40) ---------------------
 *
 * 첫 렌더에 **내용 판은 하나**다. 자회사는 윗탭으로, 과제 찾기는 오른쪽 서랍으로
 * 물러난다(둘 다 사용자 룰링 11:45·11:47). 서랍을 열 때만 두 번째 칸이 생긴다.
 */
.ns-screen--drawer { grid-template-columns: minmax(0, 1fr) var(--side-w, 380px); }

.ns-tabs {
  display: flex; gap: 4px; flex-wrap: wrap; align-items: center;
  padding: 7px 12px; background: var(--paper); border-bottom: 1px solid var(--rule);
}
.ns-tab {
  appearance: none; cursor: pointer; display: inline-flex; align-items: baseline; gap: 6px;
  background: var(--paper-2); border: 1px solid var(--rule); border-radius: 3px 3px 0 0;
  border-bottom-color: transparent; padding: 5px 11px; color: var(--ink-2);
}
.ns-tab:hover { border-color: var(--rule-strong); color: var(--ink); }
.ns-tab.is-on {
  background: var(--accent-soft); border-color: #b7d2f1; color: #143a6b; font-weight: 700;
  box-shadow: inset 0 -2px 0 var(--accent);
}
.ns-tab-n { font-size: var(--fs-sm); font-variant-numeric: tabular-nums; }
.ns-tab-warn { font-size: var(--fs-sm); color: var(--no); }
.ns-tabs-spacer { flex: 1; }

/* 본문은 **판이 주는 폭을 다 쓴다** (사용자 2026-09-19 "가운데 본문을 최대한 넓힌다").
 *
 * 예전에는 여기서 1,040px 로 잘랐다 — 읽기 폭(한 줄이 너무 길면 눈이 다음 줄을 못 찾는다)
 * 때문이었다. 그런데 이 판에 실제로 서는 것은 표·막대·줄 목록이고, 그것들은 넓을수록 잘
 * 읽힌다(간트는 시간 칸이 넓어야 하고, 표는 칸이 접히지 않아야 한다). 읽기 폭이 필요한
 * 것은 **글**뿐이라 그 선은 글에만 남긴다(.ns-p 74ch · .ns-prose 78ch · 도움말 78ch).
 * 기각한 대안: ① 1,040 을 1,400 으로 올리기 — 1,920 창에서 여전히 오른쪽이 비고 그
 * 숫자가 어디서 왔는지 아무도 모른다 ② 본문을 가운데 정렬로 띄우기 — 양쪽에 같은 빈
 * 자리가 생겨 "왜 안 쓰나" 는 그대로다. */

/* ---- 자회사 줄 — 셸 전체의 문맥 (사용자 룰링 2026-09-11 12:00·12:03) ------ */
.ns-subbar {
  grid-column: 1 / -1;
  display: flex; align-items: center; gap: 5px; flex-wrap: wrap;
  padding: 6px 16px; background: var(--paper-2);
  border-bottom: 1px solid var(--rule-strong);
}
.ns-subbar-label { font-size: var(--fs-sm); color: var(--ink-3); margin-right: 3px; }
.ns-subchip {
  appearance: none; cursor: pointer; border-radius: 999px; padding: 3px 12px;
  background: var(--paper); border: 1px solid var(--rule-strong); color: var(--ink-2);
  white-space: nowrap;
}
.ns-subchip:hover { border-color: var(--accent); color: var(--accent); }
.ns-subchip.is-on {
  background: var(--accent); border-color: var(--accent); color: #fff; font-weight: 700;
}
.ns-rowitem--sub { padding: 9px 8px; }

/* ---- 사람이 하는 쓰기 — 액션 폼 (DEV-2026-0015) --------------------------- */
.ns-actform {
  border: 1px solid var(--accent);
  border-radius: 3px; background: var(--paper-2); padding: 11px 13px; margin: 8px 0 0;
}
.ns-actform .ns-row { margin-bottom: 6px; }
/* 할 수 있는 일 — 두 묶음 (DEV-2026-0064). '바로잡기' 는 사람이 값을 덮어쓰는 자리라
   테두리 색으로 위 묶음과 갈라 세운다(0176 R6: 왼쪽만 굵게 두지 않는다 — 묶음 이름이
   글자로 함께 선다). */
.ns-deeds { margin-top: 10px; }
.ns-deeds--fix {
  border: 1px solid var(--hold); background: var(--paper-2);
  border-radius: 3px; padding: 8px 11px;
}
.ns-nowval { font-size: var(--fs-sm); color: var(--ink-3); white-space: nowrap; margin-left: 2px; }
.ns-quotes { margin-top: 10px; }
.ns-hit {
  border: 1px solid var(--rule); border-radius: 3px; background: var(--paper);
  padding: 7px 9px; margin-bottom: 6px;
}
.ns-hit-where { font-size: var(--fs-sm); color: var(--ink-3); }

/* ---- 과제 현황의 두 판 · 일정 눈금 (DEV-2026-0017) ------------------------
 *
 * 사용자 룰링 2026-09-11 14:35·14:40 — 왼쪽은 진행 상태(찾기는 그 안의 접힌 자리),
 * 오른쪽은 고른 과제의 훑어보기다. '한 화면에 한 가지' 를 이 화면에 대해 사용자가
 * 직접 조정한 배치다.
 */
.ns-screen--peek { grid-template-columns: minmax(0, 1fr) var(--side-w, 460px); }
/* 고른 과제가 없으면 오른쪽 판을 두지 않는다 — 빈 판이 460px 를 잡고 있으면 왼쪽 표와
   간트가 그만큼 좁아진다(R3). 고르는 순간 열리고, 놓으면 그 폭이 본문으로 돌아간다. */
.ns-screen--peek.is-alone { grid-template-columns: minmax(0, 1fr); }

/* 마일스톤 마디의 펼친 몸 (DEV-2026-0128 카드 → 0405 추진경과 축의 마디) — 날짜 한 줄,
   버튼 한 줄, 고치는 중이면 폼. 이름·출처·상태는 마디 머리줄에 있다. */
.ns-tl-acts { display: flex; gap: 4px; flex-wrap: wrap; justify-content: flex-start; }
.ns-mscard-dates {
  display: flex; gap: 10px; margin-top: 2px; font-size: var(--fs-sm);
}
.ns-mscard .ns-tl-acts { margin-top: 6px; }
.ns-tl-add { margin-top: 8px; }
.ns-msedit { margin: 4px 0 10px; padding-left: 16px; border-left: 2px solid var(--rule); }

/* ---- 추진경과 타임라인 (DEV-2026-0405) ------------------------------------------
   왼쪽 32px 축 · 오른쪽 카드. 축 선의 색은 그 시점의 단계(--tl-band = --stage-*), 예정 구역은
   점선 · 흐림. 마디 모양: 기록·일정 = 원 + 아이콘, 단계 변경 = 단계 이름표, 마일스톤 = 마름모.
   색은 셸 토큰 안에서만 — 기록 accent · 일정 hold · 마일스톤 상태색(ok · no · accent). */
.ns-tln { list-style: none; margin: 0; padding: 0; }
.ns-tln-node, .ns-tln-today {
  display: grid; grid-template-columns: 32px minmax(0, 1fr); column-gap: 10px;
}
.ns-tln-rail { position: relative; display: flex; justify-content: center; align-items: flex-start; }
.ns-tln-rail::before {
  content: ""; position: absolute; top: 0; bottom: 0; left: 50%; width: 2px;
  transform: translateX(-1px); background: var(--tl-band, var(--rule-strong));
}
.ns-tln > li:first-child > .ns-tln-rail::before { top: 14px; }
.ns-tln > li:last-child > .ns-tln-rail::before { bottom: auto; height: 14px; }
.ns-tln-node.is-future > .ns-tln-rail::before {
  width: 0; background: none; border-left: 2px dashed var(--rule-strong);
}
.ns-tln-mark {
  position: relative; z-index: 1; box-sizing: border-box; margin-top: 3px;
  width: 22px; height: 22px; border-radius: 50%; display: grid; place-items: center;
  background: var(--paper); border: 2px solid currentColor; color: var(--ink-3);
}
.ns-tln-node.is-record .ns-tln-mark { color: var(--accent); }
.ns-tln-mark--stage {
  flex: none; width: auto; min-width: 30px; height: 18px; margin-top: 5px; padding: 0 4px;
  border-radius: 9px; border: 2px solid var(--paper); color: #fff;
  font-size: var(--fs-2xs); font-weight: 700; line-height: 14px; letter-spacing: .02em;
  box-shadow: 0 0 0 1px var(--rule-strong);
}
.ns-tln-mark--ms { border: 0; background: transparent; }
.ns-tln-gem {
  display: block; width: 11px; height: 11px; transform: rotate(45deg); border-radius: 2px;
  background: var(--ms-c, var(--accent)); border: 2px solid var(--paper);
  box-shadow: 0 0 0 1.5px var(--ms-c, var(--accent));
}
.ns-tln-node.is-done { --ms-c: var(--ok); }
.ns-tln-node.is-late { --ms-c: var(--no); }
.ns-tln-node.is-bound { --ms-c: var(--ink-3); }
.ns-tln-node.is-dropped { --ms-c: var(--rule-strong); }
.ns-tln-node.is-dropped .ns-tln-name { text-decoration: line-through; color: var(--ink-3); }
.ns-tln-node.is-future > .ns-tln-rail .ns-tln-mark,
.ns-tln-node.is-future > .ns-tln-card { opacity: .58; }
.ns-tln-node.is-future > .ns-tln-card[open] { opacity: 1; }

.ns-tln-today .ns-tln-mark {
  width: 10px; height: 10px; margin-top: 9px; border: 0; background: var(--gt-today);
  box-shadow: 0 0 0 3px var(--paper);
}
.ns-tln-today-word {
  padding: 5px 0; font-size: var(--fs-xs); font-weight: 650; color: var(--gt-today);
  font-variant-numeric: tabular-nums;
}

.ns-tln-card { min-width: 0; padding-bottom: 6px; }
.ns-tln-head {
  display: grid; grid-template-columns: auto minmax(0, 1fr) auto; gap: 1px 8px;
  align-items: baseline; padding: 5px 0 2px; cursor: pointer; list-style: none;
}
.ns-tln-head::-webkit-details-marker { display: none; }
.ns-tln-head::after { content: "▸"; color: var(--ink-3); grid-column: 3; grid-row: 1; }
.ns-tln-card[open] > .ns-tln-head::after { content: "▾"; }
.ns-tln-day { color: var(--ink); font-variant-numeric: tabular-nums; white-space: nowrap; }
.ns-tln-kind { font-size: var(--fs-xs); color: var(--ink-3); white-space: nowrap; }
.ns-tln-text {
  grid-column: 1 / -1; display: flex; flex-wrap: wrap; align-items: center; gap: 4px 6px;
  color: var(--ink); min-width: 0; overflow-wrap: anywhere;
}
.ns-tln-name { font-weight: 600; }
.ns-tln-arrow { color: var(--ink-3); }
.ns-tln-done { font-size: var(--fs-xs); color: var(--ink-3); white-space: nowrap; font-variant-numeric: tabular-nums; }
.ns-tln-body { padding: 4px 0 8px; font-size: var(--fs-sm); display: grid; gap: 6px; }
.ns-tln-why { margin: 0; }
/* 등록 마디의 접힌 효력일 미상 전이 줄(0671) */
.ns-tln-fold { display: grid; gap: 6px; padding-top: 6px; border-top: 1px solid var(--rule); min-width: 0; }
.ns-tln-fold .ns-item-meta { flex-wrap: wrap; }
.ns-eff-fail { margin: 4px 0 0; font-size: var(--fs-sm); color: var(--no); line-height: 1.45; overflow-wrap: anywhere; }
.ns-tln-body .ns-diff { margin: 0; }

.ns-tln-legend {
  display: flex; flex-wrap: wrap; align-items: center; gap: 4px 12px; margin: 2px 0 10px;
  font-size: var(--fs-xs); color: var(--ink-2);
}
.ns-tln-key { display: inline-flex; align-items: center; gap: 4px; white-space: nowrap; }
.ns-tln-key.is-record { color: var(--accent); }
.ns-tln-key.is-stage { color: var(--ink-2); }
.ns-tln-key > span { color: var(--ink-2); }
.ns-tln-key .ns-tln-gem { width: 8px; height: 8px; box-shadow: none; border: 0; }
.ns-tln-path { display: inline-flex; align-items: center; gap: 4px; margin-left: auto; }
/* 기한 넘김(DEV-2026-0599) — 넘긴 계획 종료 마일스톤 마디 머리 안의 줄들(10-core tlLateBox · 폰과 같은 이름). */
.ns-tln-node.is-overdue .ns-tln-mark--ms .ns-tln-gem { box-shadow: 0 0 0 1.5px var(--no), 0 0 0 4px #fdf4f3; }
.tl-late {
  grid-column: 1 / -1; display: grid; gap: 3px; margin: 4px 0 2px; padding: 6px 9px;
  border-left: 2px solid var(--no); background: #fdf4f3; border-radius: 0 4px 4px 0;
  font-size: var(--fs-sm); color: var(--ink); cursor: auto;
}
.tl-late-line { display: flex; flex-wrap: wrap; align-items: baseline; gap: 2px 8px; min-width: 0; overflow-wrap: anywhere; }
.tl-late-key { font-size: var(--fs-xs); color: var(--ink-3); white-space: nowrap; }
.tl-late-at { color: var(--ink-2); font-variant-numeric: tabular-nums; white-space: nowrap; }
.tl-late-days { color: var(--no); font-variant-numeric: tabular-nums; white-space: nowrap; }
.tl-late-said { min-width: 0; }

/* 사이드바에서 바로 하는 일 (DEV-2026-0073 ④) */

/* 이 과제는 왜 이 영역인가 (0073 ③) · 관련 문서 (0073 ②) */
.ns-arealinks { margin: 10px 0; }
.ns-doc { padding: 6px 0; border-top: 1px solid var(--rule); }
.ns-doc:first-child { border-top: 0; }
.ns-doc-head { display: flex; gap: 8px; align-items: baseline; justify-content: space-between; }
.ns-doc-name { font-weight: 600; overflow-wrap: anywhere; }
.ns-doc-link {
  display: flex; gap: 6px; align-items: baseline; flex-wrap: wrap;
  padding: 2px 0; font-size: var(--fs-md);
}
.ns-fold--tight > summary { font-size: var(--fs-md); }

@media (max-width: 1180px) {
  .ns-screen--peek {
    grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr) auto;
  }
}

/* ---- 현황 묻기 — 자기 창 (DEV-2026-0021 · 룰링 2026-09-14 17:05) ------------
 *
 * R1 은 오른쪽 서랍이었다. 사용자가 "새 창 띄워서 해" 라고 해서 **자기 화면**이 됐다:
 * 레일의 자리가 `?s=ask` 를 새 탭에 열고, 누른 창은 보던 자리에 그대로 남는다. 서랍
 * 시절의 세 칸 규칙은 쓰는 곳이 없어 지웠다 — 이 창은 한 칸이다.
 */
.ns-askbtn { margin-left: 4px; text-decoration: none; }

/* 자리 (DEV-2026-0137) — 왼쪽 이력 목록 + 가운데 세로 대화 + 아래 고정 입력창.
   좁아지면 이력이 위로 가고 대화가 그 아래에 선다(매니저 목록과 같은 규칙). */
.ns-screen--ask { grid-template-columns: 244px minmax(0, 1fr); }
.ns-ask-side { background: var(--paper); }
.ns-ask-side .ns-pane-head { justify-content: stretch; }
.ns-ask-fresh { width: 100%; }
.ns-ask-none { padding: 14px 10px; font-size: var(--fs-md); }
/* 대화 목록 줄 (DEV-2026-0436) — 고르는 단추 + 오른쪽 아래 [삭제]. [삭제] 는 줄에 손이 가면 보인다
   (키보드 포커스 · 확인 단계 · 고른 줄은 늘 보인다). */
.ns-ask-hrow { position: relative; border-radius: 6px; }
.ns-ask-hrow .ns-side-item { padding-right: 58px; }
.ns-ask-hacts { position: absolute; right: 6px; bottom: 5px; margin: 0; gap: 4px; }
.ns-ask-hdel { opacity: 0; }
.ns-ask-hrow:hover .ns-ask-hdel, .ns-ask-hrow:focus-within .ns-ask-hdel, .ns-ask-hrow.is-on .ns-ask-hdel { opacity: 1; }
.ns-ask-hrow:has(.ns-btn--no) .ns-ask-hacts { position: static; justify-content: flex-end; padding: 0 6px 6px; }
.ns-ask-hrow .ns-bulk-why { margin: 2px 9px 6px; font-size: var(--fs-sm); }
.ns-ask-hfail { margin: 4px 2px 8px; display: grid; gap: 6px; font-size: var(--fs-sm); }
.ns-ask-hfail .ns-btn { justify-self: start; }
/* 갈래 칩 · 묶음 줄 (DEV-2026-0754) — 칩은 머리 아래 한 줄(좁으면 꺾임), 묶음 줄은 그 자리로 가는 링크. */
.ns-ask-kinds { flex-wrap: wrap; gap: 4px; margin: 0; padding: 6px 8px 0; }
.ns-ask-kinds .ns-btn.is-on { border-color: var(--accent); background: var(--accent-soft); color: var(--accent); }
.ns-ask-grow .ns-side-item { padding-right: 9px; text-decoration: none; box-sizing: border-box; }
/* 자회사 묶음 (DEV-2026-0760) — 머리 '이름 N'(누르면 접고 펼침) · 카드 · 과제 묶음 줄 오른쪽 자회사 짧은 표지. */
.ns-ask-sub + .ns-ask-sub { margin-top: 4px; }
.ns-ask-subhead { appearance: none; width: 100%; display: grid; grid-template-columns: 12px minmax(0, 1fr) auto; gap: 6px;
  align-items: center; padding: 5px 9px; border: 0; border-radius: 6px; background: transparent; cursor: pointer;
  font-size: var(--fs-sm); font-weight: 700; color: var(--ink-2); text-align: left; }
.ns-ask-subhead:hover { background: var(--paper-2); }
.ns-ask-subcaret { color: var(--ink-3); }
.ns-ask-subname { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ns-ask-subn { color: var(--ink-3); font-weight: 500; }
.ns-ask-subtag { max-width: 84px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--fs-xs); }

.ns-ask {
  grid-template-rows: auto auto minmax(0, 1fr) auto;
}
.ns-ask-body { background: var(--desk); padding: 10px 12px; }
/* 자기 창이 됐으니 글줄이 화면 폭만큼 늘어지지 않게 읽는 폭을 잡는다. */
/* 챗봇만 읽기 폭을 남긴다 — 여기 서는 것은 표가 아니라 **대화 줄**이다(판단, R3). */
.ns-ask-body > * { max-width: 1080px; margin-left: auto; margin-right: auto; }
/* 대화 판(DEV-2026-0028, 사용자 룰링 2026-09-14 12:20) — 오간 말이 위에서 아래로 쌓인다:
   질문은 오른쪽 말풍선, 답은 왼쪽 넓은 자리. 입력칸은 판 아래 고정(.ns-ask-foot). */
/* 물음 셋 (DEV-2026-0077 R3) — 빈 대화 판에 "물어보세요" 라고 적는 대신 누르면 입력창에
   들어가는 물음을 놓는다. 자리는 입력창 **위**다(DEV-2026-0137) — 대화가 쌓인 뒤에도
   같은 물음을 쓴다. 한 줄에 옆으로 놓고 좁으면 접힌다. */
.ns-ask-starters { display: flex; flex-wrap: wrap; align-items: center;
                   gap: 6px; padding: 0 0 7px; }
.ns-ask-starter {
  appearance: none; cursor: pointer; text-align: left;
  background: var(--paper); border: 1px solid var(--rule); border-radius: 999px;
  padding: 7px 15px; font: inherit; font-size: var(--fs-sm); color: var(--ink-1);
}
.ns-ask-starter:hover:not(:disabled) { border-color: var(--accent); color: var(--accent); }
/* 잠긴 물음은 잠겨 보인다 — 아래 보내기 단추와 같은 꼴(0074). */
.ns-ask-starter:disabled { opacity: .55; cursor: not-allowed; }
.ns-ask-starter:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }

.ns-ask-turn { margin: 0 0 14px; }
.ns-ask-qrow { display: flex; justify-content: flex-end; }
.ns-ask-q {
  max-width: 86%; background: var(--accent-soft); border: 1px solid #c6dcf6;
  border-radius: 12px 12px 3px 12px; padding: 7px 11px;
}
.ns-ask-qtext { margin: 0; font-weight: 700; white-space: pre-line; }
.ns-ask-qmeta { margin-top: 3px; justify-content: flex-end; }
.ns-ask-a {
  margin: 8px 0 0; background: var(--paper); border: 1px solid var(--rule);
  border-radius: 3px 12px 12px 12px; padding: 10px 11px;
}
.ns-ask-whose {
  display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
  padding: 6px 12px; background: var(--paper-2); border-bottom: 1px solid var(--rule);
  font-size: var(--fs-md);
}
.ns-ask-wholabel { color: var(--ink-3); }
.ns-ask-who { max-width: 190px; font-size: var(--fs-md); padding: 2px 4px; }
.ns-ask-go { display: flex; flex-wrap: wrap; gap: 4px; }
.ns-ask-go .ns-btn { font-size: var(--fs-sm); padding: 1px 6px; }
.ns-ask-sources > summary { font-weight: 700; }
.ns-ask-sum { margin: 0 0 8px; font-size: var(--fs-lg); line-height: 1.5; white-space: pre-line; }
.ns-ask-list { margin: 0 0 8px 18px; padding: 0; }
.ns-ask-list li { margin: 2px 0; }
/* 값 줄(R3) — 라벨 · 값 · '출처 보기' 각주 단추. 단추를 누르면 출처 표의 그 행이 강조된다. */
.ns-ask-label { color: var(--ink-2); }
.ns-ask-src {
  margin-left: 6px; padding: 0 5px; font: inherit; font-size: var(--fs-sm); line-height: 16px;
  color: var(--accent); background: transparent; border: 1px solid #c6dcf6; border-radius: 999px;
  cursor: pointer; vertical-align: 1px;
}
.ns-ask-src:hover { background: var(--accent-soft); }
.ns-ask-src.is-on { background: var(--accent); border-color: var(--accent); color: #fff; }
.ns-ask-table tr.ns-ask-hit td { background: var(--accent-soft); box-shadow: inset 3px 0 0 var(--accent); }
.ns-ask-tablewrap { overflow-x: auto; margin: 0 0 8px; }
/* 계약이 정한 다섯 칸 + 이동 단추가 420px 서랍에 들어간다 — 좁히면 머리글이 한 글자씩
   세로로 접힌다(옛 보고판의 주관부서 열이 그랬다, AGENTS.md '바꿀 것'). 최소 너비를
   주고 가로로 넘긴다. */
.ns-ask-table { min-width: 560px; }
.ns-ask-table th { white-space: nowrap; }
.ns-ask-table td, .ns-ask-table th { font-size: var(--fs-sm); }
.ns-ask-table td.ns-wrap { white-space: normal; overflow-wrap: anywhere; }
/* DEV-2026-0394 body tables: header row + rows, horizontal scroll when narrow */
.ns-ask-gridwrap { max-width: 100%; }
/* 임시 글(ADR-044 D4) — 확정 전이라 흐리게 · 고를 수 없게(복사 대상 아님). */
.ns-ask-prov { margin: 0; color: var(--ink-3); opacity: .7; white-space: pre-line;
  user-select: none; -webkit-user-select: none; }
/* 대화 안의 초안 판(0409) — 검토판 일괄 판정 부품(ns-bulk-*)을 그대로 입는다. */
.ns-ask-plate { margin: 10px 0 0; padding: 10px 11px 0; border: 1px solid var(--rule); border-radius: 6px;
  background: var(--paper-2); display: flex; flex-direction: column; gap: 8px; }
.ns-ask-plate .ns-bulk-foot { margin: 0 -11px; justify-content: flex-start; border-radius: 0 0 6px 6px; }
.ns-ask-plate-line { margin: 0 0 10px; font-weight: 600; }
.ns-ask-plate .ns-facts { margin: 0; }
.ns-ask-plate-step + .ns-ask-plate-step { margin-top: 6px; }
.ns-ask-plate-quotes { margin: 0; padding: 0 0 0 16px; }
.ns-ask-plate-quotes li + li { margin-top: 3px; }
.ns-ask-plate-quotes > li.ns-ev { list-style: none; margin: 0 0 6px -16px; min-width: 0; overflow-wrap: anywhere; }
.ns-ask-plate > a.ns-btn { display: inline-block; width: auto; align-self: flex-start; margin: 0 0 10px; }
/* 카드 자리의 대화(DEV-2026-0639 · ADR-055) — 걸음 박스 안 작은 창 · 오른쪽 판의 대화 탭 · 말한 자리의 초안. */
.ns-talk-stepbtn { flex: none; }
.ns-talk-mini { margin: 2px 0 8px; padding: 8px 9px; border: 1px solid #c6dcf6; border-radius: 6px;
  background: var(--accent-soft); display: grid; gap: 6px; min-width: 0; }
.ns-talk-minihead { align-items: center; }
.ns-talk-minihead > .ns-btn { margin-left: auto; }
.ns-talk-minibody { max-height: 280px; overflow-y: auto; display: grid; gap: 6px; min-width: 0; }
.ns-talk-pane { display: flex; flex-direction: column; gap: 8px; }
.ns-talk-head { align-items: center; }
.ns-talk-turn { display: grid; gap: 4px; min-width: 0; }
.ns-talk-q { justify-self: end; max-width: 88%; background: var(--paper); border: 1px solid #c6dcf6;
  border-radius: 10px 10px 3px 10px; padding: 5px 9px; min-width: 0; overflow-wrap: anywhere; }
.ns-talk-q > .ns-muted { font-size: var(--fs-xs); }
.ns-talk-a { background: var(--paper); border: 1px solid var(--rule); border-radius: 3px 10px 10px 10px;
  padding: 7px 9px; min-width: 0; overflow-wrap: anywhere; }
.ns-talk-a:empty { display: none; }
.ns-talk-said { min-width: 0; }
.ns-talk-picks { display: grid; gap: 6px; margin: 6px 0 0; }
.ns-talk-pickq { margin: 0 0 4px; font-weight: 650; }
.ns-talk-opts { display: flex; flex-wrap: wrap; gap: 5px; }
.ns-talk-opt { display: grid; gap: 1px; text-align: left; white-space: normal; max-width: 100%; height: auto; }
.ns-talk-opt > .ns-muted { font-size: var(--fs-xs); font-weight: 400; }
.ns-talk-dline { margin: 6px 0 0; display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.ns-talk-fold > summary { font-weight: 650; }
.ns-talk-foot { display: grid; gap: 5px; }
.ns-talk-say { width: 100%; min-width: 0; resize: vertical; }
.ns-talk-draft { margin: 0 0 7px; padding: 7px 9px; border: 1px dashed var(--pv-chg); border-radius: 6px;
  background: var(--pv-chg-bg); display: grid; gap: 5px; min-width: 0; }
.ns-talk-card { margin: 0 0 10px; padding: 9px 11px; border: 1px solid var(--pv-chg); border-radius: 6px;
  background: var(--pv-chg-bg); display: grid; gap: 6px; min-width: 0; }
.ns-talk-draft .ns-facts, .ns-talk-card .ns-facts { margin: 0; }
.ns-talk-draft .ns-hi-diff { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 3px; font-size: var(--fs-sm); }
.ns-talk-draft .ns-hi-diff > li { display: flex; flex-wrap: wrap; gap: 2px 8px; align-items: baseline; min-width: 0; }
.ns-talk-draft .ns-hi-field { color: var(--ink-3); }
.ns-talk-draft .ns-hi-was { color: var(--ink-2); overflow-wrap: anywhere; text-decoration: line-through; min-width: 0; }
.ns-talk-draft .ns-hi-arrow { color: var(--ink-3); }
.ns-talk-draft .ns-hi-now { font-weight: 650; overflow-wrap: anywhere; min-width: 0; }
.ns-talk-dfoot { align-items: center; }
.ns-talk-adds { margin: 0; padding: 0; list-style: none; display: grid; gap: 3px; }
.ns-talk-adds > li { display: flex; flex-wrap: wrap; gap: 6px; align-items: baseline; }
.ns-step--drop { border-style: dashed; border-color: var(--pv-gone); background: var(--pv-gone-bg); }
.ns-ask-grid th { white-space: nowrap; background: var(--paper-2); }
.ns-ask-grid td, .ns-ask-grid th { font-size: var(--fs-sm); vertical-align: top; }
.ns-ask-grid td.ns-wrap { white-space: normal; overflow-wrap: anywhere; min-width: 4em; }
ol.ns-ask-list { margin-left: 22px; }
/* 답 본문의 굵은 글(0545) · 긴 줄은 칸 안에서 꺾는다. */
.ns-ask-answer strong { font-weight: 700; color: var(--ink); }
.ns-ask-answer p, .ns-ask-answer li { overflow-wrap: anywhere; }
.ns-ask-steps { margin: 6px 0 0 18px; padding: 0; font-size: var(--fs-md); color: var(--ink-2); }
.ns-ask-step-say { color: var(--ink-3); font-size: var(--fs-sm); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }
.ns-ask-folds { margin-top: 8px; }
.ns-ask-folds .ns-fold { margin-bottom: 6px; }
/* 자료 출처(0418) — 허브 trace 한 줄씩 · 표 · 발췌 접힘. */
.ns-ask-trace li + li { margin-top: 8px; }
.ns-ask-cond { margin-top: 2px; font-size: 12px; color: var(--ink-3); overflow-wrap: anywhere; }
.ns-ask-trace .ns-ask-tablewrap, .ns-ask-trace .ns-fold { margin: 6px 0 0; }
.ns-ask-quote { margin: 0; white-space: pre-wrap; overflow-wrap: anywhere; }
.ns-ask-progress { color: var(--ink-2); }
.ns-ask-foot {
  padding: 9px 12px; background: var(--paper-2); border-top: 1px solid var(--rule-strong);
}
/* 입력창도 대화와 같은 읽는 폭에 선다 — 대화 줄과 칸의 왼끝이 어긋나지 않는다(0137). */
.ns-ask-foot > * { max-width: 1080px; margin-left: auto; margin-right: auto; }
.ns-ask-draft { width: 100%; display: block; }

/* 좁은 창에서도 대화 목록은 왼쪽 칸이다 — 위 줄로 올리면 목록이 150px 띠가 된다(0478). */
@media (max-width: 1100px) {
  .ns-screen--ask { grid-template-columns: 200px minmax(0, 1fr); }
}


/* ---- 정의와 기록 — 목록 사이드바 + 본문 (DEV-2026-0031) ---------------------
 *
 * 강의 참조 화면의 3단을 그대로 받는다: 레일(앱 전환, 위 .ns-rail) → 목록 사이드바
 * (260px, **고르는 자리**라 내용 판이 아니다) → 본문(읽는 폭 920px). 첫 렌더에 사람이
 * 읽는 내용 판은 여전히 하나다(룰링 2026-09-11 11:40).
 */
.ns-screen--om { grid-template-columns: 260px minmax(0, 1fr); }
.ns-side { background: var(--paper); }
.ns-side-body { overflow: auto; padding: 6px 8px; }
.ns-side-item {
  appearance: none; width: 100%; text-align: left; cursor: pointer;
  display: grid; grid-template-columns: 18px minmax(0, 1fr) auto; gap: 8px;
  align-items: center; background: transparent; border: 1px solid transparent;
  border-radius: 6px; padding: 7px 9px; color: var(--ink);
}
.ns-side-item:hover { background: var(--paper-2); }
.ns-side-item.is-on { background: var(--accent-soft); border-color: #c6dcf6; }
.ns-side-mark { color: var(--ink-3); font-size: var(--fs-base); text-align: center; }
.ns-side-name {
  font-size: var(--fs-base); font-weight: 500; overflow: hidden;
  text-overflow: ellipsis; white-space: nowrap;
}
.ns-side-sub { grid-column: 2 / -1; font-size: var(--fs-sm); color: var(--ink-3); }
.ns-main-body { overflow: auto; padding: 22px 26px; background: var(--desk); }
/* 본문 고정 폭을 풀었다(R3) — 표가 창을 따라 늘어난다. 글의 읽기 폭은 .ns-p/.ns-prose. */
.ns-main-inner { max-width: none; }

/* 본문 머리 — 큰 이름 + 원래 이름 한 줄 (참조 화면의 detail-header) */
.ns-dhead { display: flex; align-items: flex-start; gap: 12px; margin-bottom: 18px; }
.ns-dhead-mark { font-size: var(--fs-4xl); line-height: 1.1; color: var(--ink-3); }
.ns-dhead-name { font-size: var(--fs-3xl); font-weight: 700; line-height: 1.25; }
.ns-dhead-sub { font-size: var(--fs-md); color: var(--ink-3); margin-top: 1px; }

/* 카드 — 참조 화면의 section-card. 머리에 이름과 수를 같이 둔다. */
.ns-card {
  background: var(--paper); border: 1px solid var(--rule); border-radius: 8px;
  margin-bottom: 16px; overflow: hidden;
}
.ns-card-head {
  display: flex; align-items: center; gap: 8px;
  padding: 11px 16px; border-bottom: 1px solid var(--rule); background: var(--paper-2);
}
.ns-card-title { font-size: var(--fs-base); font-weight: 700; }
.ns-card-n {
  font-variant-numeric: tabular-nums; font-size: var(--fs-sm); color: var(--ink-2);
  background: var(--paper); border: 1px solid var(--rule); border-radius: 999px;
  padding: 0 7px;
}
.ns-card-body { padding: 13px 16px; }
.ns-card-body--flush { padding: 0; }
.ns-card-body--flush .ns-table th:first-child,
.ns-card-body--flush .ns-table td:first-child { padding-left: 16px; }
.ns-card-body--flush .ns-table th:last-child,
.ns-card-body--flush .ns-table td:last-child { padding-right: 16px; }
.ns-cols { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); gap: 16px; }
.ns-cols > .ns-card { margin-bottom: 0; }
@media (max-width: 1180px) {
  .ns-screen--om { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(220px, 42vh) minmax(0, 1fr); }
  .ns-cols { grid-template-columns: minmax(0, 1fr); }
  .ns-main-body { padding: 14px 12px; }
}

/* 이어진 것 묶음 — 이름별로 묶고, 한 줄을 누르면 그 자료로 옮겨 간다 */
.ns-lgroup { margin-bottom: 12px; }
.ns-lgroup:last-child { margin-bottom: 0; }
.ns-lgroup-name {
  font-size: var(--fs-sm); color: var(--ink-3); display: flex; align-items: baseline; gap: 6px;
  padding-bottom: 3px; border-bottom: 1px solid var(--rule); margin-bottom: 3px;
}
.ns-lrow {
  appearance: none; width: 100%; text-align: left; cursor: pointer;
  display: flex; align-items: baseline; gap: 7px;
  background: transparent; border: none; border-radius: 4px;
  padding: 4px 6px; color: var(--accent);
}
.ns-lrow:hover { background: var(--accent-soft); }
.ns-lrow-arrow { color: var(--ink-3); }
.ns-lrow-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ns-lrow-id { color: var(--ink-3); font-size: var(--fs-sm); white-space: nowrap; }

/* 0501 — 정의 표: 좁은 칸의 낱말이 쪼개지지 않게, 칸 이름 꼬리표는 이름과 띄운다. */
.ns-screen--om .ns-table th { white-space: nowrap; }
.ns-screen--om .ns-table td { word-break: keep-all; }
.ns-om-props td:nth-child(n+2), .ns-om-params td:nth-child(2), .ns-om-params td:nth-child(3) {
  white-space: nowrap; }
.ns-om-props td > b + .ns-tag, .ns-om-props td > .ns-tag + .ns-tag { margin-left: 6px; }

/* 지나온 자리 — 옮겨 다닌 길이 쌓인다 */
.ns-crumbs {
  display: flex; flex-wrap: wrap; align-items: center; gap: 3px;
  padding: 6px 12px; background: var(--paper-2); border-bottom: 1px solid var(--rule);
  font-size: var(--fs-sm);
}
.ns-crumb {
  appearance: none; cursor: pointer; background: transparent; border: none;
  color: var(--accent); padding: 1px 4px; border-radius: 3px;
}
.ns-crumb:hover { background: var(--accent-soft); }
.ns-crumb.is-on { color: var(--ink); font-weight: 700; cursor: default; }
.ns-crumb-sep { color: var(--ink-3); }

/* ---- 그림 (마디와 선) ------------------------------------------------------
 *
 * 선은 **선언된 링크**만 긋는다 — 타입 그림은 `/api/ontology/links` 가 말한 것,
 * 자료 그림은 `…/links/{이름}` 이 돌려준 것. 그 밖의 어떤 연결도 그리지 않는다
 * (ADR-013 D5 · 사용자 룰링 "연결 안 된 것은 따라가지 않는다").
 */
.ns-graph { background: var(--paper); border: 1px solid var(--rule); border-radius: 8px; }
.ns-graph svg { display: block; width: 100%; height: auto; }
.ns-gedge { stroke: var(--rule-strong); stroke-width: 1.2; fill: none; }
.ns-gedge.is-wide { stroke: #c9b6e4; stroke-dasharray: 4 3; }
.ns-gedge.is-on { stroke: var(--accent); stroke-width: 2.2; }
.ns-gnode { cursor: pointer; }
.ns-gnode circle {
  fill: var(--paper); stroke: var(--rule-strong); stroke-width: 1.4;
}
.ns-gnode:hover circle { stroke: var(--accent); }
.ns-gnode.is-on circle { fill: var(--accent-soft); stroke: var(--accent); stroke-width: 2.4; }
.ns-gnode.is-hub circle { fill: #fdf3e3; stroke: #d7ae5c; stroke-width: 2.4; }
.ns-gnode text { font-size: var(--fs-xs); fill: var(--ink); text-anchor: middle; }
.ns-gnode .ns-gnode-n { font-size: var(--fs-2xs); fill: var(--ink-3); }
.ns-glabel { font-size: var(--fs-2xs); fill: var(--ink-3); text-anchor: middle; }
.ns-glegend { display: flex; flex-wrap: wrap; gap: 12px; align-items: center;
              font-size: var(--fs-sm); color: var(--ink-2); margin: 8px 0 0; }
.ns-gswatch { display: inline-block; width: 22px; height: 0; border-top: 2px solid var(--rule-strong);
              vertical-align: middle; margin-right: 5px; }
.ns-gswatch--wide { border-top: 2px dashed #c9b6e4; }

/* ---- 링크 종류의 색 (DEV-2026-0123) --------------------------------------
 *
 * 자료 그림의 선은 색을 **인라인으로** 받는다 — 색이 서버가 선언한 링크
 * 목록의 차례에서 나오므로(85-graph.js GR_HUES) 스타일표가 종류마다 규칙을
 * 가지지 않는다. 여기서는 굵기·끝맜·흐림만 정한다.
 */
.ns-gedge--kind { stroke-width: 1.7; stroke-linecap: round; opacity: .78; }
.ns-gedge--kind:hover { opacity: 1; stroke-width: 2.6; }
.ns-gnode.is-lone { opacity: .28; }

/* 선 이름표 — 선을 따라 기울여 선 옆에 눕는다(0123 R2). 종이 테두리가 선을 끊어
   글자가 선 위에서도 읽힌다. 마우스는 선으로 통과시킨다. */
.ns-gelabel { font-size: var(--fs-2xs); text-anchor: middle; pointer-events: none;
  paint-order: stroke fill; stroke: var(--paper); stroke-width: 3.2px;
  stroke-linejoin: round; }

/* 마디 이름은 선 위에 선다 — 종이 색 테두리가 가리는 선을 끊어 준다. */
.ns-gnode text { paint-order: stroke fill; stroke: var(--paper); stroke-width: 3px;
  stroke-linejoin: round; }

.ns-gkinds { display: flex; flex-wrap: wrap; gap: 6px 8px; align-items: center;
  margin: 0 0 8px; }
.ns-gkind { display: inline-flex; align-items: center; gap: 7px; cursor: pointer;
  border: 1px solid var(--rule); border-radius: 999px; background: var(--paper);
  padding: 3px 10px 3px 8px; font: inherit; font-size: var(--fs-sm); color: var(--ink); }
.ns-gkind:hover { border-color: var(--rule-strong); background: var(--paper-2); }
.ns-gkind:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.ns-gkind-sw { display: inline-block; width: 20px; height: 0; border-top-width: 2.5px;
  flex: none; }
.ns-gkind-n { color: var(--ink-3); font-size: var(--fs-xs);
  font-variant-numeric: tabular-nums; }
.ns-gkind.is-off { background: var(--paper-2); color: var(--ink-3); }
.ns-gkind.is-off .ns-gkind-sw { opacity: .3; }
.ns-gkind.is-off .ns-gkind-name { text-decoration: line-through; }
.ns-lgroup-name .ns-gkind-sw { margin-right: 7px; vertical-align: middle; }

/* ---- 종류 그래프의 층 (DEV-2026-0138) ------------------------------------
 *
 * 띠는 배경 하나로만 말한다(2% 잉크) — 마디 상자가 그 위에 서야 하므로 띠가 색을
 * 더 쓰면 위계가 뒤집힌다. 선은 마디보다 먼저 그려져 상자 뒤로 지나간다.
 */
.ns-tgband { fill: rgba(45, 49, 66, .028); stroke: var(--rule); stroke-width: .8; }
.ns-tgband-name { font-size: var(--fs-xs); fill: var(--ink-3); letter-spacing: .06em; }
.ns-tgband-n { font-size: var(--fs-2xs); fill: var(--ink-3); text-anchor: end;
  font-variant-numeric: tabular-nums; }
.ns-tgedge { fill: none; stroke-width: 1.5; stroke-linecap: round;
  stroke-linejoin: round; opacity: .8; }
.ns-tgedge:hover { opacity: 1; stroke-width: 2.6; }
.ns-tgedge.is-on { opacity: 1; stroke-width: 2.8; }
.ns-tgnode { cursor: pointer; }
.ns-tgnode rect { fill: var(--paper); stroke: var(--rule-strong); stroke-width: 1.1; }
.ns-tgnode:hover rect { stroke: var(--accent); }
.ns-tgnode:focus-visible rect { stroke: var(--accent); stroke-width: 2.2; }
.ns-tgnode.is-on rect { fill: var(--accent-soft); stroke: var(--accent); stroke-width: 2.2; }
.ns-tgnode-name { font-size: var(--fs-sm); fill: var(--ink); font-weight: 600; }
.ns-tgnode-n { font-size: var(--fs-xs); fill: var(--ink-2);
  font-variant-numeric: tabular-nums; }
.ns-tgnode-k { font-size: var(--fs-2xs); fill: var(--ink-3); text-anchor: end; }
.ns-tgelabel { font-size: var(--fs-2xs); text-anchor: middle; pointer-events: none;
  paint-order: stroke fill; stroke: var(--paper); stroke-width: 3.2px;
  stroke-linejoin: round; }

/* 적어 넣는 자리 미리보기 — 눌러 볼 수는 있어도 보내는 자리가 없다(1단계는 조회) */
.ns-peek-field { margin-bottom: 11px; }
.ns-peek-label { font-size: var(--fs-sm); color: var(--ink-3); display: block; margin-bottom: 3px; }
.ns-peek-need { color: var(--no); }
.ns-peek-note {
  background: #fdf3e3; border: 1px solid #e8cf9f; border-radius: 4px;
  padding: 7px 10px; margin: 0 0 12px; color: #7a5200; font-size: var(--fs-md);
}


/* ---- 과제 일정 — 영역별 간트 (DEV-2026-0058) -------------------------------
 *
 * 한 좌표계다: 줄은 `var(--gt-lab) | 1fr` 두 칸이고, 눈금 선·오늘 선은 그 오른쪽 칸과
 * 똑같은 자리에 얹은 **한 겹**(.ns-gt-grid)이다. 줄마다 선을 그리지 않으므로 줄 사이에서
 * 끊기지 않고, 줄이 수백이어도 선은 눈금 수만큼만 있다.
 */
.ns-gt-body { padding: 0; }
.ns-gt { position: relative; min-width: 560px; }
/* 과제 현황 안에 들어오면(R3) 왼쪽 판만큼만 쓴다 — 이름 칸을 줄여 시간 칸을 남긴다.
   좌표계는 그대로 하나다: 눈금 겹도 줄도 이 변수를 읽는 같은 상자 안에 있다.

   가로 (사용자 2026-09-17 "좀 옆으로 길어야 할 거 같아"): 판에 맞춰 줄이지 않고 **시간 칸에
   최소 폭을 준다.** 과제 현황은 오른쪽 과제 판(460px)과 나란히 서는 자리라 남는 폭이
   실측 691px 였고(2026-09-17, 창 1440), 2년 가까운 기간을 그 안에 접으면 막대가 뭉친다.
   좁은 판에서는 서랍 안에서 좌우로 밀리고(그 상자가 overflow: auto 다), 이름 칸은 sticky 로
   왼쪽에 붙어 밀려나도 사라지지 않는다 — 그래도 막대 자신이 이름을 달고 있다(②). */
/* 과제 이름 열은 없다(R3) — 왼쪽은 영역 병합 칸 하나뿐이고 나머지가 전부 시간 칸이다. */
.ns-gt--inset { --gt-area: 224px; min-width: var(--gt-min); max-width: var(--gt-max); }
.ns-fold--gt .ns-fold-body { --gt-min: 1052px; --gt-max: 1332px; padding: 0; }
/* 미는 것은 **그림뿐**이다 — 무엇을 그리고 있는지 적은 머리글과 이름표까지 같이 밀리면
   민 사람은 그림만 남은 판을 보게 된다. 그래서 스크롤 상자는 그림만 감싼다. */
/* 높이 상한은 **화면에 비례한다** (DEV-2026-0085). 일정이 판의 맨 위로 오면서
   이 상자가 첫 화면을 얼마나 먹느냐가 아래 두 절(늦음 · 판단 대기)의 자리를 정한다.
   고정 560px 이면 1080 에서 아래 절이 화면 밖으로 밀리고 768 에서는 일정만 남는다.
   34vh 는 1080 에서 두 절이, 768 에서 늦음 절이 통째로 남는 값이다(실측). */
.ns-gt-scroll { overflow: auto; max-height: min(560px, 34vh); }
/* 과제 일정 머리의 [새 창] (DEV-2026-0383) — 제목 줄 오른쪽 끝. */
.ns-fold > summary.ns-gt-foldhead { display: flex; align-items: center; gap: 8px; }
.ns-gt-views { display: inline-flex; gap: 6px; margin-left: auto; font-weight: 400; }
.ns-gt-views a.ns-btn { text-decoration: none; color: inherit; }
/* 단독 창 — 판 하나가 창을 다 쓴다. 그림 상자는 높이 상한 없이 남는 높이를 쓰고,
   시간 칸은 창 폭을 따른다(최소 폭만 남긴다). */
#ns-root.is-gantt-alone { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr); }
.ns-gt-alonescreen { grid-template-columns: minmax(0, 1fr); }
.ns-gt-alone { border-right: none; }
.ns-gt-alonebody { --gt-min: 900px; --gt-max: none; display: flex; flex-direction: column;
                   min-height: 0; overflow: hidden; }
.ns-gt-alonebody > .ns-gt-scroll { flex: 1 1 auto; max-height: none; min-height: 0; }
.ns-gt-alonebody .ns-gt--inset { max-width: none; }
.ns-gt-stamp { font-size: var(--fs-sm); color: var(--ink-3); }
.ns-gt-note { display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
              padding: 7px 10px; border-bottom: 1px solid var(--rule); }
.ns-gt-scope { font-size: var(--fs-sm); font-weight: 700; }
.ns-gt-grid { position: absolute; left: var(--gt-area);
              right: 0; top: 0; bottom: 0;
              pointer-events: none; z-index: 0; }
.ns-gt-gridline { position: absolute; top: 0; bottom: 0; width: 1px; background: var(--gt-grid); }
.ns-gt-gridline.is-year { background: var(--rule-strong); }
.ns-gt-past { position: absolute; left: 0; top: 0; bottom: 0; background: var(--gt-past); }
.ns-gt-today { position: absolute; top: 0; bottom: 0; width: 2px; margin-left: -1px;
               background: var(--gt-today); }

.ns-gt-row { display: grid; grid-template-columns: minmax(0, 1fr);
             border-bottom: 1px solid var(--rule); position: relative; z-index: 1; }
/* 영역 열 밖에 서는 줄(눈금자 · 자회사) — 빈 칸 한 칸을 앞에 둬 시간 칸을 맞춘다. */
.ns-gt-row--wide { grid-template-columns: var(--gt-area) minmax(0, 1fr); }

/* 영역 = 세로 병합 칸 (DEV-2026-0074). 왼쪽 칸 하나 + 오른쪽 줄 묶음 하나가 한 그리드
   줄에 서므로 왼쪽이 오른쪽 높이만큼 늘어난다 — 줄 수를 세어 적지 않는다. */
/* 영역 그룹 사이는 **굵은 선**이다 (사용자 2026-09-21). 줄 사이 실선과 그룹 사이 선이
   같은 굵기면 어디서 한 영역이 끝났는지 눈이 못 세고, 영역 칸의 세로 병합만으로는
   훑는 동안 경계가 흐려진다. 선은 그룹마다 **아래**에 한 줄 — 첫 그룹의 위는 눈금자
   줄의 굵은 선이 맡는다. 접혔든 펴졌든 같은 자리에 같은 굵기다. */
.ns-gt-areagroup { display: grid; grid-template-columns: var(--gt-area) minmax(0, 1fr);
                   position: relative; z-index: 1; align-items: stretch;
                   border-bottom: 2px solid var(--rule-strong); }
/* 그룹의 마지막 줄까지 제 실선을 그으면 굵은 선 위에 가는 선이 겹쳐 세 겹이 된다. */
.ns-gt-areagroup > .ns-gt-arearows > .ns-gt-row:last-child { border-bottom: 0; }
.ns-gt-areagroup > .ns-gt-areacell { border-bottom: 0; }
.ns-gt-arearows { min-width: 0; }
/* 칸은 높이를 **요구하지 않는다** — 그 영역 줄들이 높이를 정하고 칸은 거기 맞춰 늘어난다
   (글자는 안쪽 겹에 떠 있다). 그래서 과제 한 개짜리 영역도 칸 높이 = 줄 높이다. */
.ns-gt-areacell { background: var(--paper-2);
                  border-right: 1px solid var(--rule-strong);
                  border-bottom: 1px solid var(--rule);
                  position: sticky; left: 0; z-index: 3; overflow: hidden;
                  min-height: 0; }
/* 글자 겹은 **손을 받지 않는다** — 칸을 덮은 단추(.ns-gt-areahit)가 아래에서 누름을
   받으므로, 이름 위든 셈 위든 빈 자리든 같은 일이 일어난다. 칸이 하는 일은 접기 하나라
   예외가 없다(0110 R5).
   이름과 셈은 **한 줄**에 선다 (사용자 2026-09-21). 위아래로 놓으면 과제 한 개짜리
   영역에서 두 줄이 한 줄 높이(27px)에 갇혀 셈이 잘린다 — 열을 넓혀 옆으로 세우면 접혔든
   펴졌든 같은 배치가 되고, 긴 이름만 말줄임으로 물러난다. */
.ns-gt-areacell-in { position: absolute; inset: 0; z-index: 1; display: flex;
                     flex-direction: row; align-items: center; pointer-events: none;
                     gap: 8px; justify-content: flex-start; padding: 4px 8px;
                     overflow: hidden; }
.ns-gt-areahit { position: absolute; inset: 0; z-index: 0; border: 0; background: none;
                 padding: 0; margin: 0; width: 100%; cursor: pointer; }
.ns-gt-areahit:hover { background: var(--accent-soft); }
.ns-gt-areahit:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
.ns-gt-areacell.is-blank { background: var(--paper); border-bottom: 0; }
.ns-gt-row--group .ns-gt-areacell.is-blank { background: var(--paper-2); }
/* 꺾쇠와 이름은 **같은 일의 표지**다 — 둘 다 접기이고(칸 전체가 그렇다), 꺾쇠는 지금
   접혔는지 폈는지를 말한다. 자회사 줄의 꺾쇠와 같은 모양이라 같은 일이 보인다(0110). */
.ns-gt-areahead { display: flex; align-items: center; gap: 4px; min-width: 0;
                  flex: 0 1 auto; }
.ns-gt-areacaret { flex: none; font: inherit; line-height: 1.3; width: 12px;
                   color: var(--ink-3); }
/* 접힌 영역은 **판을 가로지르는 한 줄**이다 (사용자 2026-09-21 "병합된 탭처럼 한 줄로
   길게"). 접혔는데도 왼쪽 132px 칸만 차지하면 오른쪽 시간 칸이 빈 채 남아, 접힌 영역이
   '내용이 사라진 표' 로 읽힌다. 열을 하나로 접어 칸이 판 끝까지 뻗으면 그 자체가 한 줄이
   되고 — 과제 줄은 하나도 없다 — 다음 영역이 바로 아래에 붙는다. */
.ns-gt-areagroup.is-shut { grid-template-columns: minmax(0, 1fr); }
.ns-gt-areagroup.is-shut > .ns-gt-arearows { display: none; }
/* 오른쪽에 칸이 없으니 칸을 가르던 세로 선도 없다. */
.ns-gt-areacell.is-shut { border-right: 0; }
/* 접힌 영역은 줄을 하나도 내지 않으므로 칸이 제 글자만큼만 선다 — 겹으로 띄운 글자가
   자리를 못 잡게 되니 이때만 흐름 안으로 되돌린다. 배치는 편 자리와 같다: 이름과 셈이
   한 줄에 좌우로 서고, 셈은 이름 바로 옆에 붙는다 — 오른쪽 끝으로 보내면 판이 좁을 때
   (시간 칸이 판보다 넓다) 옆으로 밀어야만 보인다. */
.ns-gt-areacell.is-shut .ns-gt-areacell-in { position: relative; inset: auto;
                     padding: 5px 10px; }
/* 접힌 줄의 이름은 잘려 말줄임이 되지 않는다 — 한 줄이 판만큼 길어 자리가 남는다. */
.ns-gt-areacell.is-shut .ns-gt-areaname { text-overflow: clip; }
/* 편 자리의 이름은 열 폭을 넘으면 말줄임으로 물러난다 — 셈은 잘리지 않는다. */
.ns-gt-areaname { text-align: left; font: inherit; font-weight: 700; color: var(--ink);
                  line-height: 1.3; min-width: 0;
                  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ns-gt-areameta { display: flex; align-items: center; flex-wrap: nowrap; flex: none;
                  gap: 6px; font-size: var(--fs-xs); color: var(--ink-3); }
/* 왼쪽 열을 훑는 것만으로 **어느 영역이 늦었나** 가 보여야 한다 (DEV-2026-0077) —
   그 수는 다른 수와 같은 회색이 아니다. */
.ns-gt-areameta .ns-warn { font-size: var(--fs-sm); font-weight: 700; }
/* 계획 일자가 없는 줄은 일정이 아니라 **빈자리**다 — 줄 높이는 그대로 두고(영역 병합
   칸의 높이가 줄 높이 × 줄 수라 건드리면 칸이 어긋난다, 0074) 바탕만 물린다. */
.ns-gt-row--nodate { background: repeating-linear-gradient(135deg,
                       rgba(126, 135, 148, .05) 0 6px, transparent 6px 12px); }
/* 이름 칸은 영역 열 오른쪽에 붙어 선다 — 좌우로 밀어도 두 칸이 겹치지 않는다. */
.ns-gt-row--wide .ns-gt-lab { left: 0; z-index: 2; }
.ns-gt-row--group { background: var(--paper-2); }
.ns-gt-row--task:hover { background: rgba(31, 90, 168, .045); }
.ns-gt-row--ruler { position: sticky; top: 0; z-index: 3; background: var(--paper);
                    border-bottom: 1px solid var(--rule-strong); }

/* 좌우로 밀어도 이름 칸은 왼쪽에 붙어 있는다 — 밀린 자리에서 "이게 누구 줄인지" 를
   잃지 않게. 바탕이 비치면 막대가 글자 밑으로 지나가므로 칸마다 제 바탕을 깐다. */
.ns-gt-lab { display: flex; align-items: center; gap: 6px; text-align: left;
             padding: 4px 8px; background: var(--paper); border: 0;
             border-right: 1px solid var(--rule); overflow: hidden;
             position: sticky; left: 0; z-index: 2; }
.ns-gt-row--group .ns-gt-lab { background: var(--paper-2); }
.ns-gt-lab--group { font-weight: 700; cursor: pointer; }
.ns-gt-lab--group.is-deep { padding-left: 22px; font-weight: 600; }
.ns-gt-lab--group:hover { color: var(--accent); }
.ns-gt-lab--task { padding-left: 30px; cursor: pointer; color: var(--ink); }
.ns-gt-lab--task.is-faint { color: var(--ink-2); }
.ns-gt-lab--task:hover { color: var(--accent); }
.ns-gt-lab--task.is-on { background: var(--accent-soft); }
/* 눈금자 줄의 왼쪽 칸은 **빈 칸**이다 — 영역 열 맨 위라 글자를 적으면 영역의 기간으로
   읽힌다(0110). 자리만 지킨다. */
.ns-gt-lab--ruler { background: var(--paper); }
.ns-gt-labname { overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
                 flex: 1 1 auto; min-width: 0; }
/* 늦음 일수는 이름을 밀어내지 않고 한 줄로 남는다 — 접히면 줄 높이가 두 배가 된다 */
.ns-gt-lab--task .ns-num { flex: none; white-space: nowrap; }
.ns-gt-labn { margin-left: auto; color: var(--ink-3); font-size: var(--fs-sm); }
.ns-gt-caret { color: var(--ink-3); width: 10px; flex: none; }
.ns-gt-only { flex: none; border: 1px solid var(--rule-strong); background: var(--paper);
              border-radius: 3px; font-size: var(--fs-xs); padding: 1px 5px; color: var(--ink-2);
              cursor: pointer; }
.ns-gt-only:hover { border-color: var(--accent); color: var(--accent); }

/* 줄과 막대 (사용자 2026-09-19 "막대 높이를 키워 과제 이름이 막대 안에") — 이름이
   막대 안에 사는 순간 막대는 **글자를 담는 그릇**이 되므로 글자가 설 만큼 두꺼워야
   한다: 15px 글자 + 위아래 숨 = 24px, 줄은 그보다 10px 여유. 실측 2026-09-19 이 회사의
   가장 짧은 막대가 1366 폭에서 363px 라 네 글자 문턱(6%)에 걸리는 막대가 없다. */
.ns-gt-track { position: relative; min-height: 36px; }
.ns-gt-row--ruler .ns-gt-track { min-height: 46px; }
.ns-gt-bar { position: absolute; top: 6px; height: 24px; border: 0; border-radius: 2px;
             padding: 0; cursor: pointer; }
.ns-gt-bar:hover { box-shadow: 0 0 0 2px var(--accent); }
.ns-gt-bar.is-on { box-shadow: 0 0 0 2px var(--accent); }
/* 뒤로 옮긴 마감 — 처음 계획 막대에서 이어지는 점선 연장이라 어느 쪽이 원래인지 읽힌다 */
.ns-gt-moved { position: absolute; top: 6px; height: 24px; border: 1px dashed var(--ink-2);
               border-left: 0; border-radius: 0 2px 2px 0; background: rgba(84, 92, 104, .08); }
/* 끝나지 않고 넘긴 기간 — 빗금은 "계획에 없던 시간" 이라는 뜻이다 */
.ns-gt-over { position: absolute; top: 5px; height: 26px; border-radius: 0 2px 2px 0;
              background: repeating-linear-gradient(45deg,
                rgba(192, 57, 43, .55) 0 3px, rgba(192, 57, 43, .12) 3px 6px); }
/* 상위가 제 날짜를 갖지 않아 아래에서 기간을 빌려 온 줄 — 빌렸다는 것이 보이게 테두리만 */
.ns-gt-bar.is-borrowed { opacity: .7; outline: 1px dashed var(--ink-2); outline-offset: 1px; }
/* 아래 과제가 이 줄의 기간 밖으로 나간 만큼 — 상위 막대를 늘려 덮지 않고 따로 그린다 */
.ns-gt-outside { position: absolute; top: 13px; height: 10px; border-radius: 2px;
                 background: repeating-linear-gradient(90deg,
                   var(--ink-2) 0 4px, transparent 4px 8px); }
/* 막대의 이름표(DEV-2026-0072) — 자리는 JS 가 백분율로 정하고(ganttBarName), 여기서는
   생김새만 맡는다. 상자는 판 끝까지 뻗어 있는 빈 칸이라 마우스를 받지 않고(막대를
   누르는 길도 모두 살아 있다), **글자 그 자리만** 누르면 과제가 골라진다(R2). */
.ns-gt-barname { position: absolute; top: 6px; height: 24px; line-height: 24px;
                 font-size: var(--fs-sm); color: var(--ink); pointer-events: none;
                 overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ns-gt-namehit { pointer-events: auto; max-width: 100%; border: 0; padding: 0; margin: 0;
                 background: none; color: inherit; font: inherit; line-height: inherit;
                 cursor: pointer; overflow: hidden; text-overflow: ellipsis;
                 white-space: nowrap; vertical-align: top; }
.ns-gt-namehit:hover { text-decoration: underline; }
.ns-gt-namehit.is-on { text-decoration: underline; font-weight: 600; }
.ns-gt-barname.is-after { padding-left: 7px; }
.ns-gt-barname.is-before { padding-right: 7px; text-align: right; }
.ns-gt-barname.is-in { padding-left: 9px; padding-right: 9px; color: #fff; font-weight: 600;
                       text-shadow: 0 1px 2px rgba(0, 0, 0, .35); }
.ns-gt-labunder { flex: none; color: var(--ink-3); font-size: var(--fs-sm); }
.ns-gt-band { position: absolute; top: 15px; height: 6px; border-radius: 3px;
              background: linear-gradient(90deg, #a9bace, #7d93ad); }
.ns-gt-groupfacts { position: absolute; right: 8px; top: 9px; display: inline-flex; gap: 10px;
                    font-size: var(--fs-sm); }
.ns-gt-nodate { position: absolute; left: 8px; top: 10px; font-size: var(--fs-sm); color: var(--ink-3);
                pointer-events: none; }

.ns-gt-tick { position: absolute; top: 3px; transform: translateX(-50%);
              font-family: var(--mono); font-size: var(--fs-xs); color: var(--ink-3);
              white-space: nowrap; }
.ns-gt-tick.is-year { color: var(--ink); font-weight: 700; }
.ns-gt-tick.is-first { transform: none; }
.ns-gt-tick.is-last { transform: translateX(-100%); }
.ns-gt-todaytag { position: absolute; bottom: 2px; transform: translateX(-50%);
                  background: var(--gt-today); color: #fff; font-family: var(--mono);
                  font-size: var(--fs-xs); padding: 0 5px; border-radius: 2px; white-space: nowrap; }

.ns-gt-legend { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 14px;
                padding: 7px 12px; font-size: var(--fs-sm); color: var(--ink-2);
                border-bottom: 1px solid var(--rule); background: var(--paper-2); }
.ns-gt-key { display: inline-flex; align-items: center; gap: 5px; }
.ns-gt-swatch { display: inline-block; width: 16px; height: 8px; border-radius: 2px; }
.ns-gt-swatch.is-moved { border: 1px dashed var(--ink-2); background: rgba(84, 92, 104, .08); }
.ns-gt-swatch.is-over { background: repeating-linear-gradient(45deg,
                          rgba(192, 57, 43, .55) 0 3px, rgba(192, 57, 43, .12) 3px 6px); }
.ns-gt-swatch.is-outside { background: repeating-linear-gradient(90deg,
                            var(--ink-2) 0 4px, transparent 4px 8px); }
.ns-gt-swatch.is-today { width: 3px; height: 13px; background: var(--gt-today); border-radius: 0; }

/* ---- 승인 미리 보기 간트 · 판 반영 전→후 표 (DEV-2026-0568 · ADR-051 D3 · D4) ----------
 * 막대 · 눈금 · 오늘 선은 위 과제 일정 규칙 그대로다. 여기는 판의 틀만 — 왼쪽 칸은 줄 이름(지금 ·
 * 승인 뒤) 한 칸이라 좁고(--gt-area), 그림은 제 상자 안에서 민다(걸음 수십 개 묶음에서도 판이 넘치지
 * 않게 높이 상한). 바뀐 과제는 왼쪽 굵은 띠로 강조 — 막대 색은 단계 색 그대로다. */
.ns-gt-pv { margin: 8px 0; }
.ns-gt-pvhead { display: flex; align-items: center; gap: 8px; margin: 0 0 6px; font-size: var(--fs-sm); }
.ns-gt-pvscroll { overflow: auto; max-height: min(440px, 46vh); border: 1px solid var(--rule);
                  border-radius: 4px; background: var(--paper); }
.ns-gt--pv { --gt-area: 64px; min-width: 520px; }
.ns-gt-pvlab { font-size: var(--fs-sm); color: var(--ink-3); padding: 0 8px; white-space: nowrap; }
.ns-gt-pvgroup { position: relative; z-index: 1; border-bottom: 2px solid var(--rule-strong); }
.ns-gt-pvgroup:last-child { border-bottom: 0; }
.ns-gt-pvgroup.is-changed { box-shadow: inset 3px 0 0 var(--accent); }
.ns-gt-pvgroup.is-changed .ns-gt-pvlab { color: var(--ink); font-weight: 600; }
.ns-gt--pv .ns-gt-bar { cursor: default; }
.ns-gt--pv .ns-gt-bar:hover { box-shadow: none; }
.ns-gt--pv .ns-gt-namehit { cursor: default; }
.ns-gt--pv .ns-gt-namehit:hover { text-decoration: none; }
.ns-gt-pvshift { display: flex; flex-wrap: wrap; gap: 2px 14px; padding: 4px 8px 6px calc(var(--gt-area) + 8px);
                 font-size: var(--fs-sm); color: var(--ink-2); background: var(--paper); position: relative; z-index: 1; }
.ns-gt-pvmove { display: inline-flex; gap: 6px; align-items: baseline; }
.ns-gt-pvmove .is-late, .ns-gt-pvtable .is-late { color: var(--hold); font-weight: 650; }
.ns-gt-pvmove .is-early, .ns-gt-pvtable .is-early { color: var(--accent); font-weight: 650; }
.ns-gt-pvtablebox { overflow: auto; max-height: min(420px, 44vh); margin: 6px 0 10px;
                    border: 1px solid var(--rule); border-radius: 4px; }
.ns-gt-pvtable { width: 100%; border-collapse: collapse; font-size: var(--fs-sm); }
.ns-gt-pvtable th { position: sticky; top: 0; background: var(--paper-2); text-align: left; font-weight: 600;
                    padding: 5px 8px; border-bottom: 1px solid var(--rule-strong); white-space: nowrap; }
.ns-gt-pvtable td { padding: 5px 8px; border-bottom: 1px solid var(--rule); vertical-align: top; }
.ns-gt-pvtable td:nth-child(2), .ns-gt-pvtable td:nth-child(3), .ns-gt-pvtable td:nth-child(4) { white-space: nowrap; }
.ns-gt-pvtable td b + b { margin-left: 6px; }
.ns-bulk-difffold { margin: 6px 0 0; }

/* 좁은 창 — 이름 칸만 줄인다. 눈금·오늘 선은 같은 변수를 읽으므로 함께 움직인다. */
@media (max-width: 1180px) {
  #ns-root { --gt-lab: 176px; }
}

/* ---- 카드가 담은 액션 배열 · 영역 고치기 · 읽히는 사유 (DEV-2026-0066) -------
 *
 * 걸음은 접지 않는다 — 카드 하나가 여러 일을 한다는 사실이 한 번의 클릭 뒤로 숨으면
 * 이 화면이 고치려는 상태 그대로다(ADR-019 D1). 그래서 세로로 쌓되 번호를 크게 준다.
 */
.ns-step {
  border: 1px solid var(--ink-3);
  border-radius: 3px; padding: 8px 10px; margin: 0 0 7px; background: var(--paper);
}
.ns-step:last-child { margin-bottom: 0; }
.ns-step-head { display: flex; align-items: center; gap: 7px; margin-bottom: 5px; }
.ns-step-no {
  font-variant-numeric: tabular-nums; font-weight: 700; font-size: var(--fs-md);
  min-width: 19px; height: 19px; line-height: 19px; text-align: center;
  color: #fff; background: var(--accent); border-radius: 3px;
}

/* 걸음의 4단 추적 (0119) — 번호 열이 차례를 지고, 글은 한 폭에 선다. 넷이 위에서
   아래로 읽히는 것이 요점이라 접지 않는다(접으면 안 보이는 근거로 돌아간다). */
.ns-trace {
  display: grid; gap: 7px; margin: 0 0 7px; padding: 8px 10px;
  background: var(--paper-2); border: 1px solid var(--rule); border-radius: 3px;
}
.ns-trace-line { display: grid; grid-template-columns: 18px 1fr; gap: 8px; align-items: start; }
.ns-trace-no {
  font-variant-numeric: tabular-nums; font-weight: 700; font-size: var(--fs-sm);
  line-height: 18px; text-align: center; color: var(--ink-2);
  border: 1px solid var(--rule-strong); border-radius: 50%;
}
.ns-trace-body { min-width: 0; }
.ns-trace-head { display: flex; align-items: baseline; gap: 7px; flex-wrap: wrap; margin: 0 0 2px; }
.ns-trace-label { font-size: var(--fs-sm); font-weight: 700; color: var(--ink-2); }
.ns-trace-from {
  font-size: var(--fs-xs); color: var(--ink-2);
  border: 1px solid var(--rule-strong); border-radius: 2px; padding: 0 5px;
}
.ns-trace-ev {
  border-left: 3px solid var(--quote-bar); background: var(--quote-bg);
  padding: 7px 9px; margin: 0 0 6px;
}
.ns-trace-ev:last-child { margin-bottom: 0; }
.ns-trace-ev .ns-ev-meta { margin-top: 5px; }

.ns-q--0 { --quote-bar: #b5179e; }
.ns-q--1 { --quote-bar: #c1121f; }
.ns-q--2 { --quote-bar: #3f37c9; }
.ns-q--3 { --quote-bar: #f08c00; }
.ns-ev.ns-q--0 { --ev-bar: #b5179e; }
.ns-ev.ns-q--1 { --ev-bar: #c1121f; }
.ns-ev.ns-q--2 { --ev-bar: #3f37c9; }
.ns-ev.ns-q--3 { --ev-bar: #f08c00; }
.ns-q-mark {
  border: 1px solid var(--quote-bar, var(--ev-bar)); border-radius: 999px;
  padding: 0 6px; color: var(--quote-bar, var(--ev-bar)); font-weight: 700;
}
.ns-ev .ns-q-mark { --quote-bar: var(--ev-bar); }
/* 걸음이 저장할 인용 — '인용' 절의 번호 단추(DEV-2026-0396 ④). */
.ns-step-cite { margin: 0 0 6px; gap: 5px; }
/* 판 메모 행(DEV-2026-0588) — 걸음 박스 안 · 메모 번호 칸 + 메모 글 원문 · 업무. 어긋남은 주의색 한 줄. */
.ns-memo { margin: 0 0 6px; padding: 6px 8px; border-left: 3px solid var(--rule-strong); background: var(--paper-2); border-radius: 0 3px 3px 0; }
.ns-memo-row { display: grid; grid-template-columns: 4.6em minmax(0, 1fr); gap: 2px 8px; align-items: baseline; }
.ns-memo-row + .ns-memo-row { margin-top: 4px; }
.ns-memo-no { font-weight: 700; font-size: var(--fs-xs); color: var(--ink-2); white-space: nowrap; }
.ns-memo-body { display: flex; flex-direction: column; min-width: 0; overflow-wrap: anywhere; }
.ns-memo-text { white-space: pre-wrap; }
.ns-memo-task { font-size: var(--fs-xs); color: var(--ink-3); }
.ns-memo--mis { border-left-color: var(--quote-bar); background: var(--quote-bg); }
.ns-memo-mis .ns-memo-no, .ns-memo-mis .ns-memo-text { color: var(--hold); }
.ns-memo-seg { margin: 0 0 8px; }
.ns-step-cite .ns-q-mark { text-decoration: none; min-height: 0; line-height: 1.6; }
/* 참고한 인용 = 인용과 같음 — 접힌 절과 같은 한 줄(펼칠 것이 없다). */
.ns-fold--same {
  padding: 7px 11px; font-weight: 700; color: var(--ink-3); background: var(--paper-2);
}
.ns-ev--gone { --ev-bar: var(--rule-strong); }

.ns-step-change {
  margin: 0 0 6px; display: flex; flex-wrap: wrap; align-items: baseline; gap: 6px;
  font-weight: 700;
}
.ns-step-change-to { font-weight: 700; }
.ns-step-change-sep { color: var(--ink-3); font-weight: 400; }

/* [그 대목] 이 짚은 인용 — 오른쪽 판에서 테로 답한다. */
.ns-ev.is-spot { outline: 2px solid var(--accent); outline-offset: 1px; }

/* 인용·문서 묶음 (0182) — 같은 문구는 한 번, 같은 문서는 한 번 적고 서로를 링크로 건다.
   링크 이름이 '인용N' · '문서N' 이라 색 없이도 갈린다(색은 번호를 거들 뿐이다). */
.ns-evidence-groups .ns-h { margin: 12px 0 6px; }
.ns-evidence-groups .ns-h:first-child { margin-top: 0; }
.ns-evidence-links { margin: 6px 0 0; gap: 6px; }
.ns-evidence-link {
  border-left: 3px solid var(--quote-bar, var(--rule-strong));
  background: var(--quote-bg); border-radius: 0 3px 3px 0; padding: 1px 7px;
}
.ns-evidence-link.is-spot { outline: 2px solid var(--accent); outline-offset: 1px; }

/* 영역 자리 — 값이 있으면 조용히, 비어 있으면 눈에 띄게(D5 "채우지 말고 말하라"). */
.ns-area-slot {
  margin: 6px 0 0; padding: 7px 9px; border-radius: 3px;
  background: var(--paper-2); border: 1px solid var(--rule);
}
.ns-area-slot--empty {
  background: #fdf8ec; border-color: #e8cf9f; color: #5d4600;
}
.ns-area-slot--empty b { display: block; color: var(--hold); }
/* 카드를 고치는 중 — 읽던 자리가 그대로 칸이 된다(0081 ①). 고치는 중임이 한눈에
   보이게 걸음 테두리 색을 바꾸고, 새로 더한 걸음 자리는 점선으로 세운다. */
.ns-step-edit { display: grid; gap: 5px; margin: 4px 0 0; }
.ns-step-ev {
  margin: 5px 0 0; padding: 6px 8px; border-radius: 3px;
  background: var(--quote-bg); border-left: 3px solid var(--quote-bar);
}
.ns-step-ev .ns-row { align-items: flex-start; gap: 6px; }
.ns-step-ev-doc { margin-top: 6px; align-items: center; }
.ns-step-ev-doc:first-of-type { margin-top: 4px; }
.ns-step-ev-name { font-weight: 600; overflow-wrap: anywhere; }
.ns-step-ev-q { padding-left: 22px; }
.ns-step-ev-sec { flex: 0 1 30%; font-size: var(--fs-xs, 12px); overflow-wrap: anywhere; }
.ns-step--add { border-color: var(--hold); border-style: dashed; }
/* 수정 중인 장 (DEV-2026-0215) — 테두리와 바탕이 바뀐다. 기본 장 테두리가
   진해진 만큼(DEV-2026-0240) 굵기도 올려 고른 상태와 계속 구분되게 한다. */
.ns-step.is-editing { border-width: 2px; border-color: var(--accent); background: var(--accent-soft); }
/* 근거 없는 걸음 (0410) — 주의색 테두리 · 거절 줄의 번호로 짚은 걸음은 두 겹. */
.ns-step--bare { border-color: #e8cf9f; background: #fffaf0; }
/* 영역미상 걸음(DEV-2026-0741) — 빨간 '확인 필요' + 한 줄. */
.ns-step--unk { border-color: #e7bdb7; }
.ns-tag--unk { border-color: var(--no); background: #fdf4f3; color: var(--no); font-weight: 700; }
.ns-area-unk { margin: 2px 0 6px; color: var(--no); font-weight: 600; overflow-wrap: anywhere; }
/* 확인 필요 메모 쪽지(DEV-2026-0746 → 0747) — 접힌 머리 한 줄, 펼치면 글 · 근거 · 비교 과제 · [확인 완료]. */
.ns-cnote { margin: 2px 0 6px; min-width: 0; border: 1px solid #e7bdb7; border-radius: 3px; background: #fdf4f3; padding: 4px 8px; }
.ns-cnote > summary.ns-area-unk { margin: 0; display: list-item; cursor: pointer; list-style-position: inside; }
.ns-cnote[open] > summary.ns-area-unk { margin: 0 0 4px; }
.ns-cnote-said { margin: 0 0 4px; max-width: 78ch; line-height: 1.55; overflow-wrap: anywhere; }
.ns-cnote-basis { margin: 0 0 4px; min-width: 0; }
.ns-cnote-quote { margin: 2px 0 0; max-width: 78ch; padding-left: 8px; border-left: 2px solid #e7bdb7; font-size: 12px; overflow-wrap: anywhere; }
.ns-cnote-foot { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; min-width: 0; }
.ns-cnote-vs { color: var(--ink-3); font-size: 12px; }
.ns-cnote-foot .ns-btn--link { overflow-wrap: anywhere; text-align: left; }
.ns-step--bare.is-spot { border-width: 2px; border-color: #c98a1a; }
.ns-fail .ns-btn--link { margin-right: 6px; }
/* 발의자 원문 — 수정본 위가 아니라 옆에 남는다(덮어쓰기가 아니다). */
.ns-rat-orig {
  margin: 0 0 8px; padding: 7px 9px; border-radius: 3px;
  background: var(--paper-2); border-left: 3px solid var(--rule);
}

/* 사유 — 결론이 먼저 서고, 과제 번호·문서 이름이 글 안에서 구별된다(0066 ⑦). */
.ns-rat-lead {
  margin: 0 0 4px; font-size: var(--fs-base); font-weight: 700; line-height: 1.5;
  max-width: 78ch; border-left: 3px solid var(--accent); padding-left: 8px;
}
.ns-rat-why { display: block; font-size: var(--fs-sm); margin: 0 0 7px; }
.ns-rat-body { display: grid; gap: 5px; }
.ns-rat-cite { display: block; font-size: var(--fs-sm); margin: 7px 0 0; max-width: 78ch; }
.ns-rat-line {
  margin: 0; max-width: 78ch; line-height: 1.6; padding-left: 9px;
  border-left: 1px solid var(--rule);
}
.ns-doc-ref { background: var(--quote-bg); box-shadow: 0 1px 0 var(--quote-bar); }
.ns-ref { font-family: var(--mono); font-size: var(--fs-sm); padding: 0 2px; }
.ns-warnline { color: var(--no); font-weight: 700; }


/* ---- 액션 설명 (DEV-2026-0074) ---------------------------------------------
 *
 * 사람이 누르기 전에 "이게 무슨 일을 하나" 를 안다. 글은 **액션 카탈로그**에서 오고
 * (`GET /api/actions` 의 `description`), 화면은 그것을 그대로 싣는다. 뜨고 안 뜨고는
 * CSS 가 정한다 — `:hover` 는 진짜 마우스가 있어야 참이고, 키보드로 짚은 사람도
 * `:focus-within` 으로 같은 글을 본다. */
.ns-hint { position: relative; display: inline-flex; }
.ns-tip { position: absolute; left: 0; top: calc(100% + 6px); z-index: 40;
          display: flex; flex-direction: column; gap: 5px;
          width: max-content; max-width: 320px; padding: 8px 10px;
          background: var(--ink); color: #fff; border-radius: 4px;
          font-size: var(--fs-sm); line-height: 1.45;
          box-shadow: 0 6px 18px rgba(16, 20, 28, .28);
          visibility: hidden; opacity: 0; pointer-events: none;
          transition: opacity .09s ease-out; }
.ns-hint:hover > .ns-tip, .ns-hint:focus-within > .ns-tip { visibility: visible; opacity: 1; }
.ns-tip-name { font-weight: 700; }
.ns-tip-say { white-space: normal; }
.ns-tip-say--none { color: #c8cdd6; }
.ns-tip .ns-tagrow { gap: 4px; }
.ns-tip .ns-tag { background: rgba(255, 255, 255, .16); color: #fff; border-color: transparent; }
.ns-tip .ns-tag--esc { background: rgba(255, 138, 128, .32); }
.ns-tip .ns-tag--amb { background: rgba(255, 213, 128, .32); }
/* 작업 칸의 풍선은 **줄 전체 폭**으로 선다 (DEV-2026-0267) — 곁 패널 오른쪽 끝 단추의 풍선이
   패널 밖으로 나가지 않게, 단추가 아니라 단추 줄에 붙인다. */
.ns-deeds > .ns-row { position: relative; }
.ns-deeds .ns-hint { position: static; }
.ns-deeds .ns-tip { left: 0; right: 0; width: auto; max-width: none; }

.ns-tagrow { display: flex; flex-wrap: wrap; gap: 5px; }
.ns-actfacts { display: flex; flex-direction: column; gap: 5px; margin: 8px 0;
               padding: 7px 9px; background: var(--paper-2);
               border: 1px solid var(--rule); border-radius: 4px; }
.ns-actsay { margin: 0; line-height: 1.5; }
.ns-actsay--none { color: var(--ink-3); }

/* 글꼴이 안 실렸다 — 조용히 시스템 글꼴로 돌아가지 않는다(DEV-2026-0039 의 교훈). */
.ns-fontwarn { display: inline-flex; align-items: center; gap: 5px;
               padding: 1px 7px; border-radius: 999px;
               background: #fdecea; color: var(--no); border: 1px solid var(--no);
               font-size: var(--fs-xs); font-weight: 700; }

/* 화면과 서버의 세대가 어긋났다 (DEV-2026-0076) — 따로 배달되면서 생긴 자리다. */
.ns-genwarn { display: inline-flex; align-items: center; gap: 5px;
              padding: 1px 7px; border-radius: 999px;
              background: #fff4e5; color: #8a5300; border: 1px solid #d38b1f;
              font-size: var(--fs-xs); font-weight: 700; }

/* 접힌 도움말 (DEV-2026-0074) — 기본 상태의 화면에는 한 줄도 나가지 않는다. */
.ns-fold--help { border-style: dashed; margin-bottom: 10px; }
.ns-fold--help > summary { background: none; color: var(--ink-3); font-weight: 400; }
.ns-help-p { margin: 0 0 6px; line-height: 1.55; color: var(--ink-2); max-width: 78ch; }
.ns-help-p:last-child { margin-bottom: 0; }

/* 막대 이름표가 데려온 표시(번호는 이름 앞, 아래·지남은 이름 뒤) — R3 에서 왼쪽 이름
   칸이 사라지면서 그 칸이 들고 있던 값들이 여기로 왔다. */
.ns-gt-barmark { margin-left: 6px; color: var(--ink-3); }
.ns-gt-barname.is-in .ns-gt-barmark { color: rgba(255, 255, 255, .85); }

/* 문서 줄 자체가 원문 링크다 (DEV-2026-0128 ⑦) */
.ns-doc-head--open { justify-content: space-between; color: inherit;
  text-decoration: none; cursor: pointer; }
.ns-doc-head--open:hover .ns-doc-name { text-decoration: underline; }


/* ---- 문서 수신함 — 직접 투입 · 수신 카드 (DEV-2026-0142) ------------------
   사용자 2026-09-22: 직접 넣는 액션이 상단, 수신 목록은 카드, 옆 판은 필터 · 이력.
   판 셋이 한 칸에 세로로 서므로 스크롤은 바깥 흐름 칸 하나다 — 판마다 따로 구르면
   상단 폼을 열었을 때 카드가 제자리에서 밀린다. */
.ns-inbox-flow { overflow: auto; display: flex; flex-direction: column; min-width: 0; }
.ns-inbox-flow > .ns-pane {
  overflow: visible; grid-template-rows: auto auto;
  border-right: none; border-bottom: 1px solid var(--rule-strong);
}
.ns-inbox-flow > .ns-pane:last-child { border-bottom: none; }
.ns-inbox-flow > .ns-pane > .ns-pane-body { overflow: visible; }

.ns-inbox-cards {
  display: grid; gap: 10px;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
}
.ns-inbox-card {
  display: flex; flex-direction: column; gap: 6px;
  border: 1px solid var(--ink-3); border-left: 3px solid var(--ink-3);
  border-radius: 4px; background: var(--paper); padding: 10px 12px;
}
/* 고른 카드는 네 변 모두 강조색이다 — 왼쪽만 다르면 나머지 세 변의 어두운
   테두리와 섞여 안 보인다(DEV-2026-0240). */
.ns-inbox-card.is-on {
  border-width: 2px; border-color: var(--accent); border-left-color: var(--accent);
  background: var(--accent-soft);
}
.ns-inbox-card-pick {
  border: 0; background: none; padding: 0; text-align: left; cursor: pointer;
  font: inherit; font-size: var(--fs-md); font-weight: 700; color: var(--ink);
  overflow-wrap: anywhere;
}
.ns-inbox-card-pick:hover { color: var(--accent); }
.ns-inbox-card-tags { display: flex; flex-wrap: wrap; gap: 5px; }
.ns-inbox-card .ns-facts { margin: 0; }
.ns-inbox-card-foot {
  display: flex; align-items: center; justify-content: space-between; gap: 8px;
  padding-top: 7px; border-top: 1px solid var(--rule); margin-top: auto;
}

/* 카드 안 '과제 지금 값' 한 줄 — 이름 · 값 · 걸음 값 · 변경 (DEV-2026-0149) */
.ns-nowrow {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 4px 0; border-top: 1px solid var(--rule);
}
.ns-nowrow:first-of-type { border-top: 0; }
.ns-nowlab { margin: 0; min-width: 72px; }
.ns-nowval { flex: 1; min-width: 120px; font-size: var(--fs-sm); }

/* ---- 서고 (DEV-2026-0135) ------------------------------------------------- */
.ns-vt-form {
  padding: 10px 10px 12px; border-bottom: 1px solid var(--rule);
  display: grid; gap: 8px;
}
.ns-vt-field { display: grid; grid-template-columns: 64px minmax(0, 1fr); gap: 8px; align-items: center; }
.ns-vt-label { font-size: var(--fs-sm); color: var(--ink-3); }
.ns-vt-treehead {
  font-size: var(--fs-sm); color: var(--ink-3); padding: 4px 8px 6px;
  border-bottom: 1px solid var(--rule); margin-bottom: 4px;
}
.ns-vt-tree {
  appearance: none; width: 100%; text-align: left; cursor: pointer;
  display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 6px; align-items: center;
  background: transparent; border: 1px solid transparent; border-radius: 5px;
  padding: 5px 8px; color: var(--ink); font-size: var(--fs-sm);
}
.ns-vt-tree:hover { background: var(--paper-2); }
.ns-vt-tree.is-on { background: var(--accent-soft); border-color: #c6dcf6; }
.ns-vt-treename { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ns-vt-treen { color: var(--ink-3); font-variant-numeric: tabular-nums; }
.ns-vt-dates { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; }
.ns-vt-dates .ns-input { min-width: 0; }
/* 결과 표는 칸 넷이고 **판 폭 안에서 끝난다**(DEV-2026-0222) — 백분율 둘의 합이
   100% 미만이고 나머지 둘만 px 라, 판이 좁아져도 표가 넘치거나 한 칸이 0px 로
   짜부라지지 않는다. 긴 글은 한 줄로 줄이고 전문은 이름표(title)에 있다. */
.ns-vt-table { table-layout: fixed; width: 100%; }
.ns-vt-table th, .ns-vt-table td { overflow: hidden; }
.ns-vt-table th:nth-child(1), .ns-vt-table td:nth-child(1) { width: 34%; }
.ns-vt-table th:nth-child(2), .ns-vt-table td:nth-child(2) { width: 104px; }
.ns-vt-table th:nth-child(4), .ns-vt-table td:nth-child(4) { width: 118px; }
.ns-vt-line { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* 일자 머리 칸의 정렬 단추(DEV-2026-0263) — 화살표만 강조하고 칸 안에 꽉 채운다. */
.ns-vt-sort {
  appearance: none; cursor: pointer; background: transparent; border: none; padding: 0;
  font: inherit; font-weight: 600; color: inherit; white-space: nowrap;
}
.ns-vt-sort.is-on { color: var(--accent); }
.ns-vt-date {
  display: flex; gap: 4px; align-items: center; flex-wrap: wrap;
  font-variant-numeric: tabular-nums;
}
.ns-vt-date .ns-tag { font-size: var(--fs-xs); max-width: 100%; }
.ns-vt-row { cursor: pointer; }
.ns-vt-row:hover td { background: var(--paper-2); }
.ns-vt-name { font-weight: 600; }
.ns-vt-folder, .ns-vt-head {
  font-weight: 400; font-size: var(--fs-xs); color: var(--ink-3); margin-top: 2px;
}
.ns-vt-snip { color: var(--ink-2); }
.ns-vt-table td:nth-child(4) .ns-btn { max-width: 100%; }
/* 문서 탭(DEV-2026-0222 R2) — 문서 한 줄 아래에 그 문서의 인용이 접혀 있다. 펼친
   줄은 네 칸을 한 칸으로 쓰고, 인용 한 줄은 절 · 인용문 · 문서일 · 원문 넷이다
   (px 둘 + 비율 둘이라 판이 좁아도 넘치지 않는다). */
.ns-vt-fold {
  appearance: none; cursor: pointer; background: transparent; border: none; padding: 0;
  color: var(--accent); font-size: var(--fs-xs); font-weight: 600; white-space: nowrap;
}
.ns-vt-fold:hover { text-decoration: underline; }
.ns-vt-row.is-open td { border-bottom-color: transparent; }
.ns-vt-sub > td { padding-top: 0; background: var(--paper-2); }
.ns-vt-quotes { display: grid; gap: 2px; padding: 4px 0 6px 10px; border-left: 2px solid var(--rule-strong); }
.ns-vt-qrow {
  display: grid; grid-template-columns: minmax(0, 28%) minmax(0, 1fr) 96px 96px;
  gap: 8px; align-items: center; padding: 4px 6px; border-radius: 5px; cursor: pointer;
  font-size: var(--fs-sm);
}
/* 다섯째 칸 — [근거로 등록] · '등록됨' (DEV-2026-0274, 과제의 관련 문서 검색 창). */
.ns-vt-qrow--ev { grid-template-columns: minmax(0, 24%) minmax(0, 1fr) 88px 88px 128px; }
.ns-vt-evwrap {
  display: flex; align-items: center; justify-content: flex-end; gap: 6px; min-width: 0;
}
.ns-vt-evwrap .ns-tag { flex: none; }
.ns-vt-qrow:hover { background: var(--paper); }
.ns-vt-qrow.is-on { background: var(--accent-soft); }
.ns-vt-qrow .ns-vt-head { margin-top: 0; }
.ns-vt-qtext { color: var(--ink-2); }
.ns-vt-qdate { font-variant-numeric: tabular-nums; color: var(--ink-3); font-size: var(--fs-xs); }
.ns-vt-qtail { min-width: 0; }
.ns-vt-qtail .ns-btn { max-width: 100%; }
.ns-vt-field .ns-select { min-width: 0; width: 100%; }
/* DEV-2026-0222 R3 — 포함 선택 · 배제 표시 */
.ns-vt-flags { display: flex; flex-wrap: wrap; gap: 4px 12px; font-size: var(--fs-sm); min-width: 0; }
.ns-vt-flag input { margin: 0; }
.ns-vt-nameline { display: flex; align-items: center; gap: 6px; min-width: 0; }
.ns-vt-nameline > .ns-vt-line { flex: 1 1 auto; min-width: 0; }
.ns-vt-nameline > .ns-tag { flex: none; font-size: var(--fs-xs); }
.ns-vt-row.is-excluded td { color: var(--ink-3); }
/* 찾기 판은 300px 이다 — 날짜 칸 둘을 한 줄에 두면 판 밖으로 23px 넘쳤다(실측
   2026-09-24, 운영 화면도 같았다). 날짜는 두 줄, 검색어 칸은 단추 옆에서 줄어든다. */
.ns-screen--vault > .ns-pane { grid-template-columns: minmax(0, 1fr); }
.ns-vt-form { min-width: 0; grid-template-columns: minmax(0, 1fr); }
.ns-vt-form > .ns-row { flex-wrap: nowrap; }
.ns-vt-form > .ns-row > .ns-input { flex: 1 1 0; min-width: 0; width: 0; }
.ns-vt-dates { grid-template-columns: minmax(0, 1fr); }
.ns-vt-dates .ns-input { width: 100%; }

/* 과제의 관련 문서 검색 카드 (DEV-2026-0268) — 푸른 테두리 · 푸른 머리로 다른 카드와
   가른다. 결과 표는 서고 문서 탭의 것 그대로이고 곁판 폭(약 440px)에 맞춰 칸만 좁힌다
   — 일자 칸 · 원문 칸 · 구절 줄의 문서일(같은 문서라 문서 줄의 일자와 같다). */
.ns-fold--search { border: 2px solid var(--accent); }
.ns-fold--search > summary { background: var(--accent-soft); color: #143a6b; }
.ns-fold--search[open] > summary { border-bottom-color: #b7d2f1; }
.ns-vt-table--card th:nth-child(1), .ns-vt-table--card td:nth-child(1) { width: 30%; }
.ns-vt-table--card th:nth-child(2), .ns-vt-table--card td:nth-child(2) { width: 102px; }
.ns-vt-table--card th:nth-child(4), .ns-vt-table--card td:nth-child(4) { width: 112px; }
.ns-vt-table--card .ns-vt-sub > td { width: auto; }
.ns-vt-table--card .ns-vt-qrow { grid-template-columns: minmax(0, 30%) minmax(0, 1fr) 80px; }
.ns-vt-table--card .ns-vt-qdate { display: none; }
.ns-vt-table--card .ns-docpeek { margin-top: 6px; }

@media (max-width: 1180px) {
  .ns-screen--vault { grid-template-columns: 260px minmax(0, 1fr); }
  .ns-screen--vault > .ns-pane:nth-child(3) { display: none; }
}

/* 서고 문서 판 (DEV-2026-0135 R2) — 옵시디언 노트: 속성 표 · 단계 · 목차 · 본문 */
.ns-vt-note { display: grid; gap: 14px; }
.ns-vt-stages { flex-wrap: wrap; gap: 6px 10px; }
.ns-vt-stage { display: inline-flex; align-items: center; gap: 5px; }
.ns-vt-stagename { font-size: var(--fs-sm); color: var(--ink-3); }
.ns-vt-toc {
  border: 1px solid var(--rule); border-radius: 6px; padding: 8px 6px;
  background: var(--paper-2); display: grid; gap: 2px; max-height: 220px; overflow: auto;
}
.ns-vt-tocrow {
  display: block; width: 100%; text-align: left; border: 1px solid transparent;
  border-radius: 5px; background: none; padding: 3px 8px; cursor: pointer;
  font-size: var(--fs-sm); color: var(--ink);
}
.ns-vt-tocrow:hover { background: var(--paper); }
.ns-vt-tocrow.is-on { background: var(--accent-soft); border-color: #c6dcf6; }
.ns-vt-views { gap: 6px; }
.ns-vt-views .ns-btn.is-on { background: var(--accent-soft); border-color: #a9c8ea; font-weight: 700; }

.ns-vt-read { max-width: 78ch; }
.ns-vt-h { font-weight: 700; margin: 16px 0 6px; line-height: 1.35; }
.ns-vt-h1 { font-size: var(--fs-xl); }
.ns-vt-h2 { font-size: var(--fs-lg); }
.ns-vt-h3, .ns-vt-h4 { font-size: var(--fs-md); }
.ns-vt-h5, .ns-vt-h6 { font-size: var(--fs-sm); color: var(--ink-2); }
.ns-vt-p { margin: 0 0 8px; line-height: 1.7; word-break: break-word; }
.ns-vt-list { margin: 0 0 8px; padding-left: 20px; line-height: 1.7; }
.ns-vt-quote {
  margin: 0 0 8px; padding: 4px 12px; border-left: 3px solid var(--rule);
  color: var(--ink-2);
}
.ns-vt-rule { height: 1px; background: var(--rule); margin: 14px 0; }
.ns-vt-code { font-size: .92em; background: var(--paper-2); padding: 1px 4px; border-radius: 4px; }
.ns-vt-mdwrap { overflow-x: auto; margin: 0 0 12px; max-width: 100%; }
.ns-vt-md { min-width: 480px; font-size: var(--fs-sm); }
.ns-vt-md th, .ns-vt-md td { vertical-align: top; }

.ns-vt-chunks { display: grid; gap: 10px; }
.ns-vt-chunk { border: 1px solid var(--rule); border-radius: 7px; padding: 9px 11px; }
.ns-vt-chunk.is-on { border-color: #a9c8ea; background: var(--accent-soft); }
.ns-vt-chunkhead { display: flex; align-items: center; gap: 8px; margin: 0 0 6px; }
.ns-vt-chunkname {
  font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
  flex: 1 1 auto; min-width: 0;
}
.ns-vt-chunkbody { white-space: pre-wrap; line-height: 1.65; word-break: break-word; }

/* Document backlinks (DEV-2026-0135 R3). */
.ns-vt-usage { overflow-wrap: anywhere; }
.ns-vt-citation { display: grid; gap: 6px; margin-top: 10px; }
.ns-vt-usage-group + .ns-vt-usage-group { margin-top: 16px; }

/* 원문 보기 — 검색 결과 한 줄 아래에 펴는 절 (DEV-2026-0176 R3) */
.ns-docpeek {
  margin: 6px 0 2px;
  border: 1px solid var(--rule);
  border-radius: 6px;
  padding: 6px 8px;
  background: var(--paper-2);
}
.ns-docpeek-body { margin-top: 6px; }
.ns-docpeek-chunk {
  border-left: 2px solid var(--rule);
  padding: 2px 0 2px 8px;
  margin: 4px 0;
}
.ns-docpeek-chunk.is-on { border-left-color: var(--accent); background: var(--quote-bg); }
.ns-docpeek-head { display: flex; gap: 6px; align-items: baseline; }
.ns-docpeek-text {
  white-space: pre-wrap;
  font-size: var(--fs-sm);
  line-height: 1.55;
  max-height: 220px;
  overflow: auto;
}

/* ---- 로그인 (DEV-2026-0188 R2) ------------------------------------------ */
.ns-top-me { gap: 8px; }
.ns-top-me-name { font-weight: 600; color: var(--ink); }
.ns-top-me-role { font-size: var(--fs-sm); color: var(--ink-3); }
.ns-screen--login { grid-column: 1 / -1; grid-row: 2 / -1; overflow: auto; display: flex; justify-content: center; align-items: flex-start; padding: 16vh 16px 32px; }
.ns-login { width: 100%; max-width: 320px; display: grid; gap: 10px; padding: 28px 24px 22px; border: 1px solid var(--rule); border-radius: 8px; background: var(--paper); }
.ns-login-title { margin: 0 0 6px; font-size: var(--fs-2xl); font-weight: 650; color: var(--ink); text-align: center; }
#ns-root .ns-login-field { width: 100%; padding: 9px 11px; font-size: var(--fs-base); }
.ns-login-code { letter-spacing: 0.3em; font-variant-numeric: tabular-nums; text-align: center; }
.ns-login-code::placeholder { letter-spacing: normal; }
.ns-login-main { width: 100%; padding: 9px 11px; margin-top: 2px; }
#ns-root .ns-login-main { color: #fff; }
.ns-login-again { justify-self: center; font-size: var(--fs-sm); }
#ns-root .ns-login-again { color: var(--ink-3); }
#ns-root .ns-login-again:hover:not([disabled]) { color: var(--accent); }
.ns-login-fact { margin: 0; font-size: var(--fs-sm); color: var(--ink-3); text-align: center; }
.ns-login-fail { margin: 0; font-size: var(--fs-sm); color: var(--no); text-align: center; }

/* ---- 권한 관리 (DEV-2026-0188 R4) ------------------------------------------ */
/* 할 수 없는 액션의 단추는 숨는다(withTip 이 hidden 을 준다) — .ns-hint 의 display 가
   hidden 을 이기지 않게. */
#ns-root [hidden] { display: none !important; }
.ns-perm-lookup { margin-bottom: 12px; padding-bottom: 10px; border-bottom: 1px solid var(--rule); }
.ns-perm-code { width: 160px; }
.ns-perm-find { width: 200px; }
.ns-perm-why { width: 140px; }
.ns-perm-lab { min-width: 44px; font-size: var(--fs-sm); color: var(--ink-3); }
.ns-perm-fail { color: var(--no); margin: 0 0 6px; }
.ns-perm-found b { font-size: var(--fs-md); }
.ns-perm-row { cursor: pointer; }
.ns-perm-row:hover td { background: var(--paper-2); }
.ns-perm-row.is-off td { color: var(--ink-3); }
.ns-perm-row td .ns-tag { margin-left: 6px; }
.ns-perm-sec { margin-bottom: 14px; }
.ns-perm-eff td { padding: 3px 8px; }

/* 권한 표 — 머리줄(사람)과 첫 열(권한)이 붙박이다. 칸의 뜻은 색이 진다: 개인 행(파랑 바탕) ·
   그룹 행(점선) · 잠금 방지 줄(자물쇠 색 왼쪽 표시). */
.ns-perm-gridwrap { display: grid; grid-template-rows: auto auto minmax(0, 1fr); height: 100%; min-height: 0; }
.ns-perm-gridbar { padding: 8px 12px; margin: 0; border-bottom: 1px solid var(--rule); background: var(--paper); }
.ns-perm-gridfail { margin: 8px 12px 0; }
.ns-perm-legend { display: inline-flex; gap: 6px; margin-left: auto; font-size: var(--fs-sm); }
.ns-perm-key { padding: 1px 7px; border-radius: 3px; border: 1px solid var(--rule-strong); color: var(--ink-2); }
.ns-perm-key.is-own { background: var(--accent-soft); border-color: #a9c8ea; color: #17457f; }
.ns-perm-key.is-group { border-style: dashed; border-color: var(--recheck); color: var(--recheck); }
.ns-perm-key.is-lock { border-color: #d7ae5c; color: var(--hold); }
.ns-perm-scroll { overflow: auto; min-height: 0; }
.ns-perm-grid { border-collapse: separate; border-spacing: 0; font-size: var(--fs-sm); }
.ns-perm-grid th, .ns-perm-grid td { border-bottom: 1px solid var(--rule); border-right: 1px solid var(--gt-grid); }
.ns-perm-grid thead th {
  position: sticky; top: 0; z-index: 2; background: var(--paper-2);
  vertical-align: bottom; padding: 6px 4px; min-width: 64px; text-align: center;
}
.ns-perm-grid thead th.ns-perm-corner { left: 0; z-index: 3; text-align: left; padding-left: 12px; min-width: 240px; color: var(--ink-3); }
.ns-perm-col.is-off { opacity: .55; }
.ns-perm-colname {
  appearance: none; border: none; background: none; cursor: pointer; padding: 0;
  font-weight: 700; color: var(--ink); white-space: nowrap;
}
.ns-perm-colname:hover { color: var(--accent); text-decoration: underline; }
.ns-perm-colrole { display: block; font-size: var(--fs-xs); color: var(--ink-3); font-weight: 400; }
.ns-perm-res {
  position: sticky; left: 0; z-index: 1; background: var(--paper);
  text-align: left; font-weight: 500; padding: 3px 12px; white-space: nowrap;
  border-left: 3px solid transparent;
}
.ns-perm-res.is-lock { border-left-color: #d7ae5c; }
.ns-perm-sec-th {
  position: sticky; left: 0; text-align: left; background: var(--desk);
  font-size: var(--fs-xs); color: var(--ink-2); font-weight: 700; padding: 5px 12px;
}
.ns-perm-cell { text-align: center; padding: 2px 4px; }
.ns-perm-cell.is-own { background: var(--accent-soft); }
.ns-perm-cell.is-group { outline: 1px dashed var(--recheck); outline-offset: -3px; }
.ns-perm-cell.is-busy { background: #fdf3e3; }
.ns-perm-box { width: 16px; height: 16px; cursor: pointer; accent-color: var(--accent); }
.ns-perm-box:disabled { cursor: not-allowed; }
tr:hover > .ns-perm-cell, tr:hover > .ns-perm-res { background-image: linear-gradient(rgba(31, 90, 168, .05), rgba(31, 90, 168, .05)); }

/* ---- 권한 관리 · 그룹 (DEV-2026-0188 R4d) ---------------------------------- */
.ns-perm-newgroup { margin-bottom: 12px; padding-bottom: 10px; border-bottom: 1px solid var(--rule); }
.ns-perm-nogroup { margin-bottom: 10px; }
.ns-perm-gname { width: 220px; }
.ns-perm-from .ns-tag + .ns-tag { margin-left: 4px; }
.ns-perm-chips { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.ns-perm-chip { display: inline-flex; align-items: center; gap: 2px; padding: 1px 2px 1px 4px; border: 1px dashed var(--recheck); border-radius: 4px; }
.ns-perm-addwho { min-width: 180px; }
.ns-perm-import .ns-seg { margin-bottom: 6px; }
.ns-perm-codes { width: 100%; box-sizing: border-box; font-family: inherit; }
.ns-perm-roster { width: 220px; }
.ns-perm-impres { margin-top: 8px; }
.ns-perm-impres .ns-perm-chips { margin-bottom: 6px; }
.ns-perm-gscroll { max-height: 420px; overflow: auto; border: 1px solid var(--rule); border-radius: 4px; }
.ns-perm-ggrid { width: 100%; }
.ns-perm-ggrid .ns-perm-res { position: static; white-space: normal; }
.ns-perm-ggrid .ns-perm-cell { width: 44px; }

/* ---- 권한 관리 · 문구 묶음 (DEV-2026-0298) ---- */
.ns-perm-phrases { flex-wrap: wrap; gap: 4px; margin-top: 4px; }
.ns-perm-phrasenew { margin-bottom: 12px; padding-bottom: 10px; border-bottom: 1px solid var(--rule); }
.ns-perm-phrasenew .ns-seg { margin-bottom: 6px; }
.ns-perm-paction { min-width: 220px; max-width: 100%; }
.ns-perm-pwordsin { margin: 6px 0; }
.ns-perm-pwords { color: var(--ink-2); font-size: var(--fs-sm); }

/* ---- 되돌리기 한 자리 (DEV-2026-0221 · ADR-031 D1) ---- */
.ns-undo { margin-top: 4px; }
.ns-undo .ns-actform { margin-top: 6px; }
.ns-undo-why { margin: 4px 0 0; font-size: var(--fs-sm); color: var(--ink-2); line-height: 1.45; }
.ns-lastdeed { margin-top: 8px; padding-top: 8px; border-top: 1px solid var(--rule); }
.ns-rowitem > .ns-undo, .ns-rowitem > .ns-undo-why { grid-column: 1 / -1; }

/* ---- 근거 여러 건 한 번에 (DEV-2026-0279) ---- */
.ns-pick { margin: 0 2px 0 0; width: 16px; height: 16px; flex: none; accent-color: var(--accent); }
.ns-pickbar {
  position: sticky; top: 0; z-index: 2; margin: 0 0 8px; padding: 6px 8px;
  background: var(--accent-soft); border: 1px solid var(--accent); border-radius: 4px;
}
.ns-pickbar .ns-actform { margin-top: 6px; }

/* 구절의 마크다운 (DEV-2026-0287) — 10-core 의 mdOr · mdLineOr 가 그린다. 제목은 구절 안에서
   크기를 키우지 않는 굵은 한 줄이고, 표는 칸 안에서만 가로로 민다(판 넘침 0). */
.ns-md { white-space: normal; min-width: 0; max-width: 100%; }
.ns-md > :first-child { margin-top: 0; }
.ns-md > :last-child { margin-bottom: 0; }
.ns-md-p { margin: 0 0 4px; }
.ns-md-h { font-weight: 700; margin: 2px 0 3px; }
.ns-md-list { margin: 2px 0 4px; padding-left: 1.4em; }
.ns-md-list > li { margin: 1px 0; }
.ns-md-wrap { overflow-x: auto; max-width: 100%; margin: 2px 0 4px; }
.ns-md-table { border-collapse: collapse; font-size: inherit; background: var(--paper); }
.ns-md-table th, .ns-md-table td {
  border: 1px solid var(--rule); padding: 3px 7px; text-align: left; vertical-align: top; min-width: 5em;
}
.ns-md-table th { font-weight: 700; }
.ns-md-code { background: rgba(16, 20, 28, .06); border-radius: 3px; padding: 0 3px; }
.ns-md-line b { font-weight: 700; }
.ns-md-pre { display: block; white-space: pre; overflow-x: auto; max-width: 100%; padding: 4px 6px; margin: 2px 0 4px;
  font-family: ui-monospace, Consolas, monospace; font-size: .92em; }

/* ---- AI 이해 요청 · 카드 직접 작성 (DEV-2026-0341 · ADR-038) ------------------
   문서 줄 끝 칸에 원문 열기와 [AI 이해 요청]이 위아래로 선다. 결과는 문서 줄 아래
   한 줄 — 왼쪽 굵은 줄로 그 문서에 딸린 것임을 보인다. 진행 중에는 점 하나만 숨 쉰다. */
.ns-vt-tail { display: flex; flex-direction: column; align-items: stretch; gap: 4px; min-width: 0; }
.ns-vt-tail > * { max-width: 100%; }
.ns-uq-ask { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.ns-uq-sub > td { padding-top: 2px; }
.ns-uq {
  display: grid; gap: 6px; margin: 2px 0 8px; padding: 8px 10px;
  border-left: 3px solid var(--accent); background: var(--paper); border-radius: 0 4px 4px 0;
  cursor: default; font-size: var(--fs-sm);
}
.ns-uq-head { align-items: center; }
.ns-uq-head .ns-sec-label { margin: 0; }
.ns-uq-run { display: flex; align-items: center; gap: 8px; }
.ns-uq-pulse {
  width: 8px; height: 8px; border-radius: 50%; background: var(--accent); flex: none;
  animation: ns-uq-breathe 1.2s ease-in-out infinite;
}
@keyframes ns-uq-breathe { 0%, 100% { opacity: .25; } 50% { opacity: 1; } }
@media (prefers-reduced-motion: reduce) { .ns-uq-pulse { animation: none; } }
.ns-uq-cards { display: grid; gap: 3px; }
.ns-uq-card {
  display: grid; grid-template-columns: minmax(0, max-content) minmax(0, max-content) minmax(0, 1fr);
  gap: 8px; align-items: baseline; min-width: 0;
}
.ns-uq-card > * { min-width: 0; }
.ns-uq-card .ns-btn--link { white-space: nowrap; }
.ns-uq-gist { color: var(--ink-2); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ns-uq-skip { display: grid; gap: 1px; padding: 3px 0; border-bottom: 1px dashed var(--rule); }
.ns-uq-skip:last-child { border-bottom: none; }
.ns-uq-fold { margin: 0; }
.ns-uq-err { margin: 0; color: var(--no); }
.ns-uq-mine { display: grid; gap: 3px; }
.ns-uq-mine .ns-sec-label { margin: 0; }
.ns-uq-foot { margin-top: 2px; }
.ns-uq-form { display: grid; gap: 12px; }
.ns-uq-sec { display: grid; gap: 6px; min-width: 0; }
.ns-uq-sec > .ns-sec-label { margin: 0; }
.ns-uq-line { align-items: flex-start; min-width: 0; }
.ns-uq-line > :last-child { flex: 1 1 auto; min-width: 0; }
.ns-uq-label { margin: 4px 0 0; min-width: 104px; }
.ns-uq-quote { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 6px; align-items: start; }
.ns-uq-quote .ns-area { width: 100%; }
.ns-uq-pick {
  display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 8px; align-items: center;
  padding: 4px 6px; border-radius: 4px; border: 1px solid var(--rule);
}
.ns-uq-pick.is-on { background: var(--accent-soft); border-color: #c6dcf6; }
.ns-uq-pick-text { min-width: 0; max-height: 7.5em; overflow: auto; }
.ns-uq-chunks { display: grid; gap: 4px; max-height: 280px; overflow: auto; }
/* 대화 실 (DEV-2026-0601 · ADR-052 D1) — 턴은 위에서 아래로 쌓이고, 턴 사이는 가는 실선 한 줄.
   사람의 말은 인용 바탕(노란 계열), 에이전트의 답은 판 안쪽 바탕 — 누가 한 말인지가 색으로 갈린다. */
.ns-uq-thread { display: grid; gap: 0; min-width: 0; }
.ns-uq-turn { display: grid; gap: 5px; min-width: 0; padding: 6px 0; border-top: 1px solid var(--rule); }
.ns-uq-turn:first-child { border-top: none; padding-top: 0; }
.ns-uq-said {
  display: grid; grid-template-columns: 2.4em minmax(0, 1fr); gap: 6px; align-items: baseline;
  padding: 5px 8px; border-radius: 4px; min-width: 0;
}
.ns-uq-said--said { background: var(--quote-bg); }
.ns-uq-said--reply { background: var(--paper-2); }
.ns-uq-who { font-size: var(--fs-xs); color: var(--ink-3); font-weight: 600; }
.ns-uq-words { margin: 0; white-space: pre-line; overflow-wrap: anywhere; min-width: 0; color: var(--ink); }
.ns-uq-conv { align-items: baseline; }
.ns-uq-talk { display: grid; gap: 4px; min-width: 0; padding-top: 6px; border-top: 1px solid var(--rule); }
.ns-uq-talk .ns-area { width: 100%; box-sizing: border-box; resize: vertical; }

/* ---- 문서 제거 창 · 자회사 문서 목록 (DEV-2026-0338 · ADR-037) ---------------------- */
.ns-dd .ns-modal-body { display: flex; flex-direction: column; gap: 10px; min-height: 0; flex: 1 1 auto; }
.ns-dd-scope { gap: 8px; }
.ns-dd-cards { margin: 0; font-weight: 600; }
.ns-dd-doc { border-top: 1px solid var(--rule); padding-top: 8px; }
.ns-dd-docname { margin: 0 0 6px; font-size: var(--fs-md); }
.ns-dd-table { width: 100%; }
.ns-dd-table td.ns-num, .ns-dd-table th.ns-num { text-align: right; white-space: nowrap; }
.ns-dd-task.is-out td { color: var(--ink-3); }
.ns-dd-change td.ns-dd-sub { padding-left: 22px; font-size: var(--fs-sm); color: var(--ink-2); }
.ns-dd-change.is-stuck td.ns-dd-sub { color: var(--no); }
.ns-dd-what { margin-right: 6px; }
.ns-dd-eff { font-size: var(--fs-sm); }
.ns-dd-effpart { display: inline-block; margin: 0 8px 0 0; white-space: nowrap; }
.ns-dd-effpart.is-gone { color: var(--no); font-weight: 600; }
.ns-dd-task td:first-child .ns-tag { margin-left: 6px; }
.ns-dd-task.is-gone td:first-child > span:first-child { text-decoration: line-through; color: var(--ink-3); }
.ns-dd-why { margin: 2px 0 0; font-size: var(--fs-sm); color: var(--no); }
.ns-dd-cardtable { margin: 2px 0 8px; }
.ns-dd-cardtable td:last-child .ns-dd-why { margin-left: 6px; }
.ns-dd-choice {
  border-top: 1px solid var(--rule); padding: 10px 0 4px; display: flex; flex-direction: column; gap: 8px;
  position: sticky; bottom: -11px; background: var(--paper); box-shadow: 0 -6px 10px -8px rgba(0, 0, 0, .25);
}
.ns-dd-ex { display: inline-flex; align-items: center; gap: 5px; margin-left: 10px; }
.ns-dd-foot { gap: 8px; }
.ns-dd-bad { margin: 6px 0 0; padding-left: 18px; }
.ns-dd-bad li { margin: 4px 0; }
.ns-dd-list .ns-row { margin-bottom: 8px; }
.ns-dd-bar { margin: 8px 0; }
.ns-dd-docrow.is-on td { background: var(--accent-soft); }
.ns-dd-out summary { font-size: var(--fs-sm); color: var(--ink-2); }

/* 검토 카드 박스 오른쪽 위 모서리 — [카드 수정] · [수정 취소] [수정 완료] (DEV-2026-0366 R3) */
.ns-card--review { position: relative; }
.ns-card-corner { position: absolute; top: 6px; right: 12px; z-index: 4; display: flex; }
.ns-card-corner .ns-card-tools { margin-left: 0; }

/* ---- 오른쪽 사이드바 폭 손잡이 (DEV-2026-0386) ------------------------------
   오른쪽 판의 왼쪽 경계 위에 선다. 폭은 `--side-w` 하나 — 판의 열 폭과 손잡이 자리가 같은
   변수를 읽어 함께 움직인다. 손잡이는 경계선 양쪽으로 4px 씩 잡히고, 누르거나 끄는 동안만
   파란 선이 보인다. */
.ns-screen.has-sidegrip { position: relative; }
.ns-sidegrip {
  position: absolute; top: 0; bottom: 0; right: var(--side-w); width: 9px; margin-right: -5px;
  cursor: col-resize; z-index: 6; touch-action: none; background: transparent;
}
.ns-sidegrip::after {
  content: ""; position: absolute; top: 0; bottom: 0; left: 4px; width: 1px; background: transparent;
}
.ns-sidegrip:hover::after, .ns-sidegrip.is-drag::after { width: 3px; left: 3px; background: var(--accent); }
.ns-sidegrip:focus-visible { outline: none; }
.ns-sidegrip:focus-visible::after { width: 3px; left: 3px; background: var(--accent); }
body.ns-sidedrag, body.ns-sidedrag * { cursor: col-resize !important; user-select: none !important; }
/* 좁은 창 — 판이 세로로 쌓이는 화면은 손잡이가 없다. */
@media (max-width: 1180px) {
  .ns-screen--peek > .ns-sidegrip, .ns-screen--panes3 > .ns-sidegrip,
  .ns-screen--panes2r > .ns-sidegrip, .ns-screen--vault > .ns-sidegrip { display: none; }
}
@media (max-width: 900px) {
  .ns-screen--compare > .ns-sidegrip { display: none; }
}

/* ---- 서고 문서 줄의 위계 (DEV-2026-0375) ---------------------------------------
   표(칸 넷)는 그대로 두고 문서 줄만 격자로 편다 — 이름(굵게 한 줄) · 경로(흐리게, 앞
   줄임) / 칩 줄 / 발췌 두 줄 · 맞는 구절, 단추 묶음은 오른쪽 위. 문서 줄이 있는 표는
   머리 칸 중 일자 정렬만 남긴다. 좁은 폭(560px 미만)에서는 단추가 맨 아래 줄로 내려간다. */
.ns-vt-table:has(.ns-vt-row--doc) { display: block; table-layout: auto; container-type: inline-size; }
.ns-vt-table:has(.ns-vt-row--doc) > thead,
.ns-vt-table:has(.ns-vt-row--doc) > tbody { display: block; }
.ns-vt-table:has(.ns-vt-row--doc) > thead > tr {
  display: flex; justify-content: flex-end; padding: 0 4px 6px; border-bottom: 1px solid var(--rule);
}
.ns-vt-table:has(.ns-vt-row--doc) > thead th { display: none; width: auto; padding: 0; border: 0; background: none; }
.ns-vt-table:has(.ns-vt-row--doc) > thead th:has(.ns-vt-sort) { display: block; }
.ns-vt-table:has(.ns-vt-row--doc) > tbody > tr:not(.ns-vt-row--doc) { display: block; }
.ns-vt-table:has(.ns-vt-row--doc) > tbody > tr:not(.ns-vt-row--doc) > td { display: block; width: auto; }
.ns-vt-table tr.ns-vt-row--doc {
  display: grid; grid-template-columns: minmax(0, 1fr) auto;
  grid-template-areas: "name tail" "meta meta" "snip snip";
  column-gap: 16px; row-gap: 6px; padding: 12px 14px 12px 16px;
  border-bottom: 1px solid var(--rule); background: var(--paper);
}
.ns-vt-table tr.ns-vt-row--doc > td {
  width: auto; padding: 0; border: 0; background: none; overflow: visible; min-width: 0;
}
.ns-vt-table tr.ns-vt-row--doc:hover { background: var(--paper-2); }
.ns-vt-table tr.ns-vt-row--doc:hover > td { background: none; }
.ns-vt-table tr.ns-vt-row--doc.is-on { background: var(--accent-soft); box-shadow: inset 3px 0 0 var(--accent); }
.ns-vt-table tr.ns-vt-row--doc.is-open { background: var(--paper-2); border-bottom-color: transparent; }
.ns-vt-table tr.ns-vt-row--doc > td:nth-child(1) { grid-area: name; font-weight: 400; }
.ns-vt-table tr.ns-vt-row--doc > td:nth-child(2) { grid-area: meta; }
.ns-vt-table tr.ns-vt-row--doc > td:nth-child(3) { grid-area: snip; }
.ns-vt-table tr.ns-vt-row--doc > td:nth-child(4) { grid-area: tail; align-self: start; }
.ns-vt-docname { font-size: var(--fs-lg); font-weight: 650; color: var(--ink); line-height: 1.35; }
.ns-vt-path {
  direction: rtl; text-align: left; margin-top: 2px;
  font-size: var(--fs-xs); color: var(--ink-3); line-height: 1.4;
}
.ns-vt-path > bdi { unicode-bidi: isolate; }
.ns-vt-meta { display: flex !important; flex-wrap: wrap; align-items: center; gap: 4px 6px; }
.ns-vt-chip {
  display: inline-flex; align-items: center; height: 20px; padding: 0 7px; border-radius: 10px;
  background: var(--paper-2); border: 1px solid var(--rule); color: var(--ink-2);
  font-size: var(--fs-xs); line-height: 1; white-space: nowrap; font-variant-numeric: tabular-nums;
}
.ns-vt-chip--date { color: var(--ink); border-color: var(--rule-strong); }
.ns-vt-chip--soft { background: none; border-color: transparent; color: var(--ink-3); padding: 0 2px; }
.ns-vt-row--doc .ns-vt-snip { display: grid; gap: 3px; color: var(--ink-2); }
.ns-vt-excerpt {
  font-size: var(--fs-md); line-height: 1.5; color: var(--ink-2);
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
  overflow-wrap: anywhere;
}
.ns-vt-excerpt + .ns-vt-excerpt { -webkit-line-clamp: 1; }
.ns-vt-hit { background: var(--quote-bg); color: var(--ink); font-weight: 650; padding: 0 1px;
  border-radius: 2px; box-shadow: inset 0 -2px 0 var(--quote-bar); }
.ns-vt-row--doc .ns-vt-fold { justify-self: start; margin-top: 2px; font-size: var(--fs-sm); }
.ns-vt-row--doc .ns-vt-tail { flex-direction: row; align-items: center; gap: 6px; flex-wrap: nowrap; }
.ns-vt-row--doc .ns-vt-tail > .ns-btn { white-space: nowrap; }
.ns-vt-row--doc.is-excluded .ns-vt-docname,
.ns-vt-row--doc.is-excluded .ns-vt-excerpt { color: var(--ink-3); }
.ns-vt-table:has(.ns-vt-row--doc) .ns-vt-sub > td { padding: 0 14px 12px 16px; border-bottom: 1px solid var(--rule); }
.ns-vt-table:has(.ns-vt-row--doc) .ns-vt-sub { background: var(--paper-2); }
@container (max-width: 560px) {
  .ns-vt-table tr.ns-vt-row--doc {
    grid-template-columns: minmax(0, 1fr);
    grid-template-areas: "name" "meta" "snip" "tail";
  }
  .ns-vt-row--doc .ns-vt-tail { flex-wrap: wrap; }
}

/* ---- 검토 사안 일괄 판정 (DEV-2026-0391) ------------------------------------ */
.ns-tag--plain { background: var(--paper); border-color: var(--rule-strong); color: var(--ink-2); }
.ns-bulk-bar { padding: 6px 11px; gap: 8px; border-bottom: 1px solid var(--rule); background: var(--paper-2); }
.ns-bulk-n { font-variant-numeric: tabular-nums; font-weight: 600; color: var(--ink); }
.ns-item-pick { display: flex; align-items: flex-start; background: var(--paper); border-bottom: 1px solid var(--rule); }
.ns-item-pick > .ns-item { flex: 1 1 auto; min-width: 0; border-bottom: none; }
.ns-item-tick { flex: none; width: 15px; height: 15px; margin: 10px 0 0 9px; accent-color: var(--accent); cursor: pointer; }
.ns-item-tick-off { flex: none; width: 15px; margin-left: 9px; }
.ns-bulk-reason { margin-bottom: 6px; }
.ns-bulk-tally { gap: 6px; margin: 4px 0 8px; }
.ns-bulk-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.ns-bulk-item {
  display: flex; flex-direction: column; gap: 6px; padding: 8px 10px;
  border: 1px solid var(--rule); border-left: 3px solid var(--ok); border-radius: 4px; background: var(--paper);
}
.ns-bulk-item.is-stop { border-left-color: var(--no); background: var(--paper-2); }
.ns-bulk-item-head { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; min-width: 0; }
.ns-bulk-item-head b { overflow-wrap: anywhere; }
.ns-bulk-why { margin: 0; font-size: var(--fs-sm); color: var(--no); overflow-wrap: anywhere; }
.ns-bulk-fix, .ns-bulk-none { margin: 0; font-size: var(--fs-sm); }
.ns-bulk-foot { padding: 10px 14px; gap: 8px; justify-content: flex-end; border-top: 1px solid var(--rule); background: var(--paper-2); }
/* 옛 값 → 새 값 줄 — 편집 화면 변경 이력(editor.css ns-hi-diff)과 같은 부품. 셸 한 장에도 싣는다. */
.ns-bulk .ns-hi-diff { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; font-size: var(--fs-xs); }
.ns-bulk .ns-hi-diff > li { display: flex; flex-wrap: wrap; gap: 2px 8px; align-items: baseline; }
.ns-bulk .ns-hi-field { flex: 0 0 12em; max-width: 100%; color: var(--ink-2); overflow-wrap: anywhere; }
.ns-bulk .ns-hi-was { color: var(--ink-2); overflow-wrap: anywhere; text-decoration: line-through; }
.ns-bulk .ns-hi-arrow { color: var(--ink-3); }
.ns-bulk .ns-hi-now { font-weight: 600; overflow-wrap: anywhere; }
#ns-root .ns-bulk-bar .ns-btn--go, #ns-root .ns-bulk-foot .ns-btn--go { color: #fff; }

/* ---- 추진경과 절 (DEV-2026-0397 → 0405 타임라인 — 마디 규칙은 .ns-tln) ---- */
.ns-upds > .ns-fold-body { padding: 8px 11px 6px; }
.ns-proof > .ns-fold-body > .ns-docsearch, .ns-proof > .ns-fold-body > .ns-fold:last-child { margin-bottom: 0; }

/* ---- 연결 인용 경고 (DEV-2026-0398 · 60-act cwPanel) ---------------------------- */
.ns-cw { max-width: 560px; }
.cw { display: flex; flex-direction: column; gap: 8px; }
.cw-what { margin: 0; color: var(--ink-2); overflow-wrap: anywhere; }
.cw-list { margin: 0; padding-left: 18px; display: flex; flex-direction: column; gap: 4px; }
.cw-list li > span + span { margin-left: 6px; }
.cw-steps, .cw-muted { color: var(--ink-3); font-size: var(--fs-sm); }
.cw-tag { color: var(--no); font-size: var(--fs-sm); }
.cw-row { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.cw-row > .ns-input { flex: 1; min-width: 0; }
.cw-row .is-on { border-color: var(--accent); color: var(--accent); }
.cw-res { padding: 6px 8px; border: 1px solid var(--rule); border-radius: 6px; background: var(--paper-2); }
.cw-why { margin: 4px 0 0; font-size: var(--fs-sm); color: var(--no); }

/* 근거 추가 창 — 위 서고 검색 · 넣을 카드, 아래 판 둘(지금 근거 | 참고한 문서 · 인용) · 판마다 스크롤(DEV-2026-0487) */
.ns-modal.ns-modal--wide.ns-evadd { width: min(1320px, 96vw); height: min(880px, 92vh); max-height: none; }
.ns-evadd-body { display: flex; flex-direction: column; gap: 10px; flex: 1 1 auto; min-height: 0; overflow: hidden; }
.ns-evadd-find { flex: 0 0 auto; flex-wrap: nowrap; }
.ns-evadd-find > .ns-input { min-width: 0; }
.ns-evadd-body > .cw { flex: 0 0 auto; max-height: 34%; overflow: auto; }
.ns-evadd-split { flex: 1 1 0; min-height: 0; display: grid; gap: 12px;
  grid-template-columns: minmax(0, 2fr) minmax(0, 3fr); grid-template-rows: minmax(0, 1fr); }
.ns-evadd-pane { min-height: 0; overflow: auto; padding: 0 10px 10px; border: 1px solid var(--rule);
  border-radius: 4px; background: var(--paper-2); }
.ns-evadd-pane > .ns-h { position: sticky; top: 0; z-index: 1; margin: 0 -10px 8px; padding: 8px 10px;
  background: var(--paper-2); border-bottom: 1px solid var(--rule); }
.ns-evadd-sub { margin: 12px 0 6px; font-size: var(--fs-sm); font-weight: 700; color: var(--ink-2); }
.ns-evadd-pane > .ns-h + .ns-evadd-sub, .ns-evadd-pane > .ns-h + .ns-evadd-sec > .ns-evadd-sub:first-child { margin-top: 0; }
.ns-evadd-list { display: flex; flex-direction: column; gap: 8px; }
.ns-evadd-row { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; padding: 8px 10px;
  border: 1px solid var(--rule); border-radius: 6px; background: var(--paper); overflow-wrap: anywhere; }
.ns-evadd-row.is-new { border-color: var(--ok); }
.ns-evadd-row.ns-evadd-doc { flex-direction: row; flex-wrap: wrap; align-items: center; column-gap: 10px; }
.ns-evadd-doc > b { flex: 1 1 240px; min-width: 0; }
.ns-evadd-line { align-self: stretch; display: flex; gap: 8px; align-items: flex-start; }
.ns-evadd-text { flex: 1 1 auto; min-width: 0; display: flex; flex-direction: column; gap: 4px; }
.ns-evadd-line > .ns-btn, .ns-evadd-line > .ns-hint { flex: 0 0 auto; }
.ns-evadd-row > .ns-actform { align-self: stretch; }
/* 같은 두 판을 긴 폼 안에(검토 사안 만들기 — DEV-2026-0496): 창이 아니라 판 높이를 고정 · 과제 근거 창의 진행 기록 폼 */
.ns-evadd-split.ns-evadd-split--inline { flex: none; height: min(480px, 58vh); }
.ns-evadd-sec > .ns-actform { margin-top: 8px; }
.ns-evadd-text .ns-muted > .ns-tag { margin-right: 4px; }
.cw-step { display: inline-flex; gap: 4px; align-items: center; }
/* 배제·삭제된 인용 — 흐리게 · 빨간 이름표 + 저장 안 됨(0411 ④⑦) */
.ns-gone-off { opacity: .6; display: inline-flex; gap: 4px; align-items: center; }
.ns-trace-ev.ns-gone-off { display: block; }
@media (max-width: 900px) { .ns-evadd-split { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr) minmax(0, 1fr); } }

/* ---- 충돌 판 (DEV-2026-0400 · 67-merge mergeBoard) — 다섯 자리가 같은 판 ---------------- */
.mg { display: flex; flex-direction: column; gap: 8px; }
.mg-tally, .mg-bar, .mg-pick, .mg-foot { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.mg-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; }
.mg-item { display: flex; flex-direction: column; gap: 6px; padding: 8px 10px; min-width: 0;
  border: 1px solid var(--rule); border-left: 3px solid var(--ok); border-radius: 4px; background: var(--paper); }
.mg-item.is-conflict { border-left-color: var(--hold); }
.mg-item.is-conflict[data-choice=""] { background: #fdf3e3; }
.mg-item.is-blocked { border-left-color: var(--no); background: var(--paper-2); }
.mg-head { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; min-width: 0; }
.mg-head b, .mg-body { overflow-wrap: anywhere; }
.mg-body, .mg-sub, .mg-at, .mg-hint, .mg-fix { color: var(--ink-2); font-size: var(--fs-sm); }
.mg-why { margin: 0; color: var(--no); font-size: var(--fs-sm); overflow-wrap: anywhere; }
.mg-fix, .mg-sub { margin: 0; }
.mg-cmp { width: 100%; border-collapse: collapse; font-size: var(--fs-sm); table-layout: fixed; }
.mg-cmp th { text-align: left; font-weight: 600; color: var(--ink-3); font-size: var(--fs-xs); padding: 2px 6px; }
.mg-cmp td { padding: 3px 6px; border-top: 1px solid var(--rule); overflow-wrap: anywhere; vertical-align: top; }
.mg-cmp-row td { color: var(--ink-3); font-size: var(--fs-xs); background: var(--paper-2); }
.mg-field { color: var(--ink-2); }
.mg-old { background: #fdecea; }
.mg-now { background: #e8f5ec; }
.mg-later { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 3px; font-size: var(--fs-sm); }
.mg-later > li { display: flex; flex-wrap: wrap; gap: 2px 8px; align-items: baseline; }
.mg-diff { color: var(--ink-2); overflow-wrap: anywhere; }
.mg-pick .is-on { box-shadow: inset 0 0 0 1px currentColor; }
.mg-foot { justify-content: flex-end; }
#ns-root .mg .ns-btn--go { color: #fff; }

/* 근거 영향 경고 (DEV-2026-0433, 60-act dwBlock · dwShort) — 문서 제거 창 맨 위 · 과제 문서 배제 폼 위. */
.dw { display: flex; flex-direction: column; gap: 6px; padding: 8px 10px; margin: 0 0 10px;
  border: 1px solid var(--rule); border-left: 3px solid var(--hold); border-radius: 6px; background: var(--paper-2); }
.dw--short { margin: 6px 0; }
.dw-head { font-size: var(--fs-md); }
.dw-nums { display: flex; flex-wrap: wrap; gap: 4px 12px; }
.dw-n b { margin-right: 4px; }
.dw-n.is-zero { color: var(--ink-3); }
.dw-n--warn { color: var(--no); font-weight: 700; }
.dw-mode { margin: 0; color: var(--ink-3); font-size: var(--fs-sm); }
.dw-mode.is-on { color: var(--ink); font-weight: 700; }
.dw-part { display: flex; flex-direction: column; gap: 2px; }
.dw-sub { font-size: var(--fs-sm); color: var(--ink-2); font-weight: 700; }
.dw-list { margin: 0; padding-left: 18px; display: flex; flex-direction: column; gap: 2px; font-size: var(--fs-sm); }
.dw-row > span + span { margin-left: 8px; }
.dw-cite { color: var(--ink-3); }
.dw-zero { color: var(--no); font-weight: 700; }
.dw-row.is-zero { color: var(--no); }

/* 요청 (DEV-2026-0423 · ADR-046 D3) — 과제 상세 · 자회사 현황의 '요청' 절 */
.ns-rq { border: 1px solid var(--rule); border-radius: 8px; padding: 8px 10px; margin: 6px 0 0; }
.ns-rq-head { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: 0 0 4px; }
.ns-rq-subject { font-weight: 650; }
.ns-rq-acts { margin: 6px 0 0; }
.ns-rq--line .ns-row { margin: 2px 0 0; }
/* 평가지표 절(DEV-2026-0426) — 줄 모양은 요청 절(ns-rq)과 같다. 근거 인용 후보는 체크 + 인용 + 문서 이름. */
.ns-kp-pick { display: grid; gap: 6px; flex: 1; min-width: 0; }
.ns-kp-cand { display: flex; align-items: flex-start; gap: 8px; cursor: pointer; }
.ns-kp-cand .ns-ev-quote { margin: 0; }
/* 영역 평가지표 절(DEV-2026-0679) — 줄 모양은 과제 평가지표와 같다. 영역 이름은 영역이 바뀌는 줄 위에 한 번. */
.ns-ka-area { margin: 10px 0 0; font-weight: 650; color: var(--ink-2); }
.ns-ka .ns-facts dd { overflow-wrap: anywhere; }

/* 사유 줄(ADR-048 D3 · DEV-2026-0449) — 접힘 안의 줄마다 이름표 · 문서 · 왜 · 누가 언제. */
.ns-reasons { list-style: none; margin: 0; padding: 0; display: grid; gap: 4px; }
.ns-reason { display: flex; flex-wrap: wrap; gap: 6px; align-items: baseline; font-size: var(--fs-sm); }
.ns-reason-doc { font-weight: 600; }
.ns-reason-why { flex: 1 1 12em; min-width: 0; }
.ns-reason-fold { margin: 4px 0; }
.ns-dd-tally { margin: 6px 0 0; font-weight: 600; }
/* 근거 없는 진행 기록 — 걸음의 '근거 없음'(ns-step--bare)과 같은 꼴 (0471) */
.ns-tln-node.is-bare > .ns-tln-card > .ns-tln-head { background: #fffaf0; box-shadow: inset 2px 0 0 #e8cf9f; }
.ns-tln-node.is-bare .ns-tln-text > .ns-tag--amb { margin-right: 6px; align-self: flex-start; }

/* ---- 좁은 창의 사이드바 — 본문 아래 · 높이 끌기 · 접기 (DEV-2026-0478) --------
   사용자 2026-10-02 "사이드바였던 게 그냥 화면을 다 가리면 쓰겠냐" · 보강 "본문 높이의 1/3,
   끌어서 조절, 검토판 왼쪽 목록은 왼쪽 그대로". 1360px 이하에서 과제 현황 · 검토의 오른쪽 판은
   본문 아래 칸(기본 1/3, `--side-h`)에 선다. 검토의 대기 목록은 왼쪽 칸에 남고, 아래 칸은 카드
   열 밑에만 선다. 손잡이 · [접기] 는 20-shell.js bindSideStack. 넓은 창은 종전 그대로. */
.ns-sidegrip-h, .ns-sidefold { display: none; }
body.ns-sidedrag-h, body.ns-sidedrag-h * { cursor: row-resize !important; user-select: none !important; }
@media (max-width: 1360px) {
  .ns-screen.ns-screen--peek:not(.is-alone) {
    grid-template-columns: minmax(0, 1fr);
    grid-template-rows: minmax(0, 1fr) var(--side-h, 33.333%);
  }
  .ns-screen.ns-screen--panes3 {
    --list-w: 300px;
    grid-template-columns: var(--list-w) minmax(0, 1fr);
    grid-template-rows: minmax(0, 1fr) var(--side-h, 33.333%);
  }
  .ns-screen--peek:not(.is-alone) > .ns-pane:nth-child(1) {
    grid-column: 1; grid-row: 1; border-right: none; border-bottom: 1px solid var(--rule-strong);
  }
  .ns-screen--peek:not(.is-alone) > .ns-pane:nth-child(2) { grid-column: 1; grid-row: 2; }
  .ns-screen--panes3 > .ns-pane:nth-child(1) {
    grid-column: 1; grid-row: 1 / span 2;
    border-right: 1px solid var(--rule-strong); border-bottom: none;
  }
  .ns-screen--panes3 > .ns-pane:nth-child(2) {
    grid-column: 2; grid-row: 1; border-right: none; border-bottom: 1px solid var(--rule-strong);
  }
  .ns-screen--panes3 > .ns-pane:nth-child(3) { grid-column: 2; grid-row: 2; border-bottom: none; }
  /* 접힘 — 판 머리줄(제목 · 탭)만 남고 본문이 그 높이를 쓴다(`--side-h` = 머리줄 높이, JS). */
  .ns-screen--peek.is-side-fold > .ns-pane:nth-child(2) > :not(:first-child),
  .ns-screen--panes3.is-side-fold > .ns-pane:nth-child(3) > :not(:first-child) { display: none; }
  .ns-screen--peek > .ns-sidegrip, .ns-screen--panes3 > .ns-sidegrip { display: none; }
  .ns-screen--peek > .ns-sidegrip-h, .ns-screen--panes3 > .ns-sidegrip-h {
    display: block; position: absolute; left: 0; right: 0; bottom: var(--side-h, 33.333%);
    height: 9px; margin-bottom: -5px; cursor: row-resize; z-index: 6; touch-action: none;
  }
  .ns-screen--panes3 > .ns-sidegrip-h { left: var(--list-w); }
  .ns-sidegrip-h::after {
    content: ""; position: absolute; left: 0; right: 0; top: 4px; height: 1px; background: transparent;
  }
  .ns-sidegrip-h:hover::after, .ns-sidegrip-h.is-drag::after,
  .ns-sidegrip-h:focus-visible::after { height: 3px; top: 3px; background: var(--accent); }
  .ns-sidegrip-h:focus-visible { outline: none; }
  .ns-screen--peek > .ns-sidefold, .ns-screen--panes3 > .ns-sidefold {
    display: block; position: absolute; right: 12px; bottom: var(--side-h, 33.333%);
    transform: translateY(calc(100% + 8px)); z-index: 7; height: 20px; padding: 0 10px;
    font: inherit; font-size: var(--fs-xs); line-height: 18px; color: var(--ink-2);
    background: var(--paper); border: 1px solid var(--rule-strong); border-radius: 10px; cursor: pointer;
  }
  /* 0501 — [접기] 는 아래 판 머리줄 오른쪽에 앉는다(경계선에 걸치지 않게) — 그 자리를 비운다. */
  .ns-screen--peek:not(.is-alone) > .ns-pane:nth-child(2) > :first-child,
  .ns-screen--panes3 > .ns-pane:nth-child(3) > :first-child { padding-right: 76px; }
  .ns-sidefold:hover { color: var(--ink); border-color: var(--accent); }
  .ns-sidefold:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
}
@media (max-width: 1180px) {
  .ns-screen.ns-screen--panes3 { --list-w: 260px; }
}

/* ---- 내가 올린 — 처리 단계 띠 (DEV-2026-0514) ------------------------------
   수신 → 적재 → 이해 → 검토 사안 N건 | 무관 종결. 완료는 승인색, 진행은 강조색 테두리,
   대기는 점선, 보류 · 중단은 그 상태의 색. 좁은 폭에서는 줄을 바꾼다(가로 넘침 없음). */
.ns-mine-steps { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 0; min-width: 0; }
.ns-mine-step {
  display: inline-flex; align-items: center; white-space: nowrap;
  font-size: 12px; line-height: 1.2; padding: 2px 7px; border-radius: 10px;
  border: 1px solid var(--rule); color: var(--ink-3); background: var(--paper);
}
.ns-mine-step + .ns-mine-step { margin-left: 14px; position: relative; }
.ns-mine-step + .ns-mine-step::before {
  content: "›"; position: absolute; left: -11px; color: var(--ink-3); font-weight: 700;
}
.ns-mine-step.is-done { color: var(--ok); border-color: var(--ok); background: #eaf6ef; }
.ns-mine-step.is-now { color: var(--accent); border-color: var(--accent); background: var(--accent-soft);
  font-weight: 700; }
.ns-mine-step.is-todo { border-style: dashed; }
.ns-mine-step.is-hold { color: var(--hold); border-color: var(--hold); }
.ns-mine-step.is-stop { color: var(--no); border-color: var(--no); font-weight: 700; }
.ns-mine-list { display: grid; gap: 8px; }
.ns-mine-row {
  display: grid; gap: 6px; min-width: 0; padding: 9px 12px;
  border: 1px solid var(--rule); border-radius: 4px; background: var(--paper);
}
.ns-mine-row-head { display: flex; align-items: baseline; gap: 10px; min-width: 0; }
.ns-mine-name { flex: 1; min-width: 0; text-align: left; font-weight: 700; overflow-wrap: anywhere; }
.ns-btn.ns-mine-name { white-space: normal; font-size: inherit; }
.ns-mine-at { flex: none; font-size: var(--fs-sm); color: var(--ink-3); }
.ns-mine-row-foot { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }

/* 과제 정리 (DEV-2026-0519) — 폼 · 삭제됨/병합됨 줄. 좁은 칸에서도 줄이 넘치지 않게 min-width 0. */
.ns-tidy { display: grid; gap: 8px; min-width: 0; }
.ns-tidy .ns-seg { justify-self: start; }
.ns-tidy .ns-area { width: 100%; min-width: 0; box-sizing: border-box; }
.ns-tidy-quotes { display: grid; gap: 4px; min-width: 0; }
.ns-tidy-q { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 2px 8px; align-items: start; }
.ns-tidy-qtext { overflow-wrap: anywhere; }
.ns-tidy-qdoc { grid-column: 2; font-size: 12px; overflow-wrap: anywhere; }
.ns-tidy-note { margin: 0; color: var(--ink-2); font-weight: 600; }
.ns-tidy-gone { display: grid; gap: 6px; min-width: 0; }
.ns-tidy-gone .ns-area { width: 100%; min-width: 0; box-sizing: border-box; }

/* 계획 과제의 진행 기록 — 기록 앞 단계 걸음 선택지 (DEV-2026-0523 · 0548 기본 꺼짐). 켜짐은 진행 색 띠, 끔은 회색 띠. */
.ns-planlead {
  border: 1px solid var(--rule); border-left: 3px solid var(--stage-진행); border-radius: 3px;
  background: var(--paper-2); padding: 7px 10px; margin: 0 0 8px; min-width: 0;
}
.ns-planlead.is-off { border-left-color: var(--rule); }
.ns-planlead-head { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; cursor: pointer; }
.ns-planlead.is-off .ns-planlead-head b { color: var(--ink-2); }
.ns-planlead-to { color: var(--ink-2); }
.ns-planlead-note { margin: 4px 0 0; color: var(--ink-2); font-size: 12px; overflow-wrap: anywhere; }
.ns-planlead .ns-fail { margin: 6px 0 0; }
.ns-mk-lead .ns-planlead { margin: 0; }

/* 일정 변경 이력 · 최근 일정 변경 (DEV-2026-0566) — 전 → 후 한 덩이, 방향은 글(색 아님). */
.ns-plans > .ns-fold-body { padding: 4px 11px 6px; }
.ns-plan-line { padding: 7px 0; border-bottom: 1px solid var(--rule); min-width: 0; }
.ns-plan-line:last-child { border-bottom: none; }
.ns-plan-line.is-back .ns-plan-pairs { color: var(--ink-3); }
.ns-plan-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; font-size: var(--fs-sm); }
.ns-plan-at { font-weight: 700; }
.ns-plan-pairs { display: flex; flex-wrap: wrap; gap: 2px 14px; margin: 3px 0 0; min-width: 0; grid-column: 1 / -1; }
.ns-plan-pair { display: inline-flex; flex-wrap: wrap; align-items: baseline; gap: 0 6px; min-width: 0; }
.ns-plan-key { font-size: var(--fs-xs); color: var(--ink-3); }
.ns-plan-move { font-size: var(--fs-xs); border: 1px solid var(--rule); border-radius: 3px; padding: 0 5px; color: var(--ink-2); }
.ns-plan-reason { margin: 3px 0 0; font-size: var(--fs-sm); color: var(--ink-2); overflow-wrap: anywhere; }
.ns-plan-recent .ns-row { align-items: center; flex-wrap: wrap; }

/* 판 반영 카드의 판 문서 한 줄(DEV-2026-0570 · ADR-051 D7) — 문서 이름 · 문서일 · 문서 근거 꼴. */
.ns-edition-doc { display: flex; flex-direction: column; gap: 3px; padding: 7px 9px; border: 1px solid var(--rule);
  border-radius: 6px; background: var(--paper-2); overflow-wrap: anywhere; }

/* ---- 승인 뒤 과제 현황 (DEV-2026-0592 · ADR-051 D10) -------------------------------------
 * 단건 [미리 보기] 판 — 과제 현황 부품 그대로(진행 상태 · 과제 찾기 · 과제 일정)를 크게 연다. 달라진 자리만
 * 색: 새 과제(초록) · 보관(빨강, 지움 줄) · 변경(호박, 바뀐 글자는 형광). 막대 바탕은 단계 색 그대로다. */
/* 승인 뒤 과제 현황 창 (DEV-2026-0597) — 머리(이름 · 카드 · 전후 과제 수 · 범례) · 회사 줄 · 과제 현황.
   레일 없음 · 쓰기 단추(.ns-hint)와 과제 일정 [새 창]은 접는다 — 이 창은 읽기만이다. */
#ns-root.is-pvw { grid-template-columns: minmax(0, 1fr); grid-template-rows: auto auto minmax(0, 1fr); }
#ns-root.is-pvw .ns-hint, #ns-root.is-pvw .ns-gt-views { display: none !important; }
.ns-pvw-wrap { grid-column: 1 / -1; min-width: 0; background: var(--paper); border-bottom: 1px solid var(--rule-strong); }
.ns-pvw-wrap > .ns-top { border-bottom: 1px solid var(--rule); }
.ns-pvw-card { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 10px; min-width: 0; flex: 1 1 280px; }
.ns-pvw-cardname { min-width: 0; overflow-wrap: anywhere; }
.ns-pvw-band { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 28px; padding: 10px 16px 12px; min-width: 0; }
.ns-pvw-total { display: inline-flex; flex-wrap: wrap; align-items: baseline; gap: 4px 12px; min-width: 0; }
.ns-pvw-scope { font-size: var(--fs-lg); font-weight: 600; color: var(--ink-2); }
.ns-pvw-was, .ns-pvw-will { font-size: var(--fs-4xl); line-height: 1.1; font-variant-numeric: tabular-nums; }
.ns-pvw-was { color: var(--ink-3); font-weight: 600; }
.ns-pvw-will { color: var(--ink); font-weight: 800; }
.ns-pvw-arrow { font-size: var(--fs-2xl); color: var(--ink-3); }
.ns-pvw-pair { font-size: var(--fs-xs); }
.ns-pvw-keys { flex: 1 1 340px; min-width: 0; }
.ns-pvw-gap { height: 0; }
.ns-subchip .ns-pv-n { margin-left: 6px; font-size: var(--fs-xs); }
.ns-pv-legend { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 14px; padding: 7px 10px;
                font-size: var(--fs-sm); color: var(--ink-2); background: var(--paper-2);
                border: 1px solid var(--rule); border-radius: 4px; }
.ns-pv-key { display: inline-flex; align-items: center; gap: 5px; }
.ns-pv-key b, .ns-pv-kind b { color: var(--ink); }
.ns-pv-swatch { display: inline-block; width: 16px; height: 10px; border-radius: 2px; border: 2px solid; }
.ns-pv-swatch.is-pv-new { border-color: var(--pv-new); background: var(--pv-new-bg); }
.ns-pv-swatch.is-pv-gone { border-color: var(--pv-gone); background: var(--pv-gone-bg); }
.ns-pv-swatch.is-pv-chg { border-color: var(--pv-chg); background: var(--pv-chg-bg); }
.ns-pv-kind { display: inline-flex; align-items: baseline; gap: 4px; padding: 0 6px; border-radius: 3px;
              background: var(--pv-chg-bg); color: #6b4700; font-size: var(--fs-xs); white-space: nowrap; }
.ns-pv-n { color: #6b4700; background: var(--pv-chg-bg); border-radius: 3px; padding: 0 5px; font-weight: 600; }
/* 변경분만(0632) — 보기 단추 · 대상 묶음 · 걸음 줄 · 옛 값 → 새 값 */
.ns-pvw-seg { flex: 0 0 auto; }
.ns-pv-group { border-left: 3px solid var(--pv-chg); padding-left: 12px; min-width: 0; }
.ns-pv-group-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 8px; min-width: 0; margin-bottom: 6px; }
.ns-pv-group-name { min-width: 0; overflow-wrap: anywhere; font-size: var(--fs-md); }
.ns-pv-step { padding: 6px 0; border-top: 1px solid var(--rule); min-width: 0; }
.ns-pv-step-head { display: flex; flex-wrap: wrap; align-items: baseline; gap: 4px 8px; font-size: var(--fs-xs); margin-bottom: 3px; }
.ns-pv-step-no { font-weight: 700; color: var(--ink-2); font-variant-numeric: tabular-nums; }
.ns-pv-group .ns-hi-diff { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; font-size: var(--fs-sm); }
.ns-pv-group .ns-hi-diff > li { display: flex; flex-wrap: wrap; gap: 2px 8px; align-items: baseline; min-width: 0; }
.ns-pv-group .ns-hi-field { flex: 0 0 9em; max-width: 100%; color: var(--ink-2); overflow-wrap: anywhere; }
.ns-pv-group .ns-hi-was { color: var(--ink-2); overflow-wrap: anywhere; text-decoration: line-through; min-width: 0; }
.ns-pv-group .ns-hi-arrow { color: var(--ink-3); }
.ns-pv-group .ns-hi-now { font-weight: 600; overflow-wrap: anywhere; min-width: 0; }
/* 과제 줄 */
.ns-rowitem.is-pv-new { background: var(--pv-new-bg); border-left-color: var(--pv-new); }
.ns-rowitem.is-pv-gone { background: var(--pv-gone-bg); border-left-color: var(--pv-gone); }
.ns-rowitem.is-pv-gone .ns-rowitem-name { text-decoration: line-through; color: var(--ink-2); }
.ns-rowitem.is-pv-chg { background: var(--pv-chg-bg); border-left-color: var(--pv-chg); }
.ns-rowitem.is-pv-new.is-on, .ns-rowitem.is-pv-gone.is-on, .ns-rowitem.is-pv-chg.is-on { box-shadow: inset 0 0 0 2px var(--accent); }
.ns-rowitem .is-pv-hit, #ns-root.is-pvw .ns-no.is-pv-hit { background: var(--pv-hit); border-radius: 2px; padding: 0 2px; }
.ns-areahead.is-pv-has { border-left: 3px solid var(--pv-chg); }
/* 간트 줄 · 막대 — 줄 바탕은 물, 막대는 테두리. 지금 계획 구간은 점선 테두리로 같은 축에. */
.ns-gt-row.is-pv-new .ns-gt-track { background: var(--pv-new-bg); }
.ns-gt-row.is-pv-gone .ns-gt-track { background: var(--pv-gone-bg); }
.ns-gt-row.is-pv-chg .ns-gt-track { background: var(--pv-chg-bg); }
.ns-gt-row.is-pv-under .ns-gt-track { background: linear-gradient(90deg, var(--pv-chg-bg), transparent 60%); }
.ns-gt-bar.is-pv-new { box-shadow: 0 0 0 2px var(--pv-new); }
.ns-gt-bar.is-pv-chg { box-shadow: 0 0 0 2px var(--pv-chg); }
.ns-gt-bar.is-pv-gone { opacity: .4; box-shadow: 0 0 0 2px var(--pv-gone); }
/* 승인 뒤 미리보기 — 검토판 [과제 현황] 탭 맨 위 표(DEV-2026-0633). 점선 테두리 · '승인 뒤' 칸 물이 미리보기 표지. */
.ns-pva { margin: 0 0 12px; border: 1px dashed var(--pv-chg); border-radius: 6px; background: var(--paper); }
.ns-pva > summary { padding: 7px 10px; cursor: pointer; display: flex; align-items: center; gap: 6px; }
.ns-pva > .ns-fold-body { padding: 0 10px 10px; display: grid; gap: 8px; min-width: 0; }
.ns-pva-targets { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; min-width: 0; }
.ns-pva-targets .ns-subchip { max-width: 100%; }
.ns-pva-targets .ns-subchip span { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ns-pva-grid { display: grid; grid-template-columns: minmax(64px, .7fr) minmax(0, 1fr) minmax(0, 1fr);
               border: 1px solid var(--rule); border-radius: 4px; font-size: var(--fs-sm); min-width: 0; }
.ns-pva-row, .ns-pva-sec { display: contents; }
.ns-pva-row > span { padding: 5px 8px; border-top: 1px solid var(--rule); min-width: 0; overflow-wrap: anywhere; }
.ns-pva-row--head > span { border-top: 0; font-size: var(--fs-xs); color: var(--ink-3); background: var(--paper-2); }
.ns-pva-sec > span { grid-column: 1 / -1; padding: 6px 8px 3px; border-top: 1px solid var(--rule);
                     font-size: var(--fs-xs); font-weight: 600; color: var(--ink-2); background: var(--paper-2); }
.ns-pva-label { color: var(--ink-2); }
.ns-pva-row.is-sub .ns-pva-label { padding-left: 18px; color: var(--ink-3); }
.ns-pva-will { background: var(--pv-chg-bg); }
.ns-pva-row--head .ns-pva-will { background: var(--pv-chg-bg); color: #6b4700; font-weight: 600; }
.ns-pva-row.is-chg .ns-pva-will { box-shadow: inset 3px 0 0 var(--pv-chg); color: var(--ink); font-weight: 600; }
.ns-pva-row.is-add .ns-pva-will { box-shadow: inset 3px 0 0 var(--pv-new); background: var(--pv-new-bg); }
.ns-pva-will.is-none { color: var(--ink-3); font-weight: 400; font-style: italic; }
.ns-pva-nonelist { margin: 0; font-size: var(--fs-xs); }
.ns-gt-row.is-pv-gone .ns-gt-namehit { text-decoration: line-through; }
.ns-gt-pvwas { position: absolute; top: 3px; height: 30px; border: 2px dashed var(--pv-chg); border-radius: 3px;
               background: transparent; pointer-events: none; }

/* 체크리스트 절 (DEV-2026-0659) — 항목 줄 · 근거 한 줄 · 미충족 수 줄. */
.ns-ck-lines { list-style: none; margin: 2px 0 0; padding: 0; display: grid; gap: 2px; min-width: 0; }
.ns-ck-line { font-size: var(--fs-sm); color: var(--ink-2); overflow-wrap: anywhere; min-width: 0; }
.ns-ck-origin { margin-left: auto; font-size: var(--fs-xs); }
/* 두 묶음(0675) — 공통 체크리스트 · 운영 체크리스트 */
.ns-ck-group { display: grid; gap: 6px; margin-top: 8px; min-width: 0; }
.ns-ck-group-head { flex-wrap: wrap; gap: 6px; padding-bottom: 2px; border-bottom: 1px solid var(--rule); }
.ns-ck-group-name { font-size: var(--fs-sm); }
.ns-ck.is-wait .ns-rq-subject { color: var(--ink-3); }
.ns-ck-asof { margin: 6px 0 0; font-size: var(--fs-xs); }
.ns-ck-item { margin: 4px 0 0; }
.ns-ck-sum { flex-wrap: wrap; gap: 6px 10px; align-items: center; }

/* 검토 사안 이력 · 줄의 사안 (DEV-2026-0664) */
.ns-ch-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 8px; }
.ns-ch-row { border: 1px solid var(--rule); border-radius: 6px; padding: 8px 10px; background: var(--paper); min-width: 0; }
.ns-ch-at { font-variant-numeric: tabular-nums; }
.ns-ch-what { margin: 4px 0 2px; overflow-wrap: anywhere; }
.ns-ch-who { margin: 0 0 4px; display: flex; flex-wrap: wrap; gap: 2px 12px; font-size: var(--fs-xs); }
.ns-cardref { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: 6px 0 0; font-size: var(--fs-xs); min-width: 0; }

/* ---- 운영 관리 — 월간 점검표 (DEV-2026-0683 · ADR-058 D5 · 0691 보정 2) ------------------------
   칸 둘(ns-screen--peek — 과제현황과 같은 칸 규칙 · 폭 손잡이 · 1360 이하 아래 칸): 왼쪽 목록 | 오른쪽 과제 판.
   표의 열은 서비스 · 마지막 기록 둘(판정 열 없음). 마지막 기록은 1000 이하에서 접는다.
   강조(④): 미충족 · 판정 못 함 · 제안 지표 · 마지막 기록 · 마지막 판정은 굵게 · 색, 다 충족인 줄과 충족 막대는 가라앉힌다. */
.ns-ops-body { padding: 16px 20px 28px; }
.ns-ops-head { display: flex; flex-direction: column; gap: 8px; margin: 0 0 12px; }
.ns-ops-titlerow, .ns-ops-sums { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.ns-ops-title { margin: 0; font-size: var(--fs-3xl); font-weight: 700; letter-spacing: -.01em; }
.ns-ops-spacer { flex: 1 1 auto; }
.ns-ops-sum { font-size: var(--fs-sm); }
.ns-ops-card { background: var(--paper); border: 1px solid var(--rule); border-radius: 6px; overflow: hidden; }
.ns-ops-cardhead {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 10px 12px;
  border-bottom: 1px solid var(--rule);
}
.ns-ops-cardhead > b { font-size: var(--fs-lg); }
.ns-ops-cardnote { margin-left: auto; display: flex; align-items: center; gap: 6px 10px; flex-wrap: wrap;
  font-size: var(--fs-sm); color: var(--ink-3); }
.ns-ops-mark, .ns-ck-mark { color: var(--ink); white-space: nowrap; font-size: var(--fs-sm); }
.ns-ops-mark b, .ns-ck-mark b { font-weight: 700; font-variant-numeric: tabular-nums; }
.ns-ck-mark.is-none { color: var(--ink-3); }
.ns-ops-tablewrap { overflow-x: auto; }
.ns-ops-table th, .ns-ops-table td { vertical-align: middle; }
.ns-ops-table th { position: static; white-space: nowrap; }
.ns-ops-svcline { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.ns-ops-strip { display: flex; align-items: center; gap: 4px 10px; margin: 6px 0 0; flex-wrap: wrap; }
.ns-ops-bars { display: inline-flex; gap: 3px; flex: 0 0 auto; }
.ns-ops-bar { width: 26px; height: 6px; border-radius: 1px; background: var(--paper); border: 1px dashed var(--rule-strong); }
.ns-ops-bar.ns-ops-gap { margin-left: 6px; }
.ns-ops-unmet { font-size: var(--fs-sm); font-weight: 700; color: var(--no); white-space: nowrap; }
.ns-ops-und { font-size: var(--fs-sm); font-weight: 700; color: var(--hold); white-space: nowrap; }
.ns-ops-kpis { display: flex; flex-wrap: wrap; gap: 6px; margin: 6px 0 0; }
.ns-ops-chip {
  display: inline-flex; align-items: center; gap: 6px; flex-wrap: wrap; padding: 2px 8px; min-width: 0;
  border: 1px solid var(--rule); border-radius: 4px; background: var(--paper-2); font-size: var(--fs-sm);
  color: var(--ink-2);
}
.ns-ops-chip.is-look { border-color: #e8cf9f; background: #fdf3e3; color: var(--ink); }
.ns-ops-chip--blank { border-style: dashed; background: var(--paper); color: var(--ink-3); }
.ns-ops-latest { font-variant-numeric: tabular-nums; }
.ns-ops-period { color: var(--ink-3); font-variant-numeric: tabular-nums; }
.ns-ops-blank { display: inline-block; width: 40px; height: 16px; border: 1px dashed var(--rule-strong); border-radius: 3px; }
.ns-ops-last { font-size: var(--fs-sm); color: var(--ink); white-space: nowrap; font-variant-numeric: tabular-nums; width: 1%; }
.ns-ops-last.is-none { color: var(--ink-3); }
.ns-ops-grp td { background: var(--paper-2); padding: 3px 8px; }
.ns-ops-fold {
  display: inline-flex; align-items: center; gap: 8px; flex-wrap: wrap; border: none; background: none; padding: 2px 0;
  cursor: pointer; color: var(--ink); text-align: left; font: inherit;
}
.ns-ops-fold:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.ns-ops-caret { color: var(--ink-3); width: 10px; }
.ns-ops-grpsub, .ns-ops-grpn { font-size: var(--fs-sm); color: var(--ink-2); }
.ns-ops-row { cursor: pointer; }
.ns-ops-row:hover td { background: var(--paper-2); }
.ns-ops-row.is-due > td:first-child { box-shadow: inset 3px 0 0 var(--no); }
.ns-ops-row.is-calm .ns-ops-svc { font-weight: 500; color: var(--ink-2); }
.ns-ops-row.is-calm .ns-ops-last { color: var(--ink-2); }
.ns-ops-row.is-on td { background: var(--accent-soft); }
.ns-ops-row.is-on > td:first-child { box-shadow: inset 3px 0 0 var(--accent); }
.ns-ops-svc {
  border: none; background: none; padding: 0; margin: 0; font: inherit; font-weight: 600; color: var(--ink);
  text-align: left; cursor: pointer; overflow-wrap: anywhere;
}
.ns-ops-svc:hover, .ns-ops-row.is-on .ns-ops-svc { color: var(--accent); }
.ns-ops-svc:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.ns-ops-go { cursor: pointer; }
.ns-ops-go:hover { outline: 1px solid var(--accent); outline-offset: 1px; }
/* 좁은 창(1360 이하)에서 고른 줄이 없으면 오른쪽 칸을 접는다 — 과제현황의 '고른 과제 없음' 과 같은 한 칸. */
@media (max-width: 1360px) {
  .ns-screen.ns-screen--peek.ns-screen--ops.is-blank { grid-template-columns: minmax(0, 1fr); grid-template-rows: minmax(0, 1fr); }
  .ns-screen--ops.is-blank > .ns-pane:nth-child(2),
  .ns-screen--ops.is-blank > .ns-sidegrip-h, .ns-screen--ops.is-blank > .ns-sidefold { display: none; }
}
@media (max-width: 1000px) {
  .ns-ops-wide { display: none; }
  .ns-ops-body { padding: 12px 12px 24px; }
}

/* 과제 평가지표 · 영역 평가지표 — 두 층(0691 ③). 머리 띠 · 여백 · 접힘이 따로이고, 영역 층은 왼쪽 띠 색이 다르다.
   확인이 필요한 줄(제안 지표 · 미충족 · 판정 못 함 점검 항목)은 왼쪽 띠, 충족 줄은 가라앉힌다. */
/* 0718 — 두 층의 절은 추진경과와 같은 격(같은 접이식 ns-fold · 머리 글 · 몸 여백 · 폭). 영역 층만 머리 왼쪽 띠 색이 다르다. */
.ns-kl { padding: 0; }
.ns-kl--area > .ns-kl-fold > summary { box-shadow: inset 3px 0 0 var(--stage-운영중); }
.ns-kl-fold > summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.ns-kl-fold > summary .ns-sec-label { display: inline; margin: 0; font-size: inherit; font-weight: inherit; color: inherit; }
.ns-kl-fold > .ns-fold-body, .ns-ck-fold > .ns-fold-body { padding: 8px 11px 6px; }
.ns-kl-fold > .ns-fold-body > .ns-rq:first-child { margin-top: 0; }
/* 추진경과 · 과제 평가지표 — 테두리 한 단계 두껍게(0718, 같은 두께 · 같은 색). */
.ns-fold.ns-upds, .ns-kl--task > .ns-fold.ns-kl-fold { border-width: 2px; }
/* 확인 필요 — 그 자리에서 펴는 제안(0718). */
.ns-kp-need {
  display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; width: 100%; min-width: 0; margin: 0 0 8px;
  padding: 6px 10px; border: 1px solid #ecd3a8; border-radius: 3px; background: #fdf3e3; box-shadow: inset 3px 0 0 var(--ev-caution);
  color: var(--ev-caution); font: inherit; text-align: left; cursor: pointer;
}
.ns-kp-need:hover { border-color: var(--ev-caution); }
.ns-kp-need:focus-visible, .ns-ev-ref--go:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.ns-kp-need-mark { width: 10px; color: var(--ink-3); }
.ns-kp-need-sum { color: var(--ink-2); font-size: var(--fs-sm); }
.ns-kp-need-box { display: grid; gap: 8px; margin: 0 0 10px; min-width: 0; }
.ns-kp-need-card { margin: 0; box-shadow: inset 3px 0 0 var(--hold); min-width: 0; }
.ns-kp-need-step { margin-top: 6px; min-width: 0; }
.ns-kp-need-name { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; margin: 0 0 4px; }
.ns-kp-need-why { margin: 6px 0; color: var(--ink-2); overflow-wrap: anywhere; }
.ns-ev-ref--go { display: block; width: 100%; text-align: left; cursor: pointer; border-top: 0; border-right: 0; border-bottom: 0; font-family: inherit; }
.ns-ev-ref--go:hover { text-decoration: underline; }
.ns-kp.is-need { border-color: var(--ev-caution); }
.ns-need-go { cursor: pointer; }
.ns-need-go:hover { text-decoration: underline; }
.ns-st-upds > .ns-row { margin: 0 0 6px; }
.ns-kp[data-kp-status="proposed"], .ns-ka[data-ka-status="proposed"] { box-shadow: inset 3px 0 0 var(--hold); }
/* 평가지표 한 절(0730) — 공통 점검은 절 안의 접힘 · 과제 평가지표 줄 위에 작은 머리. */
.ns-kl--task .ns-ck-fold-block { margin: 0 0 10px; }
.ns-kl-sub { margin: 4px 0 6px; }

/* 과제 찾기 확장(0691 · ADR-058 D6) — 거르기 줄(미리 맞춤 · 단계 · 묶음 · 줄 표시) · 걸러진 셈 · 줄 표시 */
.ns-find-filters { display: grid; gap: 6px; margin: 4px 0 8px; }
.ns-find-row { align-items: center; gap: 8px; flex-wrap: wrap; min-width: 0; }
.ns-find-key { font-size: var(--fs-xs); color: var(--ink-3); min-width: 52px; }
.ns-find-sums { flex-wrap: wrap; gap: 6px 10px; align-items: center; margin: 0 0 8px; }
.ns-find-last { color: var(--ink); font-weight: 700; }
.ns-find-ops { display: flex; flex-direction: column; gap: 4px; width: 100%; min-width: 0; }
.ns-find-ops .ns-ops-strip, .ns-find-ops .ns-ops-kpis { margin: 0; }
.ns-rowitem.is-due { box-shadow: inset 3px 0 0 var(--no); }
.ns-rowitem.is-calm .ns-rowitem-name { font-weight: 500; color: var(--ink-2); }
.ns-areahead-sub { font-weight: 400; }

/* 체크리스트 절 접힘(0691 보정 3) — 머리줄에 수만(충족 m/n · 미충족 · 마지막 기록 · 마지막 판정) */
.ns-ck-fold > summary { list-style: none; cursor: pointer; flex-wrap: wrap; gap: 6px 10px; align-items: center; border-radius: 3px; }
.ns-ck-fold > summary::-webkit-details-marker { display: none; }
.ns-ck-fold > summary::before { content: "▸"; color: var(--ink-3); width: 10px; }
.ns-ck-fold[open] > summary::before { content: "▾"; }
.ns-ck-fold > summary .ns-sec-label { margin: 0; font-size: inherit; font-weight: 700; color: var(--ink); }
.ns-ck-fold > summary:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.ns-ck-body { margin-top: 0; }

/* 체크리스트 확인 필요(0695) — 지연 · 이슈 곁의 칩(누르면 과제 찾기 거르기) · 과제 판 맨 위 띠(0691 확인 필요 띠 꼴). */
.ns-chip--go { cursor: pointer; font: inherit; font-size: var(--fs-md); }
.ns-chip--go:hover { border-color: var(--ink-3); }
.ns-chip--go:focus-visible, .ns-ck-band:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.ns-ck-band {
  display: flex; flex-wrap: wrap; align-items: center; gap: 6px 8px; width: 100%; min-width: 0;
  margin: 0 0 10px; padding: 7px 10px; border: 1px solid #e7bdb7; border-radius: 3px;
  background: #fdf4f3; box-shadow: inset 3px 0 0 var(--no); color: var(--no);
  font: inherit; font-size: var(--fs-sm); text-align: left; cursor: pointer;
}
.ns-ck-band b { font-weight: 700; }
/* 평가 사슬(DEV-2026-0700 · ADR-061) — 상태 여섯 색 · 판정 못 함 점선 · 요청 유형 다섯 칩 */
.ns-tag--ev-normal { color: var(--ev-normal); border-color: var(--ev-normal); background: #eef8f1; }
.ns-tag--ev-caution { color: var(--ev-caution); border-color: var(--ev-caution); background: #fdf3e3; }
.ns-tag--ev-risk { color: #fff; border-color: var(--ev-risk); background: var(--ev-risk); font-weight: 700; }
.ns-tag--ev-unmeasured { color: var(--ev-unmeasured); border-color: var(--ev-unmeasured); background: #eef2f9; }
.ns-tag--ev-not_applicable { color: var(--ev-not_applicable); border-color: var(--rule); background: var(--paper); }
.ns-tag--ev-no_premise { color: var(--ev-no_premise); border-color: var(--ev-no_premise); background: #f3eff9; }
.ns-tag--ev-undetermined { color: var(--ink-3); border: 1px dashed var(--rule-strong); background: var(--paper); }
.ns-tag[class*="ns-tag--rt-"] { border-radius: 3px; font-weight: 700; background: var(--paper); }
.ns-tag--rt-check { color: var(--ev-unmeasured); border-color: var(--ev-unmeasured); }
.ns-tag--rt-action { color: var(--ev-risk); border-color: var(--ev-risk); }
.ns-tag--rt-review { color: var(--ev-no_premise); border-color: var(--ev-no_premise); }
.ns-tag--rt-approval { color: var(--ev-normal); border-color: var(--ev-normal); }
.ns-tag--rt-report { color: var(--ink); border-color: var(--ink); box-shadow: inset 0 0 0 1px var(--ink); }
.ns-ops-bar.is-normal { background: var(--ev-normal); border: 1px solid var(--ev-normal); opacity: .4; }
.ns-ops-bar.is-caution { background: var(--ev-caution); border: 1px solid var(--ev-caution); }
.ns-ops-bar.is-risk { background: var(--ev-risk); border: 1px solid var(--ev-risk); }
.ns-ops-bar.is-unmeasured { background: var(--ev-unmeasured); border: 1px solid var(--ev-unmeasured); }
.ns-ops-bar.is-not_applicable { background: var(--rule); border: 1px solid var(--rule); }
.ns-ops-bar.is-no_premise { background: var(--ev-no_premise); border: 1px solid var(--ev-no_premise); }
.ns-ops-bar.is-undetermined { background: var(--paper); border: 1px dashed var(--ink-3); }
.ns-ev-list { display: grid; gap: 6px; min-width: 0; }
.ns-ev[data-ev-row-state="risk"] { box-shadow: inset 3px 0 0 var(--ev-risk); }
.ns-ev[data-ev-row-state="caution"] { box-shadow: inset 3px 0 0 var(--ev-caution); }
.ns-ev[data-ev-row-state="unmeasured"] { box-shadow: inset 3px 0 0 var(--ev-unmeasured); }
.ns-ev[data-ev-row-state="no_premise"] { box-shadow: inset 3px 0 0 var(--ev-no_premise); }
.ns-ev-measure, .ns-ev-crit, .ns-ev-line, .ns-ev-trig { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px;
  margin: 3px 0 0; font-size: var(--fs-sm); color: var(--ink-2); min-width: 0; overflow-wrap: anywhere; }
.ns-ev-key { color: var(--ink-3); font-size: var(--fs-xs); }
.ns-ev-why { margin: 3px 0 0; font-size: var(--fs-xs); overflow-wrap: anywhere; }
.ns-ev-premise, .ns-ev-quiet { font-size: var(--fs-sm); color: var(--ink-2); white-space: nowrap; }
.ns-ev-premise.is-none { color: var(--ev-no_premise); font-weight: 700; }
.ns-ev-quiet { color: var(--ev-normal); }
.ns-ev-ref { margin: 4px 0 0; padding: 3px 8px; border-left: 3px solid var(--ev-caution); background: #fdf3e3;
  color: var(--ev-caution); font-size: var(--fs-sm); font-weight: 700; }
.ns-ev-sec { display: grid; gap: 6px; margin-top: 10px; min-width: 0; }
.ns-ev-sec > .ns-sec-label { margin: 0; }
.ns-ev-gaps { margin: 0; padding-left: 18px; font-size: var(--fs-sm); color: var(--ink-2); }
.ns-ev-gap { overflow-wrap: anywhere; }
.ns-ka-area { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }

/* ---- 할 일 머리 · 자회사 담당자 판 (DEV-2026-0706 · ADR-062 D3 · D4 · D5) ---------------------- */
.ns-todo-head { margin-bottom: 0; }
.ns-todo-chips { margin: 6px 0; }
.ns-chip--go.is-on { border-color: var(--accent); box-shadow: inset 0 -2px 0 var(--accent); color: var(--ink); }
.ns-todo-lines { margin: 4px 0 2px; }
.ns-todo-line .ns-rowitem-name { white-space: normal; overflow-wrap: anywhere; }
.ns-st-mn { font-size: var(--fs-sm); color: var(--ink-2); }
.ns-st-acts { margin-top: 4px; min-width: 0; }
.ns-st-up { margin: 4px 0; }
.ns-st-form .ns-row { min-width: 0; }
.ns-st-pick { flex: 1; min-width: 0; }

/* ---- 제출 증빙 — 상태 띠 · [확인] · [거절] (ADR-062 부칙 10-27) ------------------------------------- */
.ns-evs-block { margin: 8px 0 0; display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.ns-evs { border-left: 3px solid #e8cf9f; padding: 2px 0 2px 10px; min-width: 0; }
.ns-evs[data-evs-status="confirmed"] { border-left-color: #a8d5b9; }
.ns-evs[data-evs-status="rejected"] { border-left-color: #e7bdb7; }
.ns-evs-head { flex-wrap: wrap; min-width: 0; }
.ns-evs-name { white-space: normal; overflow-wrap: anywhere; min-width: 0; max-width: 100%; text-align: left; }
.ns-evs-reason { margin: 4px 0 0; font-size: var(--fs-sm); color: var(--ink-2); overflow-wrap: anywhere; }
.ns-evs-acts { margin: 4px 0 0; flex-wrap: wrap; }
.ns-evs-why { margin: 6px 0 0; min-width: 0; }
.ns-evs-why .ns-input { min-width: 0; }

/* 과제 담당자 칸 (DEV-2026-0728 · ADR-064) — 판 머리 한 줄 + [지정] 폼 */
.ns-owner-line { flex-wrap: wrap; align-items: center; gap: 6px 8px; }
.ns-owner-line .ns-sec-label { margin: 0; }
.ns-owner-name { font-weight: 600; }
.ns-owner-org { min-width: 0; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ns-owner-form { margin-top: 8px; }
.ns-owner-hits { display: grid; gap: 4px; margin-top: 6px; max-height: 220px; overflow-y: auto; }
.ns-owner-hit {
  appearance: none; display: flex; flex-wrap: wrap; align-items: center; gap: 4px 8px; min-width: 0;
  text-align: left; cursor: pointer; background: var(--paper); color: var(--ink);
  border: 1px solid var(--rule); border-radius: 3px; padding: 5px 8px; font: inherit;
}
.ns-owner-hit:hover:not(:disabled) { border-color: var(--accent); }
.ns-owner-hit.is-on { background: var(--accent-soft); border-color: var(--accent); }
.ns-owner-hit:disabled { cursor: default; opacity: .7; }
.ns-owner-hit:focus-visible { outline: 2px solid var(--accent); outline-offset: 1px; }
.ns-rowitem-owner { color: var(--ink-2); max-width: 9em; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* ---- 화면 안내(DEV-2026-0721 · ADR-063 D4~D6) — 네 층 답 · 조치 자리의 작은 대화창 ---- */
.ns-gd { display: grid; gap: 8px; min-width: 0; overflow-wrap: anywhere; }
.ns-gd-layer { min-width: 0; }
/* 첫 물음 전 확인 한 줄 · 제안 칩(0749) */
.ns-gd-confirm { margin: 6px 0 4px; font-size: var(--fs-md); color: var(--ink); font-weight: 600; }
.ns-gd-suggests { flex-wrap: wrap; gap: 4px; margin-bottom: 4px; }
.ns-gd-foot { flex-wrap: wrap; }
.ns-gd-layer.is-lead p { margin: 0; }
.ns-gd-layer.is-lead strong { font-weight: 700; color: var(--ink); font-size: var(--fs-lg); margin-right: 6px; }
.ns-gd-layer.is-title h3 { margin: 0; font-size: var(--fs-md); font-weight: 600; color: var(--ink-2); }
.ns-gd-layer.is-body ol { margin: 0 0 0 20px; padding: 0; display: grid; gap: 3px; }
.ns-gd-layer.is-body li { font-size: var(--fs-md); line-height: 1.5; }
.ns-gd-layer p { margin: 0 0 4px; }
.ns-gd-layer h4 { margin: 6px 0 2px; font-size: var(--fs-md); font-weight: 650; color: var(--ink); }
.ns-gd-phrase { color: var(--ink-3); font-size: var(--fs-sm); }
.ns-gd-table { width: 100%; }
.ns-gd-table th { white-space: nowrap; background: var(--paper-2); font-size: var(--fs-sm); }
.ns-gd-table td { font-size: var(--fs-sm); vertical-align: top; }
.ns-gd-table tr.is-current td { background: var(--accent-soft); box-shadow: inset 3px 0 0 var(--accent); }
.ns-gd figure { margin: 4px 0; max-width: 100%; }
.ns-gd-img { display: block; max-width: 100%; height: auto; border: 1px solid var(--rule); border-radius: 4px; }
.ns-gd figcaption { font-size: var(--fs-sm); color: var(--ink-3); margin-top: 2px; }
.ns-gd-svg { display: block; max-width: 100%; height: auto; }
.ns-gd-svg rect { fill: var(--paper-2); stroke: var(--rule-strong); }
.ns-gd-svg rect[data-current] { fill: var(--accent-soft); stroke: var(--accent); }
.ns-gd-svg text { font: 12px var(--font); fill: var(--ink); }
.ns-gd-svg line { stroke: var(--ink-3); }
.ns-gd-svg line[data-back] { stroke-dasharray: 4 3; }
.ns-gd-goto { color: var(--accent); }
.ns-gd-goto.is-off { color: inherit; }
.ns-gd-btn { margin-left: auto; flex: none; }
.ns-gd-btn.is-on { background: var(--accent-soft); border-color: var(--accent); color: var(--accent); }
.ns-tln-node > .ns-gd-btn { margin: 4px 0 0 auto; display: block; }
.ns-gd-pane {
  margin: 8px 0 0; padding: 8px 10px; border: 1px solid var(--accent); border-radius: 6px;
  background: var(--paper); display: grid; gap: 8px; min-width: 0; max-width: 100%; box-sizing: border-box;
}
.ns-tln-node > .ns-gd-pane { grid-column: 1 / -1; }
.ns-gd-head b { font-size: var(--fs-md); }
.ns-gd-body { display: grid; gap: 10px; max-height: 420px; overflow-y: auto; min-width: 0; }
.ns-gd-q { margin: 0; font-size: var(--fs-sm); color: var(--ink-2); }
.ns-gd-turn { display: grid; gap: 4px; min-width: 0; }
.ns-gd-pastbody { padding: 0 10px 10px; }
.ns-gd-steps { flex-wrap: wrap; align-items: center; }
.ns-gd-foot { min-width: 0; }

/* 상위 과제(0732 · ADR-061 부칙 10-27) — '해당 없음(상위 과제)' + 하위 요약 한 줄. 줄 · 절 머리 · 절 몸이 같은 꼴. */
.ns-ev-parent { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 4px 6px; min-width: 0; }
.ns-ev-child { color: var(--ink-2); font-size: var(--fs-sm); font-variant-numeric: tabular-nums; }
.ns-ev-parent-line { display: flex; flex-wrap: wrap; align-items: center; gap: 6px 12px; margin: 4px 0 8px; }

/* ---- 과제 찾기 영역 거르기 (DEV-2026-0738 → 0748 · ADR-058 보정 4 정정 2) ---------------- */
.ns-find-row.ns-find-arearow { display: grid; grid-template-columns: 52px minmax(0, 1fr); align-items: start; }
.ns-find-arearow > .ns-find-key { padding-top: 5px; }
.ns-subhead-key { font-size: var(--fs-xs); color: var(--ink-3); }
.ns-subhead-arealist { display: grid; gap: 2px; min-width: 0; }
.ns-subhead-area {
  display: grid; grid-template-columns: minmax(0, 1fr) 5em minmax(0, auto) 1em; gap: 10px; align-items: baseline;
  width: 100%; min-width: 0; padding: 3px 8px; border: 1px solid transparent; border-radius: 3px; background: none;
  font: inherit; font-size: var(--fs-sm); color: var(--ink); cursor: pointer; text-align: left;
}
.ns-subhead-area:hover { border-color: var(--rule); background: var(--paper-2); }
.ns-subhead-area.is-on { border-color: var(--accent); background: var(--accent-soft); }
.ns-subhead-areaname { font-weight: 600; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ns-subhead-n { color: var(--ink-2); white-space: nowrap; }
.ns-subhead-kpi { color: var(--ink-3); font-size: var(--fs-xs); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-align: right; }
.ns-subhead-kpi.is-some { color: var(--ink-2); }
.ns-subhead-kpi.is-fail { color: var(--no); }
.ns-subhead-x { color: var(--accent); text-align: center; }

/* ---- 문서함 · 주간보고 (DEV-2026-0743 — 0738 자회사 머리에서 옮김) ------------------------------ */
.ns-wr-view { display: grid; gap: 10px; min-width: 0; }
.ns-wr-bar { flex-wrap: wrap; }
.ns-wr-weekline { display: flex; align-items: center; gap: 10px; min-width: 0; }
.ns-wr-weeks { display: inline-flex; gap: 4px; align-items: center; }
.ns-wr-dot { width: 10px; height: 10px; border-radius: 50%; border: 1.5px solid var(--rule-strong); background: var(--paper); flex: none; }
.ns-wr-dot.is-on { background: var(--ok); border-color: var(--ok); }
.ns-wr-dot.is-miss { background: var(--ev-caution); border-color: var(--ev-caution); }
.ns-wr-table { table-layout: fixed; width: 100%; }
.ns-wr-table th:nth-child(2), .ns-wr-table td:nth-child(2) { width: 6.5em; }
.ns-wr-table th:nth-child(3), .ns-wr-table td:nth-child(3) { width: 9.5em; }
.ns-wr-table th:nth-child(4), .ns-wr-table td:nth-child(4) { width: 7.5em; }
.ns-wr-name .ns-btn--link { text-align: left; overflow-wrap: anywhere; white-space: normal; }
.ns-wr-go { white-space: nowrap; }
.ns-wr-go > * + * { margin-left: 6px; }
