/* ─────────────────────────────────────────────────────────────────────────────
   40-v2.css — 새 1탭 셸(#1719) + 클래식 임베드(?embed=1) 모드.
   토큰은 01-base.css 것만 쓴다(새 색 없음). 채운 파랑은 화면당 하나(주 액션). 상태 = 점 + 글자.
   ⚠ 이 파일은 캐스케이드 맨 뒤다 — 클래식 규칙(특히 35-liv.css 의 body[data-route="liv"] …)을 여기서 되잡는다.
   ───────────────────────────────────────────────────────────────────────────── */

/* ── 임베드 모드: 새 셸이 클래식 화면을 iframe 에 실을 때. 크롬만 걷고 화면 코드는 그대로. ── */
body.embed #org-banner, body.embed header.topbar, body.embed footer.app-foot, body.embed #skip-link { display: none !important; }
body.embed #view { padding-top: 12px; }
body.embed .liv-head { display: none; } /* 리브 페이지도 임베드되면 '← 라이블리'가 이중이 된다 */

/* ── 새 셸 켜짐: 클래식 크롬 숨김, 뿌리 전체 화면 ── */
body[data-ui="v2"] { height: 100vh; overflow: hidden; margin: 0; }
body[data-ui="v2"] #app { display: block !important; height: 100vh; }
body[data-ui="v2"] #org-banner, body[data-ui="v2"] header.topbar, body[data-ui="v2"] main#view, body[data-ui="v2"] footer.app-foot, body[data-ui="v2"] #skip-link { display: none !important; }
/* 세 칸 + 사이 손잡이 둘(v2/split.ts) — 너비는 변수, 손잡이가 바꾼다(기억됨). no-aside 면 우패널·그 손잡이는 0. */
#v2-root { --v2-side-w: 292px; --v2-aside-w: 316px; height: 100vh; display: grid; grid-template-columns: var(--v2-side-w) 6px minmax(0, 1fr) 6px var(--v2-aside-w); background: var(--bg, #fff); color: var(--ink); }
#v2-root.no-aside { grid-template-columns: var(--v2-side-w) 6px minmax(0, 1fr) 0 0; }
#v2-root.no-aside .v2-aside { display: none; }
#v2-root.no-aside > .v2-split-x + .v2-main + .v2-split-x { display: none; }
.v2-split { position: relative; z-index: 3; background: transparent; touch-action: none; }
.v2-split-x { cursor: col-resize; }
.v2-split-y { cursor: row-resize; height: 6px; flex: none; }
.v2-split::after { content: ''; position: absolute; background: var(--blue); opacity: 0; transition: opacity .12s; border-radius: 2px; }
.v2-split-x::after { top: 0; bottom: 0; left: 2px; right: 2px; }
.v2-split-y::after { left: 0; right: 0; top: 2px; bottom: 2px; }
.v2-split:hover::after, .v2-split.on::after, .v2-split:focus-visible::after { opacity: .55; }
.v2-split:focus-visible { outline: none; }
body.v2-splitting-x, body.v2-splitting-x * { cursor: col-resize !important; user-select: none; }
body.v2-splitting-y, body.v2-splitting-y * { cursor: row-resize !important; user-select: none; }
body.v2-splitting-x iframe, body.v2-splitting-y iframe { pointer-events: none; }
#v2-root .v2-ic { width: 16px; height: 16px; stroke: currentColor; stroke-width: 1.7; fill: none; stroke-linecap: round; stroke-linejoin: round; flex: none; }
.v2-k { font-family: var(--mono, ui-monospace, monospace); font-size: 11px; letter-spacing: .06em; text-transform: uppercase; color: var(--muted); }
.v2-dot { width: 6px; height: 6px; border-radius: 50%; background: transparent; box-shadow: inset 0 0 0 1.5px var(--muted-2, #a6b2c8); flex: none; display: inline-block; box-sizing: border-box; }
/* 상태점 어휘(web/v2/views.ts dotCls) — 색은 셋뿐: 작업 중·확인 필요·작업 완료. 나머지 살아 있는 것은 회색, 끝난 것은 빈 점(기본). */
.v2-dot.busy { background: var(--blue); box-shadow: none; animation: v2pulse 1.1s ease-in-out infinite; }
.v2-dot.wait { background: var(--amber, #C98A16); box-shadow: 0 0 0 2.5px color-mix(in srgb, var(--amber, #C98A16) 22%, transparent); }
.v2-dot.done { background: var(--mint-deep, #0FA37E); box-shadow: 0 0 0 2.5px color-mix(in srgb, var(--mint-deep, #0FA37E) 22%, transparent); }
.v2-dot.idle { background: var(--muted-2, #a6b2c8); box-shadow: none; }
.v2-dot.off { background: transparent; box-shadow: inset 0 0 0 1.5px var(--muted-2, #a6b2c8); }
.v2-dot.shell { background: var(--muted-head, #8b93a7); box-shadow: none; border-radius: 2px; }
@keyframes v2pulse { 50% { opacity: .35; } }
.v2-cnt { font-family: var(--mono, ui-monospace, monospace); font-size: 11px; color: var(--muted-2, #a6b2c8); }
.v2-muted { color: var(--muted); font-size: 13px; }
.v2-empty { font-size: 12.5px; color: var(--muted); line-height: 1.6; margin: 0; padding: 8px 4px; }
.v2-fine { font-size: 11.5px; color: var(--muted); line-height: 1.6; margin: 10px 0 0; }

/* ── 사이드바 ── */
.v2-side { background: var(--canvas, #F4F7FC); border-right: 1px solid var(--line); display: flex; flex-direction: column; min-height: 0; }
.v2-side-top { padding: 14px 12px 4px; }
.v2-logo { display: inline-flex; align-items: center; gap: 8px; font-weight: 800; font-size: 18.5px; letter-spacing: -.45px; color: var(--ink); padding: 6px 9px; border-radius: 9px; text-decoration: none; }
.v2-logo:hover { background: var(--bg, #fff); }
.v2-liv-btn { margin: 5px 8px 2px; display: flex; align-items: center; gap: 10px; padding: 10px 11px; border-radius: 10px; border: 1px solid transparent; font-weight: 700; font-size: 14.5px; color: var(--ink); text-decoration: none; }
.v2-liv-btn:hover, .v2-liv-btn.on { background: var(--bg, #fff); border-color: #CDEFE3; }
.v2-liv-btn .lm { width: 24px; height: 24px; border-radius: 50%; background: var(--bg-success, #F3FBF8); border: 1px solid #CDEFE3; display: grid; place-items: center; color: var(--mint-deep, #0FA37E); font-weight: 800; font-size: 11px; flex: none; }
.v2-liv-btn .sub { margin-left: auto; font-size: 12px; font-weight: 600; color: var(--muted); }
.v2-side-sec { padding: 16px 14px 6px 18px; display: flex; align-items: center; gap: 8px; flex-wrap: nowrap; }
/* 개수가 늘어도(196·1204) 줄바꿈되지 않게 — 조작부가 두 줄로 접히면 목록보다 머리가 커 보인다. */
.v2-side-sec .v2-k { flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.v2-side-sec .v2-flt-btn, .v2-side-sec .v2-add { flex: none; white-space: nowrap; }
.v2-add { font-size: 13px; font-weight: 700; color: var(--muted); text-decoration: none; padding: 2px 6px; border-radius: 6px; }
.v2-add:hover { color: var(--ink); background: var(--bg, #fff); }
/* 상태 칩 — 살아 있는 세션 상태별 개수. 누르면 그 상태만(렌즈). 채운 파랑은 안 쓴다(주 액션 아님) — 켜짐은 흰 배경+테두리. */
/* [필터] — 조작부는 버튼 하나. 팝오버 안에 상태·범위·완료가 모인다(#1719 사이드바 재구성). */
.v2-flt { position: relative; flex: none; }
.v2-flt-btn { display: inline-flex; align-items: center; gap: 5px; height: 27px; padding: 0 9px; border: 1px solid transparent; border-radius: 7px; background: none; font: inherit; font-size: 12.5px; font-weight: 700; color: var(--muted); cursor: pointer; }
.v2-flt-btn:hover, .v2-flt-btn.open { color: var(--ink); background: var(--bg, #fff); border-color: var(--line, #E6ECF5); }
.v2-flt-btn.has { color: var(--blue-deep, #1E54CC); }
.v2-flt-ic { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; }
.v2-flt-n { min-width: 15px; height: 15px; border-radius: 999px; background: var(--blue); color: #fff; font-size: 10px; font-weight: 800; display: inline-grid; place-items: center; padding: 0 3px; }
.v2-flt-pop { position: absolute; top: calc(100% + 6px); right: -40px; width: 236px; z-index: 30; background: var(--bg, #fff); border: 1px solid var(--line, #E6ECF5); border-radius: 12px; box-shadow: 0 12px 32px rgba(21, 35, 59, .14); padding: 6px; }
.v2-flt-k { font-family: var(--mono, ui-monospace, monospace); font-size: 11px; letter-spacing: .06em; color: var(--muted); padding: 8px 10px 3px; }
.v2-fo { display: flex; align-items: center; gap: 9px; width: 100%; padding: 8px 10px; border: 0; border-radius: 8px; background: none; font: inherit; font-size: 13.5px; font-weight: 600; color: var(--ink-sub); cursor: pointer; text-align: left; }
.v2-fo:hover { background: var(--bg-tint, #F6FAFF); color: var(--ink); }
.v2-fo.on { color: var(--ink); background: var(--bg-tint, #F6FAFF); }
.v2-fo .n { flex: 1; min-width: 0; }
.v2-fo-pad { width: 7px; flex: none; }
.v2-fo-ck { color: var(--mint-deep, #0FA37E); font-weight: 800; }
.v2-flt-foot { display: flex; justify-content: space-between; border-top: 1px solid var(--line, #E6ECF5); margin-top: 6px; padding: 6px 4px 2px; }
/* 필터가 켜졌을 때만 나오는 요약 한 줄 — 목록이 왜 짧은지 화면이 직접 말한다. */
.v2-flt-sum { display: flex; align-items: center; gap: 8px; margin: 4px 12px 0; padding: 4px 10px; border: 1px dashed var(--line-net, #DCE6F5); border-radius: 8px; font-size: 11.5px; font-weight: 600; color: var(--ink-sub); background: var(--bg, #fff); }
.v2-flt-sum span { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.v2-tree { flex: 1; min-height: 0; overflow: auto; padding: 4px 8px 12px; }
.v2-pj + .v2-pj { margin-top: 2px; }
/* 세션을 펼친 프로젝트는 한 덩어리다 — 앞뒤로 더 띄워 어디까지가 그 프로젝트인지 눈으로 끊는다. */
.v2-pj.open + .v2-pj, .v2-pj + .v2-pj.open { margin-top: 7px; }
/* 프로젝트 행 — 폴더 + 굵은 이름. 누르면 **프로젝트 화면**. 완료·조용함도 이름은 같은 잉크색(태그·시각이 구분). */
.v2-pj-row { display: flex; align-items: center; gap: 7px; padding: 8px 8px 8px 4px; border-radius: 8px; font-size: 14.5px; font-weight: 700; color: var(--ink); text-decoration: none; }
.v2-pj-row:hover { background: var(--bg, #fff); }
.v2-pj-row.on { background: var(--bg, #fff); box-shadow: inset 0 0 0 1px var(--line-net, #DCE6F5); }
.v2-pj-ic { width: 16.5px; height: 16.5px; flex: none; fill: none; stroke: var(--muted-2, #a6b2c8); stroke-width: 1.8; stroke-linejoin: round; }
.v2-pj-row:hover .v2-pj-ic, .v2-pj-row.on .v2-pj-ic { stroke: var(--blue); }
.v2-pj-row .n { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v2-pj-when { font-family: var(--mono, ui-monospace, monospace); font-size: 11px; color: var(--muted-2, #a6b2c8); flex: none; }
.v2-tag { font-family: var(--mono, ui-monospace, monospace); font-size: 11px; letter-spacing: .04em; color: var(--muted-2, #a6b2c8); border: 1px solid var(--line-net, #DCE6F5); border-radius: 4px; padding: 0 4px; line-height: 15px; flex: none; }
/* 프로젝트 행 오른쪽 상태 요약 — 색 점 + 개수. 확인 필요 › 작업 완료 › 작업 중 › 그 밖(회색) 순. */
.v2-sums { display: inline-flex; align-items: center; gap: 7px; flex: none; }
.v2-sum { display: inline-flex; align-items: center; gap: 4px; font-family: var(--mono, ui-monospace, monospace); font-size: 11.5px; font-weight: 600; color: var(--muted); }
.v2-sum.wait { color: var(--amber, #C98A16); }
.v2-sum.busy { color: var(--blue); }
.v2-sum.done { color: var(--mint-deep, #0FA37E); }
.v2-car { width: 20px; height: 20px; border: 0; background: none; color: var(--muted-2, #a6b2c8); font-size: 15px; line-height: 1; border-radius: 4px; cursor: pointer; padding: 0; transition: transform .15s ease; flex: none; }
.v2-car:hover { color: var(--ink); background: var(--bg-tint-2, #EEF5FF); }
.v2-car.none { visibility: hidden; cursor: default; }
.v2-pj.open > .v2-pj-row .v2-car { transform: rotate(90deg); }
/* 세션 행 — 들여쓴 레일 안, 상태점 + 보통 글씨. 누르면 **그 세션의 대화**. 프로젝트 행과 생김새가 다르다(위계).
   레일은 행마다 끊긴 테두리가 아니라 **그룹을 관통하는 선 하나**다 — 끊긴 선은 '매달린 가지'로 안 읽힌다. */
.v2-ss-list { position: relative; padding: 1px 0 7px 20px; }
.v2-ss-list::before { content: ''; position: absolute; left: 12px; top: 0; bottom: 10px; width: 1.5px; border-radius: 2px; background: var(--line-net, #DCE6F5); }
.v2-ss-row { position: relative; display: flex; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 7px; font-size: 13.5px; font-weight: 500; color: var(--ink-sub); text-decoration: none; min-height: 30px; }
.v2-ss-row + .v2-ss-row { margin-top: 2px; }
.v2-ss-row:hover { background: var(--bg-tint, #F6FAFF); color: var(--ink); }
.v2-ss-row.on { background: var(--bg-tint, #F6FAFF); color: var(--ink); font-weight: 700; }
/* 지금 보고 있는 세션 — 레일 그 자리를 파랗게 덮는다(선이 두 줄로 갈라지지 않게). */
.v2-ss-row.on::before { content: ''; position: absolute; left: -8.75px; top: 3px; bottom: 3px; width: 2px; border-radius: 2px; background: var(--blue); }
.v2-ss-go { width: 14px; height: 14px; flex: none; fill: none; stroke: var(--muted-2, #a6b2c8); stroke-width: 1.8; stroke-linejoin: round; opacity: 0; }
.v2-ss-row:hover .v2-ss-go { opacity: 1; }
.v2-ss-main { flex: 1; min-width: 0; display: flex; flex-direction: column; line-height: 1.35; }
.v2-ss-row .t { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v2-ss-row .sub { font-size: 12px; font-weight: 500; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; margin-top: 1px; }
.v2-ss-face { width: 18px; height: 18px; border-radius: 50%; font-size: 9.5px; font-weight: 700; flex: none; display: inline-grid; place-items: center; color: #fff; overflow: hidden; }
.v2-ss-face img { width: 100%; height: 100%; object-fit: cover; }
.v2-ss-row .w { font-size: 11.5px; color: var(--muted-2, #a6b2c8); flex: none; font-weight: 600; }
.v2-ss-row .w.wait { color: var(--amber, #C98A16); }
.v2-ss-row .w.busy { color: var(--blue); }
.v2-ss-row .w.done { color: var(--mint-deep, #0FA37E); }
.v2-ss-more { display: block; padding: 6px 8px; font-size: 13px; color: var(--muted); text-decoration: none; }
.v2-tree-note { margin: 10px 8px 0; padding: 10px 12px; border: 1px dashed var(--line-net, #DCE6F5); border-radius: 9px; font-size: 13px; color: var(--muted); line-height: 1.55; display: flex; flex-direction: column; gap: 4px; align-items: flex-start; }
.v2-tree-note .btn-text { font-size: 13px; padding: 0; }
.v2-tree-more { display: block; width: 100%; margin-top: 8px; padding: 7px 8px; border: 1px dashed var(--line-net, #DCE6F5); border-radius: 8px; background: none; font: inherit; font-size: 13px; font-weight: 600; color: var(--muted); cursor: pointer; text-align: left; }
.v2-tree-more:hover { color: var(--ink); background: var(--bg, #fff); }
.v2-side-foot { padding: 8px 10px 10px; border-top: 1px solid var(--line); display: flex; flex-direction: column; gap: 6px; }
.v2-apps-btn { display: flex; align-items: center; gap: 9px; width: 100%; padding: 10px 11px; border-radius: 10px; border: 1px solid var(--line); background: var(--bg, #fff); font: inherit; font-size: 14px; font-weight: 700; color: var(--ink); cursor: pointer; }
.v2-apps-btn:hover { border-color: var(--blue); }
.v2-apps-btn .v2-cnt { margin-left: auto; }
.v2-me { display: flex; align-items: center; gap: 9px; padding: 4px 4px; font-size: 13.5px; color: var(--ink-sub); }
.v2-me .v2-ava { width: 25px; height: 25px; border-radius: 50%; font-size: 11px; }
.v2-me-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v2-classic-link { border: 0; background: none; font: inherit; font-size: 12px; color: var(--muted-2, #a6b2c8); cursor: pointer; text-align: left; padding: 0 4px; }
.v2-classic-link:hover { color: var(--ink-sub); text-decoration: underline; }

/* ── 중앙 ── */
.v2-main { min-width: 0; min-height: 0; overflow: auto; display: flex; flex-direction: column; background: var(--bg, #fff); }
.v2-center { width: 100%; max-width: 820px; margin: 0 auto; padding: 30px 40px 40px; }
.v2-eyebrow { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; font-size: 12.5px; color: var(--muted); }
.v2-title { margin: 8px 0 0; font-size: 24px; font-weight: 800; letter-spacing: -.5px; line-height: 1.3; }
.v2-desc { margin: 10px 0 0; font-size: 14.5px; color: var(--ink-sub); line-height: 1.7; max-width: 66ch; white-space: pre-line; }
.v2-actrow { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: 16px; }
.v2-sec { margin-top: 26px; }
.v2-sec-h { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
.v2-list { border: 1px solid var(--line); border-radius: 12px; background: var(--bg, #fff); overflow: hidden; }
.v2-row { display: flex; align-items: center; gap: 12px; padding: 11px 14px; text-decoration: none; color: inherit; }
.v2-row + .v2-row { border-top: 1px solid var(--line-row, #EDF1F8); }
.v2-row:hover { background: var(--bg-tint, #F6FAFF); }
.v2-row-main { min-width: 0; flex: 1; }
.v2-row .t { font-size: 14px; font-weight: 700; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v2-row .m { font-size: 12.5px; color: var(--muted); margin-top: 2px; }
.v2-row-r { color: var(--muted-2, #a6b2c8); }
.v2-more { display: block; padding: 9px 14px; font-size: 12.5px; color: var(--muted); text-decoration: none; border-top: 1px solid var(--line-row, #EDF1F8); }

/* 홈 — 인사 + 입력창 하나(#1719, claude.ai 홈처럼) + 지금 도는 세션 */
.v2-home { flex: 1; min-height: 0; display: flex; flex-direction: column; width: 100%; max-width: 780px; margin: 0 auto; padding: 34px 32px 18px; }
/* 홈 = 런처(#1719 재설계) — 왼끝 정렬(가운데 정렬 낙수형 탈피), 입력 카드가 유일한 주인공. */
.v2-home-launch { max-width: 720px; justify-content: flex-start; padding-top: clamp(36px, 13vh, 120px); }
.v2-home-eyebrow { display: flex; align-items: center; gap: 8px; font-size: 12.5px; color: var(--muted); font-variant-numeric: tabular-nums; }
.v2-home-eyebrow .sep { color: var(--line-net-2, #CFE0F7); }
.v2-home-eyebrow .st { display: inline-flex; align-items: center; gap: 5px; font-weight: 700; color: var(--ink-sub); }
.v2-home-eyebrow .st.wait { color: var(--amber, #B7791F); }
.v2-home-launch .v2-h1 { font-size: 25px; letter-spacing: -.45px; margin: 8px 0 0; }
.v2-launch { position: relative; margin-top: 16px; border: 1px solid var(--line-net, #D5DDEA); border-radius: 16px; background: var(--bg, #fff);
  box-shadow: 0 1px 2px rgba(21, 35, 59, .05), 0 10px 30px -18px rgba(21, 35, 59, .18); padding: 14px 14px 10px; }
.v2-launch:focus-within { border-color: var(--blue); box-shadow: 0 0 0 3px color-mix(in srgb, var(--blue) 14%, transparent), 0 10px 30px -18px rgba(21, 35, 59, .2); }
.v2-launch-in { display: block; width: 100%; resize: none; border: 0; outline: 0; background: transparent; font: inherit; font-size: 15.5px; line-height: 1.6; min-height: 52px; }
.v2-launch-in::placeholder { color: var(--muted-2, #a6b2c8); }
.v2-launch-in:disabled { opacity: .55; }
.v2-launch-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; margin-top: 8px; border-top: 1px solid var(--line-row, #EDF1F8); padding-top: 9px; }
/* 행선지 — "이 입력이 어디로 가는가"가 창 안에 산다. 칩이 곧 바꾸는 버튼이다. */
.v2-dest { display: flex; align-items: center; gap: 8px; min-width: 0; }
.v2-dest-k { font-family: var(--mono, ui-monospace, monospace); font-size: 10px; letter-spacing: .06em; color: var(--muted); flex: none; }
.v2-dest-chip { display: inline-flex; align-items: center; gap: 7px; max-width: 320px; height: 28px; padding: 0 10px; border: 1px solid var(--line, #E6ECF5); border-radius: 999px; background: var(--bg-tint, #F6FAFF); font: inherit; font-size: 12.5px; color: var(--ink); cursor: pointer; min-width: 0; }
.v2-dest-chip:hover { border-color: var(--line-net-2, #CFE0F7); background: var(--bg, #fff); }
.v2-dest-chip b { font-weight: 700; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.v2-dest-chip .car { color: var(--muted); font-size: 10px; flex: none; }
.v2-dest-dot { width: 7px; height: 7px; border-radius: 50%; background: var(--line-net, #DCE6F5); flex: none; }
.v2-dest-dot.on { background: var(--blue); }
.v2-dest-why { font-size: 11.5px; color: var(--muted); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.v2-launch-send { flex: none; display: inline-flex; align-items: center; gap: 7px; height: 34px; padding: 0 15px; }
.v2-launch-send kbd { font-family: var(--mono, ui-monospace, monospace); font-size: 11px; opacity: .75; }
.v2-dest-pop { position: absolute; left: 14px; bottom: 52px; width: min(360px, calc(100% - 28px)); z-index: 30; background: var(--bg, #fff); border: 1px solid var(--line, #E6ECF5); border-radius: 12px; box-shadow: 0 14px 36px rgba(21, 35, 59, .16); padding: 8px; }
.v2-dest-q { width: 100%; height: 30px; border: 1px solid var(--line, #E6ECF5); border-radius: 8px; padding: 0 9px; font: inherit; font-size: 12.5px; background: var(--bg-tint, #F6FAFF); }
.v2-dest-q:focus-visible { outline: 2px solid var(--blue); outline-offset: 0; border-color: transparent; }
.v2-dest-list { margin-top: 6px; max-height: 260px; overflow: auto; display: flex; flex-direction: column; gap: 1px; }
.v2-dest-opt { display: flex; align-items: baseline; gap: 8px; width: 100%; text-align: left; padding: 7px 9px; border: 0; border-radius: 8px; background: none; font: inherit; font-size: 13px; color: var(--ink); cursor: pointer; }
.v2-dest-opt:hover { background: var(--bg-tint, #F6FAFF); }
.v2-dest-opt.on { background: var(--bg-tint, #F6FAFF); font-weight: 700; }
.v2-dest-opt .n { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v2-dest-opt .s { font-size: 11px; color: var(--muted); flex: none; }
.v2-dest-opt .ck { color: var(--mint-deep, #0FA37E); font-weight: 800; flex: none; }
.v2-dest-opt.auto { border-top: 1px dashed var(--line, #E6ECF5); border-radius: 0 0 8px 8px; margin-top: 4px; padding-top: 9px; color: var(--ink-sub); }
.v2-launch-hint { margin-top: 7px; font-size: 11.5px; color: var(--muted-2, #a6b2c8); }
.v2-launch-sugs { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; margin-top: 14px; }
.v2-launch-sugs .v2-k { flex: none; }
.v2-launch-sugs .chip { font-size: 12.5px; padding: 5px 11px; border-radius: 999px; max-width: 280px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v2-home-launch .v2-now { margin-top: 26px; }
/* ── 아래는 HEAD 원문 유지 구간(런처 재설계에서 대체하지 않은 규칙들) ── */
  padding: 12px 12px 10px; box-shadow: 0 1px 2px rgba(16, 24, 40, .04); }
  line-height: 1.6; color: var(--ink); min-height: 48px; max-height: 220px; padding: 2px 4px; }
/* 상단바 프로젝트 연결(#1749) — 버튼 + 검색 드롭다운(anchoredPopover .dash-pop 위에 얹힘) */
.sc-proj { display: inline-flex; align-items: center; gap: 4px; min-width: 0; }
.sc-proj > a { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 240px; }
.sc-proj-btn { padding: 1px 4px; border-radius: 6px; color: var(--muted); }
.sc-proj-btn:hover { color: var(--ink); background: var(--bg-tint, #F6FAFF); }
.sc-proj-connect { display: inline-flex; align-items: center; gap: 5px; border: 1px dashed var(--line-net, #D5DDEA); padding: 2px 9px; border-radius: 999px;
  color: var(--ink-sub); font-size: 12px; font-weight: 600; }
.sc-proj-connect:hover { border-color: var(--blue); color: var(--blue); background: transparent; }
.sc-proj-car { font-size: 9px; color: inherit; }
.sc-proj-none { color: var(--muted); }
.v2-pjpick { width: 320px; max-width: calc(100vw - 24px); display: flex; flex-direction: column; gap: 8px; padding: 8px; }   /* 배경·그림자는 .dash-pop-panel(20-dashboard.css) */
.v2-pjpick-in { height: 32px; border: 1px solid var(--line-net, #D5DDEA); border-radius: 8px; padding: 0 10px; font: inherit; font-size: 13px;
  background: var(--bg, #fff); color: var(--ink); }
.v2-pjpick-in:focus-visible { outline: 2px solid var(--blue); outline-offset: 1px; border-color: transparent; }
.v2-pjpick-list { max-height: 320px; overflow: auto; display: flex; flex-direction: column; }
.v2-pjpick-row { display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%; text-align: left; border: 0; background: none;
  padding: 7px 8px; border-radius: 8px; cursor: pointer; font: inherit; color: var(--ink); }
.v2-pjpick-row:hover { background: var(--bg-tint, #F6FAFF); }
.v2-pjpick-row .n { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; font-weight: 600; }
.v2-pjpick-row .m { flex: none; display: inline-flex; align-items: center; gap: 6px; font-size: 11.5px; color: var(--muted); }
.v2-pjpick-row.cur { cursor: default; background: var(--bg-subtle, #F4F6FA); }
.v2-pjpick-cur { color: var(--mint-deep, #0FA37E); font-weight: 700; }
.v2-pjpick-done { border: 1px solid var(--line-row, #EDF1F8); border-radius: 999px; padding: 0 6px; font-size: 10.5px; }
.v2-pjpick-none .n { color: var(--coral-text, #C0392B); }
.v2-pjpick-note:empty { display: none; }
.v2-liv-tag { display: inline-flex; align-items: center; gap: 7px; color: var(--mint-deep, #0FA37E); font-weight: 800; font-size: 13px; }
.v2-h1 { margin: 10px 0 0; font-size: 22px; font-weight: 800; letter-spacing: -.45px; line-height: 1.38; text-wrap: balance; word-break: keep-all; }
.v2-title, .v2-desc { word-break: keep-all; }
.v2-find { padding: 4px 12px 2px; }
.v2-find-in { width: 100%; height: 34px; border: 1px solid var(--line); border-radius: 9px; padding: 0 11px; font: inherit; font-size: 13.5px; background: var(--bg, #fff); }
.v2-find-in:focus-visible { outline: 2px solid var(--blue); outline-offset: 1px; border-color: transparent; }
.v2-sugs { display: flex; flex-wrap: wrap; gap: 8px; margin: 14px 0 12px; }
.v2-sugs .chip { font-size: 13px; padding: 6px 12px; border-radius: 999px; }
.v2-chat { flex: 1; min-height: 260px; border: 1px solid var(--line); border-radius: 14px; background: var(--bg, #fff); overflow: hidden; display: flex; flex-direction: column; }
.v2-chat-body { flex: 1; min-height: 0; display: flex; }
.v2-askdock { margin-top: 8px; }
.v2-now { margin-top: 18px; }
.v2-now-h { display: flex; align-items: baseline; justify-content: space-between; margin-bottom: 6px; }
.v2-now .v2-k { display: block; }
.v2-now-row { display: flex; align-items: center; gap: 10px; padding: 8px 10px; border-radius: 9px; text-decoration: none; color: inherit; }
.v2-now-row:hover { background: var(--bg-tint, #F6FAFF); }
.v2-now-row + .v2-now-row { border-top: 1px solid var(--line-row, #EDF1F8); }
/* 답을 기다리는 세션 — 목록 맨 위 + 앰버 근(왼쪽 2px). '답하기 →' 는 hover 없이도 보인다(기다림은 숨기지 않는다). */
.v2-now-row.wait { border-left: 2px solid var(--amber, #C98A16); border-radius: 0 9px 9px 0; background: color-mix(in srgb, var(--amber, #C98A16) 5%, transparent); }
.v2-now-row.wait + .v2-now-row { border-top-color: transparent; }
.v2-now-row .p { flex: none; max-width: 180px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 11px; color: var(--ink-sub); border: 1px solid var(--line, #E6ECF5); border-radius: 999px; padding: 1px 8px; background: var(--bg, #fff); }
.v2-now-row .go { flex: none; font-size: 12px; font-weight: 700; color: var(--amber, #B7791F); }
.v2-now-row .t { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13.5px; font-weight: 700; color: var(--ink); }
.v2-now-row .st { font-size: 12px; color: var(--ink-sub); flex: none; }

/* 리브 페이지(클래식 renderLiv 를 이 칸에) — 35-liv 의 body[data-route=liv] main 규칙은 여기 안 닿는다(main 태그 안 씀) */
.v2-livpage { flex: 1; min-height: 0; padding: 14px 18px 16px; background: var(--canvas, #F4F7FC); display: flex; flex-direction: column; }
.v2-livpage .liv-wrap { flex: 1; }
body[data-ui="v2"][data-route="liv"] { overflow: hidden; }

/* 앱 프레임 — 클래식 화면 임베드 · 라이브 터미널 */
.v2-app { flex: 1; min-height: 0; display: flex; flex-direction: column; }
.v2-frame-h { display: flex; align-items: center; gap: 10px; padding: 8px 14px; border-bottom: 1px solid var(--line); background: var(--bg, #fff); }
.v2-frame-t { font-size: 13.5px; font-weight: 800; }
.v2-frame-sub { font-size: 12px; color: var(--muted); }
.v2-frame-acts { margin-left: auto; display: inline-flex; gap: 8px; align-items: center; }
.v2-frame-acts .btn-text { font-size: 12.5px; }
.v2-sess-meta { display: flex; align-items: center; gap: 8px; padding: 6px 14px; font-size: 12.5px; color: var(--ink-sub); border-bottom: 1px solid var(--line-row, #EDF1F8); background: var(--bg, #fff); }
.v2-sess-meta a { color: var(--ink-sub); text-decoration: none; }
.v2-sess-meta a:hover { color: var(--blue); }
.v2-frame { flex: 1; min-height: 0; width: 100%; border: 0; background: var(--bg, #fff); }

/* ── 우측 ── */
.v2-aside { background: var(--canvas, #F4F7FC); border-left: 1px solid var(--line); min-height: 0; overflow: auto; padding: 16px 14px 24px; display: flex; flex-direction: column; gap: 10px; }
.v2-aside-h { display: flex; align-items: baseline; gap: 8px; padding: 0 2px; }
.v2-aside-h b { font-size: 13.5px; font-weight: 800; }
.v2-aside-h .v2-k { margin-left: auto; }
.v2-liv-cards { gap: 6px; }
.v2-liv-rail { overflow: visible; }
.v2-liv-rail .liv-cards { gap: 6px; }
.v2-kn-sec .v2-k { display: block; margin: 6px 2px 6px; }
.v2-kn-list { display: flex; flex-direction: column; gap: 6px; }
.v2-kn { display: flex; align-items: baseline; gap: 8px; background: var(--bg, #fff); border: 1px solid var(--line); border-radius: 10px; padding: 8px 10px; text-decoration: none; color: inherit; }
.v2-kn:hover { border-color: var(--line-net-2, #CFE0F7); }
.v2-kn-rel { font-family: var(--mono, ui-monospace, monospace); font-size: 10.5px; letter-spacing: .04em; flex: none; }
.v2-kn-rel.req { color: var(--ink-note, #2D4A7A); }
.v2-kn-rel.prod { color: var(--mint-deep, #0FA37E); }
.v2-kn-name { font-size: 12.5px; font-weight: 600; color: var(--ink); min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v2-applist { display: flex; flex-direction: column; gap: 4px; }
.v2-applink { display: flex; align-items: center; gap: 8px; padding: 7px 9px; border-radius: 8px; font-size: 13px; font-weight: 600; color: var(--ink); text-decoration: none; }
.v2-applink:hover { background: var(--bg, #fff); }
.v2-facts { display: grid; grid-template-columns: auto 1fr; gap: 6px 12px; margin: 0; font-size: 12.5px; }
.v2-facts dt { color: var(--muted); }
.v2-facts dd { margin: 0; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* ── 우패널 타임라인(#1719) — 프로젝트·세션·워크스페이스가 같은 부품 ──
   상민님 2026-08-18: "중요한 변화·새 파일·결정만. 모두 한 줄로 요약하고 자세한 건 눌러서."
   그래서 이 패널에 **두 줄짜리 행은 없다.** 위계는 굵기·점·색으로만 말한다. */
.tl-wrap { display: flex; flex-direction: column; gap: 8px; flex: none; }
.tl-scope { font-size: 11.5px; color: var(--muted); }
.tl-wrap .v2-aside-h .v2-k { margin-left: auto; }
.tl-seg { display: flex; align-items: center; gap: 2px; background: var(--bg, #fff); border: 1px solid var(--line); border-radius: 9px; padding: 2px; }
.tl-seg-b { flex: 1; min-width: 0; display: inline-flex; align-items: center; justify-content: center; gap: 4px; height: 24px; padding: 0 6px; border: 0; border-radius: 7px; background: none; font: inherit; font-size: 11.5px; font-weight: 600; color: var(--muted); cursor: pointer; white-space: nowrap; }
.tl-seg-b:hover { color: var(--ink); }
.tl-seg-b.on { background: var(--bg-tint-2, #EEF5FF); color: var(--ink); }
.tl-seg-b .n { font-family: var(--mono, ui-monospace, monospace); font-size: 10px; color: var(--muted-2, #a6b2c8); }
.tl-seg-b.on .n { color: var(--blue); }
.tl-kind-b { flex: none; height: 24px; padding: 0 8px; border: 0; border-left: 1px solid var(--line); border-radius: 0 7px 7px 0; background: none; font: inherit; font-size: 11.5px; font-weight: 600; color: var(--muted); cursor: pointer; }
.tl-kind-b:hover, .tl-kind-b.open { color: var(--ink); }
.tl-kind-b.on { color: var(--blue); }
.tl-kinds { display: flex; flex-wrap: wrap; gap: 4px; }
.tl-kchip { display: inline-flex; align-items: center; gap: 5px; height: 22px; padding: 0 8px; border: 1px solid transparent; border-radius: 999px; background: none; font: inherit; font-size: 11px; color: var(--ink-sub); cursor: pointer; }
.tl-kchip:hover { background: var(--bg, #fff); }
.tl-kchip.on { background: var(--bg, #fff); border-color: var(--line-net-2, #CFE0F7); color: var(--ink); font-weight: 600; }
.tl-kchip .n { font-family: var(--mono, ui-monospace, monospace); font-size: 10px; color: var(--muted-2, #a6b2c8); }
.tl-list { display: flex; flex-direction: column; min-height: 0; }
.tl-day { display: flex; align-items: center; gap: 8px; padding: 10px 2px 4px; font-size: 10.5px; font-weight: 600; color: var(--muted-2, #a6b2c8); }
.tl-day::after { content: ""; flex: 1; height: 1px; background: var(--line-net, #DCE6F5); }

/* 세로 레일 — 점이 레일 위에 얹힌다 */
.tl-rail { position: relative; padding-left: 16px; display: flex; flex-direction: column; }
.tl-rail::before { content: ""; position: absolute; left: 4px; top: 9px; bottom: 9px; width: 1px; background: var(--line-net, #DCE6F5); }

/* 한 줄 — 모든 항목이 같은 골격: [동사] [제목……] [×N] [얼굴] [시각] */
.tl-ev { position: relative; display: flex; align-items: center; gap: 6px; min-height: 23px; padding: 2px 2px 2px 0; border-radius: 6px; text-decoration: none; color: inherit; }
.tl-ev::before { content: ""; position: absolute; left: -14px; top: 9px; width: 5px; height: 5px; border-radius: 50%; background: var(--bg, #fff); border: 1.5px solid var(--muted-2, #a6b2c8); box-sizing: border-box; }
.tl-ev.go:hover { background: var(--bg, #fff); }
.tl-ev .tl-verb { flex: none; font-size: 11px; font-weight: 600; color: var(--muted); }
.tl-ev .tl-ttl { flex: 1; min-width: 0; font-size: 12.5px; color: var(--ink-sub); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.tl-ev .tl-tm { flex: none; font-family: var(--mono, ui-monospace, monospace); font-size: 10px; color: var(--muted-2, #a6b2c8); }
.tl-ev.go:hover .tl-ttl { color: var(--blue); }
.tl-ev.err .tl-ttl { color: var(--coral-text, #B84E44); }
/* 1단 = 남은 변화: 굵게 + 채운 점 */
.tl-ev.t1::before { top: 8px; width: 7px; height: 7px; background: var(--mint-deep, #0FA37E); border-color: var(--mint-deep, #0FA37E); }
.tl-ev.t1.tlk-activity::before, .tl-ev.t1.tlk-cmd::before { background: var(--blue); border-color: var(--blue); }
.tl-ev.t1 .tl-verb { color: var(--mint-deep, #0FA37E); font-weight: 700; }
.tl-ev.t1.tlk-activity .tl-verb, .tl-ev.t1.tlk-cmd .tl-verb { color: var(--blue); }
.tl-ev.t1 .tl-ttl { color: var(--ink); font-weight: 600; }
/* 3단 = 뒷일: 흐리게 */
.tl-ev.t3 .tl-ttl { font-size: 11.5px; color: var(--muted); }
.tl-ev.t3::before { width: 4px; height: 4px; left: -13.5px; border-color: var(--line-net, #DCE6F5); }
.tl-x { flex: none; font-family: var(--mono, ui-monospace, monospace); font-size: 10px; color: var(--muted-2, #a6b2c8); }

/* 장(章) — 접힌 제목 + 결과 배지. 누르면 그 안이 펼쳐진다. */
.tl-ch { position: relative; }
.tl-ch + .tl-ch { margin-top: 1px; }
.tl-ch-top { position: relative; display: flex; align-items: center; gap: 5px; min-height: 26px; padding: 2px 2px 2px 0; border-radius: 7px; }
.tl-ch-top::before { content: ""; position: absolute; left: -14px; top: 11px; width: 7px; height: 7px; border-radius: 50%; background: var(--ink-sub, #5A6B85); box-sizing: border-box; }
.tl-ch.open > .tl-ch-top::before { background: var(--blue); }
.tl-ch-top:hover { background: var(--bg, #fff); }
.tl-car { flex: none; width: 16px; height: 16px; margin-left: -3px; border: 0; background: none; color: var(--muted-2, #a6b2c8); font-size: 13px; line-height: 1; border-radius: 4px; cursor: pointer; padding: 0; transition: transform .15s ease; }
.tl-car:hover { color: var(--ink); }
.tl-ch.open .tl-car { transform: rotate(90deg); }
.tl-ch-ttl { flex: 1; min-width: 0; font-size: 12.5px; font-weight: 700; color: var(--ink); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; text-decoration: none; }
a.tl-ch-ttl:hover { color: var(--blue); }
.tl-bdgs { flex: none; display: inline-flex; align-items: center; gap: 7px; }
.tl-bdg { display: inline-flex; align-items: center; gap: 3px; font-size: 10.5px; color: var(--muted); white-space: nowrap; }
.tl-dur { flex: none; font-size: 10.5px; color: var(--muted-2, #a6b2c8); }
.tl-ch-top .tl-tm { flex: none; font-family: var(--mono, ui-monospace, monospace); font-size: 10px; color: var(--muted-2, #a6b2c8); }
.tl-ch-body { position: relative; padding: 1px 0 4px 14px; margin-left: 3px; border-left: 1px solid var(--line-net, #DCE6F5); }
.tl-ch-body .tl-ev::before { left: -18px; }

.tl-face { width: 15px; height: 15px; border-radius: 50%; font-size: 8.5px; font-weight: 700; flex: none; display: inline-grid; place-items: center; color: #fff; overflow: hidden; }
.tl-face img { width: 100%; height: 100%; object-fit: cover; display: block; }
.tl-dot { width: 6px; height: 6px; border-radius: 50%; background: var(--muted-2, #a6b2c8); flex: none; display: inline-block; }
/* ⚠ 접두어 tlk- 인 이유: 옛 발자취 CSS 에 **범위 없는** .k-file/.k-task 규칙이 살아 있어(.k-task{background:coral})
   행에 k-task 를 붙이면 행 전체가 산호색으로 칠해진다(실측). 우리 클래스는 우리 접두어를 쓴다. */
.tl-dot.tlk-file { background: var(--mint-deep, #0FA37E); }
.tl-dot.tlk-knowledge { background: var(--teal, #1BAEB0); }
.tl-dot.tlk-activity { background: var(--blue); }
.tl-dot.tlk-cmd { background: var(--blue); }
.tl-dot.tlk-task { background: var(--blue-deep, #1E54CC); }
.tl-dot.tlk-project { background: var(--blue-deep, #1E54CC); }
.tl-dot.tlk-source { background: var(--node-blue-soft, #9DBDF2); }
.tl-dot.tlk-say, .tl-dot.tlk-meta { background: var(--muted-2, #a6b2c8); }
.tl-dot.tlk-all { background: transparent; box-shadow: inset 0 0 0 1.5px var(--muted-2, #a6b2c8); }
.v2-kn-foot { margin-top: 14px; padding-top: 12px; border-top: 1px solid var(--line); display: flex; flex-direction: column; gap: 6px; }

/* ── 런치패드 ── */
.v2-pad { position: fixed; inset: 0; z-index: 900; background: rgba(21, 35, 59, .28); backdrop-filter: blur(6px); display: flex; flex-direction: column; align-items: center; padding: 48px 24px; overflow: auto; }
.v2-pad-top { width: min(920px, 100%); display: flex; align-items: center; gap: 12px; margin-bottom: 18px; background: var(--bg, #fff); border: 1px solid var(--line); border-radius: 14px; padding: 12px 14px; }
.v2-pad-h { display: flex; flex-direction: column; min-width: 0; }
.v2-pad-h b { font-size: 15px; font-weight: 800; }
.v2-pad-sub { font-size: 12px; color: var(--muted); }
.v2-pad-search { flex: 1; min-width: 160px; height: 36px; border: 1px solid var(--line-net, #DCE6F5); border-radius: 10px; padding: 0 12px; font: inherit; font-size: 14px; background: var(--bg, #fff); }
.v2-pad-grid { width: min(920px, 100%); display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 12px; }
.v2-pad-item { display: flex; flex-direction: column; align-items: center; gap: 8px; padding: 18px 12px 14px; background: var(--bg, #fff); border: 1px solid var(--line); border-radius: 16px; text-decoration: none; color: var(--ink); text-align: center; box-shadow: var(--shadow-1, 0 2px 8px rgba(21,35,59,.05)); }
.v2-pad-item:hover { border-color: var(--blue); }
.v2-pad-item b { font-size: 13.5px; font-weight: 800; }
.v2-pad-ico { width: 46px; height: 46px; border-radius: 13px; background: var(--bg-tint, #F6FAFF); border: 1px solid var(--line); display: grid; place-items: center; color: var(--ink-sub); }
.v2-pad-ico .v2-ic { width: 22px; height: 22px; }
.v2-pad-desc { font-size: 11.5px; color: var(--muted); line-height: 1.5; }
.v2-pad-empty { color: #fff; font-size: 13px; }

@media (max-width: 1100px) { #v2-root { grid-template-columns: 232px minmax(0, 1fr) 280px; } .v2-center { padding-left: 24px; padding-right: 24px; } }
@media (max-width: 900px) { #v2-root, #v2-root.no-aside { grid-template-columns: 220px 6px minmax(0, 1fr) 0 0; } .v2-aside, #v2-root > .v2-split-x + .v2-main + .v2-split-x { display: none; } }

/* ── 세션 우패널: 사실 한 줄 + 발자취(web/session-trail.ts) ── */
.v2-sfacts { display: flex; align-items: center; flex-wrap: wrap; gap: 6px; font-size: 12px; color: var(--ink-sub); padding: 0 2px; }
.v2-sfacts a { color: var(--ink-sub); text-decoration: none; } .v2-sfacts a:hover { color: var(--blue); }
.v2-sfacts .sep { color: var(--muted-2, #a6b2c8); }
.tr-wrap { display: flex; flex-direction: column; gap: 8px; min-height: 0; }
.tr-sub { font-size: 11.5px; color: var(--muted); }
.tr-chips { display: flex; flex-wrap: wrap; gap: 4px; }
.tr-chip { display: inline-flex; align-items: center; gap: 5px; font: inherit; font-size: 11.5px; line-height: 1; padding: 5px 8px; border-radius: 999px;
  border: 1px solid var(--line); background: var(--bg); color: var(--ink-sub); cursor: pointer; }
.tr-chip:hover { border-color: var(--line-net); color: var(--ink); }
.tr-chip.on { background: var(--ink); color: var(--bg); border-color: var(--ink); }
.tr-chip.on .tr-chip-dot { box-shadow: 0 0 0 1px var(--bg); }
.tr-chip-n { font-family: var(--mono, ui-monospace, monospace); font-size: 10.5px; opacity: .8; }
.tr-chip-dot, .tr-dot { width: 7px; height: 7px; border-radius: 50%; flex: none; display: inline-block; background: var(--muted-2, #a6b2c8); }
.k-file { background: var(--ink-sub); } .k-knowledge { background: var(--blue); } .k-activity { background: var(--mint-deep); }
.k-project { background: var(--teal); } .k-task { background: var(--coral); } .k-source { background: var(--node-blue-soft, #9DBDF2); }
.k-all { background: transparent; box-shadow: inset 0 0 0 1.5px var(--muted-2, #a6b2c8); }
.tr-list { display: flex; flex-direction: column; gap: 2px; }
.tr-row { border-radius: 8px; }
.tr-row.open { background: var(--bg); border: 1px solid var(--line); }
.tr-row[hidden] { display: none; }
.tr-head { display: flex; align-items: center; gap: 7px; width: 100%; text-align: left; font: inherit; font-size: 12.5px; line-height: 1.45;
  padding: 6px 8px; border: 0; border-radius: 8px; background: none; color: var(--ink); cursor: pointer; }
.tr-head:hover { background: var(--bg); }
.tr-row.open > .tr-head { border-radius: 8px 8px 0 0; }
.tr-verb { color: var(--ink-sub); flex: none; }
.tr-label { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; flex: 1; font-weight: 600; }
.tr-x { font-family: var(--mono, ui-monospace, monospace); font-size: 10.5px; color: var(--muted); flex: none; }
.tr-st { font-family: var(--mono, ui-monospace, monospace); font-size: 10.5px; color: var(--coral-text); flex: none; }
.tr-tm { font-family: var(--mono, ui-monospace, monospace); font-size: 10.5px; color: var(--muted-2, #a6b2c8); flex: none; }
.tr-body { padding: 4px 10px 10px; display: flex; flex-direction: column; gap: 8px; font-size: 12.5px; }
.tr-body[hidden] { display: none; }
.tr-loading { color: var(--muted); font-size: 12px; margin: 0; }
.tr-title { font-weight: 700; font-size: 13px; line-height: 1.5; }
.tr-kv, .tr-path { font-family: var(--mono, ui-monospace, monospace); font-size: 11px; color: var(--ink-sub); word-break: break-all; }
.tr-part { min-width: 0; }
.tr-cap { font-family: var(--mono, ui-monospace, monospace); font-size: 10px; letter-spacing: .04em; color: var(--muted); margin-bottom: 3px; }
.tr-pre { margin: 0; padding: 8px 10px; border-radius: 6px; background: var(--bg-tint); border: 1px solid var(--line);
  font-family: var(--mono, ui-monospace, monospace); font-size: 11px; line-height: 1.55; white-space: pre-wrap; word-break: break-word; max-height: 360px; overflow: auto; }
.tr-md { font-size: 12.5px; line-height: 1.7; max-height: 480px; overflow: auto; }
.tr-md .md > :first-child { margin-top: 0; }
.tr-body .btn { align-self: flex-start; }

/* ── 워크스페이스 스위처(#1750) — 좌상단. 홈 워드마크 + 개인/팀 배지 버튼. 메뉴는 body 에 fixed 로 뜬다. ── */
.v2-side-top { display: flex; align-items: center; gap: 6px; padding: 12px 12px 4px; }
.v2-side-top .v2-logo { padding: 6px 8px; }
.v2-ws { flex: 1; min-width: 0; display: flex; align-items: center; gap: 6px; padding: 6px 8px; border: 1px solid var(--line); border-radius: 9px; background: var(--bg, #fff); font: inherit; cursor: pointer; }
.v2-ws:hover { border-color: var(--line-net-2, #CFE0F7); }
.v2-ws-name { flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 13px; font-weight: 700; color: var(--ink); }
.v2-ws-car { font-size: 10px; color: var(--muted-2, #a6b2c8); flex: none; }
.v2-ws-badge { flex: none; font-family: var(--mono, ui-monospace, monospace); font-size: 9.5px; letter-spacing: .04em; font-weight: 700; padding: 1px 5px; border-radius: 5px; border: 1px solid transparent; }
.v2-ws-badge.personal { color: var(--mint-deep, #0FA37E); background: var(--bg-success, #F3FBF8); border-color: #CDEFE3; }
.v2-ws-badge.team { color: var(--blue); background: var(--bg-tint, #F6FAFF); border-color: var(--line-net-2, #CFE0F7); }
/* 스위처 메뉴(fixed, body 부착) */
.v2-ws-menu { z-index: 60; background: var(--bg, #fff); border: 1px solid var(--line); border-radius: 12px; box-shadow: var(--shadow-2, 0 8px 30px rgba(21,35,59,.14)); padding: 6px; max-width: 380px; max-height: 74vh; overflow: auto; display: flex; flex-direction: column; gap: 2px; }
.v2-ws-acct { font-size: 11.5px; color: var(--muted); padding: 6px 8px 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.v2-ws-sec { font-family: var(--mono, ui-monospace, monospace); font-size: 10px; letter-spacing: .06em; text-transform: uppercase; color: var(--muted-2, #a6b2c8); padding: 8px 8px 3px; }
.v2-ws-cur { display: flex; align-items: center; gap: 7px; padding: 7px 8px; border-radius: 8px; background: var(--bg-tint, #F6FAFF); }
.v2-ws-cur .v2-ws-name { font-size: 13px; }
.v2-ws-check { color: var(--blue); font-weight: 800; flex: none; }
.v2-ws-item { display: flex; align-items: center; gap: 6px; padding: 8px; border: 0; background: none; font: inherit; font-size: 12.5px; font-weight: 600; color: var(--ink-sub); text-decoration: none; border-radius: 8px; cursor: pointer; text-align: left; }
.v2-ws-item:hover { background: var(--bg-tint, #F6FAFF); color: var(--ink); }
.v2-ws-item.add { color: var(--blue); }
.v2-ws-empty, .v2-ws-loading { font-size: 11.5px; color: var(--muted); line-height: 1.55; padding: 4px 8px 6px; margin: 0; }
.v2-ws-team-row { display: flex; align-items: center; gap: 4px; padding: 2px 4px 2px 8px; border-radius: 8px; }
.v2-ws-team-row:hover { background: var(--bg-tint, #F6FAFF); }
.v2-ws-team-open { flex: 1; min-width: 0; display: flex; align-items: center; gap: 6px; text-decoration: none; color: var(--ink); font-size: 12.5px; font-weight: 600; }
.v2-ws-err { flex: none; width: 15px; height: 15px; border-radius: 50%; background: var(--coral, #E5484D); color: #fff; font-size: 10px; font-weight: 800; display: grid; place-items: center; }
.v2-ws-auto { flex: none; font-size: 10.5px; font-weight: 700; padding: 2px 6px; border: 1px solid var(--line); border-radius: 6px; background: none; color: var(--muted); cursor: pointer; }
.v2-ws-auto.on { color: var(--mint-deep, #0FA37E); border-color: #CDEFE3; background: var(--bg-success, #F3FBF8); }
.v2-ws-del { flex: none; width: 22px; border: 0; background: none; color: var(--muted-2, #a6b2c8); font-size: 12px; cursor: pointer; border-radius: 6px; }
.v2-ws-del:hover { color: var(--coral, #E5484D); background: var(--bg-tint, #F6FAFF); }
.v2-ws-linkform { display: flex; flex-direction: column; gap: 6px; padding: 6px 8px 8px; }
.v2-ws-in { width: 100%; box-sizing: border-box; padding: 7px 9px; border: 1px solid var(--line); border-radius: 8px; font: inherit; font-size: 12.5px; }
.v2-ws-in:focus { outline: none; border-color: var(--blue); }
.v2-ws-formrow { display: flex; align-items: center; gap: 8px; }
.v2-ws-note { font-size: 11px; color: var(--coral, #E5484D); flex: 1; min-width: 0; line-height: 1.4; }
.v2-ws-hint { font-size: 11px; color: var(--muted); line-height: 1.5; margin: 2px 0 0; }
.v2-ws-promo { display: flex; align-items: center; gap: 8px; padding: 6px 8px; border-radius: 8px; }
.v2-ws-promo:hover { background: var(--bg-tint, #F6FAFF); }
.v2-ws-promo-main { flex: 1; min-width: 0; display: flex; align-items: center; gap: 6px; }
.v2-ws-promo-kind { flex: none; font-family: var(--mono, ui-monospace, monospace); font-size: 9.5px; color: var(--muted); border: 1px solid var(--line); border-radius: 4px; padding: 0 4px; }
.v2-ws-promo-title { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: 12.5px; font-weight: 600; color: var(--ink); }
.v2-ws-promo-acts { flex: none; display: flex; gap: 4px; }
.btn-xs { font-size: 11px; padding: 2px 8px; }
