/* ============================================================
   Genffice KSP·EIPP 예·정산 — 셸 디자인 시스템

   토큰 체계와 4열 그리드는 genffice-docs / genffice-slide / genffice-ksp 를
   계승한다. 액센트만 KDI 블루다 (genffice-ksp 와 같은 자리).

   이 앱만의 것은 **금액 표기 규약** 하나다.
   - `.n`      숫자 칸. 오른쪽 정렬 + tabular-nums. 자릿수가 어긋나면 사람이 못 읽는다
   - `.unset`  미확정. **0 원과 다르게 보여야 한다** (설계문서.md §4-3)
   - `.up`/`.down` 증감 방향
   ============================================================ */

:root {
  /* Surfaces */
  --bg-app: #fbfbfc;
  --bg-panel: #ffffff;
  --bg-sidebar: #f8f8fa;
  --bg-subtle: #f3f3f6;
  --bg-hover: #eeeef2;
  --bg-active: #e7e7ed;

  /* Text */
  --text-1: #18181b;
  --text-2: #5b5b66;
  --text-3: #8a8a95;
  --text-inv: #ffffff;

  /* Borders */
  --border-1: #ededf1;
  --border-2: #e0e0e6;
  --border-3: #c9c9d2;

  /* Accent — KDI 블루 */
  --accent: #1668b3;
  --accent-hover: #135b9d;
  --accent-press: #104e88;
  --accent-subtle: #eaf2fa;
  --accent-border: #c5ddf1;
  --accent-text: #135b9d;

  /* Semantic */
  --success: #167c3c;
  --success-subtle: #e9f6ed;
  --warning: #9a5700;
  --warning-subtle: #fdf2e4;
  --warning-border: #f0d8b0;
  --danger: #c22b2b;
  --danger-subtle: #fdecec;
  --danger-border: #f5c9c9;

  /* Type scale */
  --fs-10: 10px;
  --fs-11: 11px;
  --fs-12: 12px;
  --fs-13: 13px;
  --fs-14: 14px;
  --fs-15: 15px;
  --fs-17: 17px;

  /* Radius */
  --r-4: 4px;
  --r-6: 6px;
  --r-8: 8px;
  --r-10: 10px;
  --r-14: 14px;

  /* Elevation */
  --sh-1: 0 1px 2px rgba(20, 20, 35, .05);
  --sh-2: 0 4px 12px rgba(20, 20, 35, .07), 0 0 0 1px rgba(20, 20, 35, .04);
  --sh-3: 0 16px 48px rgba(20, 20, 35, .16), 0 0 0 1px rgba(20, 20, 35, .06);
  --ring: 0 0 0 3px rgba(22, 104, 179, .16);

  /* Layout — Genffice 표준 4열 (메뉴 | 작업 | 대화 | 캔버스) */
  --menu-w: 210px;
  --work-w: 268px;
  --stream-w: 380px;
  --split-w: 1px;
  --hit: 9px;

  /* 원장 여섯 칸의 색 — views.js 의 LEDGER_TONE 과 값이 같아야 한다 */
  --st-request: #8a8a95;
  --st-approved: #5b7fa8;
  --st-contract: #1668b3;
  --st-execution: #167c3c;
  --st-settlement: #7a4bb8;
}

* { margin: 0; padding: 0; box-sizing: border-box; }
[hidden] { display: none !important; }
.hidden { display: none !important; }

html, body { height: 100%; overflow: hidden; }

body {
  font-family: "Pretendard Variable", Pretendard, "Apple SD Gothic Neo",
    "Malgun Gothic", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
  font-size: var(--fs-13);
  line-height: 1.5;
  color: var(--text-1);
  background: var(--bg-app);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}
button, input, select, textarea { font-family: inherit; }
::selection { background: rgba(22, 104, 179, .18); }

* { scrollbar-width: thin; scrollbar-color: var(--border-3) transparent; }
*::-webkit-scrollbar { width: 10px; height: 10px; }
*::-webkit-scrollbar-track { background: transparent; }
*::-webkit-scrollbar-thumb {
  background: transparent; border: 3px solid transparent;
  border-radius: 8px; background-clip: padding-box;
}
*:hover::-webkit-scrollbar-thumb { background: var(--border-3); background-clip: padding-box; }

/* ============================================================
   금액 표기 — 이 앱의 핵심 규약
   ============================================================ */

.n { text-align: right; font-variant-numeric: tabular-nums; }

/* 미확정. **0 원과 같아 보이면 안 된다** — 정산 전 사업이 「한 푼도 안 쓴 사업」이
   되고, 담당자는 시작도 안 한 사업의 집행을 독촉받는다. */
.unset {
  color: var(--warning); font-weight: 600;
  background: var(--warning-subtle); border-radius: var(--r-4);
  padding: 0 5px; font-size: .94em; white-space: nowrap;
}
.up { color: var(--danger); }
.down { color: var(--accent-text); }
.flat { color: var(--text-3); }

/* ============================================================
   셸 — Genffice 표준 4열 그리드
   ============================================================ */

.app {
  display: grid;
  grid-template-columns:
    var(--menu-w) var(--split-w)
    var(--work-w) var(--split-w)
    var(--stream-w) var(--split-w)
    minmax(320px, 1fr);
  height: 100dvh;
  max-height: 100dvh;
  min-height: 0;
  overflow: hidden;
}
.app.resizing { cursor: col-resize; user-select: none; }

.splitter {
  position: relative; z-index: 20;
  width: var(--split-w);
  background: var(--border-1);
  cursor: col-resize; touch-action: none;
  border: 0; padding: 0;
}
.splitter::after {
  content: ""; position: absolute; top: 0; bottom: 0;
  left: calc(var(--hit) * -1); right: calc(var(--hit) * -1);
}
.splitter::before {
  content: ""; position: absolute; inset: 0;
  background: transparent; transition: background .12s ease;
}
.splitter:hover::before,
.splitter:focus-visible::before,
.app.resizing .splitter.active::before {
  background: var(--accent); box-shadow: 0 0 0 1px var(--accent);
}
.splitter:focus-visible { outline: none; }

/* ============================================================
   버튼 · 입력
   ============================================================ */

.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  height: 28px; padding: 0 10px;
  border: 1px solid var(--border-2); border-radius: var(--r-6);
  background: var(--bg-panel); color: var(--text-1);
  font: inherit; font-size: var(--fs-12); font-weight: 500;
  white-space: nowrap; cursor: pointer;
  transition: background .12s ease, border-color .12s ease, color .12s ease;
}
.btn:hover:not(:disabled) { background: var(--bg-subtle); border-color: var(--border-3); }
.btn:active:not(:disabled) { background: var(--bg-active); }
.btn:focus-visible { outline: none; box-shadow: var(--ring); }
.btn:disabled { cursor: not-allowed; color: var(--text-3); }

.btn.primary {
  background: var(--accent); border-color: transparent;
  color: var(--text-inv); box-shadow: var(--sh-1);
}
.btn.primary:hover:not(:disabled) { background: var(--accent-hover); }
.btn.primary:active:not(:disabled) { background: var(--accent-press); }
.btn.primary:disabled { background: var(--bg-subtle); border-color: var(--border-2); color: var(--text-3); box-shadow: none; }

.btn.ghost { background: transparent; border-color: transparent; color: var(--text-2); }
.btn.ghost:hover:not(:disabled) { background: var(--bg-hover); color: var(--text-1); }
.btn.danger { color: var(--danger); border-color: var(--danger-border); }
.btn.danger:hover:not(:disabled) { background: var(--danger-subtle); }

.btn.icon { width: 28px; padding: 0; }
.btn svg { width: 14px; height: 14px; flex-shrink: 0; }
.btn.sm { height: 24px; padding: 0 8px; font-size: var(--fs-11); }
.btn.lg { height: 34px; padding: 0 18px; font-size: var(--fs-13); font-weight: 650; }

.inp {
  height: 28px; padding: 0 9px;
  border: 1px solid var(--border-2); border-radius: var(--r-6);
  background: var(--bg-panel); color: var(--text-1);
  font: inherit; font-size: var(--fs-12); min-width: 0;
}
.inp:focus { outline: none; border-color: var(--accent); box-shadow: var(--ring); }
.inp.n { text-align: right; font-variant-numeric: tabular-nums; }
select.inp { padding-right: 6px; cursor: pointer; }

/* ============================================================
   1열 · 메뉴
   ============================================================ */

.menu {
  display: flex; flex-direction: column; min-height: 0;
  padding: 12px 10px;
  background: var(--bg-sidebar);
  overflow: auto;
}

.brand { display: flex; align-items: center; gap: 9px; padding: 4px 6px 14px; }
.brand .logo {
  display: grid; place-items: center;
  width: 26px; height: 26px; flex-shrink: 0;
  border-radius: 7px;
  background: linear-gradient(150deg, var(--accent), #3f8fd4);
  color: #fff; font-size: var(--fs-10); font-weight: 700;
  letter-spacing: -.03em; box-shadow: var(--sh-1);
}
.brand .txt { min-width: 0; display: flex; flex-direction: column; }
.brand .mark {
  font-size: var(--fs-13); font-weight: 650; letter-spacing: -.01em;
  color: var(--text-1); line-height: 1.25;
}
.brand .sub {
  font-size: var(--fs-11); color: var(--text-3); line-height: 1.3;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}

.nav-label {
  padding: 12px 8px 4px;
  font-size: var(--fs-11); font-weight: 600;
  letter-spacing: .03em; color: var(--text-3);
}

.nav-item {
  display: flex; align-items: center; gap: 9px;
  width: 100%; height: 30px; padding: 0 8px;
  border: 0; border-radius: var(--r-6);
  background: transparent; color: var(--text-2);
  font: inherit; font-size: var(--fs-13); font-weight: 500;
  text-align: left; cursor: pointer;
  transition: background .12s ease, color .12s ease;
}
.nav-item:hover:not(:disabled) { background: var(--bg-hover); color: var(--text-1); }
.nav-item.active { background: var(--accent-subtle); color: var(--accent-text); font-weight: 600; }
.nav-item:focus-visible { outline: none; box-shadow: var(--ring); }
.nav-item:disabled { color: var(--text-3); cursor: not-allowed; }
.nav-item .ico {
  display: grid; place-items: center;
  width: 16px; height: 16px; flex-shrink: 0;
  color: currentColor; opacity: .85;
}
.nav-item .ico svg { width: 16px; height: 16px; }
.nav-item .lbl { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nav-item .kb {
  font-size: var(--fs-10); font-weight: 700; color: var(--text-3);
  font-variant-numeric: tabular-nums; flex-shrink: 0;
}

@keyframes stpulse { 0%, 100% { opacity: 1 } 50% { opacity: .25 } }

.menu-foot { margin-top: auto; padding: 10px 8px 2px; border-top: 1px solid var(--border-1); }
.model-chip {
  display: flex; align-items: center; gap: 7px;
  padding: 7px 8px; border-radius: var(--r-6);
  background: var(--bg-panel); border: 1px solid var(--border-1);
  margin-bottom: 6px;
}
.model-chip .dot {
  width: 6px; height: 6px; flex-shrink: 0; border-radius: 50%;
  background: var(--text-3); box-shadow: 0 0 0 3px var(--bg-subtle);
}
.model-chip[data-state="on"] .dot { background: var(--success); box-shadow: 0 0 0 3px var(--success-subtle); }
.model-chip[data-state="off"] .dot { background: var(--danger); box-shadow: 0 0 0 3px var(--danger-subtle); }
.model-chip strong {
  min-width: 0; font-size: var(--fs-11); font-weight: 600; color: var(--text-2);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
/* 이 설치가 무엇을 기준으로 삼는가. 금액이 여기서 나오므로 늘 보여야 한다. */
.std-chip {
  display: block; width: 100%; text-align: left;
  padding: 7px 8px; border-radius: var(--r-6);
  background: var(--accent-subtle); border: 1px solid var(--accent-border);
  font: inherit; cursor: pointer;
}
.std-chip:hover { background: #dfecf8; }
.std-chip b { display: block; font-size: var(--fs-11); font-weight: 650; color: var(--accent-text); }
.std-chip span { display: block; font-size: var(--fs-10); color: var(--text-3); margin-top: 1px; }

/* ============================================================
   2열 · 작업 패널
   ============================================================ */

.work {
  display: flex; flex-direction: column; min-height: 0; min-width: 0;
  background: var(--bg-panel); overflow: hidden;
}

.panel-head {
  flex: 0 0 auto; display: flex; align-items: center; gap: 8px;
  min-height: 44px; padding: 0 12px;
  border-bottom: 1px solid var(--border-1);
}
.panel-head h2 { font-size: var(--fs-13); font-weight: 650; letter-spacing: -.01em; }
.panel-head .badge {
  margin-left: auto; flex-shrink: 0;
  padding: 2px 7px; border-radius: 20px;
  background: var(--bg-subtle); border: 1px solid var(--border-1);
  font-size: var(--fs-11); font-weight: 600; color: var(--text-2);
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.panel-head .badge.done { background: var(--success-subtle); border-color: transparent; color: var(--success); }

/* --- 여섯 단계 --- */
.steps {
  flex: 0 0 auto; display: flex; gap: 2px;
  padding: 7px 6px;
  border-bottom: 1px solid var(--border-1); background: var(--bg-sidebar);
}
.step-b {
  flex: 1; min-width: 0;
  position: relative;
  display: flex; flex-direction: column; align-items: center; gap: 3px;
  padding: 6px 1px 5px;
  border: 1px solid transparent; border-radius: var(--r-6);
  background: transparent; color: var(--text-3);
  font: inherit; font-size: var(--fs-10); font-weight: 600;
  cursor: pointer; transition: background .12s ease, color .12s ease, border-color .12s ease;
}
.step-b .si { display: grid; place-items: center; width: 15px; height: 15px; }
.step-b .si svg { width: 15px; height: 15px; }
.step-b .sl { max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.step-b .sd {
  position: absolute; top: 3px; right: 3px;
  width: 5px; height: 5px; border-radius: 50%; background: var(--border-3);
}
.step-b .sd[data-s="running"] { background: var(--warning); animation: stpulse 1.1s infinite; }
.step-b .sd[data-s="done"] { background: var(--success); }
.step-b .sd[data-s="pending"] { background: var(--accent); }
.step-b:hover:not(:disabled) { background: var(--bg-panel); color: var(--text-2); }
.step-b.ok { color: var(--success); }
.step-b.on {
  background: var(--bg-panel); border-color: var(--accent); color: var(--accent-text);
  box-shadow: var(--sh-1);
}
/* 단계가 저절로 넘어가지 않으므로 어디를 눌러야 하는지가 보여야 한다. */
.step-b.ready {
  border-color: var(--accent-border); background: var(--accent-subtle);
  color: var(--accent-text);
}
.step-b.ready::after {
  content: ""; position: absolute; inset: -1px; border-radius: var(--r-6);
  border: 1px solid var(--accent); opacity: .45; animation: stready 1.6s ease-in-out infinite;
  pointer-events: none;
}
@keyframes stready { 0%, 100% { opacity: .15 } 50% { opacity: .6 } }
.step-b:disabled { opacity: .4; cursor: not-allowed; }

.work-progress { flex: 0 0 auto; height: 2px; background: var(--bg-subtle); }
.work-progress .bar { height: 100%; width: 0; background: var(--accent); transition: width .45s ease; }

.work-body { flex: 1; min-height: 0; overflow-y: auto; overflow-x: hidden; }

.work-foot {
  flex: 0 0 auto; display: flex; gap: 6px; padding: 9px 10px;
  border-top: 1px solid var(--border-1); background: var(--bg-sidebar);
}
.work-foot .btn { flex: 1; }

.panel-empty { padding: 40px 20px; text-align: center; color: var(--text-3); }
.panel-empty .pe-i { display: grid; place-items: center; margin: 0 auto 10px; width: 34px; height: 34px; opacity: .5 }
.panel-empty .pe-i svg { width: 26px; height: 26px }
.panel-empty b { display: block; font-size: var(--fs-12); font-weight: 600; color: var(--text-2); margin-bottom: 4px; }
.panel-empty span { font-size: var(--fs-11); line-height: 1.65; }

/* --- 패널 행 (단계별 항목 목록) --- */
.prow {
  display: block; width: 100%; text-align: left;
  border: 0; border-bottom: 1px solid var(--border-1);
  background: var(--bg-panel); padding: 9px 12px;
  cursor: pointer; font: inherit;
  opacity: .36; transition: opacity .3s, background .12s;
}
.prow.on { opacity: 1; }
.prow.on:hover { background: var(--bg-sidebar); }
.prow.sel { background: var(--accent-subtle); box-shadow: inset 2px 0 0 var(--accent); }
.prow:disabled { cursor: default; }
.prow-t { display: flex; align-items: center; gap: 7px; }
.prow-t .no {
  flex: 0 0 auto; display: grid; place-items: center;
  width: 16px; height: 16px; border-radius: var(--r-4);
  background: var(--bg-subtle); border: 1px solid var(--border-1);
  font-size: 9.5px; font-weight: 700; color: var(--text-3);
}
.prow.on .prow-t .no { background: var(--accent); border-color: transparent; color: #fff; }
.prow-t b { flex: 1; min-width: 0; font-size: var(--fs-12); font-weight: 650;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.prow-t .st { flex: 0 0 auto; width: 6px; height: 6px; border-radius: 50%; background: var(--border-3); }
.prow.on .prow-t .st { background: var(--success); }
.prow .d { display: block; font-size: var(--fs-10); color: var(--text-3);
  margin: 3px 0 0 23px; line-height: 1.5; }
.prow .v {
  display: block; margin: 4px 0 0 23px;
  font-size: var(--fs-12); font-weight: 700; color: var(--text-1);
  font-variant-numeric: tabular-nums;
}
.prow .v .unset { font-size: var(--fs-11); }
.prow .tags { display: flex; flex-wrap: wrap; gap: 4px; margin: 6px 0 0 23px; }

.tag {
  padding: 1px 6px; border-radius: 20px;
  border: 1px solid var(--border-2); background: var(--bg-app);
  font-size: var(--fs-10); font-weight: 600; color: var(--text-2); white-space: nowrap;
}
.tag[data-s="block"] { border-color: transparent; background: var(--danger-subtle); color: var(--danger); }
.tag[data-s="warn"] { border-color: transparent; background: var(--warning-subtle); color: var(--warning); }
.tag[data-s="info"] { border-color: transparent; background: var(--bg-subtle); color: var(--text-2); }
.tag[data-s="done"] { border-color: transparent; background: var(--success-subtle); color: var(--success); }
.tag[data-s="run"] { border-color: transparent; background: var(--warning-subtle); color: var(--warning); }
.tag[data-s="accent"] { border-color: var(--accent-border); background: var(--accent-subtle); color: var(--accent-text); }

/* ============================================================
   4열 · 캔버스
   ============================================================ */

.canvas { display: flex; flex-direction: column; min-width: 0; min-height: 0; overflow: hidden; background: var(--bg-app); }
.cv { display: flex; flex-direction: column; flex: 1; min-height: 0; }
.cv-head {
  flex: 0 0 auto; display: flex; align-items: center; gap: 10px;
  min-height: 44px; padding: 6px 14px;
  border-bottom: 1px solid var(--border-1); background: var(--bg-panel);
  flex-wrap: wrap;
}
.cv-body { flex: 1; min-height: 0; overflow-y: auto; overflow-x: hidden; }

.cv-tabs { display: inline-flex; gap: 2px; padding: 2px; border-radius: var(--r-6); background: var(--bg-subtle); flex-wrap: wrap; }
.cv-tab {
  border: 0; border-radius: var(--r-4); background: transparent;
  padding: 4px 9px; font: inherit; font-size: var(--fs-11); font-weight: 600;
  color: var(--text-2); cursor: pointer; white-space: nowrap;
}
.cv-tab:hover { color: var(--text-1); }
.cv-tab.on { background: var(--bg-panel); color: var(--accent-text); box-shadow: var(--sh-1); }
.cv-tab:disabled { opacity: .45; cursor: not-allowed; }

.cv-meta { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; font-size: var(--fs-11); color: var(--text-3); min-width: 0; }
.cv-meta b { font-size: var(--fs-12); font-weight: 650; color: var(--text-1); }
.cv-rt { margin-left: auto; display: flex; align-items: center; gap: 6px; flex-shrink: 0; }

.cv-empty { display: grid; place-items: center; height: 100%; padding: 40px 20px; text-align: center; color: var(--text-3); }
.cv-empty .ei { display: grid; place-items: center; margin: 0 auto 12px; opacity: .45 }
.cv-empty .ei svg { width: 34px; height: 34px }
.cv-empty b { display: block; font-size: var(--fs-14); font-weight: 650; color: var(--text-2); margin-bottom: 6px; }
.cv-empty span { font-size: var(--fs-12); line-height: 1.7; }

/* --- 워크스페이스 시작 화면 --- */
.ws-start { max-width: 780px; margin: 0 auto; padding: 42px 24px 40px; }
.ws-start h1 { font-size: 21px; font-weight: 650; letter-spacing: -.02em; margin-bottom: 8px; }
.ws-start .lead { font-size: var(--fs-13); color: var(--text-2); line-height: 1.75; margin-bottom: 22px; }
.ws-start .lead b { font-weight: 650; color: var(--text-1); }
.ws-flow { display: grid; grid-template-columns: repeat(6, 1fr); gap: 6px; margin-bottom: 24px; }
.ws-flow .f {
  border: 1px solid var(--border-1); border-radius: var(--r-8);
  background: var(--bg-panel); padding: 10px 10px;
}
.ws-flow .f .k { font-size: 9.5px; font-weight: 700; color: var(--text-3); }
.ws-flow .f .t { font-size: var(--fs-12); font-weight: 650; margin: 3px 0 2px; }
.ws-flow .f .d { font-size: 9.5px; color: var(--text-3); line-height: 1.45; }
.ws-flow .f[data-s="done"] { border-color: var(--accent-border); background: var(--accent-subtle); }
.ws-flow .f[data-s="done"] .k { color: var(--accent-text); }

.ws-sec { font-size: var(--fs-11); font-weight: 600; color: var(--text-3); letter-spacing: .03em; margin-bottom: 8px; }
.ws-p {
  display: flex; gap: 10px; align-items: flex-start;
  width: 100%; margin-bottom: 7px; padding: 12px 14px;
  border: 1px solid var(--border-1); border-radius: var(--r-8);
  background: var(--bg-panel); color: var(--text-1);
  font: inherit; font-size: var(--fs-12); line-height: 1.65;
  text-align: left; cursor: pointer; transition: border-color .12s, background .12s;
}
.ws-p:hover { border-color: var(--accent-border); background: var(--accent-subtle); }
.ws-p .n { flex: 0 0 auto; font-weight: 700; color: var(--text-3); text-align: left; }
.ws-p.tour { border-color: var(--accent-border); background: var(--accent-subtle); }
.ws-p.tour .n { color: var(--accent); }
.ws-p.tour em {
  flex: 0 0 auto; font-style: normal; font-size: var(--fs-10); font-weight: 700;
  color: var(--accent); align-self: center;
}
.ws-hint { margin-top: 18px; font-size: var(--fs-11); color: var(--text-3); line-height: 1.7; }
.ws-hint b { font-weight: 650; color: var(--text-2); }

/* --- 사업 목록 --- */
.pl-list { display: grid; gap: 7px; }
.pl-r {
  display: flex; align-items: center; gap: 14px;
  width: 100%; padding: 13px 15px;
  border: 1px solid var(--border-1); border-radius: var(--r-8);
  background: var(--bg-panel); color: var(--text-1);
  font: inherit; text-align: left; cursor: pointer;
  transition: border-color .12s, background .12s;
}
.pl-r:hover:not(:disabled) { border-color: var(--accent-border); background: var(--accent-subtle); }
.pl-r:disabled { cursor: not-allowed; background: var(--bg-sidebar); }
.pl-m { flex: 1; min-width: 0; }
.pl-t { display: flex; align-items: center; gap: 7px; flex-wrap: wrap; }
.pl-t b { font-size: var(--fs-13); font-weight: 650; }
.pl-t code {
  font-size: var(--fs-10); background: var(--bg-subtle); padding: 1px 5px;
  border-radius: var(--r-4); color: var(--text-2);
}
.pl-d { font-size: var(--fs-11); color: var(--text-2); margin-top: 4px; line-height: 1.55; }
.pl-p { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 8px; }
.pl-n { flex: 0 0 auto; text-align: right; }
.pl-n b { display: block; font-size: var(--fs-13); font-weight: 700; font-variant-numeric: tabular-nums; }
.pl-n span { display: block; font-size: var(--fs-10); color: var(--text-3); margin-top: 2px; }

/* ============================================================
   토스트 · 모달
   ============================================================ */

.toasts { position: fixed; left: 50%; bottom: 26px; transform: translateX(-50%); z-index: 400; display: flex; flex-direction: column; gap: 7px; align-items: center; pointer-events: none; }
.toast {
  padding: 8px 15px; border-radius: 20px;
  background: rgba(24, 24, 27, .92); color: #fff;
  font-size: var(--fs-12); font-weight: 500;
  box-shadow: var(--sh-2); animation: tin .18s ease;
  max-width: 68vw; text-align: center;
}
.toast.bad { background: rgba(194, 43, 43, .95); }
@keyframes tin { from { opacity: 0; transform: translateY(6px) } }

#overlay:empty { display: none; }
.mask { position: fixed; inset: 0; z-index: 500; background: rgba(24, 24, 27, .44); display: grid; place-items: center; padding: 24px; }
.modal {
  width: min(960px, 100%); max-height: 88vh; display: flex; flex-direction: column;
  background: var(--bg-panel); border-radius: var(--r-14); box-shadow: var(--sh-3); overflow: hidden;
}
.modal-h { flex: 0 0 auto; display: flex; align-items: center; gap: 10px; padding: 14px 18px; border-bottom: 1px solid var(--border-1); }
.modal-h h3 { font-size: var(--fs-15); font-weight: 650; }
.modal-h .d { font-size: var(--fs-11); color: var(--text-3); min-width: 0; }
.modal-h .x { margin-left: auto; flex-shrink: 0; border: 0; background: transparent; color: var(--text-3); font: inherit; font-size: var(--fs-12); cursor: pointer; padding: 4px 6px; border-radius: var(--r-6); }
.modal-h .x:hover { background: var(--bg-hover); color: var(--text-1); }
.modal-b { flex: 1; min-height: 0; overflow-y: auto; padding: 16px 18px; }
.modal-f { flex: 0 0 auto; display: flex; justify-content: flex-end; gap: 7px; padding: 12px 18px; border-top: 1px solid var(--border-1); background: var(--bg-sidebar); }

/* --- 팀 · AI직원 모달 --- */
.team-grid { display: grid; grid-template-columns: 1fr 1.35fr; gap: 20px; }
.team-sec h4 { font-size: var(--fs-11); font-weight: 600; color: var(--text-3); letter-spacing: .03em; margin-bottom: 8px; }
.person { display: flex; align-items: center; gap: 9px; padding: 7px 6px; border-radius: var(--r-6); }
.person:hover { background: var(--bg-sidebar); }
.person .avatar { display: grid; place-items: center; width: 27px; height: 27px; flex-shrink: 0; border-radius: 50%; color: #fff; font-size: var(--fs-11); font-weight: 700; }
.person .pn { flex: 1; min-width: 0; }
.person .pn b { display: block; font-size: var(--fs-12); font-weight: 600; line-height: 1.35; }
.person .pn span { display: block; font-size: var(--fs-10); color: var(--text-3); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.person .dot { width: 6px; height: 6px; flex-shrink: 0; border-radius: 50%; background: var(--text-3); }
.person .dot.on { background: var(--success); }
.person .dot.away { background: var(--warning); }

.agent-card { border: 1px solid var(--border-1); border-radius: var(--r-8); background: var(--bg-panel); padding: 10px 11px; margin-bottom: 8px; }
.agent-card.primary { border-color: var(--accent-border); background: var(--accent-subtle); }
.agent-card .at { display: flex; align-items: center; gap: 8px; }
.agent-card .em { display: grid; place-items: center; width: 26px; height: 26px; flex-shrink: 0; border-radius: var(--r-6); background: var(--bg-panel); border: 1px solid var(--border-1); font-size: var(--fs-14); }
.agent-card .an { flex: 1; min-width: 0; }
.agent-card .an b { display: block; font-size: var(--fs-12); font-weight: 650; }
.agent-card .an span { display: block; font-size: var(--fs-10); color: var(--text-3); }
.agent-card .stat { flex-shrink: 0; font-size: 9.5px; font-weight: 700; padding: 2px 7px; border-radius: 20px; background: var(--bg-subtle); border: 1px solid var(--border-1); color: var(--text-3); white-space: nowrap; }
.agent-card .stat.run { background: var(--warning-subtle); border-color: transparent; color: var(--warning); }
.agent-card .stat.done { background: var(--success-subtle); border-color: transparent; color: var(--success); }
.agent-card .ad { font-size: var(--fs-11); color: var(--text-2); margin-top: 7px; line-height: 1.6; }
.agent-card .askills { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 7px; }
.askill { font-size: 9.5px; font-weight: 600; color: var(--accent-text); background: var(--bg-panel); border: 1px solid var(--accent-border); border-radius: var(--r-4); padding: 1px 6px; }

/* ============================================================
   반응형 — genffice-docs(1240) · genffice-slide(1320) 와 같은 장치
   ============================================================ */

@media (max-width: 1400px) {
  .app {
    grid-template-columns:
      52px var(--split-w)
      minmax(200px, var(--work-w)) var(--split-w)
      minmax(0, 1fr);
    grid-template-rows: minmax(272px, 2fr) minmax(0, 3fr);
  }
  .menu { padding: 12px 8px; align-items: center; }
  .menu, .work { grid-row: 1 / -1; }
  .splitter[data-split="menu"], .splitter[data-split="work"] { grid-row: 1 / -1; }
  .splitter[data-split="stream"] { display: none; }
  .stream { grid-column: 5; grid-row: 1; }
  .canvas { grid-column: 5; grid-row: 2; border-top: 1px solid var(--border-2); }

  .brand { padding: 4px 0 14px; }
  .brand .txt, .nav-label, .menu-foot { display: none; }
  .nav-item { justify-content: center; padding: 0; }
  .nav-item .lbl, .nav-item .kb { display: none; }
  .splitter[data-split="menu"] { pointer-events: none; }
  .ws-flow { grid-template-columns: repeat(3, 1fr); }
}

/* 더 좁아지면 2열을 접는다. 3열은 지시를 넣는 유일한 자리라 끝까지 남긴다. */
@media (max-width: 980px) {
  .app {
    grid-template-columns: 52px var(--split-w) minmax(0, 1fr);
    grid-template-rows: minmax(0, 1fr) minmax(0, 1fr);
  }
  .menu, .splitter[data-split="menu"] { grid-row: 1 / -1; }
  .work, .splitter[data-split="work"] { display: none; }
  .stream { grid-column: 3; grid-row: 1; }
  .canvas { grid-column: 3; grid-row: 2; border-top: 1px solid var(--border-2); }
  .ws-flow { grid-template-columns: repeat(2, 1fr); }
}
