/**
 * 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 위
 *        9000 – 9999 완충(사용 금지)  ·  ≥ 10100 금지
 *
 * 🔴 **왜 오버레이는 토큰이 아닌가** — 오버레이의 올바른 순서는 **열린 순서**(런타임 정보)라
 *    정적 숫자로 표현할 수 없다. 실측(2026-09-04): 확인창 `#pbConfirmBackdrop` 은 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 / modal-backdrop 1050 / modal 1055 / popover 1070 / tooltip 1080
 *    우리 L3(≥2000)는 이 전부의 위다. L1 은 의도적으로 Bootstrap 과 섞인다(실측 결함 0 — 재배치 안 함).
 */
:root {
    /* ── L1 크롬 ── */
    --z-nav-subnav: 1035;    /* admin 서브 네비 띠 — 종전 1020 리터럴(Bootstrap sticky 와 동률) [2026-09-05] */
    --z-nav-side: 1040;      /* 사이드바 · 폰 하단 탭바(대역이 배타라 같은 토큰) */
    --z-cart-bar: 1042;      /* 보관함 선택 카트 바 — 하단 탭바(1040) 위·탐색기 드로어(1045) 아래 [2026-09-04]
                                🔴 종전 1040 리터럴이라 하단 탭바와 **동률**이었고, DOM 뒤에 있어 탭바를 이겼다.
                                   숨김이 opacity 뿐이라 투명한 채로 폰 하단 탭 전체를 가로챘다(실측 제보). */
    --z-pbx-drawer: 1045;    /* 보관함 탐색기 폴더 드로어(<1024px) — 임시 오버레이라 nav 사이드바(1040) 위·상단바(1050) 아래 [2026-08-22] */
    --z-nav-top: 1050;       /* 상단바 · 공지 패널(상단바에 붙어 열림) */
    --z-nav-dropdown: 1100;  /* 앵커 팝오버 — 백드롭도 스크롤 잠금도 없는 것 전부: 사용자 드롭다운 · 음악/테마 팝업 ·
                                문제 미리보기 팝오버. 🔴 같은 성격에 새 토큰을 만들지 말 것(같은 층의 두 번째 이름).
                                공존 시 동률이지만 문서 클릭 위임이 서로를 닫아 실제 겹침이 없다 [2026-09-05 범위 확장] */

    /* ── 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: 10000;       /* 권유 — PWA 설치 배너 · 푸시 권유(종전 9990/9991) */
    --z-toast: 10010;        /* 알림 — 글로벌 토스트 · 조교/같이풀기 notice · common.js 폴백 컨테이너(종전 10000·9999).
                                L3 오버레이(≤8999)보다 위 — "알림은 가려지면 안 된다"를 대역이 보장한다 */
    --z-toast-action: 10020; /* 액션형 알림 토스트 — 글로벌 토스트보다 위(종전 10010) */
    --z-system-bar: 10030;   /* 결정 요구 — SW 업데이트 바 · iOS 설치 시트(종전 10000) */
    /* (폐기) --z-popup 9999 — 라이트박스는 오버레이(L3)라 layerStack 이 층을 준다. 완충 대역 값을 남기지 않는다. */
}
