/* 새 셸 화면별 완성도 층 — chrome-shell. DESIGN.md(Framer) 준수 · body.shell-v2 스코프
 *   ① 허브 사이드바(데스크톱) ② 모바일 내비(≤810: 56px 바 + 전체 높이 시트) ③ 프로젝트 셸 상단바 ④ 셸 레이아웃 보정 */

/* ── ① 허브 사이드바(데스크톱) ── */
.hub-menu-btn { display: none; } /* 스코프 밖 기본값 — 새로고침 없이 v1 로 돌아가도 햄버거가 남지 않는다 */
body.shell-v2 .sidebar-head { min-height: 32px; }
body.shell-v2 .brand { padding: 0 14px; }
body.shell-v2 .rail-toggle { color: var(--ink-48); border-radius: var(--r-pill); }
body.shell-v2 .rail-toggle:hover { background: var(--surface-1); color: var(--ink); }
body.shell-v2 .sidebar-actions { gap: 2px; padding: 0 4px; }
body.shell-v2 .sidebar-action-btn, body.shell-v2 .feed-notif-bell { width: 44px; height: 44px; border-radius: var(--r-pill); background: transparent; color: var(--ink-48); }
body.shell-v2 .sidebar-action-btn:hover, body.shell-v2 .feed-notif-bell:hover, body.shell-v2 .feed-notif-bell[aria-expanded="true"] { background: var(--surface-1); color: var(--ink); }
/* 🔴 padding 0 — 전역 button 패딩(8px 15px · glass.css)이 44px 버튼의 내용 폭을 14px 로 줄여 아이콘이 20px 이 아니라 14px 로 찌그러져 있었다(2026-09-16 실측).
 *    사이드바 메뉴 아이콘(20px · 1.8)과 같은 크기·굵기로 맞춘다. */
body.shell-v2 .sidebar-action-btn, body.shell-v2 .feed-notif-bell { padding: 0; }
body.shell-v2 .sidebar-action-btn svg, body.shell-v2 .feed-notif-bell svg { width: 20px; height: 20px; stroke-width: 1.8; flex-shrink: 0; }
body.shell-v2 .rail-toggle svg { stroke-width: 1.8; }
/* 피드백 버튼의 앱 마크(컬러 이미지)는 다른 선 아이콘 옆에서 튄다 — 평소 무채색, 올리면 본색 */
body.shell-v2 .fb-rail-img { width: 20px; height: 20px; border-radius: var(--r-xs); filter: grayscale(1); opacity: 0.72; transition: filter var(--t-fast) var(--ease), opacity var(--t-fast) var(--ease); }
body.shell-v2 .fb-rail-btn:hover .fb-rail-img, body.shell-v2 .fb-rail-btn:focus-visible .fb-rail-img { filter: none; opacity: 1; }
/* 미확인 수 배지 — 색 배지 대신 흰 점 + 캔버스 테두리(아이콘 모서리에 걸친다) */
body.shell-v2 .feed-notif-badge, body.shell-v2 .fb-rail-badge {
  top: 6px; right: 5px; min-width: 16px; height: 16px; padding: 0 4px;
  background: var(--ink); color: var(--canvas); box-shadow: 0 0 0 2px var(--canvas);
  font-size: 10px; font-weight: 600; line-height: 16px; letter-spacing: 0; font-variant-numeric: tabular-nums;
}
/* 허브 내비 칸의 숫자 배지(관리자 · 승인 대기) — 알림 배지와 같은 흰 점. 아이콘 오른쪽 위 모서리에 걸친다. */
body.shell-v2 .shell-nav .nav-btn { position: relative; }
body.shell-v2 .nav-count-badge {
  position: absolute; top: 6px; left: 26px; min-width: 16px; height: 16px; padding: 0 4px; border-radius: var(--r-pill);
  background: var(--ink); color: var(--canvas); box-shadow: 0 0 0 2px var(--canvas); pointer-events: none;
  font-size: 10px; font-weight: 600; line-height: 16px; text-align: center; letter-spacing: 0; font-variant-numeric: tabular-nums;
}
body.shell-v2 .feed-notif-panel { background: var(--surface-1); border: 0; border-radius: var(--r-lg); box-shadow: var(--shadow-float); }
body.shell-v2 .auth-area { gap: var(--sp-xs); }
body.shell-v2 #who { padding: 0 14px; font-size: var(--fs-fine); color: var(--ink-48); letter-spacing: var(--ls-fine); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
body.shell-v2 .auth-area #signout {
  min-height: 40px; padding: 0 15px; border: 0; border-radius: var(--r-pill);
  background: var(--surface-1); color: var(--ink-80); font-size: var(--fs-caption); font-weight: 500; letter-spacing: var(--ls-caption);
}
body.shell-v2 .auth-area #signout:hover { background: var(--surface-2); color: var(--ink); }
body.shell-v2 .auth-area #signout:active { transform: scale(0.98); }

/* ── ①-b 데스크톱 독 — 좌측 글라스 캡슐(아이콘 + 호버 라벨)은 web/ui/v2/sidebar-dock.css 가 소유한다(2026-09-16).
 *   아이콘은 기본 숨김이고(모바일 시트는 텍스트만) 독이 데스크톱에서만 켠다. */
body.shell-v2 .nav-btn-icon { display: none; }

/* ── ② 모바일 내비(≤810) — 사이드바 = 56px 상단 바(브랜드 + 메뉴). 메뉴를 열면 같은 <aside> 가 전체 높이 시트가 된다 ── */
@media (max-width: 810px) {
  body.shell-v2.shell-chrome, body.shell-v2.shell-chrome.rail-collapsed { padding-left: 0; }
  body.shell-v2.shell-chrome .wiz-composer { left: 0; }
  body.shell-v2.shell-chrome .rail-mini { display: none; }
  body.shell-v2.shell-chrome:not(.pshell-open) .shell-sidebar {
    display: flex; position: sticky; top: 0; left: auto; right: auto; bottom: auto; z-index: 70;
    width: auto; height: var(--top-h); flex-direction: column; align-items: stretch; gap: 0;
    padding: 0 var(--sp-xs) 0 var(--sp-md); overflow: hidden;
    background: var(--chrome-veil, var(--canvas)); -webkit-backdrop-filter: blur(18px); backdrop-filter: blur(18px); border: 0; border-bottom: 1px solid var(--hairline-soft); border-radius: 0; box-shadow: none; animation: none;
  }
  body.shell-v2 .sidebar-head { flex: 0 0 var(--top-h); height: var(--top-h); }
  body.shell-v2 .brand { padding: 0; }
  body.shell-v2 #sidebarToggle { display: none; }
  body.shell-v2 .hub-menu-btn {
    display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 44px; padding: 0;
    border: 0; border-radius: var(--r-pill); background: transparent; color: var(--ink);
  }
  body.shell-v2 .hub-menu-btn:hover { background: var(--surface-1); }
  body.shell-v2 .shell-sidebar .shell-nav, body.shell-v2 .shell-sidebar .sidebar-actions, body.shell-v2 .shell-sidebar .auth-area { display: none; }

  body.shell-v2.hub-menu-open { overflow: hidden; }
  body.shell-v2.shell-chrome.hub-menu-open:not(.pshell-open) .shell-sidebar {
    position: fixed; inset: 0; height: 100dvh; overflow-y: auto; overscroll-behavior: contain;
    padding-bottom: calc(var(--sp-lg) + env(safe-area-inset-bottom));
    /* 🔴 fill 은 both 가 아니라 backwards — both 면 끝난 뒤에도 opacity 애니메이션을 붙잡아 이 시트가 쌓임 맥락·backdrop root 로 남고,
     *    liquid-glass-chrome.css 가 .shell-sidebar 에 건 블러가 조용히 죽는다. 같은 이유로 아래 .shell-view 는 이미 fill 을 끈다.
     *    keyframes 가 opacity 0→1 이라 끝 상태가 기본값과 같다 — 보이는 결과는 동일하다. */
    animation: chrome-sheet-in var(--t-mid, 200ms) var(--ease, ease) backwards;
  }
  body.shell-v2.hub-menu-open .shell-sidebar .shell-nav:not([hidden]) {
    display: flex; flex-direction: column; align-items: stretch; gap: 2px; overflow: visible; padding: var(--sp-md) 0 var(--sp-lg);
  }
  body.shell-v2.hub-menu-open .shell-sidebar .nav-btn { width: 100%; min-height: 52px; padding: 0 14px; font-size: 22px; font-weight: 500; letter-spacing: -0.8px; color: var(--ink-48); border-radius: var(--r-md); }
  body.shell-v2.hub-menu-open .shell-sidebar .nav-btn--active { color: var(--ink); background: var(--surface-1); }
  body.shell-v2.hub-menu-open .shell-sidebar .sidebar-actions {
    display: flex; margin-top: auto; gap: var(--sp-xs); padding: var(--sp-md) 4px 0; border-top: 1px solid var(--hairline-soft);
  }
  body.shell-v2.hub-menu-open .shell-sidebar .sidebar-action-btn, body.shell-v2.hub-menu-open .shell-sidebar .feed-notif-bell { background: var(--surface-1); color: var(--ink-80); }
  body.shell-v2.hub-menu-open .shell-sidebar .auth-area {
    display: flex; flex-direction: row; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--sp-xs) var(--sp-sm); margin: var(--sp-md) 0 0; padding: 0 4px;
  }
  body.shell-v2.hub-menu-open .shell-sidebar #who { display: block; flex: 1 1 auto; min-width: 0; padding: 0; }
  body.shell-v2.hub-menu-open .shell-sidebar .auth-area #signout { min-height: 44px; flex: 0 0 auto; }
  /* 자동저장 상태(저장 중·실패·‘새 기획안으로 저장’ 복구)는 계정 줄 위 한 줄 전폭 — 숨기면 390 에서 실패·복구를 누를 길이 없었다(3차 대조). */
  body.shell-v2.hub-menu-open .shell-sidebar .auth-area .autosave-indicator { order: -1; flex: 1 1 100%; min-height: 32px; display: flex; align-items: center; }
  body.shell-v2.hub-menu-open .shell-sidebar .auth-area .autosave-indicator--error { min-height: 44px; }
  body.shell-v2.hub-menu-open .sidebar-actions .feed-notif-panel { left: 0; right: auto; width: min(300px, calc(100vw - 32px)); }
}
@keyframes chrome-sheet-in { from { opacity: 0; } to { opacity: 1; } }

/* ── ③ 프로젝트 셸 상단바 ── */
body.shell-v2 .pshell-top { gap: var(--sp-sm); }
body.shell-v2 .pshell-top > .btn:first-child { min-height: 36px; color: var(--ink-48); }
body.shell-v2 .pshell-top > .btn:first-child:hover { color: var(--ink); }
body.shell-v2 .pshell-top > .pshell-feedback { flex: none; color: var(--ink-48); }
body.shell-v2 .pshell-top > .pshell-feedback:hover { color: var(--ink); }
/* [캔버스 설정](2026-10-19 · 영상 캔버스 · `graphCanvasSettingsPanel`) — 피드백과 아바타 사이 · 피드백 단추와 같은 모양·호버. 보드 밖에서는 숨는다. */
body.shell-v2 .pshell-top > .pshell-canvas-settings { flex: none; color: var(--ink-48); }
body.shell-v2 .pshell-top > .pshell-canvas-settings:hover { color: var(--ink); }
body.shell-v2:not(.vlab-board-open) .pshell-top > .pshell-canvas-settings { display: none; }
/* 모드 선택: 가장 긴 옵션 폭이 아니라 고른 값의 폭 + 화살표. 화살표는 뒤 형제(.pshell-mode-chev)를 음수 여백으로 겹친다 */
body.shell-v2 .pshell-mode {
  field-sizing: content; min-width: 84px; height: 36px; padding: 0 36px 0 16px; cursor: pointer;
  background-image: none; font-size: var(--fs-caption); font-weight: 500; letter-spacing: var(--ls-caption); color: var(--ink);
}
body.shell-v2 .pshell-mode:hover { background-color: var(--surface-2); }
body.shell-v2 .pshell-mode option { background: var(--surface-1); color: var(--ink); }
body.shell-v2 .pshell-mode-chev { display: inline-flex; flex: 0 0 14px; margin: 0 22px 0 -40px; color: var(--ink-48); pointer-events: none; }
/* 모드 내비(데스크톱) — 드롭다운에 숨어 있던 옆걸음을 한 줄로 꺼낸다. 묶음 사이 실선 = 구획, 선택 구간(오디오·영상) 앞만 점선 = 보드의 '골라 가는 길' 과 같은 문법.
 *   선택(현재 모드)은 표면 단차 + 흰 글자 — 파랑은 포커스 링에만. ≤720px 은 아래 미디어 쿼리가 이 줄을 숨기고 select 를 살린다. */
@media (min-width: 721px) { body.shell-v2 .pshell-mode, body.shell-v2 .pshell-mode-chev { display: none; } }
body.shell-v2 .pshell-modes { display: flex; flex: 0 0 auto; align-items: center; min-width: 0; }
body.shell-v2 .pshell-modes-grp { display: inline-flex; align-items: center; gap: 2px; }
body.shell-v2 .pshell-modes-grp + .pshell-modes-grp::before { content: ''; align-self: center; height: 16px; margin: 0 8px; border-left: 1px solid var(--divider-soft); }
body.shell-v2 .pshell-modes-grp--fork::before { border-left-style: dashed !important; }
body.shell-v2 .pshell-modes-grp:not(:has(> .btn:not([hidden]))) { display: none; }
body.shell-v2 .btn.pshell-mode-btn { min-height: 32px; padding-inline: 12px; font-size: var(--fs-caption); font-weight: 500; color: var(--ink-48); }
body.shell-v2 .btn.pshell-mode-btn:hover { color: var(--ink); background: var(--surface-1); }
body.shell-v2 .btn.pshell-mode-btn.is-active { color: var(--ink); background: var(--surface-2); }
@media (max-width: 720px) { body.shell-v2 .pshell-modes { display: none; } }
/* 저장할 것이 없는 모드(개요·라이브러리 — 슬러그 assets)에서는 '저장됨' 을 말하지 않는다 — 실패·복구 경고는 어느 모드에서든 남긴다 */
body.shell-v2 .pshell:is([data-mode="overview"], [data-mode="assets"]) .pshell-save .autosave-indicator:not(.autosave-indicator--error) { visibility: hidden; }
@media (max-width: 720px) { body.shell-v2 .pshell:is([data-mode="overview"], [data-mode="assets"]) .pshell-top > .pshell-save:not(:has(.autosave-indicator--error)) { display: none; } } /* 좁은 화면은 저장 줄이 한 줄을 통째로 차지한다 — 말할 것이 없으면 줄도 없다 */
/* 배치(2026-09-19 오너 *"프로젝트 제목이 우측에 쏠린 것도 이상해"*) — [← 프로젝트] 제목 ··· 모드 내비 ··· 저장 [상태].
 *   제목과 저장 칸이 같은 비율(1 1 0)로 남는 폭을 나눠 가져 내비가 가운데 선다. 제목이 길면 제목이 줄어든다(내비는 안 줄어든다).
 *   뒤로와 제목 사이 세로선 = 빵부스러기 구획. */
body.shell-v2 .pshell-title { gap: var(--sp-xs); flex: 1 1 0; justify-content: flex-start; }
body.shell-v2 .pshell-top > .pshell-title::before { content: ''; flex: none; align-self: center; height: 16px; margin-right: var(--sp-xs); border-left: 1px solid var(--divider-soft); }
body.shell-v2 .pshell-top > .pshell-save { flex: 1 1 0; justify-content: flex-end; }
/* 빵부스러기 — 작업면이 연 하위 대상(영상 캔버스 이름). 제목과 같은 크기 · 한 단 흐리게 */
body.shell-v2 .pshell-crumb { font-size: var(--fs-body); font-weight: 500; color: var(--ink-80); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }
body.shell-v2 .pshell-crumb::before { content: '›'; margin: 0 var(--sp-xs); color: var(--ink-48); }
body.shell-v2 .pshell-title-text { font-size: var(--fs-body); font-weight: 600; letter-spacing: var(--ls-body); color: var(--ink); }
body.shell-v2 .pshell-title-meta { font-size: var(--fs-fine); color: var(--ink-48); letter-spacing: var(--ls-fine); }
/* 폭이 모자랄 때 제목이 먼저 사라지지 않게(2026-10-04 감사 — 1024 영어에서 제목이 2px 로 줄고 'Short anime · Done' 만 남았다):
 *   제목 칸은 최소 10em 을 지키고(저장 칸에서 가져온다 · 960px 이상), 그 안에서는 메타(형식 · 상태)가 먼저 줄어 … 로 잘린다. */
@media (min-width: 721px) {
  body.shell-v2 .pshell-top > .pshell-title { min-width: 0; }
  body.shell-v2 .pshell-title-text { flex: 0 1 auto; min-width: 0; }
  body.shell-v2 .pshell-title-meta { flex: 0 1000 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; }
}
/* 최소 폭은 모드 내비가 다 들어가는 폭에서만 — 그 아래(영어 ~800)에서 10em 을 지키면 상단바가 화면 밖으로 넘친다(실측 800 en +101px). */
@media (min-width: 960px) { body.shell-v2 .pshell-top > .pshell-title { min-width: 10em; } }
/* 721~959(모드 내비가 다 보이는 가장 좁은 폭) — 내비 버튼 안여백 12→6 · 구획선 여백 8→4 로 내비를 좁히고(영어 495→399px), 저장 칸이 남는 폭을
   제목과 반씩 나누지 않게 한다. 제목 칸은 최소 5em(811 부터 7em — 아래 · 그 아래는 … + 툴팁 전문). 실측 넘침 0 · 영어 800 에서 제목 전문(옛 0px · 2026-10-04). */
@media (min-width: 721px) and (max-width: 959px) {
  body.shell-v2 .btn.pshell-mode-btn { padding-inline: 6px; }
  body.shell-v2 .pshell-modes-grp + .pshell-modes-grp::before { margin: 0 4px; }
  body.shell-v2:not(.vlab-board-open) .pshell-top > .pshell-title { min-width: 5em; } /* 캔버스는 도구 줄이 그 폭을 쓴다(canvas.css — 제목이 먼저 준다) */
  body.shell-v2 .pshell-top > .pshell-save { flex: 0 1 auto; }
}
/* 960~1279 — 모드가 일곱이 되며(2026-10-05 에셋 탭) 1024 영어에서 내비가 오른쪽으로 47px 밀렸다: 제목 칸이 최소 10em 을 붙잡고 남는 폭은
   저장 칸만 줄어서다. 721~959 처럼 내비를 조인다 — 안여백 12→8(--sp-xs) · 구획선 여백 8→4(--sp-xxs). 시안 감사 1024: en +47→+7 · ko +9→−1. */
@media (min-width: 960px) and (max-width: 1279px) {
  body.shell-v2 .btn.pshell-mode-btn { padding-inline: var(--sp-xs); }
  body.shell-v2 .pshell-modes-grp + .pshell-modes-grp::before { margin: 0 var(--sp-xxs); }
}
/* 760~959 — 상단바 칩(읽기전용 등)이 붙어도 제목 글자가 5em 이상 남게 칸 최소를 7em 으로(구획선 몫 포함 · 3차 검증 811=5 · 850=24px).
   721~810 은 [← 프로젝트]를 화살표만 남긴다(≤720 과 같은 처리 · 이름은 aria 에 남는다) — 그 폭이 없으면 7em 은 커녕 5em 에서도
   읽기 전용 영어 상단바가 7~46px 넘쳤다(실측). 721~759 는 5em 칸(읽기 전용 영어 721 은 글자 50px) + 툴팁 전문. */
@media (min-width: 760px) and (max-width: 959px) {
  body.shell-v2:not(.vlab-board-open) .pshell-top > .pshell-title { min-width: 7em; }
}
@media (min-width: 721px) and (max-width: 810px) {
  body.shell-v2 .pshell-top > .btn:first-child { width: 36px; padding: 0; justify-content: center; }
  body.shell-v2 .pshell-top > .btn:first-child .btn__label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
}
body.shell-v2 .pshell-save, body.shell-v2 .pshell-save .autosave-indicator { color: var(--ink-48); font-size: var(--fs-fine); }
/* 실패·복구는 누를 수 있는 경고다 — 저장됨과 같은 흐린 글자면 지나친다(3차 대조: 상단바 규칙이 components.css 의 오류색을 덮고 있었다) */
body.shell-v2 .pshell-save .autosave-indicator--error { color: var(--danger); cursor: pointer; }

@media (max-width: 720px) {
  /* 좌우 안쪽 여백 0 — 바 자체가 이미 15px 거터 안에 있다. 뒤로 버튼(왼쪽)과 모드 알약(오른쪽)이 같은 거터에 맞닿는다(실측: 알약이 381 로 바 375 를 넘어 우 9px·좌 15px 비대칭이었다). */
  body.shell-v2 .pshell-top { height: auto; min-height: var(--top-h); flex-wrap: wrap; column-gap: var(--sp-xs); row-gap: 6px; padding: 6px 0 8px; }
  body.shell-v2 .pshell-top > .btn:first-child { order: 0; width: 44px; min-height: 44px; padding: 0; justify-content: center; }
  body.shell-v2 .pshell-top > .btn:first-child .btn__label { position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; }
  body.shell-v2 .pshell-title { order: 1; display: flex; flex: 1 1 0; min-width: 0; flex-direction: column; align-items: flex-start; justify-content: center; gap: 0; }
  body.shell-v2 .pshell-title-text { max-width: 100%; font-size: var(--fs-caption); }
  body.shell-v2 .pshell-title-meta { font-size: var(--fs-footnote); }
  body.shell-v2 .pshell-mode { order: 2; height: 44px; max-width: 42vw; }
  /* 화살표는 알약 안쪽 오른쪽 18px 에 겹친다 — margin-left(-40) + 폭(14) + margin-right(18) + gap(8) = 0 이라 알약 끝이 줄 끝이 된다(margin-right 0 은 알약을 18px 밖으로 밀었다) */
  body.shell-v2 .pshell-mode-chev { order: 3; margin-right: 18px; }
  body.shell-v2 .pshell-top > .pshell-feedback { order: 3; width: 44px; min-height: 44px; padding: 0; justify-content: center; margin-left: var(--sp-xs); } /* 모드 알약 옆 — 같은 첫 줄 */
  body.shell-v2 .pshell-top > .pshell-canvas-settings { order: 3; width: 44px; min-height: 44px; padding: 0; justify-content: center; } /* 피드백 옆 — 같은 첫 줄 */
  /* 자동저장 상태 — shell2.css 가 ≤720 에서 저장 자리를 통째로 숨겨 저장 실패·복구('새 기획안으로 저장')가 390 에서 어디에도 안 보였다(3차 대조).
     상태가 있을 때만 제목 아래 한 줄로 세운다(뒤로 버튼 폭만큼 들여 제목과 줄을 맞춘다). */
  body.shell-v2 .pshell-top > .pshell-save:has(.autosave-indicator:not([hidden])) { display: flex; order: 4; flex: 1 1 100%; min-width: 0; padding-left: 42px; }
  body.shell-v2 .pshell-save .autosave-indicator { display: block; min-width: 0; line-height: 24px; text-align: left; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
  /* 실패·복구 상태는 누르는 버튼이다 — 터치 대상 44px */
  body.shell-v2 .pshell-save .autosave-indicator--error { line-height: 44px; }
  body.shell-v2 .pshell-mseg {
    order: 5; display: flex; flex: 0 0 100%; margin: 0; gap: 4px; padding: 2px;
    background: var(--surface-1); border-radius: var(--r-pill);
  }
  body.shell-v2 .pshell-mseg .btn { flex: 1 1 0; min-height: 44px; justify-content: center; color: var(--ink-48); }
  body.shell-v2 .pshell-mseg .btn.is-active { background: var(--surface-3); color: var(--ink); }
  /* 패널이 없는 모드(개요 등)는 트리·패널 칸을 빼고, 둘 다 없으면 전환 줄 자체를 접는다 */
  body.shell-v2 .pshell:not(.pshell--left) .pshell-mseg [data-mpane="left"], body.shell-v2 .pshell:not(.pshell--right) .pshell-mseg [data-mpane="right"] { display: none; }
  body.shell-v2 .pshell:not(.pshell--left):not(.pshell--right) .pshell-mseg { display: none; }
}

/* ── ④ 셸 레이아웃 보정 ── */
/* feed.css 의 좁은 화면 규칙(.feed-notif { top: 60px })은 우상단 고정 클러스터 시절 것 — 사이드바 줄 안에서는 벨을 60px 아래로 밀어낸다 */
body.shell-v2 .sidebar-actions .feed-notif { top: auto; right: auto; }

/* 허브 섹션 페이드(glass.css .shell-view { animation: fade … both })의 fill 'both' 는 끝난 뒤에도 opacity 애니메이션을 붙잡아
 * 섹션을 쌓임 맥락으로 남긴다 — 그 안의 fixed 스크림·시트(z 909/910)가 상단 바(z 70) 아래에 갇혔다(#/library 실측). 끝나면 풀리게 fill 을 끈다(0→1 이라 끝 상태는 원래 값과 같다). */
body.shell-v2 .shell-view { animation-fill-mode: none; }

/* 프로젝트 셸은 스스로 100dvh(shell2.css .pshell) — glass.css ≤720 의 .shell-main 위아래 20px 패딩이 더해져 짧은 내용에도 페이지가 창보다 40px 길었다(884 vs 844 실측).
 * 좌우 패딩은 옮겨 붙은 섹션이 기대하므로 두고 위아래만 끈다(데스크톱은 원래 0). */
body.shell-v2.pshell-open .shell-main { padding-block: 0; }
