/**
 * z-layers.css — z-index 층서 **단일 정본**
 *
 * ## 5대역 (2026-09-05 재설계)
 *
 *   L0  지역        0 –   99   스택 컨텍스트 내부 상대 순서.           토큰 아님
 *   L1  크롬     1000 – 1199   상주 고정 요소(nav·바·드로어) · 권유 카드(최하위).  토큰 — 관계가 화면 구조다
 *   L2  모드     1200 – 1999   배타적 화면 모드(같이풀기 A/B/C).      토큰
 *   L3  오버레이 2000 – 8999   열고 닫는 것(모달·확인창·크롭·시트).   🔴 런타임 전용 — 정적 값 금지
 *   L4  알림    10000 – 10099  토스트 · 시스템 바(지금 알려야 하는 것). 토큰 — 항상 L3 위
 *
 * 🔴 **권유는 L4 가 아니다**(2026-10-04) — 권유(앱 설치·재설치·알림 받기 카드)는 사용자가 요청하지 않은 비긴급 안내라
 *    사용자가 **연 것**(알림 패널·드롭다운·케밥·선택 바·시트·모달·확인창)보다 아래여야 한다. 종전 Z4(09-05)는 옛 값 9990 을
 *    그대로 L4 로 옮겨 열린 알림 패널 19%·폴더 시트 30% 를 덮고 모달 백드롭 위에서 눌렸다(분석 plan/2026-10-04 §11).
 *    층을 정하는 축은 "얼마나 중요한가" 가 아니라 **"누가 요청했나"** 다 — 결과 통지·결정 요구만 열린 것 위에 선다.
 *    관계 가드 `ZIndexLayerCanonGuardTest` Z7(권유 < 사용자가 여는 모든 층). 모양·자리 정본 `nudge.css`.
 *        9000 – 9999 완충(사용 금지)  ·  ≥ 10100 금지
 *
 * 🔴 **왜 오버레이는 토큰이 아닌가** — 오버레이의 올바른 순서는 **열린 순서**(런타임 정보)라
 *    정적 숫자로 표현할 수 없다. 실측(2026-09-04): 확인창 `#dlgConfirmBackdrop` 은 DOM 싱글턴 1개를
 *    8곳이 공유하는데, 카드 삭제로 열릴 땐 아무것도 없는 위에, 총평 모달 안에서 열릴 땐 두 층 위에
 *    떠야 했다. 선언 시점에 정할 수 있는 숫자가 없어서 총평 모달(1070) 뒤에 깔렸다(조작 불가).
 *    → L3 는 `common.js` 의 `layerStack` 이 열린 순서대로 슬롯을 준다. CSS 는 `var(--z-layer, 5000)`.
 *    L3 의 BASE·STEP·CAP 수치는 **`common.js` layerStack 이 정본**이다(여기 복사하지 말 것).
 *
 * 🔴 **상한을 닫는다.** 값이 20000·99999 까지 올라갔던 이유는 상한이 없어 "더 큰 수"가 항상
 *    이겼기 때문이다. 상한이 있으면 그 전략이 불가능하다. 가드 `ZIndexLayerCanonGuardTest`.
 *
 * 🔴 값을 흩어 놓지 말 것. 종전에는 CSS 5값 / fragment 인라인 6값 / JS 문자열 3값이
 *    규칙 없이 섞여, 같은 역할의 공지 패널이 1050(student)과 9999(auth)로 갈리고
 *    global-player(9999)와 auth 패널(9999)이 **동률이라 DOM 순서로 승부가 갈렸다**.
 *    2026-09-04: 카트 바 1040 리터럴이 하단 탭바(1040)와 동률 → 폰 메뉴 전면 차단.
 *
 * 🔴 **배포 경로는 `fragments/head-icons.html` 의 `<link>` 한 줄이다** (2026-09-05).
 *    그 fragment 가 전 페이지가 싣는 유일한 head 진입점이라, auth(랜딩·로그인)·admin/profile 처럼
 *    `student-nav.css`/`admin-common.css` 를 안 싣는 화면에도 토큰이 닿는다.
 *    종전엔 두 CSS 의 `@import` 로만 들어가 **auth 군 전체에 정의가 없었다**(2026-08-15 에
 *    "admin 에 토큰이 없어 토큰화를 포기했다"던 상황이 auth 에 그대로 남아 있었다).
 *    🔴 이 파일을 `@import` 하지 말 것 — 진입 경로가 둘이 되면 갈린다.
 *
 * ⚠️ Bootstrap 자체 층(참고, 이 파일이 정의하지 않는다):
 *      dropdown 1000 / sticky 1020 / fixed 1030 / popover 1070 / tooltip 1080
 *    L1 은 의도적으로 Bootstrap 과 섞인다(실측 결함 0 — 재배치 안 함).
 *    🔴 [2026-10-03] **modal·modal-backdrop 은 L3 참여자로 옮겼다**(파일 끝 규칙) — `bsModal` 이 `layerStack` 슬롯을 받는다.
 *       종전 "L3 는 BS 모달(1055) 위" 전제 때문에 L3 시트 안에서 연 모달이 시트 뒤에 깔렸다(운영 제보 10-03 · common.js layerStack KDoc).
 *       그래서 모달 **안**에 Bootstrap tooltip·popover·dropdown 을 두지 말 것 — body 에 붙어 1070~1080 에 남아 모달 뒤로 간다
 *       (자체 앵커 팝오버는 `popoverGate` 가 모달 슬롯 +1 을 준다). 가드 `BsModalCanonGuardTest` G-B3.
 */
:root {
    /* ── L1 크롬 ── */
    --z-banner: 1038;        /* 권유 — 앱 설치·재설치·알림 받기 카드(nudge.css). 🔴 L1 **최하위**: 콘텐츠·Bootstrap sticky/fixed 위,
                                하단 탭바(1040)·선택 바·케밥·상단바/알림 패널·드롭다운·L2·L3 전부 아래(2026-10-04 · 종전 L4 10000) */
    --z-nav-subnav: 1035;    /* admin 서브 네비 띠 — 종전 1020 리터럴(Bootstrap sticky 와 동률) [2026-09-05] */
    --z-nav-side: 1040;      /* 사이드바 · 폰 하단 탭바(대역이 배타라 같은 토큰) */
    --z-cart-bar: 1042;      /* 보관함 선택 바(pb-select-bar) — 하단 탭바(1040) 위·탐색기 드로어(1045) 아래 [2026-09-04]
                                🔴 종전 1040 리터럴이라 하단 탭바와 **동률**이었고, DOM 뒤에 있어 탭바를 이겼다.
                                   숨김이 opacity 뿐이라 투명한 채로 폰 하단 탭 전체를 가로챘다(실측 제보). */
    --z-ctx-menu: 1045;      /* 케밥 메뉴(`ctxMenu` · ctx-menu.css)의 **바닥값** — 오버레이 밖(데스크톱 상시 사이드바 등)에서만 쓰인다.
                                🔴 [2026-10-03] 구 이름 `--z-pbx-ctx`(·클래스 `.pbx-ctx-*`) — 메뉴는 대화방·메시지·학습관리도 쓰는 공용 부품인데 보관함 탐색기 접두였다.
                                오버레이 안(폴더 시트 등)에서는 `popoverGate.open` 이 앵커의 `--z-layer` 에서 파생해 인라인으로 덮는다.
                                🔴 [2026-09-20] 구 이름 `--z-pbx-drawer`. 폴더 드로어가 **바텀 시트(L3 런타임)** 가 되면서
                                   이 토큰의 소유자는 케밥만 남았다 — 이름이 원주인을 가리키면 다음 사람이 시트를 여기로 되돌린다. */
    --z-nav-top: 1050;       /* 상단바 · 공지 패널(상단바에 붙어 열림) */
    --z-nav-dropdown: 1100;  /* 앵커 팝오버 — 백드롭도 스크롤 잠금도 없는 것 전부: 사용자 드롭다운(상단바·레일) ·
                                이미지 미리보기 팝오버(`.pbpv-pop`). 🔴 같은 성격에 새 토큰을 만들지 말 것(같은 층의 두 번째 이름).
                                🔴 [2026-09-30] **이 값은 오버레이 밖의 바닥값이다** — L3 오버레이 안에서 열리면 `popoverGate.open` 이
                                   앵커의 `--z-layer` +1 을 인라인으로 싣는다. 종전 목록의 "검토 매트릭스 썸네일" 은 **매트릭스(L3) 안에서만**
                                   열리는데 이 층에 배정돼 매트릭스 뒤에 깔렸다(운영 제보 — 미리보기도 같은 결함). 폴백은 제거됐다.
                                공존 시 동률이지만 문서 클릭 위임이 서로를 닫아 실제 겹침이 없다 [2026-09-05 범위 확장]
                                🔴 [2026-09-20] **잠금이 없다는 것이 "배경을 그냥 둔다"는 뜻은 아니다** — 이 부류는
                                   `popoverGate`(common.js 정본)에 등록해 **배경 스크롤에 닫히고**, 자체 스크롤 영역에는
                                   `overscroll-behavior: contain` 이 짝이다(운영 제보 — frontend_guide §3.9-PG).
                                📎 종전 목록의 "음악/테마 팝업" 은 **둘 다 실체가 없다**: 테마 팝업은 2026-08-14 에,
                                   음악 팝업은 2026-09-20 에 제거됐다(여는 버튼 마크업 0건). 목록이 낡으면 다음 사람이
                                   없는 것을 근거로 판단한다. */

    /* ── L2 모드 (같이풀기 화면 전용 — 이 관계는 종전에 어디에도 적혀 있지 않았다) [2026-09-05] ── */
    --z-ws-pane-popup: 1310; /* B모드 조교 팝업 — 일반 콘텐츠 위, 전체화면 아래 (종전 1010) */
    --z-ws-fullscreen: 1500; /* 연습장 전체화면 "경계" (종전 2000) */
    --z-ws-pane-over: 1510;  /* C모드 조교 팝업 — 전체화면 위 (종전 JS 인라인 2010) */
    --z-ws-exam-bar: 1900;   /* 시험 상태 바 — 모드 전부 위, 오버레이 아래 (종전 JS 인라인 2100) */
    --z-ws-flyout: 1950;     /* 툴바 플라이아웃 그룹 — 모드 층 전부 위, 오버레이(L3) 아래 (종전 20000 !important —
                                🔴 그 값이 토스트(10000)까지 덮어 "알림은 가려지면 안 된다" 원칙과 충돌했다) */

    /* ── L3 오버레이: 토큰 없음. common.js layerStack 이 --z-layer 를 요소에 싣는다 ── */

    /* ── L4 알림 — 알림 < 결정 요구. 종전엔 전부 10000 한 값에 뭉쳐 DOM 순서로 갈렸다 [2026-09-05 Z4] ·
          권유(--z-banner)는 2026-10-04 L1 최하위로 내렸다(위 머리 주석 "권유는 L4 가 아니다") ── */
    --z-toast: 10010;        /* 알림 — 글로벌 토스트 · 조교/같이풀기 notice · common.js 폴백 컨테이너(종전 10000·9999).
                                L3 오버레이(≤8999)보다 위 — "알림은 가려지면 안 된다"를 대역이 보장한다 */
    --z-system-bar: 10030;   /* 결정 요구 — SW 업데이트 바 · iOS 설치 시트(종전 10000) */
    /* (폐기) --z-popup 9999 — 라이트박스는 오버레이(L3)라 layerStack 이 층을 준다. 완충 대역 값을 남기지 않는다. */
}

/* ── L3 참여자: Bootstrap 모달 (2026-10-03) ──
   JS 는 `--z-layer` 만 싣는다(`layerStack.acquire`/`attach` — common.js bsModal `_bsRegister`·`_bsShow`). 여기서 Bootstrap 변수로 읽는다.
   · 모달 = 슬롯 +0, 백드롭 = 슬롯 −1 — `.pbx-drawer-backdrop` 과 같은 형태. 🔴 모달을 +10 으로 올리지 말 것:
     `popoverGate` 가 조상 `--z-layer` +1 에 팝오버를 세우므로 모달 안 케밥·미리보기가 모달 뒤로 간다.
   · 폴백 1055/1050 = Bootstrap 기본값(슬롯을 못 받은 모달은 종전과 동일).
   · `:root` 접두 — 이 파일은 bootstrap.min.css 보다 **먼저** 실린다(head-icons). 같은 특이도면 Bootstrap 의 선언이 이긴다. */
:root .modal          { --bs-modal-zindex: var(--z-layer, 1055); }
:root .modal-backdrop { --bs-backdrop-zindex: calc(var(--z-layer, 1051) - 1); }
