@import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;500;700&display=swap');
/* ══════════════════════════════════════════════════════════
   나눔스퀘어라운드 Light(NAVER 원본, 상업용 무료) — 요청사항: "버튼을
   나눔스퀘어라운드로 바꿔주고, 라이트 굵기에다가 bold 넣어줘." Light
   폰트 파일 하나만 등록하고, 실제로 굵게 보여야 하는 곳에는
   font-weight:bold를 CSS로 얹는다(진짜 Bold 폰트 파일보다 덜 각지고
   부드러운 인상이라는 요청자의 확인에 따름). 퍼즐 공통 버튼 전용으로
   쓰므로 --font-ui와는 별도의 이름(--font-pz-btn)으로 관리한다.
   [CORS 수정] 원래 hangeul.pstatic.net(네이버 CDN)에서 직접 로드했으나,
   같은 서버의 나눔고딕 폰트가 CORS로 막히는 걸 확인한 뒤(콘솔 에러:
   "blocked by CORS policy") 이쪽도 잠재적으로 같은 위험이 있어 예방
   차원에서 jsDelivr(GitHub 저장소 innks/NanumSquareRound를 그대로
   서빙, 항상 CORS 허용)로 옮겼다. font-family 이름('NanumSquareRoundL')과
   font-weight 미지정 구조, 파일명까지 전부 원본과 동일하게 유지했으므로
   —src의 도메인만 바뀐 것이라 — 이 폰트를 참조하는 나머지 CSS
   (--font-ui/--font-pz-btn 및 font-weight:bold를 쓰는 모든 곳)는
   전혀 손댈 필요가 없다. */
@font-face {
  font-family: 'NanumSquareRoundL';
  src: url(https://cdn.jsdelivr.net/gh/innks/NanumSquareRound@master/NanumSquareRoundL.eot);
  src: url(https://cdn.jsdelivr.net/gh/innks/NanumSquareRound@master/NanumSquareRoundL.eot?#iefix) format("embedded-opentype"), url(https://cdn.jsdelivr.net/gh/innks/NanumSquareRound@master/NanumSquareRoundL.woff2) format("woff2"), url(https://cdn.jsdelivr.net/gh/innks/NanumSquareRound@master/NanumSquareRoundL.woff) format("woff"), url(https://cdn.jsdelivr.net/gh/innks/NanumSquareRound@master/NanumSquareRoundL.ttf) format("truetype");
  font-display: swap;
}
/* ══════════════════════════════════════════════════════════
   나눔스퀘어라운드 Regular(NAVER 원본, 상업용 무료) — 요청사항: "11번
   게임영역 텍스트만, 글자가 L이다보니 잘 안보여. 400짜리(Regular)로."
   위 Light와 같은 jsDelivr 저장소(innks/NanumSquareRound)에서 파일명만
   R로 바꿔 등록한다. 이름을 'NanumSquareRoundL'과 별도로
   'NanumSquareRoundR'로 두어, 하단 공통 버튼(--font-ui/--font-pz-btn,
   Light 유지)에는 전혀 영향 없이 11_choice.js 게임 영역 텍스트에만
   국한해서 쓸 수 있게 했다(아래 --font-pz-nanum-square-round-r 변수). */
@font-face {
  font-family: 'NanumSquareRoundR';
  src: url(https://cdn.jsdelivr.net/gh/innks/NanumSquareRound@master/NanumSquareRoundR.eot);
  src: url(https://cdn.jsdelivr.net/gh/innks/NanumSquareRound@master/NanumSquareRoundR.eot?#iefix) format("embedded-opentype"), url(https://cdn.jsdelivr.net/gh/innks/NanumSquareRound@master/NanumSquareRoundR.woff2) format("woff2"), url(https://cdn.jsdelivr.net/gh/innks/NanumSquareRound@master/NanumSquareRoundR.woff) format("woff"), url(https://cdn.jsdelivr.net/gh/innks/NanumSquareRound@master/NanumSquareRoundR.ttf) format("truetype");
  font-display: swap;
}
/* ══════════════════════════════════════════════════════════
   나눔스퀘어라운드 Bold(NAVER 원본, 상업용 무료) — 요청사항: "퍼즐
   공통 파일의 팝업 내부 글꼴을 기본 bold체로 바꿔보자. 700짜리
   글꼴 있는거 같아." 지금까지 팝업 제목/설명/버튼(.cpz-popup-label
   등)은 --font-pz-btn(=NanumSquareRoundL, Light 전용 파일)에
   font-weight:bold만 얹어서 "가짜 볼드"(브라우저가 얇은 획을 억지로
   부풀리는 합성 볼드)로 렌더링되고 있었다. 위 L/R과 완전히 같은
   jsDelivr 저장소(innks/NanumSquareRound)에 실제 Bold(700) 파일이
   존재해서(파일명만 B로 바꾸면 됨), 새 CDN을 추가할 필요 없이 그대로
   가져왔다. 이름을 'NanumSquareRoundB'로 따로 둬서, 다른 곳(--font-ui/
   --font-pz-btn, Light 유지)에는 영향 없이 퍼즐 공통 팝업 4개 클래스
   (.cpz-popup-label/.cpz-help-rule/.cpz-help-desc/.cpz-continue-btn/
   .cpz-popup-close-btn)에만 국한해서 쓸 수 있게 했다. */
@font-face {
  font-family: 'NanumSquareRoundB';
  src: url(https://cdn.jsdelivr.net/gh/innks/NanumSquareRound@master/NanumSquareRoundB.eot);
  src: url(https://cdn.jsdelivr.net/gh/innks/NanumSquareRound@master/NanumSquareRoundB.eot?#iefix) format("embedded-opentype"), url(https://cdn.jsdelivr.net/gh/innks/NanumSquareRound@master/NanumSquareRoundB.woff2) format("woff2"), url(https://cdn.jsdelivr.net/gh/innks/NanumSquareRound@master/NanumSquareRoundB.woff) format("woff"), url(https://cdn.jsdelivr.net/gh/innks/NanumSquareRound@master/NanumSquareRoundB.ttf) format("truetype");
  /* [2026-08-24 수정] font-weight를 지정하지 않으면 브라우저가 이
     패밀리를 기본값 400(normal)으로 등록한다 — 그러면 CSS에서
     font-weight:bold(700)를 요청할 때 "이 패밀리엔 700이 없다"고
     판단해, 이미 두꺼운 이 Bold 파일 위에 브라우저가 합성 볼드(가짜
     볼드)를 한 번 더 얹어버릴 수 있다. 이 파일 자체가 진짜 700
     굵기이므로 명시적으로 700으로 등록해, 사용하는 쪽(font-weight:
     bold=700)과 정확히 매칭시켜 합성 볼드가 끼어들지 않게 한다. */
  font-weight: 700;
  font-display: swap;
}
/* ══════════════════════════════════════════════════════════
   나눔고딕(Nanum Gothic) — 요청사항: "11번 퍼즐(선택지 퍼즐) 게임
   영역 글자를 나눔고딕 레귤러 굵기로." 우선은 11번 퍼즐 하나에만
   적용하지만, "다른 글자 많이 나오는 퍼즐에도 동일하게 쓸 수 있을
   것 같다"는 의견에 따라 등록은 공통 파일(여기)에 해두고, 재사용
   가능한 공통 변수(--font-pz-nanum-gothic)로 노출해둔다.
   [CORS 수정] 네이버 CDN(hangeul.pstatic.net)에서 직접 @font-face로
   불러왔더니 그 서버가 폰트 파일에 CORS 헤더를 열어주지 않아 배포
   도메인(zking1234.mycafe24.com)에서 로딩 자체가 막혔다(콘솔 에러
   확인됨: "blocked by CORS policy"). 나눔고딕은 Google Fonts에도
   동일한 이름으로 정식 등록돼 있어, 대신 index.html 상단의 구글
   폰트 <link>에 family=Nanum+Gothic:wght@400;700을 추가해 불러온다
   (Google Fonts는 항상 CORS를 허용). 그래서 여기엔 더 이상
   @font-face가 없고, 아래 변수가 그 이름('Nanum Gothic', 공백 포함
   — 구글 폰트 표준 이름)을 그대로 참조하기만 한다. */
/* ══════════════════════════════════════════════════════════
   에스코어드림(S-CoreDream) 웹폰트 — 상업용 무료(S-Core 제공,
   웹사이트/임베딩 사용 허용). 요청사항 — "타이틀 관련 버튼들과
   타이틀 버튼 내부 팝업 내용들, 그리고 퍼즐 공통 버튼만" 이 폰트로
   교체. --font-ui 변수를 쓰는 요소 중 이 세 범위(타이틀 버튼:
   .title-main-btn/.title-settings-btn, 타이틀 팝업 내용:
   .settings-popup-btn/.pop-title/.pop-desc 등, 퍼즐 공통 버튼:
   .pzc-bar-btn/.pzc-bar-continue-btn)에 자동으로 적용된다. 필요한
   굵기(400/600/700/800)만 등록해 로딩 비용을 줄였다. 나중에 다른
   폰트로 바꾸고 싶으면 --font-ui 값만 교체하면 된다(아래 :root
   참고). ══════════════════════════════════════════════════════ */
@font-face {
  font-family: 'Escoredream';
  src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_six@1.2/S-CoreDream-4Regular.woff') format('woff');
  font-weight: 400;
  font-display: swap;
}
@font-face {
  font-family: 'Escoredream';
  src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_six@1.2/S-CoreDream-6Bold.woff') format('woff');
  font-weight: 600;
  font-display: swap;
}
@font-face {
  font-family: 'Escoredream';
  src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_six@1.2/S-CoreDream-7ExtraBold.woff') format('woff');
  font-weight: 700;
  font-display: swap;
}
@font-face {
  font-family: 'Escoredream';
  src: url('https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_six@1.2/S-CoreDream-8Heavy.woff') format('woff');
  font-weight: 800;
  font-display: swap;
}
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0;}
:root{
  --gold:#D4A84C;--gold-dim:#9a7a42;--gold-faint:rgba(212,168,76,0.09);
  /* [2026-08-24 추가] 요청사항 — "타이틀 버튼 팝업(공지사항, 의견보내기,
     설정, 챕터 선택) 글자 색도 전부 밝은 노랑으로 바꿔줘." 이 한 값만
     바꾸면 관련 팝업 텍스트 색이 전부 같이 바뀐다. */
  --bright-yellow:#fff066;
  --bg:#111118;--panel:#16161f;--border:rgba(212,168,76,0.18);
  --text:#f0e8d4;--text-dim:#9a9080;--text-mid:#c0b494;--red:#a03030;
  --game-w:680px;
  /* [폰트 교체] 요청사항 — "한번에 글꼴 바꿀수 있도록 작업해놔봐
     마음에 안들면 다른거 바꾸게." 이 한 줄만 바꾸면 --font-ui를
     쓰는 모든 UI 요소(타이틀 버튼/팝업/메시지/퍼즐 도움말 등)의
     글꼴이 한 번에 바뀐다. 지금은 에스코어드림이 1순위, 폰트 로딩
     실패나 미지원 글자 시 Noto Sans KR로 자연스럽게 대체된다. */
  --font-ui:'NanumSquareRoundL','Noto Sans KR','Gowun Batang',sans-serif;   /* 게임 최대 너비 */
  /* ══════════════════════════════════════════════════════════
     [변수 정리] 퍼즐 공통 UI(하단 버튼 + 팝업 + 스토리 진행버튼) 폰트/
     크기 변수 묶임 구조 — 어떤 걸 바꾸면 무엇이 함께 바뀌는지 정리.

     ① --font-pz-btn  (아래 정의)
          ↳ --font-pzc-game 가 그대로 참조 → 게임 영역 라벨(01_clock.js
            "알람"/"입력" 등)의 font-family
          ↳ --pzc-font 가 그대로 참조 → 팝업 제목(.cpz-popup-label),
            팝업 버튼(.cpz-continue-btn/.cpz-popup-close-btn)의
            font-family
          ↳ .pzc-bar-btn/.pzc-bar-fold-btn/.pzc-bar-continue-btn
            (하단 공통 버튼 전부)이 font-family로 직접 참조
          ↳ .cb/.cb.pri (계속/이전으로/퍼즐로돌아가기)가 font-family로
            직접 참조
        즉 --font-pz-btn 하나만 바꾸면: 하단 공통 버튼 5종 + 팝업
        제목/버튼 + 게임 영역 라벨 + 계속/이전으로/퍼즐로돌아가기까지
        모두 한 번에 폰트가 바뀐다.

     ② --pz-btn-font-size  (아래 정의, 현재 13px 기준)
          ↳ .pzc-bar-btn/.pzc-bar-continue-btn 등 하단 공통 버튼의
            font-size로 직접 참조
          ↳ .cpz-continue-btn/.cpz-popup-close-btn (팝업 버튼)의
            font-size로 직접 참조
          ↳ .cpz-popup-label (팝업 제목)의 font-size로 직접 참조
          ↳ .cb/.cb.pri (계속/이전으로/퍼즐로돌아가기)의 font-size로
            직접 참조
        즉 --pz-btn-font-size 하나만 바꾸면: 하단 공통 버튼 + 팝업
        글자(제목·버튼) + 계속/이전으로/퍼즐로돌아가기 크기가 모두
        함께 바뀐다("내부 팝업 글자와 하단 공통버튼들의 크기를 1px
        다 키워줘"가 이 한 줄 수정으로 전체 반영된 이유).

     ③ --pz-btn-height  (아래 정의, 42px 기준)
          ↳ 하단 공통 버튼 높이, 팝업 버튼 높이, .cb/#pz-cont-btn/
            #pz-min-btn 높이가 모두 이 값(또는 이 값의 비율)을 참조.
            .pzc-bar-fold-btn(접기)은 ×0.62, .pzc-bar-continue-btn
            (이야기 진행, 클리어 시)은 도움말줄+간격+접기줄을 합친
            높이를 이 변수로 계산해서 확장된다.

     이 세 변수(①②③)는 모두 style.css :root 상단에 모여 있으므로,
     여기 세 줄만 확인하면 퍼즐 공통 UI 전체의 폰트/크기 체계를
     파악할 수 있다. ══════════════════════════════════════════ */
  /* 퍼즐 공통 버튼(하단 5버튼/이야기진행) 전용 폰트 — 요청사항: 이
     한 변수만 바꾸면 퍼즐 버튼 글꼴을 다른 걸로 쉽게 교체할 수 있다.
     [통일] 요청사항 — "타이틀 글자들도 같은 글꼴로 수정해주고." 이제
     --font-ui와 동일한 나눔스퀘어라운드를 쓴다(값은 위와 같지만,
     퍼즐 버튼만 따로 바꾸고 싶을 때를 위해 변수는 계속 분리해둔다). */
  --font-pz-btn:'NanumSquareRoundL','Noto Sans KR',sans-serif;

  /* [추가 → 현재 미사용] 요청사항 — "퍼즐 공통 파일의 팝업 내부 글꼴을
     기본 bold체로 바꿔보자. 700짜리 글꼴 있는거 같아." 당시 팝업 5개
     클래스(.cpz-popup-label/.cpz-help-rule/.cpz-help-desc/
     .cpz-continue-btn/.cpz-popup-close-btn)에 진짜 Bold 파일
     (NanumSquareRoundB)을 적용하려고 만든 변수인데, 이후 "L+bold로
     다시 돌려놓자" 요청에 따라 그 5곳 모두 --font-pz-btn(합성 볼드)
     으로 되돌렸다. 변수 자체와 NanumSquareRoundB @font-face는 나중에
     다시 쓸 수 있어 삭제하지 않고 남겨둔다(현재는 어디서도 참조되지
     않음). */
  --font-pz-popup-bold:'NanumSquareRoundB','NanumSquareRoundL','Noto Sans KR',sans-serif;

  /* [나눔고딕 — 퍼즐 게임 영역 텍스트 전용 선택 폰트] 요청사항 —
     "11번 퍼즐 게임 영역 글자를 나눔고딕 레귤러 굵기로. 등록은 해놓고
     11번 퍼즐에만 적용, 다른 글자 많이 나오는 퍼즐에도 나중에 동일하게
     쓸 수 있을 것 같다." 위 --font-pz-btn(나눔스퀘어라운드, 하단 공통
     버튼 전용)과는 별개로, 대사/본문처럼 글자가 많이 나오는 퍼즐의
     게임 보드 텍스트에 개별적으로 적용할 수 있는 변수로 새로 둔다.
     기본값 자체는 어디에도 자동 연결돼 있지 않으므로(=--font-pzc-game/
     --pzc-font를 건드리지 않음), 이 변수를 등록해두는 것만으로는 기존
     20개 퍼즐/공통 버튼의 폰트가 바뀌지 않는다. 나눔고딕을 쓰고 싶은
     퍼즐 파일에서 이 변수를 font-family로 직접 참조하면 된다(현재는
     11_choice.js만 사용 중).
     [CORS 수정] 이 폰트는 위쪽 @font-face가 아니라 index.html에 추가한
     Google Fonts <link>(family=Nanum+Gothic)로 로드되므로, 여기서
     가리키는 이름도 구글 폰트가 등록하는 표준 이름인 'Nanum Gothic'
     (공백 포함)으로 정확히 맞춰야 한다. */
  --font-pz-nanum-gothic:'Nanum Gothic','Noto Sans KR',sans-serif;

  /* [나눔스퀘어라운드 Regular — 퍼즐 게임 영역 텍스트 전용] 요청사항 —
     "11번 게임영역 텍스트만, 글자가 L(Light)이다보니 잘 안보여.
     400짜리(Regular) 있나?" 위 --font-pz-btn(NanumSquareRoundL, 하단
     공통 버튼 전용, Light 유지)과는 별도로, 게임 영역 텍스트에서만
     쓸 수 있는 Regular(400) 웨이트 변수를 새로 둔다. 이 변수를
     등록해두는 것만으로는 하단 공통 버튼이나 --font-ui/--font-pz-btn을
     쓰는 다른 곳의 폰트가 전혀 바뀌지 않는다 — 이 변수를 직접
     참조하는 곳(현재는 11_choice.js 게임 영역 텍스트만)에만 적용된다. */
  --font-pz-nanum-square-round-r:'NanumSquareRoundR','Noto Sans KR',sans-serif;

  /* [퍼즐 배경 통일 — 아이템 팝업 포함] 요청사항 — "게임 영역 배경이
     검정에 그 뒤 배경이 회색인거 같은데... 아예 기존걸로 통일해줘
     같이 바뀌도록." 정식 진행 경로(#puzzle-view)와 게임판
     (.puzzle-board-bg)이 원래도 같은 색(#060604)으로 통일돼 있었는데,
     아이템/오브젝트 액션으로 퍼즐을 열 때 쓰는 별도 틀
     (#item-puzzle-frame, item_actions.js)만 다른 색(#111118, 회색빛
     남색)을 하드코딩하고 있어서 그 틀 안에 놓인 게임판(검정)과
     경계가 보였다. 이 색을 변수 하나로 묶어서 세 곳
     (#puzzle-view/.puzzle-board-bg/#item-puzzle-frame)이 전부 이
     변수 하나만 참조하게 했다 — 이후로는 이 변수 하나만 바꾸면 세
     곳이 항상 같이 바뀐다. */
  --pz-board-bg:#060604;

  /* [게임 영역 폰트 통일] 요청사항 — "게임 영역 글자들의 폰트 종류도
     통일(색상 크기는 놔두고)... 새 변수를 만들고 게임영역 모든
     요소를 하나로 통일(이 변수도 공통파일에서 수정가능하면 됨)".
     하단 버튼 폰트(--font-pz-btn)를 그대로 가리키는 별도 변수로 둬서,
     "하나 바꾸면 퍼즐 내부 공통 ui는 같이 바뀌도록" — 즉 --font-pz-btn
     하나만 바꿔도 버튼과 게임 영역 글자(라벨/카운트다운 등)가 함께
     바뀐다. 게임 영역 텍스트에는 색상/크기를 그대로 두고 이 변수만
     font-family로 지정해서 쓰면 된다. */
  --font-pzc-game: var(--font-pz-btn);

  /* [팝업 폰트 통일] 요청사항 — "폰트 크기 굵기 종류 색상도 전부
     공통버튼과 통일... 공통퍼즐 파일 하나만 바뀌면... 팝업창의
     모든 요소... 공통파일에서 다루도록". puzzle_common.js가 팝업
     제목/버튼(.cpz-popup-label/.cpz-continue-btn/.cpz-popup-close-btn
     등)에 강제 적용하는 폰트 변수 --pzc-font를 여기서 공통 버튼
     폰트(--font-pz-btn)로 지정 — 이 한 줄만 바꾸면 팝업 폰트 전체가
     버튼과 함께 바뀐다. */
  --pzc-font: var(--font-pz-btn);

  /* ── 글자 크기 시스템 ───────────────────────────────────
     --base-font 하나만 바꾸면 A/B/C 그룹 전체가 같이 변함.
     미디어쿼리에서도 --base-font만 덮어쓰면 됨.

     기준(장면 텍스트 .mp)  : var(--base-font)          = 17px
     A그룹(라벨/타이머/토스트): var(--font-a) = base - 3  = 14px
     B그룹(버튼/팝업/토스트)  : var(--font-b) = base - 5  = 12px
     C그룹(게임영역 본문)     : var(--font-c) = base - 4  = 13px
     선택지 버튼(.cb)        : base - 4                  = 13px  */
  --base-font: 17px;
  --font-a: max(calc(var(--base-font) - 3px), 11px);
  --font-b: max(calc(var(--base-font) - 5px), 10px);
  --font-c: max(calc(var(--base-font) - 4px), 10px);

  /* puzzle_common.js 변수와 동기화 (JS에서 참조하는 코드 하위 호환) */
  --pzc-label-font-size: var(--font-a);
  --pzc-btn-font-size:   var(--font-b);
  --pzc-content-area-font-size: var(--font-c);
  --pzc-font-size:       var(--font-b);

  /* D그룹(하단 탭바: 라벨/아이콘) — 기존엔 미디어쿼리 4곳에서 .tb/.tb::before를
     각각 하드코딩으로 재정의했음. 이제 이 두 변수만 바꾸면 전부 같이 변함. */
  --font-tab-label: 11px;
  --font-tab-icon:  18px;

  /* .sbb(선택지 서브버튼) 전용 — 기존엔 --font-c(13px)와 우연히 같은 값을
     썼지만 미디어쿼리 3곳에서 개별 재정의됐음. --font-c는 가방탭 등
     다른 곳과 공유되므로, 혼선을 피하기 위해 전용 변수로 분리. */
  --font-sbb: 13px;

  /* 기록탭 본문(.le-t) 전용 */
  --font-log-body: 13px;

  /* 가방탭(아이템 이름/설명/힌트) 전용 — --font-c와 분리해서
     #panel 실측 기반 축소를 적용할 수 있게 함 (퍼즐 UI에 영향 안 주도록) */
  --font-bag: 13px;

  /* 조사수첩 노트 팝업 본문 전용 — 기본 15px, 미디어쿼리에서 화면 크기별로 조정 */
  --font-archive-note: 15px;

  /* 퍼즐 화면 공통 버튼(도움말/힌트/다시하기/SKIP, 계속하기, 접기)
     크기 — puzzle_common.js가 #puzzle-view 실측(가로/세로 중 더
     타이트한 쪽)을 기준으로 --pz-ui-scale을 계산해서 곱한다.
     [1px 확대] 요청사항 — "내부 팝업 글자와 하단 공통버튼들의 크기를
     1px 다 키워줘". 이 변수 하나로 공통 버튼(.pzc-bar-btn 등),
     팝업 버튼(.cpz-continue-btn/.cpz-popup-close-btn), 팝업 제목
     (.cpz-popup-label), 그리고 .cb(계속/이전으로/퍼즐로돌아가기)까지
     전부 묶여 있어 여기 한 줄만 바꾸면 전체가 함께 커진다. */
  --pz-ui-scale: 1;
  --pz-btn-height: calc(42px * var(--pz-ui-scale));
  --pz-btn-font-size: calc(13px * var(--pz-ui-scale));

  /* 씬 오브젝트 이름표(.sobj-lbl) 전용 — 글자 크기만 다루며,
     .sobj의 위치(%) 좌표 시스템과는 무관 (그건 절대 안 건드림) */
  --font-obj-label: 11px;
  --inner-pad:20px; /* 내부 패딩 (양쪽) → 콘텐츠 640px */
  /* 반응형 폰트 스케일: 모바일(360px)=0.9, PC(680px)=1.0 */
  /* --scale 제거: 고정 px 사용 */
}
html,body{
  width:100%;
  height:100%;
  height:100dvh;
  overflow:hidden;
  background:var(--bg);
  font-family:'Gowun Batang',serif;color:var(--text);
  -webkit-tap-highlight-color:transparent;user-select:none;
  /* [2026-09-13 제거] 기존엔 iOS Safari 주소창 자동 숨김 대응용으로
     position:fixed + top/left/right/bottom:0을 걸어뒀었는데, 이게
     Android WebView의 fitsSystemWindows="true" 패딩을 완전히 무시하고
     항상 실제 화면 전체(뷰포트) 기준 0~100%로 꽉 채워버리는 원인이었다
     (요청사항 — "3버튼 네비게이션에서 상단은 해결됐는데 하단만 계속
     가려진다"). fixed로 박아두면 부모(WebView)가 아무리 하단 패딩을
     줘도 무시되고 항상 진짜 화면 맨 아래(bottom:0)에 붙어버린다.
     position 지정을 없애고 width/height:100%(dvh)만 남기면, 이 요소가
     WebView가 실제로 차지하는 영역(=네이티브가 계산해준 패딩만큼 줄어든
     영역) 기준으로 크기를 잡아, 상단과 동일하게 하단도 정상적으로
     밀려 올라온다. */
}
body{
  /* [2026-09-13 추가] item_actions.js의 #item-puzzle-overlay를
     position:fixed → absolute로 바꾸면서, 그 기준점이 되어줄 조상이
     필요해졌다. body가 position:relative여야 #item-puzzle-overlay의
     inset:0(top/left/right/bottom:0)이 "문서 전체"가 아니라 "이 body가
     실제로 차지하는 영역"(=WebView가 이미 상하단 시스템 바를 피해
     줄여준 영역)을 기준으로 정확히 꽉 채운다. */
  position:relative;
}

/* ══ 레이아웃 — PC 680px 고정, 모바일 100% ══ */
body{display:flex;justify-content:center;align-items:center;}
#layout{
  display:flex;flex-direction:column;
  width:100%;
  max-width:min(var(--game-w), calc(100dvh * 0.65)); /* 수정된 부분 */
  height:100%;height:100dvh;
  max-height:100dvh;
  position:relative;
  box-shadow:0 0 60px rgba(0,0,0,0.8);
  overflow:hidden;
  margin:auto; /* 추가된 부분 */
}
/* PC에서 양옆 배경 */
@media(min-width:680px){
  body{background:#04040a;}
  #layout{border-left:1px solid rgba(212,168,76,0.08);border-right:1px solid rgba(212,168,76,0.08);}
}

/* ── 헤더 ── */
#header{
  flex-shrink:0;
  display:flex;align-items:center;gap:12px;
  padding:10px 16px 8px;
  padding-top:calc(10px + env(safe-area-inset-top));
  border-bottom:1px solid var(--border);
  background:rgba(8,8,20,0.95);
  backdrop-filter:blur(5px);
  z-index:20;
  position:relative;
}
#logo{
  font-family:'Cinzel',serif;font-size:13px;letter-spacing:3px;
  color:var(--gold);opacity:.9;flex-shrink:0;cursor:pointer;
}
#prog-bar-wrap{flex:1;height:2px;background:rgba(212,168,76,0.1);border-radius:2px;overflow:hidden;}
#progress-bar-hdr{height:100%;background:linear-gradient(90deg,var(--gold-dim),var(--gold));border-radius:2px;transition:width .6s ease;}
#chapter-label-hdr{display:none;}
#music-toggle{cursor:pointer;font-size:16px;color:var(--gold-dim);flex-shrink:0;padding:2px;}

/* ── 상단 씬 뷰 ── */
#scene-view{
  flex-shrink:0;
  position:relative;overflow:hidden;
  width:100%;
  aspect-ratio:5/4;
  box-sizing:border-box;
  /* 챕터3 게이지바(#gauge-bar)가 뷰포트 전체 폭(vw)이 아니라 이 씬
     영역 자체의 실제 렌더 크기에 반응하도록 컨테이너 쿼리 기준을
     선언한다(요청사항 — "이미지 영역이 줄어들면 게이지도 같이
     줄어들어야"). 이전에는 vw 단위를 썼는데, 이는 브라우저 창 전체
     폭 기준이라 씬 영역 자체만 좁아지는 상황(예: 레이아웃상 최대폭
     제한 등)에는 반응하지 않는 문제가 있었다(발견된 문제). */
  container-type:inline-size;
  /* max-height 삭제됨 */
  border-bottom:4px solid rgba(212,168,76,0.35);
  background:radial-gradient(ellipse 100% 60% at 50% 120%,#221a0e 0%,transparent 65%),
    linear-gradient(180deg,#0d0d18 0%,#141420 60%,#181410 100%);
}
#scene-bg{
  position:absolute;inset:0;
  background-size:cover;background-position:center;
  opacity:0;transition:none;
}

/* ══════════════════════════════════════
   챕터3 퍼즐 진행도 게이지 (5개, 다각면체 보석)
   gauge_system.js의 renderGaugeBar()/_buildGaugeEl()이 만드는 마크업과 짝을 맞춤.
   #scene-view 하단 테두리 위에 걸쳐서 가로로 배치된다.

   5차 재설계 포인트(요청사항):
     - #scene-view의 하단 구분선(border-bottom)에 게이지가 파묻혀
       보이던 문제 — bottom 위치를 구분선 두께(4px)보다 확실히 위로
       올려서, 구분선이 게이지를 가리지 않고 항상 그 위에 보이도록
       했다.
     - 좌우 여백을 더 넓혀 5개가 화면 가운데로 더 몰리도록 했다.
     - 5개를 하나로 묶어주는 장식 두 가지를 추가했다:
       1) gauge-bar::before — 보석들 아래를 가로지르는 얇은 금색
          받침대 라인(하나의 세공품에 보석이 세팅된 느낌).
       2) gauge-bar::after — 그 받침대 라인 위로 은은하게 흘러
          지나가는 빛(gz-flow 애니메이션) — "서로 빛이 이동하는
          느낌"을 표현.
   ══════════════════════════════════════ */
#gauge-bar{
  /* 게이지 바 전체를 아래로 살짝 내린다(요청사항) — bottom 값을
     줄여서 #scene-view 하단 구분선에 조금 더 가깝게 붙인다. */
  position:absolute;left:0;right:0;bottom:clamp(12px, 4cqi, 18px);
  z-index:20;
  display:flex;align-items:center;justify-content:space-between;
  /* 좌우 여백을 더 넉넉하게 줘서 5개가 가운데로 더 모이도록 한다
     (요청사항). 위아래 여백도 늘려 보석 위(키워드)/아래(형광펜 밑줄+
     레벨텍스트)가 #scene-view의 overflow:hidden 경계에 잘리지 않도록
     한다. */
  padding:clamp(14px, 4.5cqi, 20px) clamp(40px, 16cqi, 100px) clamp(10px, 3cqi, 14px);
  pointer-events:none; /* 바 자체는 클릭 통과, 개별 보석(.gz)만 클릭 가능 */
}
/* 받침대 라인 — 보석들 발밑을 가로지르는 얇은 금색 세공 라인. 좌우
   여백(padding)만큼 안쪽에서 시작/끝나도록 inset으로 맞춘다. */
#gauge-bar::before{
  content:'';
  position:absolute;
  left:clamp(40px, 16cqi, 100px); right:clamp(40px, 16cqi, 100px);
  top:50%; height:1.5px;
  background:linear-gradient(90deg,
    rgba(212,168,76,0) 0%,
    rgba(212,168,76,0.55) 12%,
    rgba(212,168,76,0.55) 88%,
    rgba(212,168,76,0) 100%);
  z-index:-1;
}
/* 흘러가는 빛 — 받침대 라인 위를 은은하게 왕복하며 지나가는 하이라이트. */
#gauge-bar::after{
  content:'';
  position:absolute;
  left:clamp(40px, 16cqi, 100px); right:clamp(40px, 16cqi, 100px);
  top:50%; height:1.5px;
  background:linear-gradient(90deg,
    rgba(255,255,255,0) 0%,
    rgba(255,240,200,0.9) 50%,
    rgba(255,255,255,0) 100%);
  background-size:35% 100%;
  background-repeat:no-repeat;
  animation:gz-flow 4.5s ease-in-out infinite;
  z-index:-1;
}
@keyframes gz-flow{
  0%{ background-position:-40% 0; }
  50%{ background-position:105% 0; }
  100%{ background-position:-40% 0; }
}

#gauge-bar .gz{
  position:relative;
  /* #scene-view 폭(cqi) 기준으로 반응 — 씬 영역 자체가 좁아지면 게이지도
     그만큼 확실히 작아진다. */
  width:clamp(30px, 10.5cqi, 56px);
  height:clamp(30px, 10.5cqi, 56px);
  pointer-events:auto;
  cursor:default;
  filter:drop-shadow(0 3px 6px rgba(0,0,0,0.55));
  transition:transform .15s ease, width .2s ease, height .2s ease;
}
#gauge-bar .gz.gz-active{ cursor:pointer; }
#gauge-bar .gz.gz-active:active{ transform:scale(0.9); }

#gauge-bar .gz-svg{ display:block;width:100%;height:100%; }
/* 채움 클립(clipPath) 영역은 gauge_system.js가 인라인 style로 매번
   새로 계산해 넣으므로, 여기서는 진행률 변화가 부드럽게 이어지도록
   transition만 걸어둔다. */
#gauge-bar .gz-svg clipPath rect{ transition:y .5s ease, height .5s ease; }

#gauge-bar .gz-core{
  position:absolute;inset:0;
  display:flex;align-items:center;justify-content:center;
  pointer-events:none;
}
#gauge-bar .gz-pct{
  font-family:'Share Tech Mono',monospace;
  font-size:clamp(8px, 2.2cqi, 11px);font-weight:700;
  color:#fff;
  text-shadow:0 1px 3px rgba(0,0,0,0.9);
}
#gauge-bar .gz-lockicon{
  font-size:clamp(11px, 2.7cqi, 14px);
  color:rgba(255,255,255,0.45);
}

/* 잠긴 게이지 — 흐릿하게(완전히 안 보이진 않을 정도로 요청에 따라
   조정된 값 유지). */
#gauge-bar .gz.gz-locked{ opacity:0.55; }

/* ── 발광(맥동) 효과 — "도전할 수 있는 남은 스테이지가 있을 때만"
   표시한다(요청사항). unlocked라도 이미 maxLevel까지 다 깬 상태면
   gz-canplay 클래스가 안 붙으므로 발광이 꺼진다 — 다만 클릭해서
   들어가는 것 자체는 여전히 가능하다(_buildGaugeEl의 onclick은
   unlocked만 체크). 색 자체가 이제 SVG 안에서 hsl()로 인라인
   계산되므로, CSS는 테두리 발광 강도만 애니메이션한다(색상 무관하게
   흰색 계열 발광이라 어떤 보석에도 자연스럽게 어울린다). */
#gauge-bar .gz.gz-canplay{
  animation:gz-pulse 2.4s ease-in-out infinite;
}
@keyframes gz-pulse{
  0%, 100%{ filter:drop-shadow(0 3px 6px rgba(0,0,0,0.55)) drop-shadow(0 0 2px rgba(255,255,255,0.5)); }
  50%{ filter:drop-shadow(0 3px 6px rgba(0,0,0,0.55)) drop-shadow(0 0 8px rgba(255,255,255,0.85)); }
}

/* ── 보석 아래: 형광펜 느낌의 굵은 밑줄 + 클리어레벨/최대레벨 텍스트 ──
   형광펜 특유의 "칠한 듯 살짝 삐져나온" 느낌을 위해 보석 폭보다 약간
   넓게, 살짝 비스듬한 사다리꼴 배경으로 표현한다. 색은 게이지 자체의
   hue를 못 쓰므로(인라인 SVG 쪽에만 있음) 공용 골드 톤으로 통일. */
#gauge-bar .gz-lvtext{
  position:absolute; left:50%; bottom:clamp(-15px, -4.5cqi, -11px);
  transform:translateX(-50%);
  font-family:'Share Tech Mono',monospace;
  font-size:clamp(8px, 2cqi, 10px); font-weight:700;
  color:#2a1c08; white-space:nowrap;
  padding:1px clamp(5px, 1.6cqi, 8px) 0.5px;
  background:rgba(230,190,90,0.88);
  clip-path:polygon(6% 0%, 100% 8%, 94% 100%, 0% 92%); /* 형광펜으로 슥 칠한 듯한 비스듬한 사다리꼴 */
  border-radius:1px;
  z-index:2;
}
#gauge-bar .gz-lvtext-sep{ opacity:0.55; margin:0 1px; }

/* ── 보석 위: 구간 키워드(1번 의존, 2번 공포, 3~5번은 ??? 잠금 표시) ── */
#gauge-bar .gz-keyword{
  position:absolute; left:50%; top:clamp(-16px, -5cqi, -12px);
  transform:translateX(-50%);
  font-family:'Gowun Batang',serif;
  font-size:clamp(8px, 2cqi, 10px); font-weight:700;
  letter-spacing:0.05em;
  color:rgba(240,230,210,0.75);
  white-space:nowrap;
  text-shadow:0 1px 3px rgba(0,0,0,0.9);
}
#gauge-bar .gz.gz-locked .gz-keyword{ color:rgba(240,230,210,0.35); }

/* ══════════════════════════════════════
   "빛과 어둠" 탭(#gauge-tree-wrap) — 하단 탭으로 옮긴 스킬트리용.
   위 #gauge-bar .gz* 규칙들과 완전히 같은 내용을 이 스코프에도 넣는다
   (발견된 문제 — 원래 모든 .gz-svg/.gz-core/.gz-pct/.gz-lvtext/
   .gz-keyword 스타일이 "#gauge-bar 안에 있을 때만" 적용되도록 스코프가
   걸려 있어서, #gauge-tree-wrap 안에서는 이 스타일들이 하나도 안 먹혀
   도형만 커다랗게 뭉개져 보이고 퍼센트/이름/레벨 텍스트 위치가 전부
   깨졌었다). 크기(clamp 값)만 스킬트리 노드에 맞게 별도로 준다 —
   나머지(정렬, 폰트, 색상, 클립 애니메이션 등) 로직은 100% 동일. */
#gauge-tree-wrap .gz{
  position:relative;
  width:100%; height:100%;
  pointer-events:auto;
  cursor:default;
  /* 입체감 강화 — 아래로 떨어지는 그림자를 두 겹으로 줘서 도형이
     배경에서 확실히 떠 보이게 하고, 살짝의 안쪽 발광으로 보석
     자체가 광원을 머금은 느낌을 더한다(요청사항 — "3D느낌, 입체감"). */
  filter:
    drop-shadow(0 5px 3px rgba(0,0,0,0.45))
    drop-shadow(0 10px 14px rgba(0,0,0,0.35))
    drop-shadow(0 0 6px rgba(255,255,255,0.08));
  transition:transform .18s ease, filter .18s ease;
}
#gauge-tree-wrap .gz.gz-active{ cursor:pointer; }
#gauge-tree-wrap .gz.gz-active:active{ transform:scale(0.9); }
#gauge-tree-wrap .gz.gz-active:hover{
  transform:translateY(-2px) scale(1.04);
  filter:
    drop-shadow(0 8px 5px rgba(0,0,0,0.5))
    drop-shadow(0 14px 18px rgba(0,0,0,0.4))
    drop-shadow(0 0 10px rgba(255,255,255,0.18));
}
#gauge-tree-wrap .gz-svg{ display:block;width:100%;height:100%; }
#gauge-tree-wrap .gz-svg clipPath rect{ transition:y .5s ease, height .5s ease; }
/* [버그 수정] 요청사항 — "퍼즐 접어두고 나왔을 때 상단 영역에 마우스
   올리면 뜨는 아이콘을, 클릭이 막힌 게이지 항목에도 동일하게
   표시해줘." 다른 퍼즐을 접어둔 상태에서는 openGaugePuzzle()이 클릭
   자체를 막고 있지만(gauge_system.js 참고), 위 .gz-active 규칙의
   cursor:pointer가 여전히 적용돼 있어 클릭 가능한 것처럼 보였다.
   .gz-active와 함께 이 클래스가 붙으면(_buildGaugeEl에서 부여) 접어둔
   퍼즐 화면(#minimize-block)과 동일한 cursor:not-allowed로 덮어써서,
   클릭이 막혀 있다는 걸 마우스 오버만으로도 알 수 있게 한다. hover
   확대 효과도 "클릭 가능해 보이는" 착각을 주지 않도록 함께 끈다.
*/
#gauge-tree-wrap .gz.gz-active.gz-puzzle-locked{ cursor:not-allowed; }
#gauge-tree-wrap .gz.gz-active.gz-puzzle-locked:hover{ transform:none;filter:none; }
#gauge-tree-wrap .gz.gz-active.gz-puzzle-locked:active{ transform:none; }
#gauge-tree-wrap .gz-core{
  position:absolute;inset:0;
  display:flex;align-items:center;justify-content:center;
  pointer-events:none;
}
#gauge-tree-wrap .gz-pct{
  font-family:'Share Tech Mono',monospace;
  font-size:clamp(8px, 2.6cqi, 12px);font-weight:700;
  color:#fff;
  text-shadow:0 1px 3px rgba(0,0,0,0.9);
}
#gauge-tree-wrap .gz-lockicon{
  font-size:clamp(11px, 3.2cqi, 16px);
  color:rgba(255,255,255,0.45);
}
#gauge-tree-wrap .gz.gz-locked{ /* opacity 제거(요청사항) — 대신 _buildGaugeEl에서 채도를 낮춰 잠김을 표현한다 */ }
#gauge-tree-wrap .gz-lvtext{
  position:absolute; left:50%; bottom:clamp(-16px, -5cqi, -12px);
  transform:translateX(-50%);
  font-family:'Share Tech Mono',monospace;
  font-size:clamp(9px, 2.3cqi, 12px); font-weight:700;
  color:#2a1c08; white-space:nowrap;
  padding:1px clamp(5px, 1.8cqi, 8px) 0.5px;
  background:rgba(230,190,90,0.88);
  clip-path:polygon(6% 0%, 100% 8%, 94% 100%, 0% 92%);
  border-radius:1px;
  z-index:2;
}
#gauge-tree-wrap .gz-lvtext-sep{ opacity:0.55; margin:0 1px; }
#gauge-tree-wrap .gz-keyword{
  position:absolute; left:50%; top:clamp(-17px, -5.5cqi, -13px);
  transform:translateX(-50%);
  font-family:'Gowun Batang',serif;
  font-size:clamp(9px, 2.3cqi, 12px); font-weight:700;
  letter-spacing:0.05em;
  color:rgba(240,230,210,0.75);
  white-space:nowrap;
  text-shadow:0 1px 3px rgba(0,0,0,0.9);
}
#gauge-tree-wrap .gz.gz-locked .gz-keyword{ color:rgba(240,230,210,0.35); }

/* 게이지 크기/여백은 위에서 clamp()로 이미 뷰포트 폭에 비례해 부드럽게
   줄어들도록 처리했으므로, 별도의 계단식 미디어쿼리는 더 이상 필요
   없다(이전에는 380px 기준으로 한 번에 뚝 떨어지는 방식이었음). */

/* 타이틀 비주얼 */
/* title-view는 이제 scene-view 안에 갇힌 상단 영역이 아니라, 화면
   전체(뷰포트)를 덮는 풀스크린 타이틀 화면이다. 로고/부제는 중앙 부근,
   로그인/이어하기/설정/로그아웃 버튼은 하단에 배치한다. */
#title-view{
  position:fixed;inset:0;z-index:500;
  display:flex;flex-direction:column;
  align-items:center;justify-content:center;text-align:center;gap:6px;padding:20px;
  overflow:hidden;
  background:
    radial-gradient(ellipse 90% 55% at 50% 22%, rgba(212,168,76,0.10) 0%, transparent 60%),
    radial-gradient(ellipse 120% 70% at 50% 100%, #1c1810 0%, transparent 55%),
    var(--bg);
}
/* 로고+부제(중앙)와 버튼 그룹(하단)을 화면 안에서 분리 배치하기 위한 래퍼 */
#title-center-group{position:relative;z-index:1;flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;}
#title-button-group{
  position:relative;z-index:1;width:100%;max-width:340px;flex-shrink:0;
  padding:24px 20px calc(20px + env(safe-area-inset-bottom, 0px));
  margin-bottom:56px;
  background:rgba(8,8,16,0.72);
  border:1px solid rgba(212,168,76,0.16);
  border-radius:20px;
  box-shadow:0 8px 32px rgba(0,0,0,0.35);
  backdrop-filter:blur(2px);
  box-sizing:border-box;
}
/* 빛 파티클 — "진실된 빛(흰색)"과 "거짓된 빛(루멘석의 인공적인 금색)"이
   뒤섞여 함께 떠오르는 연출. 두 종류를 교차 배치해 공존하는 느낌을 준다.
   실제 이미지 없이 CSS만으로 구현해 가볍다. */
#title-particles{position:absolute;inset:0;pointer-events:none;overflow:hidden;}
#title-particles span{
  position:absolute;bottom:-10px;
  width:3px;height:3px;border-radius:50%;
  background:var(--gold);
  box-shadow:0 0 6px 1px rgba(212,168,76,0.6);
  opacity:0;
  animation:title-particle-rise linear infinite;
}
/* 흰색 파티클(진실된 빛) — 더 맑고 또렷한 발광 */
#title-particles span.white{
  background:#fff;
  box-shadow:0 0 8px 2px rgba(255,255,255,0.75);
}
#title-particles span:nth-child(1){left:6%;  width:2px;height:2px; animation-duration:9s;   animation-delay:0s;}
#title-particles span:nth-child(2){left:15%; animation-duration:12s;  animation-delay:1.2s;}
#title-particles span:nth-child(3){left:24%; width:2px;height:2px; animation-duration:8s;   animation-delay:2.5s;}
#title-particles span:nth-child(4){left:33%; animation-duration:14s;  animation-delay:0.6s;}
#title-particles span:nth-child(5){left:42%; width:2px;height:2px; animation-duration:10s;  animation-delay:3.4s;}
#title-particles span:nth-child(6){left:51%; animation-duration:11s;  animation-delay:1.8s;}
#title-particles span:nth-child(7){left:60%; width:2px;height:2px; animation-duration:9.5s; animation-delay:4.1s;}
#title-particles span:nth-child(8){left:69%; animation-duration:13s;  animation-delay:2.2s;}
#title-particles span:nth-child(9){left:78%; width:2px;height:2px; animation-duration:8.5s; animation-delay:0.9s;}
#title-particles span:nth-child(10){left:87%; animation-duration:15s; animation-delay:3.8s;}
#title-particles span:nth-child(11){left:11%; width:2px;height:2px; animation-duration:10.5s; animation-delay:5.2s;}
#title-particles span:nth-child(12){left:29%; animation-duration:13.5s; animation-delay:6.1s;}
#title-particles span:nth-child(13){left:47%; width:2px;height:2px; animation-duration:9.2s;  animation-delay:2.9s;}
#title-particles span:nth-child(14){left:65%; animation-duration:12.5s; animation-delay:4.7s;}
#title-particles span:nth-child(15){left:83%; width:2px;height:2px; animation-duration:11s;   animation-delay:1.5s;}
#title-particles span:nth-child(16){left:93%; animation-duration:14.5s; animation-delay:3.1s;}
@keyframes title-particle-rise{
  0%{ transform:translateY(0) scale(1); opacity:0; }
  8%{ opacity:0.8; }
  75%{ opacity:0.3; }
  100%{ transform:translateY(-100vh) scale(0.4); opacity:0; }
}
.t-glow{
  position:relative;z-index:1;
  font-family:'Cinzel',serif;font-size:clamp(38px,10vw,64px);letter-spacing:16px;
  color:var(--gold);
  text-shadow:0 0 12px rgba(212,168,76,0.5),0 0 44px rgba(212,168,76,0.25);
  animation:fadeUp 1.4s ease both, title-glow-pulse 4.5s ease-in-out infinite 1.4s;
}
@keyframes title-glow-pulse{
  0%,100%{ text-shadow:0 0 12px rgba(212,168,76,0.5),0 0 44px rgba(212,168,76,0.25); }
  50%{ text-shadow:0 0 18px rgba(212,168,76,0.7),0 0 60px rgba(212,168,76,0.4); }
}
.t-sub{position:relative;z-index:1;font-size:11px;letter-spacing:3px;color:var(--text-dim);line-height:2;animation:fadeUp 1.4s ease both 0.3s;}
.t-div{position:relative;z-index:1;width:1px;height:28px;background:linear-gradient(180deg,var(--gold),transparent);margin:6px auto;animation:fadeUp 1.4s ease both 0.2s;}

/* 씬 헤더 */
#scene-hdr{
  flex-shrink:0;
  display:none;
  align-items:center;gap:8px;
  padding:10px 14px;
  background:rgba(8,8,20,0.95);
  border-bottom:1px solid rgba(212,168,76,0.15);
}
#scene-hdr.show{display:flex;}
.hdr-badge{font-family:'Gowun Batang',serif;font-size:8px;letter-spacing:2px;color:var(--gold);text-transform:uppercase;background:rgba(212,168,76,0.12);border:1px solid rgba(212,168,76,0.3);padding:3px 8px;border-radius:3px;font-weight:700;}
.hdr-title{font-family:'Gowun Batang',serif;font-size:12px;font-weight:700;color:#fff;letter-spacing:1px;}

/* ── 세이브 포인트 표시: 세이브 포인트 씬에 머무는 동안 계속 떠서
   천천히 깜박인다(사라지지 않음). 위치는 상단 헤더 우측이며, 왼쪽의
   챕터 배지(.hdr-badge)와 동일한 사각형 테두리 스타일을 그대로 쓴다.
   글자를 "저장됨"→"저장"으로 줄이고 원형 체크 아이콘을 추가했다.
   글자 크기·아이콘 크기 모두 왼쪽 장면 이름(.hdr-title, 12px)과
   동일하게 맞춰서 더 잘 보이도록 했다(요청사항). ── */
#hdr-saved-indicator{
  display:none;
  align-items:center;gap:6px;
  margin-left:auto;
  font-family:'Gowun Batang',serif;font-size:12px;letter-spacing:1px;
  color:#fff;text-transform:uppercase;font-weight:700;
  animation:hdr-saved-breathe 2.6s ease-in-out infinite;
}
#hdr-saved-indicator.show{display:flex;}
#hdr-saved-check{
  width:13px;height:13px;flex-shrink:0;
  color:#5fe3b3;
}
@keyframes hdr-saved-breathe{
  0%,100%{ opacity:0.45; }
  50%{ opacity:1; }
}

/* 서브오브젝트 오버레이 */
#sub-overlay{position:absolute;inset:0;pointer-events:none;z-index:8;}
.sobj{position:absolute;pointer-events:all;cursor:pointer;display:flex;flex-direction:column;align-items:center;gap:3px;-webkit-tap-highlight-color:transparent;
  /* 중심점 기준 정렬 — left/top이 오브젝트 중심을 가리키도록 */
  transform:translate(-50%,-50%);
}

.sobj-box{position:relative;display:flex;align-items:center;justify-content:center;width:40px;height:40px;}
.sobj-rw{position:absolute;inset:0;pointer-events:none;}
.sobj-r{position:absolute;inset:0;border-radius:50%;border:2px solid rgba(212,168,76,0.9);opacity:0;animation:rp 2.2s ease-out infinite;}
.sobj-r:nth-child(2){animation-delay:0.73s;}
.sobj-r:nth-child(3){animation-delay:1.46s;}
@keyframes rp{0%{transform:scale(0.4);opacity:0.8;}100%{transform:scale(1.8);opacity:0;}}
.sobj-icon{font-size:0;position:relative;z-index:2;transition:transform 0.15s;display:none;}
.sobj:active .sobj-icon{transform:scale(0.88);}
.sobj.visited .sobj-icon{opacity:0.4;filter:none;}
/* 이미지 모드 오브젝트: 이모지와 달리 실제로 화면에 보여야 하므로 표시 */
.sobj-icon:has(.sobj-img){display:block;font-size:initial;}
.sobj-img{width:40px;height:40px;object-fit:cover;border-radius:4px;display:block;pointer-events:none;}
.sobj.visited .sobj-r{animation:none;opacity:0.35;transform:scale(1.0);}
.sobj.visited .sobj-r:nth-child(3){opacity:0;display:none;}
.sobj.visited .sobj-box::after{
  content:'';position:absolute;width:8px;height:8px;border-radius:50%;
  background:rgba(212,168,76,0.5);top:50%;left:50%;transform:translate(-50%,-50%);
}
.sobj.transparent .sobj-box{opacity:0 !important;}
.sobj.transparent .sobj-lbl{display:none !important;}
.sobj.transparent .sobj-rw{display:none !important;}
.sobj.transparent.visited .sobj-box{opacity:0 !important;}
.sobj.inactive{opacity:0.45;pointer-events:none;cursor:default;}
.sobj.inactive .sobj-r{animation:none;opacity:0.5;transform:scale(1.0);}
.sobj.inactive .sobj-r:nth-child(2){opacity:0.35;transform:scale(1.3);}
.sobj.inactive .sobj-r:nth-child(3){display:none;}
.sobj.inactive .sobj-lbl{opacity:0.6;}

/* 조사수첩 확인 완료(archiveUnlocked값=1, "읽음·계속 존재") 오브젝트 전용.
   hideOnUse가 아니라서 화면에서 사라지지는 않지만, 한 번 확인한 자료는
   더 이상 클릭할 필요가 없으므로 클릭을 막고, 시각적으로도 "이미 다
   봤다"는 걸 확실히 알려준다:
     - 링(sobj-r) 자체를 작게 줄여서(scale 축소) 존재감을 낮춘다
     - 가운데에 작은 체크마크(✓)를 얹는다
     - 마우스 오버 시 접어둔 퍼즐 화면(#minimize-block)과 동일하게
       cursor:not-allowed(브라우저 기본 금지 아이콘)를 띄운다
   주의: pointer-events:none인 요소는 마우스 이벤트의 타겟이 될 수 없어
   그 요소에 지정한 cursor 값 자체가 무시된다(뒤에 있는 요소의 커서가
   대신 보임). 그래서 최상위(.sobj.archived)는 pointer-events:auto로
   두어 마우스가 이 요소를 실제로 타겟팅하게 하고(→ cursor:not-allowed가
   정상적으로 뜸), 클릭 자체는 JS 클릭 핸들러에서 무시하는 방식으로
   막는다(el.onclick 안의 `if (archived) return;`).
   (archiveUnlocked값=2는 hideOnUse라 애초에 DOM에서 제거되므로 여기 해당 없음.) */
.sobj.archived{pointer-events:auto;cursor:not-allowed;}
.sobj.archived .sobj-r{
  animation:none;opacity:0.3;
  /* 기본 링(scale 1.8까지 커지는 애니메이션)보다 훨씬 작게 고정 */
  transform:scale(0.55);
}
.sobj.archived .sobj-r:nth-child(2){opacity:0.18;transform:scale(0.72);}
.sobj.archived .sobj-r:nth-child(3){display:none;}
.sobj.archived .sobj-icon{opacity:0.5;}
.sobj.archived .sobj-lbl{opacity:0.45;}
/* 가운데 체크마크 — .sobj.visited의 작은 점(::after)과 같은 자리를
   쓰되, 점 대신 체크 기호를 얹어 "확인 완료"를 명확히 표현한다. */
.sobj.archived .sobj-box::after{
  content:'✓';
  position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
  width:18px;height:18px;border-radius:50%;
  background:rgba(20,16,8,0.82);
  border:1px solid rgba(212,168,76,0.55);
  color:rgba(212,168,76,0.95);
  font-size:11px;font-weight:700;line-height:18px;text-align:center;
  font-family:'Noto Sans KR',sans-serif;
  pointer-events:none;
}
.sobj-lbl{font-family:'Gowun Batang',serif;font-size:var(--font-obj-label);letter-spacing:0.05em;color:#ffe090;white-space:nowrap;background:rgba(0,0,0,0.82);padding:4px 12px;border-radius:3px;pointer-events:none;font-weight:700;border:1px solid rgba(212,168,76,0.45);
  /* 화면 밖으로 나가지 않도록: sub-overlay 기준 clamp */
  position:relative;
  max-width:min(160px, 45vw);
  white-space:normal;
  text-align:center;
  word-break:keep-all;
  line-height:1.3;
}

/* 씬 힌트 */
#scene-hint{position:absolute;bottom:10px;left:50%;transform:translateX(-50%);font-family:'Share Tech Mono',monospace;font-size:9px;letter-spacing:0.12em;color:var(--text-dim);background:rgba(0,0,0,0.7);padding:5px 12px;border-radius:2px;border:1px solid var(--border);opacity:0;transition:opacity 0.3s;pointer-events:none;white-space:nowrap;z-index:9;}
#scene-hint.show{opacity:1;}

/* 엔딩 오버레이 */
#end-ov{position:absolute;inset:0;display:none;flex-direction:column;align-items:center;justify-content:center;gap:8px;background:rgba(0,0,0,0.85);backdrop-filter:blur(4px);z-index:10;padding:24px;text-align:center;}
#end-ov.show{display:flex;animation:fadeIn 0.8s ease;}
.eo-ey{font-family:'Share Tech Mono',monospace;font-size:8px;letter-spacing:0.3em;color:var(--gold-dim);}
.eo-ti{font-family:'Cinzel',serif;font-size:22px;letter-spacing:6px;color:var(--gold);}
.eo-ba{font-size:11px;color:var(--text-dim);letter-spacing:1px;border:1px solid var(--border);padding:4px 10px;border-radius:2px;}

/* 진행 바 */
#prog-wrap{display:none;}
#prog-bar{display:none;}

/* 탭 파급 */
.tap-rpl{position:fixed;border-radius:50%;pointer-events:none;z-index:9999;transform:translate(-50%,-50%) scale(0);animation:tap-b 0.45s ease-out forwards;border:1px solid rgba(212,168,76,0.55);width:36px;height:36px;}
@keyframes tap-b{0%{transform:translate(-50%,-50%) scale(0);opacity:0.7;}100%{transform:translate(-50%,-50%) scale(2.8);opacity:0;}}

/* ── 하단 패널 ── */
#panel{flex:1;display:flex;flex-direction:column;background:var(--panel);overflow:hidden;min-height:0;}

/* 하단 내비게이션 (앱 스타일) */
#tab-bar{
  display:flex;flex-shrink:0;
  border-top:1px solid rgba(212,168,76,0.25);
  background:rgba(10,10,18,0.98);
  padding-bottom:env(safe-area-inset-bottom);
  position:relative;z-index:50;
}
.tb{
  flex:1;padding:14px 0 12px;
  background:none;border:none;
  display:flex;flex-direction:column;align-items:center;gap:5px;
  font-family:'Gowun Batang',serif;
  font-size:var(--font-tab-label);
  color:rgba(180,160,120,0.65);
  cursor:pointer;transition:color 0.2s;
  position:relative;
}
.tb::before{
  content:attr(data-icon);
  font-size:var(--font-tab-icon);
  line-height:1;
  display:block;
}
.tb.on{color:var(--gold);}
/* ── 요청사항: 선택된 탭 표시를 상단 노란색 선 대신 배경색을 살짝
   밝게 하는 방식으로 바꿔본다. 별로면 아래 주석 처리된 원본
   (.tb.on::after의 밑줄)만 다시 살리고, 그 아래 대체 규칙
   (.tb.on 배경색)을 지우면 정확히 원래대로 돌아간다. ──
.tb.on::after{
  content:'';position:absolute;top:0;left:20%;right:20%;height:2px;
  background:var(--gold);border-radius:0 0 2px 2px;
}
*/
.tb.on{
  background:var(--gold-faint);
}
.tb-dot{display:inline-block;width:5px;height:5px;border-radius:50%;background:var(--gold);
  position:absolute;top:8px;right:calc(50% - 14px);
  animation:bdot 1.5s ease-in-out infinite;}
@keyframes bdot{0%,100%{opacity:1}50%{opacity:0.3}}

/* 스크롤바 */
::-webkit-scrollbar{width:3px;}
::-webkit-scrollbar-track{background:var(--panel);}
::-webkit-scrollbar-thumb{background:rgba(212,168,76,0.2);border-radius:2px;}
::-webkit-scrollbar-thumb:hover{background:rgba(212,168,76,0.35);}

/* 탭 패널 */
.tp{display:none;flex:1;overflow:hidden;min-height:0;}
.tp.on{display:flex;flex-direction:column;}

/* ── 이야기 탭 ── */
/* pane-story는 position:relative, 내부를 absolute로 채움 */
#pane-story{position:relative;overflow:hidden;flex:1;min-height:0;}

/* msg-header 숨김 (상단 씬 헤더가 담당) */
#msg-header{display:none;}
#mh-label{}

/* 메시지 본문 — inset:0으로 전체 차지, 버튼은 위에 오버레이 */
#msg-body{
  position:absolute;
  inset:0;
  overflow-y:auto;
  padding:20px 28px 70px;
  cursor:pointer;
  display:flex;flex-direction:column;
  justify-content:center;
  z-index:1;
}
/* 텍스트 단락 */
.mp{font-size:var(--base-font);line-height:var(--story-line-height,1.75);color:var(--text);white-space:pre-wrap;animation:pi 0.25s ease forwards;text-indent:0.8em;}
.mp.narr{color:#FFCD12;padding-left:12px;border-left:1px solid #EDA900;font-size:var(--base-font);line-height:var(--story-line-height,1.75);text-indent:0;}
.mp.narrc{color:#FFCD12;text-align:center;font-size:var(--base-font);padding:4px 0;text-indent:0;}
.mp.mono{color:#FFCD12;text-align:center;font-size:var(--base-font);padding:4px 0;text-indent:0;font-style:italic;}
.mp.dv{text-align:center;color:var(--text-dim);font-size:11px;letter-spacing:4px;text-indent:0;}
.mp.dialogue{display:grid;grid-template-columns:auto 1fr;gap:0 8px;align-items:baseline;text-indent:0;}
.mp.dialogue .spk{font-weight:700;color:#c4a060;white-space:nowrap;align-self:start;padding-top:0;}
@keyframes pi{from{opacity:0;transform:translateY(3px);}to{opacity:1;transform:translateY(0);}}

/* 텍스트 묶음 전환 페이드 */
@keyframes bodyFadeIn{from{opacity:0;}to{opacity:1;}}
@keyframes bodyFadeOut{from{opacity:1;}to{opacity:0;}}
#msg-body.fading-out,#ilv-msg.fading-out{animation:bodyFadeOut 0.35s ease forwards;pointer-events:none;}
#msg-body.fading-in,#ilv-msg.fading-in{animation:bodyFadeIn 0.4s ease forwards;}

/* 다음 힌트 (hint-bar로 대체됨 — 빈 div 하위 호환) */
#next-hint { display:none !important; }
.na{
  display:inline-flex;
  align-items:center;justify-content:center;
  padding:5px 13px 4px;
  border:1px solid rgba(255,255,255,0.3);
  border-bottom:2.5px solid rgba(255,255,255,0.5);
  border-radius:5px;
  background:rgba(10,8,4,0.45);
  backdrop-filter:blur(2px);
  color:rgba(212,168,76,0.6);
  font-family:'Gowun Batang',serif;
  font-size:10px;letter-spacing:0.5px;
  animation:nb 2.8s ease-in-out infinite;
  line-height:1;white-space:nowrap;
}
@keyframes nb{0%,100%{opacity:0.2}50%{opacity:0.7}}

/* 선택지 — 하단 오버레이 (텍스트 위에 float) */
#choices-area{
  position:absolute;bottom:0;left:0;right:0;
  padding:6px 28px 14px;
  display:grid;grid-template-columns:1fr 1fr;gap:6px;
  background:linear-gradient(transparent 0%, var(--panel) 18%);
  z-index:2;
  pointer-events:auto;
}
/* .cb — 스토리 진행 중 하단에 뜨는 메인 선택지 버튼. 앞서 만든 퍼즐
   공통 버튼(.puzzle-sub-btn, gauge_puzzle_common.js의 gz-start-btn과
   동일 톤)과 같은 "글로시 3D 캡슐" 디자인을 그대로 적용했다
   (요청사항 — "선택지 버튼들... 하단에 나오는 버튼들 디자인도 같은
   디자인으로 바꿔주되 주황 계열로. 이미 공통 버튼에서 만든 색깔
   괜찮은 거 같아"). 기존의 각진 테두리+갈색 나무버튼 톤을 걷어내고
   테두리 없는 라운드 캡슐+하단 그림자 눌림 효과로 통일했다. 세로
   높이도 42px→36px로 줄였다(요청사항 — "새로 크기를 조금 줄여줘"). */
/* [스타일 통일] 요청사항 — "이야기영역(게임 하단)에 나오는 버튼 중
   '계속', '이전으로', '퍼즐로 돌아가기' 버튼들도 지금 수정한 공통
   퍼즐 버튼과 동일하게 해줘. 단 버튼 크기와 색은 지금과 유지, 버튼
   모서리 굴곡이랑 입체감 이런거 다 수정한걸로 동일하게. 글꼴도."
   크기(padding/height)와 배경색(#a85a1c)은 그대로 두고, 모서리
   반경(.pzc-bar-btn과 동일한 clamp(10px,3cqi,16px)), 입체감(그림자
   없이 평평 + active 시 눌리는 대신 scale로 축소), 글꼴(--font-pz-btn,
   나눔스퀘어라운드)만 퍼즐 공통 버튼과 맞췄다. */
.cb{
  padding:0 12px;
  height:36px;
  display:flex;align-items:center;justify-content:center;
  position:relative;overflow:hidden;outline:none;
  cursor:pointer;font-family:var(--font-pz-btn,'Noto Sans KR',sans-serif);font-weight:bold;
  /* [크기 통일] 요청사항 — "내부 팝업 글자와 하단 공통버튼들의 크기를
     1px 다 키워줘.(계속 이전으로 퍼즐로 돌아가기 모두 적용되는거지?)".
     기존엔 --base-font 기준(calc(--base-font - 4px))이라 공통버튼과
     별도로 움직였는데, 이제 공통 버튼과 동일한 --pz-btn-font-size를
     그대로 써서 한 변수로 함께 묶인다. */
  font-size:var(--pz-btn-font-size);letter-spacing:.02em;text-align:center;
  transition:transform .08s,filter .08s;
  -webkit-tap-highlight-color:transparent;user-select:none;
  /* [색상 통일] 요청사항 — "계속/이전으로/퍼즐로 돌아가기 버튼 색상도
     공통 퍼즐 버튼과 동일한 주황(#e0871f)으로". 기존 진한 주황
     (#a85a1c)에서 공통 버튼과 완전히 같은 톤으로 교체. */
  background:#e0871f;
  border:none;border-radius:clamp(10px,3cqi,16px);
  color:#ffffff;
  box-shadow:none;
  text-shadow:none;
}
.cb:hover{
  filter:brightness(1.06);
}
.cb:active{
  transform:scale(0.97);
  filter:brightness(0.9);
}
/* [재변경] 요청사항 — "하단 스토리 영역에 나오는 '계속, 이전으로'
   버튼을 선택지 버튼으로 디자인 바꾸고". 예전엔 여기서 "테두리 없애고
   글자만" 스타일로 오버라이드했었지만, 이번 요청으로 다시 .cb(선택지
   버튼)와 완전히 동일한 오렌지 글로시 캡슐 디자인으로 되돌린다 —
   grid-column:1/-1(가로 전체 폭 차지)만 .pri 전용으로 유지한다. */
/* [원복] 요청사항 — "계속, 이전으로, 퍼즐로 돌아가기 버튼... 크기
   원래대로 길게 해줘". 한때 "가로 크기를 절반으로 줄여줘"에 맞춰
   width:50%로 좁혔던 적이 있으나, 이번 요청으로 다시 grid-column:1/-1
   (가로 전체 폭)이 시각적으로도 그대로 적용되도록 되돌린다.
   [색상 통일] 요청사항 — "계속/이전으로/퍼즐로 돌아가기 버튼도 공통
   퍼즐 버튼과 동일한 색상, 폰트, 크기, 입체감(없이)로". .cb와 동일한
   공통 버튼 주황(#e0871f)으로 통일. */
.cb.pri{
  grid-column:1/-1;text-align:center;
  justify-self:center;width:100%;
  background:#e0871f;
  box-shadow:none;
}
.cb.pri:hover{ filter:brightness(1.06); }
.cb.pri:active{ transform:scale(0.97); filter:brightness(0.9); }
/* 계속 버튼(요청사항 재조정 — "하단 클리어했을 때 활성화 되는 계속
   버튼과 접어두기 버튼 색을 진한 블루 계열로 통일. 계속 버튼
   활성화 될 때에는 테두리를 조금 더 굵게 해주고 노란색 반짝 효과
   넣어줘"). 평소(비활성/기본) 상태는 접어두기와 동일한 진한 블루로
   맞추고, 실제로 클릭 가능해지는 순간(:not(:disabled))에만 굵은
   노란 테두리 + 반짝이는 글로우로 "지금 눌러야 할 버튼"임을
   또렷하게 드러낸다. */
#pz-cont-btn{
  padding:0 12px;height:var(--pz-btn-height);
  display:flex;align-items:center;justify-content:center;
  position:relative;overflow:hidden;outline:none;
  cursor:pointer;font-family:var(--font-pz-btn,'Noto Sans KR',sans-serif);
  font-weight:600;font-size:var(--pz-btn-font-size);
  letter-spacing:.02em;text-align:center;border-radius:clamp(6px,1.8cqi,9px);
  transition:transform .08s,filter .12s,border-color .15s;
  -webkit-tap-highlight-color:transparent;user-select:none;
  /* [색상 통일] 요청사항 — "계속/이전으로/퍼즐로 돌아가기 버튼도
     공통 퍼즐 버튼과 동일한 색상, 폰트, 크기, 입체감(없이)로".
     기존 블루(#2a5fa8)를 공통 버튼과 동일한 주황(#e0871f)으로 교체. */
  background:#e0871f;
  border:2px solid transparent;color:#ffffff;
  box-shadow:none;
  text-shadow:none;line-height:1.4;
  box-sizing:border-box;
}
#pz-cont-btn:hover{filter:brightness(1.06);}
#pz-cont-btn:active{transform:scale(0.97);filter:brightness(0.9);}
#pz-cont-btn:disabled{opacity:0.25;cursor:not-allowed;pointer-events:none;}
/* 활성화 상태 — 굵은 흰색 테두리 + 반짝이는 밝기 애니메이션(그림자
   없이, 테두리 강조만 유지) */
#pz-cont-btn:not(:disabled){
  border-color:#ffffff;
  animation:pz-cont-flash 1.8s ease-in-out infinite;
}
@keyframes pz-cont-flash{
  0%,100%{filter:brightness(1);}
  50%{filter:brightness(1.15);}
}
/* 접어두기 버튼 — 요청사항대로 계속 버튼과 동일한 색/폰트/크기로
   통일(활성/비활성 구분 없이 항상 같은 톤 — 접어두기는 언제나 누를
   수 있는 보조 버튼이므로). */
#pz-min-btn{
  padding:0 12px;height:var(--pz-btn-height);
  display:flex;align-items:center;justify-content:center;
  position:relative;overflow:hidden;outline:none;
  cursor:pointer;font-family:var(--font-pz-btn,'Noto Sans KR',sans-serif);
  font-weight:600;font-size:var(--pz-btn-font-size);
  letter-spacing:.02em;text-align:center;border-radius:clamp(6px,1.8cqi,9px);
  transition:transform .08s,filter .12s;
  -webkit-tap-highlight-color:transparent;user-select:none;
  background:#e0871f;
  border:none;color:#ffffff;
  box-shadow:none;
  text-shadow:none;line-height:1.4;
}
#pz-min-btn:hover{filter:brightness(1.06);}
#pz-min-btn:active{transform:scale(0.97);filter:brightness(0.9);}
.cb.retry{
  grid-column:1/-1;text-align:center;
  font-size:12px;
  color:rgba(180,160,120,0.55);
  border-color:rgba(180,160,120,0.15);
  background:transparent;
  padding:7px 14px;
  letter-spacing:0.5px;
}
.cb.retry:hover,.cb.retry:active{color:rgba(180,160,120,0.85);border-color:rgba(180,160,120,0.35);background:rgba(180,160,120,0.05);}
.cb:disabled{opacity:0.3;pointer-events:none;}
.sbb{padding:10px 14px;width:100%;border:1px solid var(--border);background:transparent;color:var(--text-dim);font-family:var(--font-ui);font-size:var(--font-sbb);cursor:pointer;text-align:center;border-radius:2px;letter-spacing:1px;grid-column:1/-1;}
.sub-note{font-family:'Share Tech Mono',monospace;font-size:9px;letter-spacing:0.15em;color:var(--text-dim);text-align:center;padding:6px 0;grid-column:1/-1;}
/* 서브장면 버튼 — 메인 선택지보다 작고 덜 강조. 색상은 계속(청록)/
   접어두기(자주)와 겹치지 않는 슬레이트/차콜 계열로 분리했다
   (요청사항 — "서브신 선택지 버튼도 별개로 나눠서 바꾸자"). 세로
   크기도 42px→36px로 살짝 줄였다(요청사항 — "선택지 버튼의 세로
   크기를 조금 줄여주고"). */
.sb{
  padding:0 12px;
  height:36px;
  display:flex;align-items:center;justify-content:center;
  position:relative;overflow:hidden;outline:none;
  cursor:pointer;font-family:'Noto Sans KR',sans-serif;font-weight:500;
  font-size:var(--font-b);letter-spacing:.03em;text-align:center;
  transition:filter .12s,transform .1s,box-shadow .12s;
  -webkit-tap-highlight-color:transparent;user-select:none;
  background:linear-gradient(180deg,#33404a 0%,#212a30 40%,#151b1e 100%);
  border:2px solid #0e1315;
  color:#a8bcc8;
  box-shadow:
    0 3px 0 #060809,
    0 4px 8px rgba(0,0,0,.5),
    inset 0 1px 0 rgba(168,188,200,.18),
    inset 0 -1px 0 rgba(0,0,0,.25);
  text-shadow:0 1px 0 rgba(10,15,20,.4);
  line-height:1.4;
}
.sb:hover{
  filter:brightness(1.15);
  box-shadow:
    0 3px 0 #060809,
    0 5px 12px rgba(40,60,70,.4),
    inset 0 1px 0 rgba(168,188,200,.25),
    inset 0 -1px 0 rgba(0,0,0,.2);
}
.sb:active{
  transform:translateY(2px);
  box-shadow:0 1px 0 #060809,0 2px 4px rgba(0,0,0,.35),inset 0 1px 0 rgba(168,188,200,.1);
  filter:brightness(.9);
}
.sb::before{
  content:'';position:absolute;left:8px;top:50%;transform:translateY(-50%);
  width:3px;height:3px;border-radius:50%;
  background:rgba(168,188,200,0.4);
}
.sb.visited{opacity:0.38;filter:grayscale(.5);pointer-events:none;}
.sb.locked{opacity:0.28;border-style:dashed;cursor:default;pointer-events:auto;filter:grayscale(.6);}
.sb.newly{
  background:linear-gradient(180deg,#3e5060 0%,#28343c 40%,#1a2226 100%);
  border-color:#101618;color:#c0d4e0;
  box-shadow:0 3px 0 #060809,0 4px 12px rgba(60,90,110,.3),inset 0 1px 0 rgba(168,188,200,.25);
}
.sb.newly::before{background:rgba(168,188,200,0.7);}

/* ── 기록 탭 ── */
#pane-log{overflow-y:auto;padding:14px 24px;gap:0;}
#log-chapter-hdr{display:none;}
#log-sticky-hdr{display:none;}
#log-scroll-body{display:contents;}
#log-chapter-hdr{display:none;}
.log-folder{margin-bottom:8px;}
/* current 폴더 헤더 — sticky 제거, 그냥 스크롤 */
.log-folder.current > .log-folder-hdr{
  background:var(--panel);
}
/* 요청사항 — "엔딩 씬 모아놓은건 제일 상단에 닫은 상태로." ENDING
   폴더는 다른 챕터 폴더와 톤을 살짝 다르게(더 어두운 배경) 줘서
   "지금 진행 중인 챕터가 아니라 지나온 결과 보관함"이라는 느낌을
   시각적으로도 구분해준다. */
.log-folder-ending > .log-folder-hdr{
  background:rgba(0,0,0,0.2);
}
/* 배경 덮개 박스 제거 */
.log-folder-hdr{
  display:flex;align-items:center;gap:8px;
  padding:8px 10px;
  border:1px solid rgba(212,168,76,0.18);
  border-radius:3px;
  background:rgba(212,168,76,0.05);
  cursor:pointer;
  font-family:var(--font-ui);font-weight:700;
  font-size:12px;
  letter-spacing:0.05em;
  color:var(--gold);
  user-select:none;
  transition:background 0.15s;
}
.log-folder-hdr:active{background:rgba(212,168,76,0.1);}
.log-folder-icon{font-size:9px;color:var(--gold-dim);}
.log-folder-body{padding:4px 0 4px 8px;border-left:1px solid rgba(212,168,76,0.12);margin-left:6px;}
.le{border-bottom:1px solid rgba(212,168,76,0.06);padding:10px 0;}
.le:last-child{border-bottom:none;}
/* 씬 제목(요청사항 — "장면 제목의 글씨체가 잘 안보이는 글씨체야.
   통일시켜주고, 글자 색이 어두운건지 효과가 들어간건지 뭔가 깨지는
   듯한 느낌인데, 글자도 잘 보이도록 해줘"). 라틴 전용 모노스페이스
   폰트(Share Tech Mono)를 쓰고 있어서 한글이 시스템 폰트로 폴백되며
   자간(0.18em)까지 넓게 걸려 있어 글자가 흩어져 보이던 문제였다.
   다른 UI 제목들과 동일한 var(--font-ui)로 통일하고, 크기/굵기/자간/
   대비를 올려 또렷하게 보이도록 했다. */
.le-nm{
  font-family:var(--font-ui);font-weight:700;font-size:12.5px;letter-spacing:0.02em;
  color:#f4d068;margin-bottom:6px;
  display:flex;align-items:center;gap:6px;
}
.le-nm::before{content:'';display:inline-block;width:12px;height:1px;background:var(--gold-dim);}
.le-t{font-size:var(--font-log-body);line-height:1.85;color:var(--text);white-space:pre-wrap;margin-bottom:3px;}
.le-t.narr{font-size:15px;color:var(--text);padding-left:0;border-left:none;}
.le-t.narrc{color:var(--text);text-align:center;}
.le-t.mono{color:var(--text);font-style:italic;}
.le-t.d{color:var(--text);}
#log-empty{font-size:12px;color:var(--text-dim);text-align:center;padding:24px 0;letter-spacing:1px;}

/* ── 가방 탭 ── */
#pane-bag{
  flex-direction:row;gap:0;overflow:hidden;
  padding:0;position:relative;
}
/* 왼쪽: 아이템 리스트 — 2열 × 4행(총 8개)이 스크롤 없이 한 화면에
   들어오도록, 칸 높이를 고정값(39px) 대신 #bag-left의 실제 가용
   높이 기준으로 반응형 계산한다(요청사항 — "왼쪽 리스트를 한번에
   8개 나오도록 세로 높이를 영역에 맞춰줘. 반응형으로. 9개이상이면
   스크롤 되는건 똑같고"). #bag-left는 flex column이고 padding
   10px씩 상하, .bag-lbl은 display:none이라 실제 세로 여백 계산에서
   제외한다. gap은 4px×3(4행 사이 3개의 간격)만큼 빠진다. */
#bag-left{
  flex:0 0 55%;border-right:1px solid var(--border);
  padding:10px 10px;overflow-y:auto;
  display:flex;flex-direction:column;gap:4px;
}
.bag-lbl{display:none;}
#bag-grid{
  display:grid;grid-template-columns:repeat(2,1fr);
  grid-template-rows:repeat(4, minmax(39px, 1fr));
  grid-auto-rows:minmax(39px, 1fr);
  gap:4px;
  flex:1 0 auto;
}
/* JS(updateBagGridRowHeight())가 #bag-left의 실측 가용 높이를 계산해
   --bag-row-h로 채우고 이 클래스를 붙이면, 4행이 정확히 그 높이를
   등분해서 스크롤 없이 8개가 꽉 차 보인다(요청사항). JS가 아직 안
   붙었거나 계산 전인 초기 렌더 프레임에는 위 minmax(39px,1fr) 기본
   규칙이 그대로 적용되어 레이아웃이 깨지지 않는다.
   grid-auto-rows — 아이템이 9개 이상이 되어 5번째 행부터 필요해질 때
   적용되는 규칙(요청사항 — "9개가 되면 맨 아래에 짧게 추가되는데,
   같은 크기로 스크롤 되게"). 이게 없으면 5행째부터는 기본값(auto)이
   적용돼 콘텐츠 크기만큼만 줄어든 짧은 칸으로 보이던 문제가 있었다.
   4행(grid-template-rows)과 동일한 높이를 쓰게 하여 9번째 칸부터도
   기존 칸과 같은 크기로 보이며, 넘치는 부분은 #bag-left의
   overflow-y:auto로 자연스럽게 스크롤된다. */
#bag-grid.js-sized{
  grid-template-rows:repeat(4, var(--bag-row-h, 39px));
  grid-auto-rows:var(--bag-row-h, 39px);
}
.bs{
  border:1px solid rgba(212,168,76,0.1);border-radius:3px;
  background:rgba(0,0,0,0.2);display:flex;flex-direction:column;
  align-items:center;justify-content:center;gap:3px;
  cursor:default;transition:border-color 0.2s,background 0.2s;
  position:relative;
}
.bs.on{border-color:rgba(212,168,76,0.35);background:rgba(212,168,76,0.05);cursor:pointer;}
.bs.on.sel{border-color:var(--gold);background:rgba(212,168,76,0.09);}
.bs.on:active{background:rgba(212,168,76,0.12);}
.bs-nm-wrap{
  width:100%; overflow:hidden; padding:0 4px;
  display:flex; justify-content:center;
}
.bs-nm{
  font-family:var(--font-ui);font-size:var(--font-bag);font-weight:400;color:#ffffff;
  text-align:center;line-height:1.3;
  white-space:nowrap; /* 줄바꿈 대신 한 줄로 고정 */
  overflow:hidden; text-overflow:ellipsis; /* 넘치면 움직이지 않고 말줄임표로 처리 */
  max-width:100%;
  display:inline-block;
}
/* 오른쪽: 상세 정보
   구조: #bag-right(높이 고정, 자체 스크롤 없음)
         └ #item-detail(flex column, 부모 높이를 꽉 채움)
             ├ #item-detail-scroll(flex:1, 이 안에서만 스크롤)
             │   └ 아이콘/이름/태그/구분선/설명
             └ #item-detail-actions(flex-shrink:0, 항상 하단 고정)
                 └ 사용 버튼 1~2개
   예전에는 #bag-right 자체가 스크롤 컨테이너라, 설명이 길어지면 버튼이
   화면 아래로 밀려나 스크롤을 안 내리면 안 보이는 문제가 있었다
   (실제 사례: "앞면 보기"/"뒷면 보기" 버튼 중 뒷면 보기 버튼을 못 보고
   지나침, 발견된 문제). 버튼 영역을 항상 하단에 고정시켜, 설명이
   얼마나 길든 버튼은 예외 없이 화면 안에 보이도록 구조를 바꿨다. */
#bag-right{
  flex:1;padding:16px 16px;overflow:hidden;
  display:flex;flex-direction:column;
}
#item-detail{
  display:none;flex-direction:column;
  flex:1;min-height:0;
  animation:pi 0.2s ease forwards;
}
#item-detail.show{display:flex;}
#item-detail-scroll{
  flex:1;min-height:0;overflow-y:auto;
  display:flex;flex-direction:column;gap:10px;
}
#item-detail-actions{
  flex-shrink:0;
}
/* 요청사항 재조정 — "가방탭에서 우측 상세정보칸에 버튼이 나오게
   되는데, 2개 이상이면 가로로 배열되거든? 그거 그냥 한줄로 나오게
   해줘. 그리고 버튼 세로 크기도 조금 줄여주고." 기존엔 버튼이 몇
   개든 항상 가로로 나란히 배치했는데(위 옛 주석 참고 — "세로로
   쌓으면 차지하는 높이가 늘어나서" 가로를 택했었음), 이제는 각
   버튼이 한 줄씩(세로로) 쌓이도록 바꾸고, 대신 버튼 자체의 세로
   크기(padding)를 줄여서 전체 차지 높이를 보완했다. */
#item-detail-actions:not(:empty){
  display:flex;flex-direction:column;gap:6px;margin-top:10px;padding-top:10px;
  border-top:1px solid rgba(212,168,76,0.15);
}
/* 요청사항 — "사용하기 등 버튼이 반응형으로 수정이 안되어있어. 글씨체와
   기본크기를 좌측 아이템 리스트 영역의 아이템 이름 글자(.bs-nm)와
   동일하게 해줘. 세로 크기도 줄여줘. 버튼 크기도 좌측 리스트와 동일하게
   반응형으로." item_actions.js가 버튼에 font-family/font-size:inherit를
   줬는데, 정작 부모(#item-detail-actions)에는 폰트가 지정돼 있지 않아
   브라우저 기본 폰트로 상속되고 있었다(발견된 원인) — .bs-nm과 전혀
   다른 폰트/크기였던 이유. 이제 .item-use-btn에 직접 .bs-nm과 동일한
   font-family/font-size(var(--font-ui)/var(--font-bag))를 명시하고,
   세로 크기(padding)도 줄였다. 화면이 낮아지면(요청사항 — 반응형)
   .bs(좌측 아이템 칸)와 선택지 버튼(.cb 등)이 이미 따르는 것과 동일한
   높이별 미디어쿼리 축소 패턴을 여기도 적용한다(아래 @media 참고). */
.item-use-btn{
  font-family:var(--font-ui);
  font-size:var(--font-bag);
  font-weight:400;
  /* 요청사항 — "버튼 크기도 좌측 리스트와 동일하게 반응형으로."
     --font-bag 자체가 #panel의 실측 높이에 따라 JS(index.html의
     _applyStoryTextSize)가 실시간으로 계산해 주입하는 진짜 반응형
     값이다(발견됨) — .bs-nm도 이 값을 그대로 쓰고 있다. padding을
     px 고정이 아니라 em 단위로 주면, font-size(=--font-bag)가
     화면에 따라 줄어들 때 패딩도 같은 비율로 자동으로 줄어들어
     별도의 미디어쿼리 없이도 버튼 전체 크기가 폰트와 함께 반응형
     으로 움직인다(요청사항 — "세로 크기도 줄여줘"에 맞춰 기존
     8px 4px보다 살짝 더 낮은 비율로 잡았다). */
  padding:0.5em 0.3em;
}
#item-detail-icon{display:none;}
#item-detail-name{
  font-family:var(--font-ui);font-size:var(--font-bag);
  font-weight:500;color:var(--gold);text-align:center;letter-spacing:0.5px;
}
#item-detail-tag{display:none;}
#item-detail-divider{height:1px;background:var(--border);margin:8px 0;}
#item-detail-desc{font-family:var(--font-ui);font-size:var(--font-bag);font-weight:400;line-height:1.85;color:#ffffff;text-align:left;word-break:keep-all;overflow-wrap:break-word;}
.bag-empty-hint{
  font-family:var(--font-ui);font-size:var(--font-bag);font-weight:400;
  letter-spacing:0.02em;color:var(--text-dim);text-align:center;
  padding:20px 8px;line-height:2;opacity:0.7;
  margin:auto;
}

/* ── 타이틀 / 메뉴 탭 ── */
#pane-title{padding:16px;gap:8px;overflow-y:auto;}

/* ── 타이틀 화면: 안내 카드(유료 안내/에러 메시지 공용) ── */
.title-notice-card{
  font-family:'Noto Sans KR',sans-serif;font-size:12.5px;line-height:1.7;color:#f0d0d0;
  background:rgba(229,115,115,0.08);border:1px solid rgba(229,115,115,0.3);
  border-radius:14px;padding:14px 16px;width:100%;box-sizing:border-box;text-align:center;
}
/* 안내 슬롯 — 평소엔 내용이 비어 높이가 0이라 자리를 차지하지 않다가,
   JS가 innerHTML을 채우는 순간 위쪽에 여백(margin-top)이 붙으며 자연스럽게
   나타난다(별도의 show/hide 애니메이션 없이 그냥 존재 유무로 처리). */
#title-notice-slot:empty{ margin:0; }
#title-notice-slot:not(:empty){ margin-top:12px; }

/* ── 타이틀 화면 버튼 체계 (둥근 사각형으로 통일) ──
   1) .title-main-btn      — 페이지 첫 로드부터 항상 존재하는 단 하나의
                              메인 액션 버튼. 상태에 따라 겉모습만 바뀐다:
                              - 기본(.title-main-btn-google): 구글 로그인, 흰 배경
                              - 기본값(클래스 없음): 게임 시작/이어하기, 골드 그라데이션
   2) .title-settings-btn  — 설정/공지사항/의견보내기 등. 메인 버튼과
                              동일한 입체 그라데이션 계열, 세로는 더 얇게.
   3) .title-logout-btn    — 로그아웃. .title-settings-btn과 같은 디자인을
                              그대로 쓰되(요청사항), 설정 버튼 옆에 좁게
                              배치되고 로그인 전엔 disabled로 흐리게 표시된다. */
/* [2026-08-24 수정] 요청사항 — "게임 시작, 이어 하기와 챕터 선택,
   퍼즐 모드 버튼의 글자 크기를 현재보다 -1 해줘." 기존 16px → 15px
   (원본 값은 주석으로 보존).
   [2026-08-24 재수정] 요청사항 — "이어하기, 게임 시작(시작 하기?)
   글자를 지금보다 -2px 해줘." 15px → 13px. */
/* [2026-08-24c 수정] 요청사항 — "이어하기 시작, 챕터선택 퍼즐모드
   글꼴이 안바꼈어." 이전엔 .title-settings-btn(공지사항/의견보내기/
   설정/로그아웃)에만 고운바탕을 적용했는데, "타이틀 메뉴 버튼"에는
   메인 액션 버튼(.title-main-btn: 이어하기/시작하기)과 보조 모드
   버튼(.title-extramode-btn: 챕터 선택/퍼즐 모드)도 포함되는 것으로
   정정. 두 곳 모두 font-family만 'Gowun Batang'으로 교체(원본
   var(--font-ui) 값은 주석 보존). 구글 로그인 상태(.title-main-btn-google)
   는 원래도 별도 폰트(Noto Sans KR)를 쓰고 있어 대상에서 제외했다.
   [2026-08-24e 재수정] 요청사항 — "이어하기 게임시작 글자를 15로
   해줘." 13px → 15px. */
.title-main-btn{
  display:flex;align-items:center;justify-content:center;
  width:100%;box-sizing:border-box;
  min-height:46px;
  padding:14px;margin:0;
  background:#e0b83a;
  color:#ffffff;
  border:none;border-radius:14px;
  font-family:'Gowun Batang',serif;/* 원본:var(--font-ui) */font-size:15px;/* 원본:16px, 1차수정:15px, 2차수정:13px */font-weight:700;letter-spacing:3px;
  cursor:pointer;text-align:center;
  box-shadow:0 4px 14px rgba(0,0,0,0.3), 0 0 24px rgba(212,168,76,0.25);
  animation:title-main-pulse 3s ease-in-out infinite;
  transition:transform .12s, background .2s;
}
.title-main-btn:active{ transform:scale(0.98); }
.title-main-btn:disabled{ opacity:0.5; cursor:not-allowed; animation:none; }
@keyframes title-main-pulse{
  0%,100%{ box-shadow:0 4px 14px rgba(0,0,0,0.3), 0 0 24px rgba(212,168,76,0.25); }
  50%{ box-shadow:0 4px 14px rgba(0,0,0,0.3), 0 0 34px rgba(212,168,76,0.45); }
}
/* 구글 로그인 상태일 때만 얹는 변형 — 흰 배경, 검정 텍스트, 브랜드 톤 */
.title-main-btn-google{
  background:#fff !important;color:#3c3c3c !important;
  font-family:'Noto Sans KR',sans-serif;font-size:15px;font-weight:700;letter-spacing:normal;
  box-shadow:0 4px 16px rgba(0,0,0,0.35) !important;
  animation:none !important;
}

/* 보조 모드 버튼(어려움 모드/퍼즐 모드) — 요청사항: "게임 시작 버튼
   아래에 가운데 정렬로 조금 들여쓴 느낌으로 작은 버튼 2개... '게임
   시작' 또는 '이어 하기' 버튼과 동일한 디자인인데 배경 색을 살짝
   다르게". .title-main-btn을 그대로 상속해 패딩/폰트/그림자 구조는
   동일하게 유지하고, 배경색·크기·애니메이션만 오버라이드한다.
   "들여쓴 느낌"은 마크업 쪽(#title-extra-modes)의 좌우 padding으로
   표현하고, 여기서는 차분한 남색 계열 배경을 써서 메인 버튼과
   명확히 구분되면서도 한 단계 낮은 위계로 보이게 했다.
   [재조정] 요청사항 — "배경 색에 그라데이션을 다 빼줘. 버튼들 전부."
   단색으로 통일. */
/* [2026-08-24 수정] 요청사항 — "챕터 선택, 퍼즐 모드 버튼의 글자
   크기를 현재보다 -1 해줘." 기존 13.5px → 12.5px(원본 값 주석 보존). */
/* [2026-08-24 수정] 요청사항 — "챕터 선택, 퍼즐 모드 버튼의 글자
   크기를 현재보다 -1 해줘." 기존 13.5px → 12.5px(원본 값 주석 보존).
   [2026-08-24e 재수정] 요청사항 — "챕터선택 퍼즐모드 글자를
   13포인트로." 12.5px → 13px. */
.title-extramode-btn{
  min-height:auto !important;
  padding:12px 16px !important;
  background:#35476b !important;
  font-family:'Gowun Batang',serif !important;/* 원본:var(--font-ui) 상속 */
  font-size:13px !important;/* 원본:13.5px, 1차수정:12.5px */letter-spacing:2px !important;
  color:#dce6ff !important;
  box-shadow:0 3px 10px rgba(0,0,0,0.3) !important;
  animation:none !important;
}
/* [결제 유도] 무료 회원에게 title-restart-btn이 "구매하기"로 바뀔 때만
   붙는 클래스 — 기존 남색 계열(.title-extramode-btn)과 다르게 골드
   계열로 강조해, 눈에 띄고 클릭을 유도하는 버튼임을 시각적으로 구분한다. */
.title-extramode-btn-purchase{
  background:linear-gradient(180deg, #e0b83a, #b8862a) !important;
  color:#2a1400 !important;
  box-shadow:0 3px 12px rgba(224,184,58,0.35) !important;
}
/* 잠금 상태(요청사항 — "전체 클리어 횟수 1 이상일 때만 활성화, 그
   외에는 비활성화") — 흐리게 표시하되 클릭 자체는 막지 않는다(막으면
   안내 문구를 보여줄 수 없으므로 pointer-events는 그대로 둔다). */
.title-extramode-btn.locked{
  opacity:0.45;
}
/* 사용 가능(잠금해제) 상태 — 요청사항 "퍼즐 모드도 색을 바꿔주고".
   잠긴 상태의 어두운 배경과 뚜렷이 구분되는 밝은 톤으로만 표시한다
   (요청사항 재조정 — "테두리 흰색 없애줘. 이어하기 버튼이랑 같은
   디자인으로... 배경 색으로만 활성화/비활성화 표시" / "그라데이션을
   다 빼줘"). 단색만 쓴다. */
.title-extramode-btn:not(.locked):not(.showing-hint){
  background:#5570a3 !important;
  box-shadow:0 3px 10px rgba(0,0,0,0.3) !important;
}
/* 잠긴 상태에서 클릭했을 때 "일반 클리어 후 가능" 안내로 배경이
   바뀌는 상태(요청사항 — "클릭하면 그 칸의 배경이 바뀌면서 '일반
   클리어 후 가능' 보여줘"). */
.title-extramode-btn.showing-hint{
  background:rgba(180,60,60,0.28) !important;
  color:#f0b0b0 !important;
  box-shadow:0 3px 10px rgba(0,0,0,0.3) !important;
  opacity:1;
}

/* 요청사항 — "타이틀 게임 시작, 어려움 모드, 퍼즐 모드 버튼
   디자인처럼, 다른 버튼들이랑 설정 창도 바꿔줘. 색은 조금 다르게
   해도 좋아." 기존엔 옅은 테두리 + 거의 투명한 배경(border-radius
   14px)이라 .title-main-btn/.title-extramode-btn 계열의 입체감
   (그라데이션 배경 + box-shadow)과 결이 완전히 달랐다. 이제 같은
   체계로 통일하되, 메인/보조모드 버튼과는 톤을 다르게(더 어둡고
   차분한 골드-브라운 계열) 줘서 "그보다 한 단계 더 아래 위계"라는
   느낌을 유지한다. [재조정] 그라데이션 제거, 단색으로. */
/* [2026-08-24 수정] 요청사항 — "타이틀 메뉴 버튼 폰트만 고운바탕으로
   바꿔줘." 공지사항/의견보내기/설정 버튼(.title-settings-btn) 및
   같은 디자인을 상속하는 로그아웃 버튼(.title-logout-btn) 전용으로
   font-family만 'Gowun Batang'으로 교체(이미 웹폰트로 로드되어 있어
   추가 등록 불필요). 크기/굵기/자간 등 나머지 값은 그대로 유지하고,
   원래 --font-ui 값은 주석으로 보존한다. */
.title-settings-btn{
  display:block;width:100%;box-sizing:border-box;
  margin:10px 0 0;
  padding:11px;
  background:#4a3d26;
  border:none;border-radius:14px;
  color:#e8d9b0;
  box-shadow:0 3px 10px rgba(0,0,0,0.3);
  font-family:'Gowun Batang',serif;/* 원본:var(--font-ui) */font-size:13px;font-weight:700;letter-spacing:2px;
  cursor:pointer;text-align:center;
  transition:filter .15s, transform .12s;
}
.title-settings-btn:active{ transform:scale(0.98) translateY(1px); filter:brightness(0.9); }
/* [2026-08-24 추가] 요청사항 — "의견 보내기... 로그인 했을 때만
   가능하도록." 설정/의견보내기 버튼이 disabled 상태일 때 로그아웃
   버튼(.title-logout-btn:disabled)과 동일하게 흐리게 표시되도록
   공통 규칙을 추가(이전엔 이 클래스에 disabled 전용 스타일이 없어
   비활성화해도 시각적으로 티가 잘 안 났다). */
.title-settings-btn:disabled{
  opacity:0.35;cursor:not-allowed;
  filter:grayscale(0.4);
}
.title-settings-btn:disabled:active{ transform:none; filter:grayscale(0.4); }

/* 설정 팝업(및 그 하위 확인 팝업) 안의 큰 버튼들 — 요청사항: "타이틀
   게임 시작... 버튼 디자인처럼 다른 버튼들이랑 설정 창도 바꿔줘.
   색은 조금 다르게 해도 좋아." .title-main-btn 계열의 입체 그라데이션
   구조(대각선 135deg, inset 하이라이트, 그림자)를 그대로 가져오되
   용도별로 톤만 다르게 나눴다:
     - primary(닫기 등 기본 동작) : 골드 계열, 메인 버튼과 톤을 맞춤
     - danger(초기화 등 파괴적 동작) : 빨강 계열
     - ghost(취소 등 소극적 동작) : 테두리만 있는 저채도 버전 */
.settings-popup-btn{
  display:block;width:100%;box-sizing:border-box;
  padding:11px;border-radius:10px;border:none;
  font-family:var(--font-ui);font-weight:700;font-size:13px;letter-spacing:1px;
  cursor:pointer;text-align:center;
  transition:filter .15s, transform .12s;
}
.settings-popup-btn:active{ transform:scale(0.98) translateY(1px); filter:brightness(0.9); }
/* 비활성 상태(요청사항 — "탈퇴하기를 적어야만 확인 버튼 활성화되도록").
   흐리게 표시하고 클릭도 막는다. */
.settings-popup-btn:disabled{
  opacity:0.35;cursor:not-allowed;pointer-events:none;
}
.settings-popup-btn-primary{
  background:#e0b83a;
  color:#ffffff;
  box-shadow:0 3px 10px rgba(0,0,0,0.3);
}
.settings-popup-btn-danger{
  background:#b84a4a;
  color:#ffffff;
  box-shadow:0 3px 10px rgba(0,0,0,0.3);
  margin-bottom:8px;
}
/* [2026-08-24 수정] ghost 버튼(닫기 등, 배경 없이 테두리만)은
   요청사항대로 글자를 밝은 노랑으로. primary/danger는 배경색이 이미
   진해서 흰 글자 그대로 두는 게 가독성이 나으므로 유지(원본:#ffffff
   주석 보존). */
.settings-popup-btn-ghost{
  background:none;border:1px solid rgba(212,168,76,0.35);
  color:var(--bright-yellow);/* 원본:#ffffff */box-shadow:none;
}
.settings-popup-btn-ghost:active{ background:rgba(212,168,76,0.08); }

/* 챕터 재시작 팝업 — 일반/어려움 탭(요청사항 재조정 — "일반 어려움
   이거 버튼 모양 말고 탭처럼 해봐. 그 위에 선은 지우고. 디자인을
   노트(선 없는) 처럼해야 하나"). 박스 테두리가 있는 버튼 대신, 흔히
   보는 언더라인 탭 스타일로 바꿨다 — 평소엔 테두리 없이 글자만
   있다가, 선택된 탭에만 하단에 얇은 금색 밑줄이 나타난다. */
.chapter-restart-tab{
  padding:9px 4px;border:none;border-bottom:2px solid transparent;
  background:none;color:var(--text-mid);
  font-family:var(--font-ui);font-weight:700;font-size:13px;
  cursor:pointer;transition:color .15s,border-color .15s;
}
.chapter-restart-tab-active{
  border-bottom-color:var(--gold);color:var(--gold);
}
/* 어려움 탭의 옵션 버튼(요청사항 — "그리고 배경 색을 일반이랑
   다르게 해줘. 버튼 배경색.") — 금색(.settings-popup-btn-primary) 대신
   붉은 계열로 구분해, 지금 어느 탭의 버튼을 누르고 있는지 색으로도
   바로 알 수 있게 한다. [재조정] 그라데이션 제거, 단색으로. */
.chapter-restart-opt-normal{
  background:#b84a4a !important;
  color:#fff0f0 !important;
  box-shadow:0 3px 10px rgba(0,0,0,0.3) !important;
}

/* ══════════════════════════════════════════════════════════════
   팝업 카드 공통 디자인(요청사항 재조정 — "타이틀에서 나오는 팝업
   창들의 디자인을 좀 바꿔봐. 칙칙한 테두리 배경 말고 새롭게"). 기존
   평평한 단색 패널 + 얇은 금색 테두리 대신, 은은하게 빛이 번지는
   듯한 이중톤 배경(위는 살짝 밝고 아래로 갈수록 어두워짐)과 부드러운
   외곽 글로우로 경계를 표현한다 — 테두리 선 자체보다 "떠 있는" 느낌을
   준다. */
.pop-card{
  background:
    radial-gradient(140% 100% at 50% 0%, rgba(60,48,28,0.55) 0%, transparent 60%),
    linear-gradient(180deg, #1c1710 0%, #14100a 100%);
  border:1px solid rgba(212,168,76,0.18);
  border-radius:16px;
  box-shadow:0 20px 50px rgba(0,0,0,0.6), 0 0 40px rgba(212,168,76,0.08), inset 0 1px 0 rgba(255,255,255,0.05);
  padding:26px 22px 22px;
  box-sizing:border-box;
}
/* [폰트 통일] 요청사항 — 타이틀 화면 내 팝업들(챕터별 다시하기, 설정
   등)의 제목 글꼴을 공지사항 팝업 제목과 동일하게 통일. 예전엔
   'Cinzel'(라틴 전용 장식체)이라 한글이 시스템 폰트로 폴백되면서
   공지사항 팝업과 스타일이 어긋나 보였다.
   [재조정] 밑줄(border-bottom)을 없애고 여백만으로 제목과 본문을
   구분한다 — "칙칙한 테두리" 느낌을 주던 요소 중 하나였다.
   [2026-08-24 수정] 요청사항 — "타이틀 버튼 팝업(공지사항, 의견보내기,
   설정, 챕터 선택) 글자 전부를 L+BOLD로 바꿔줘. 글자 색도 전부 밝은
   노랑으로 바꿔줘." --font-ui가 이미 나눔스퀘어라운드 Light이므로
   font-weight:700(bold)과 함께 쓰면 "L+BOLD" 조합이 된다(파일 상단
   주석 참고). 색상은 새 변수 --bright-yellow로 통일해서 나중에 한
   곳만 고치면 전체가 같이 바뀌도록 했다. 원래 색상(--gold/--text/
   --text-mid)은 주석으로 보존. */
.pop-title{
  font-family:var(--font-ui);color:var(--bright-yellow);/* 원본:var(--gold) */
  font-size:15.5px;font-weight:700;letter-spacing:0.3px;text-align:center;
  margin-bottom:18px;
}
.pop-row-label{
  font-family:var(--font-ui);font-size:13px;color:var(--bright-yellow);/* 원본:var(--text) */font-weight:700;
}
.pop-desc{
  font-family:var(--font-ui);font-size:12.5px;line-height:1.8;color:var(--bright-yellow);/* 원본:var(--text-mid) */font-weight:700;
}
.pop-hint{
  font-family:var(--font-ui);font-size:11px;color:var(--bright-yellow);/* 원본:var(--text-mid) */font-weight:700;margin-bottom:6px;
}
.pop-input{
  width:100%;box-sizing:border-box;padding:10px;border-radius:8px;
  border:1px solid rgba(212,168,76,0.4);
  background:rgba(0,0,0,0.35);color:var(--text);
  font-family:var(--font-ui);font-size:13px;text-align:center;
}
.pop-input:focus{ outline:none;border-color:var(--gold); }
/* 팝업 우상단 닫기(X) 버튼 — 요청사항: "초기화 팝업에 닫기 버튼
   디자인도 최신 디자인으로 바꿔줘야해". exit-popup-close(기존 최신
   패턴)와 동일한 계열로, 은은하다가 눌렀을 때만 또렷해지는 방식. */
.pop-close-x{
  position:absolute;top:10px;right:10px;
  width:28px;height:28px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  border:none;background:rgba(255,255,255,0.06);
  color:var(--text-dim);font-size:15px;line-height:1;
  cursor:pointer;transition:background .15s, color .15s;
}
.pop-close-x:hover{ background:rgba(255,255,255,0.12);color:var(--text); }
.pop-close-x:active{ transform:scale(0.92); }

/* 요청사항 재조정 — "로그아웃 버튼을 설정 오른쪽에 위치시켜줘. 버튼
   디자인도 동일하게 해서." .title-settings-btn(입체 그라데이션 배경)
   을 그대로 상속받아 모양을 통일하고, 여기서는 폭(마크업에서
   flex:0 0 auto로 좁게 잡음)과 disabled 상태만 다르게 준다. 기존의
   "은은한 텍스트 버튼" 스타일은 완전히 대체됐다. */
.title-logout-btn{
  font-size:12px !important;
  letter-spacing:1px !important;
  /* 발견된 버그 — .title-settings-btn의 width:100%가 flex item에서도
     강하게 적용돼, 인라인으로 준 flex:0 0 auto와 충돌하며 로그아웃
     버튼이 부모 폭 전체를 차지해버렸다(요청사항 — "버튼 깨지네",
     실제로 로그아웃이 넓어지고 설정이 세로로 눌려 두 글자로
     쪼개졌었다). width:auto !important로 상속된 100%를 확실히
     차단한다. */
  width:auto !important;
}
.title-logout-btn:active{ opacity:0.6; }
/* 로그인 전 비활성화 상태(요청사항 — "로그인 전에도 버튼 배치해주되
   비활성화해주고"). 자리와 디자인은 그대로 유지한 채 흐리게 표시하고
   클릭을 막는다. */
.title-logout-btn:disabled{
  opacity:0.35;cursor:not-allowed;
  filter:grayscale(0.4);
}
.title-logout-btn:disabled:active{ transform:none; filter:grayscale(0.4); }
/* "설정" 버튼도 로그아웃과 동일한 방식으로 로그인 전 비활성화
   (요청사항 — "비로그인시에 설정 버튼도 비활성화(로그아웃 처럼)").
   .title-settings-btn 클래스는 공지사항/의견보내기 버튼도 함께 쓰므로
   #title-settings-btn(설정 전용 id)로 한정해 다른 버튼에는 영향이
   없게 했다. */
#title-settings-btn:disabled{
  opacity:0.35;cursor:not-allowed;
  filter:grayscale(0.4);
}
#title-settings-btn:disabled:active{ transform:none; filter:grayscale(0.4); }

/* 유료 안내/에러 화면 등에서 쓰는 텍스트형 보조 버튼(다시 시도) */
.title-text-btn{
  padding:9px 16px;width:auto;
  background:transparent;border:1px solid rgba(212,168,76,0.25);border-radius:20px;
  color:rgba(212,168,76,0.65);
  font-family:'Noto Sans KR',sans-serif;font-size:11.5px;letter-spacing:1px;
  cursor:pointer;transition:opacity .15s, border-color .15s;
}
.title-text-btn:active{ opacity:0.6; }

/* ── 이어하기 클릭 시 페이드아웃 — 시작하기(신규)는 즉시 전환되지만,
   이어하기는 저장된 장면으로 넘어가는 만큼 암전 페이드를 한 번 거쳐
   자연스럽게 이어지는 느낌을 준다. ── */
#title-view.fading-out{ animation:title-fade-out 0.5s ease forwards; }
@keyframes title-fade-out{
  from{ opacity:1; }
  to{ opacity:0; }
}

/* ── 조사수첩 탭 ── */
#pane-archive{flex-direction:column;gap:0;overflow:hidden;padding:0;}
#archive-room-tabs{
  flex:0 0 auto;display:flex;gap:0;
  border-bottom:1px solid var(--border);background:rgba(0,0,0,0.15);
}
.art-tab{
  flex:1 1 50%;padding:10px 14px;font-family:var(--font-ui);font-size:var(--font-bag);
  color:var(--text-dim);white-space:nowrap;cursor:pointer;text-align:center;
  border-bottom:2px solid transparent;transition:color 0.2s,border-color 0.2s;
}
.art-tab.on{color:var(--gold);border-bottom-color:var(--gold);}
.art-tab .art-tab-count{font-size:10px;opacity:0.7;margin-left:3px;}

/* ══════════════════════════════════════
   조사수첩 그리드 — "낡은 노트 위에 포스트잇을 붙여나간다" 컨셉.
   - 배경: 노트 종이 질감(가로 줄무늬 + 은은한 베이지)
   - 확인된 슬롯: 실제 "공간"(6곳 — c2_7_2/c2_8/c2_9/c2_10/c2_11/c2_12)
     마다 다른 색 포스트잇. 데이터 집계용 room(archive_data.js의
     ARCHIVE_ROOMS, 4개)과는 별개로, 화면 색상 구분만을 위한 매핑을
     SPACE_COLOR_MAP(JS)에서 슬롯 단위로 관리한다 — requireArchive가
     참조하는 4-room 집계 구조에는 영향 없음.
   - 같은 공간 안에서도 슬롯마다 미세하게 명도/회전각/모양을 다르게 해
     "여러 번에 걸쳐 손으로 붙인" 느낌을 준다: 일부는 살짝 구겨진 느낌
     (비대칭 그림자+미세한 skew), 일부는 옅은 격자무늬, 나머지는 민무늬.
   - 잠긴 슬롯: 포스트잇이 아니라 "아직 아무것도 안 붙은 빈 노트 칸"
     (점선 테두리 + 흐린 물음표)으로 확실히 구분한다.
   그리드는 1층 12개(6x2), 2층 10개(5x2)로 층마다 다르게 배치한다
   (JS의 calcAndApplyArchiveGridSize가 층에 따라 셀 크기/gap을 계산해
   --as-cell-w/h, --as-gap-x/y로 채워 넣음 — flex-wrap 기반이라 별도
   열/행 트랙 변수는 필요 없음).
   ══════════════════════════════════════ */
#archive-grid{
  flex:1;overflow:hidden;padding:20px 18px;
  /* CSS Grid로 단순하게: 열 개수(--as-cols, JS가 층에 따라 6 또는 5로
     설정)만큼 균등폭 칸을 만들고, 행은 2개 고정. 칸 크기는 그리드가
     알아서 컨테이너 폭/높이에 맞춰 계산하므로, JS가 clientWidth를
     재서 픽셀 단위로 직접 계산하던 예전 방식(과 그로 인한 타이밍
     버그들)이 필요 없다. 상하좌우 여백은 이 padding과 아래 gap만으로
     결정되고, 화면 크기가 달라져도 이 값 자체는 고정이라 항상 동일한
     비율로 유지된다. */
  display:grid;
  grid-template-columns:repeat(var(--as-cols,6),1fr);
  grid-template-rows:repeat(2,1fr);
  gap:0px 4px;
  justify-items:center;align-items:center;
  /* 밝은 노트 종이 질감 — 다른 열람형 퍼즐(37/45번)과 같은 톤(#efe6d0
     계열)으로 통일. */
  background:
    repeating-linear-gradient(0deg,rgba(160,130,70,0.10) 0px,rgba(160,130,70,0.10) 1px,transparent 1px,transparent 24px),
    #efe6d0;
}

/* 공간별 포스트잇 색 — 밝은 톤 하나로 통일(공간마다 다른 색이되, 같은
   공간 안에서는 색 변주 없이 동일하게). 크기/각도/위치의 변주만으로
   반복되는 느낌을 없앤다. */
.as.unlocked{ --pn-h:45; --pn-s:38%; --pn-l:64%; --pn-text:#3a3220; }
.as.unlocked.space-c2_7_2{ --pn-h:45;  --pn-s:55%; --pn-l:66%; --pn-text:#453c1c; }
.as.unlocked.space-c2_8{   --pn-h:355; --pn-s:48%; --pn-l:70%; --pn-text:#4a2620; }
.as.unlocked.space-c2_9{   --pn-h:18;  --pn-s:50%; --pn-l:62%; --pn-text:#402318; }
.as.unlocked.space-c2_10{  --pn-h:160; --pn-s:28%; --pn-l:58%; --pn-text:#1f3830; }
.as.unlocked.space-c2_11{  --pn-h:205; --pn-s:32%; --pn-l:62%; --pn-text:#1c2e40; }
.as.unlocked.space-c2_12{  --pn-h:265; --pn-s:32%; --pn-l:68%; --pn-text:#2e2540; }

.as{
  /* 그리드 칸 자체를 100% 채운다 — 칸 크기는 그리드가 알아서 계산. */
  width:100%;height:100%;
  position:relative;min-width:0;min-height:0;
  display:flex;flex-direction:column;align-items:center;justify-content:center;
  transition:transform 0.15s;
}

/* 잠긴 슬롯 — 완전 투명. 뒤에 깔린 노트 배경(줄무늬)이 그대로 비쳐
   보이도록 테두리/배경/물음표를 전부 없앴다. "아직 아무것도 안 붙은
   빈 자리"라는 걸 시각 요소 없이 그저 비어있음 자체로 표현한다. */
.as.locked{
  width:84%;aspect-ratio:0.94/1;height:auto;
  background:transparent;border:none;
  cursor:default;
}

/* 확인된 슬롯 — 포스트잇 카드. 이전에는 그리드 칸 형태(세로로 긴
   직사각형)를 그대로 따라가 정사각형과 차이가 컸는데, aspect-ratio로
   카드 자체를 정사각형에 가깝게(0.94:1, 살짝 세로가 긴 정도) 고정하고
   대신 위아래로 살짝 겹치게 배치해 포스트잇 뭉치 느낌을 낸다. */
.as.unlocked{
  cursor:pointer;
  width:94%;aspect-ratio:0.94/1;height:auto;
  padding:7px 6px 8px;
  background:hsl(var(--pn-h),var(--pn-s),var(--pn-l));
  border-radius:2px;
  box-shadow:0 2px 4px rgba(0,0,0,0.28);
  transition:transform 0.12s, box-shadow 0.12s;
  /* --as-rot/--as-scale([data-row][data-col-parity] 규칙에서 슬롯마다
     다르게 설정됨)을 항상 함께 조합한다. */
  --as-rot:0deg; --as-scale:1;
  transform:rotate(var(--as-rot)) scale(var(--as-scale));
}

/* 위/아래 줄이 살짝 겹치도록 — "위 아래 위 아래"가 한눈에 보이게,
   상단 줄은 아래쪽으로, 하단 줄은 위쪽으로 서로를 향해 여백을 당긴다.
   z-index는 기존 규칙(상단 줄이 하단 줄 위)을 그대로 유지해 겹친
   부분에서도 순서가 깔끔하다. */
.as.unlocked[data-row="0"]{ margin-bottom:-8%; }
.as.unlocked[data-row="1"]{ margin-top:-8%; }

/* 상단 줄(data-row=0) — 왼쪽부터 "좌/우/좌/우"로 기울어지는 방향을
   교차시킨다(모든 포스트잇에 예외 없이 적용). */
.as.unlocked[data-row="0"][data-col-parity="even"]{ --as-rot:-4deg; z-index:2; }
.as.unlocked[data-row="0"][data-col-parity="odd"]{  --as-rot:4deg;  z-index:2; }

/* 하단 줄(data-row=1) — 상단과 반대로 "우/좌/우/좌"로 시작. */
.as.unlocked[data-row="1"][data-col-parity="even"]{ --as-rot:3.4deg;  z-index:1; }
.as.unlocked[data-row="1"][data-col-parity="odd"]{  --as-rot:-3.4deg; z-index:1; }

/* 몇 개만 살짝 더 크게 — 6개마다 한 번씩(3번째, 5번째 자리)만 확대해서
   리듬을 준다. --as-scale만 키우고 --as-rot(기울임)은 위 값을 그대로
   이어받으므로, 확대된 슬롯도 기울임을 유지한다. */
.as.unlocked:nth-child(6n+3){ --as-scale:1.12; z-index:3; }
.as.unlocked:nth-child(6n+5){ --as-scale:1.08; z-index:3; }

.as.unlocked:hover{
  box-shadow:0 3px 6px rgba(0,0,0,0.35);
}
.as.unlocked:active{
  transform:scale(0.95) rotate(0deg);
  box-shadow:0 1px 2px rgba(0,0,0,0.25);
  z-index:4;
}
/* 포스트잇 위쪽에 붙인 "테이프" 느낌의 작은 하이라이트 바 */
.as.unlocked::before{
  content:'';position:absolute;top:-3px;left:50%;transform:translateX(-50%);
  width:32%;height:6px;background:rgba(255,255,255,0.26);
  border-radius:1px;z-index:1;
}

/* 글자 크기는 이제 JS가 픽셀 단위로 계산하지 않고, 반응형 clamp()로
   화면 폭에 비례해 자연스럽게 커지고 작아지게 한다(요청사항 — "크기가
   커지고 작아지는 반응형까지만"). */
.as-icon{font-size:clamp(14px, 3vw, 18px);line-height:1;flex-shrink:0;}
.as-nm{
  font-family:var(--font-ui);font-size:clamp(9px, 1.9vw, 11px);font-weight:600;
  color:var(--pn-text,#ffffff);text-align:center;line-height:1.3;
  word-break:keep-all;overflow-wrap:break-word;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
  position:relative;z-index:1;
}
.archive-empty-hint{
  grid-column:1/-1;font-family:var(--font-ui);font-size:var(--font-bag);
  color:var(--text-dim);text-align:center;padding:30px 8px;opacity:0.7;
}

/* ── 조사수첩 노트 팝업 (퍼즐 오버레이와 동일 레이어 패턴, 노트 질감 배경) ── */
#archive-note-overlay{
  display:none;position:fixed;inset:0;background:rgba(0,0,0,0.75);
  /* 1100: 퍼즐 접어두기 시 켜지는 #minimize-block(z-index:999)보다 반드시
     위에 있어야 한다(item_actions.js의 #item-popup/#item-puzzle-overlay와
     동일한 이유). 이전에는 310으로 낮아서, 퍼즐을 접어둔 채 가방/조사수첩을
     열어 이 팝업을 띄우면 minimize-block이 위에 깔려 닫기(X) 버튼이
     눌리지 않는 문제가 있었다. */
  z-index:1100;align-items:center;justify-content:center;padding:20px;
}
#archive-note-overlay.show{display:flex;}
#archive-note-frame{
  position:relative;width:100%;max-width:520px;max-height:82vh;
  background:
    linear-gradient(rgba(20,17,12,0.88),rgba(20,17,12,0.88)),
    repeating-linear-gradient(0deg,rgba(212,168,76,0.05) 0px,rgba(212,168,76,0.05) 1px,transparent 1px,transparent 28px),
    #efe6d0;
  background-blend-mode:normal;
  border:1px solid rgba(212,168,76,0.35);
  border-radius:2px;
  box-shadow:0 10px 40px rgba(0,0,0,0.5);
  padding:36px 28px 28px;
  overflow-y:auto;
  animation:pi 0.2s ease forwards;
}
#archive-note-close{
  position:absolute;top:10px;right:12px;
  background:none;border:none;color:var(--gold-dim);
  font-size:18px;line-height:1;cursor:pointer;padding:6px;
  transition:color 0.15s;
}
#archive-note-close:hover{color:var(--gold);}
#archive-note-title{
  font-family:'Gowun Batang',serif;font-size:calc(var(--font-archive-note) + 3px);
  font-weight:700;color:#e8dcc0;letter-spacing:0.05em;
  margin-bottom:14px;padding-bottom:10px;
  border-bottom:1px solid rgba(212,168,76,0.25);
  text-shadow:0 1px 2px rgba(0,0,0,0.4);
}
#archive-note-body{
  font-family:var(--pzc-font,'Noto Sans KR','Gowun Batang',sans-serif);
  font-size:var(--font-archive-note);
  line-height:1.9;color:#ded2b4;white-space:pre-wrap;
  text-shadow:0 1px 1px rgba(0,0,0,0.3);
}
#archive-note-body .an-line{margin-bottom:10px;}
#archive-note-body .an-line.narr{color:#e8c878;padding-left:10px;border-left:1px solid rgba(232,200,120,0.4);}
#archive-note-body .an-line.dialogue{color:#f0e8d4;}
#archive-note-body .an-line.dialogue .an-speaker{color:var(--gold);font-weight:700;}
#archive-note-body .an-line.mono{color:#c8bc9c;font-style:italic;}

.tbtn{padding:13px 16px;width:100%;border:1px solid rgba(212,168,76,0.3);background:transparent;color:var(--gold);font-family:'Gowun Batang',serif;font-size:14px;font-weight:700;cursor:pointer;text-align:center;border-radius:2px;letter-spacing:2px;transition:background 0.2s;position:relative;overflow:hidden;}
.tbtn::before{content:'';position:absolute;inset:0;background:rgba(212,168,76,0.08);transform:translateX(-101%);transition:transform 0.3s;}
.tbtn:hover::before{transform:translateX(0);}
.tbtn.s{background:var(--gold);color:#060604;border-color:var(--gold);}
.tbtn.s::before{background:#e8c87a;}


/* ══ 퍼즐 뷰 ══ */
#puzzle-view{
  display:none;
  flex:1;
  flex-direction:column;
  overflow:hidden;
  min-height:0;
  background:var(--pz-board-bg,#060604);
  position:relative;
}
#puzzle-view.show{display:flex;}
#pz-body{
  flex:1;overflow-y:auto;
  display:flex;flex-direction:column;
  align-items:center;justify-content:center;
  padding:0;min-height:0;
  width:100%;
}
#pz-body > div{width:100%;overflow:hidden;}
#pz-choices{
  flex-shrink:0;
  padding:8px 14px 14px;
  display:flex;flex-direction:row;gap:6px;
  background:var(--panel);
  border-top:1px solid var(--border);
}
#pz-cont-btn{ flex:3; }
#pz-min-btn{ flex:1; }
#pz-min-btn::before{ display:none; }
#puzzle-screen{display:none;}

/* ── 퍼즐 공통 CSS (style.css 통합) ── */
/* [배경 통일] 요청사항 — "게임 영역에 테두리랑 안쪽이 조금 다른거지?
   완전 검정도 아니고?... 완전히 하나로 통일." 바깥 배경(#puzzle-view,
   #060604)과 게임판 배경(기존 #0d0b06)이 미세하게 달라서 테두리를
   지운 뒤에도 경계가 살짝 보였다. 완전 순수 검정(#000)보다는 이
   게임 전체의 따뜻한 톤(금색 포인트)과 자연스럽게 이어지는 #060604로
   맞췄다. inset 그림자(가장자리를 오목하게 보이던 효과)도 함께
   제거해 정말 하나의 이어진 영역처럼 보이게 했다. */
.puzzle-board-bg{display:flex;flex-direction:column;align-items:center;background:var(--pz-board-bg,#060604);border-radius:6px;padding:24px 8px;margin:0 auto 12px;width:100%;box-sizing:border-box;transition:all 0.6s ease;flex:1;}
/* [효과 제거] 요청사항 — "클리어 후에 게임영역 테두리 효과가
   깨지네. 원래 테두리 선이 있었다가 그거 지우면서 그런거 같아.
   효과 지워줘". 테두리 선 자체는 이미 지워진 상태(.puzzle-board-bg
   기본 스타일에 border 없음)인데, 클리어 시에만 남아있던 이
   box-shadow 글로우 효과가 사라진 테두리와 어긋나 보였다. 이제
   클리어 시에도 별도 효과 없이 평소와 동일하게 유지한다. */
.puzzle-board-bg.solved{}
.puzzle-feedback-text{text-align:center;font-size:14px;font-weight:600;min-height:20px;letter-spacing:1px;width:100%;margin:10px 0 12px;transition:color 0.3s;}
.puzzle-feedback-text.hint{color:#c4b494;font-weight:400;}
.puzzle-feedback-text.error{color:#e57373;}
.puzzle-feedback-text.success{color:#f4d068;text-shadow:0 0 8px rgba(244,208,104,0.3);letter-spacing:2px;}
/* ══════════════════════════════════════════════════════════
   퍼즐 하단 통합 버튼 바(요청사항 재설계 — "상단 도움말/다시하기/
   힌트/SKIP과 하단 계속/접어두기를 하나의 세트로... 왼쪽부터 접기,
   도움말, 다시하기, 힌트, 스킵 5개로. 접기와 스킵은 글자 크기도 1px
   줄이고 간격도 제일 좁게(둘은 같도록), 도움말·다시하기·힌트는
   서로 동일한 크기. 클리어하면 5개 버튼 자리에 '이야기 진행' 버튼이
   꽉 차게. 버튼 디자인은 3번 이미지(닫기 버튼)처럼, 글자색은 흰색,
   배경은 살짝 어두워도 좋음"). puzzle_common.js의 mountBottomBar()가
   이 클래스들로 마크업을 생성한다. ══════════════════════════════════ */
.pzc-bottombar{
  flex-shrink:0;width:100%;box-sizing:border-box;
  padding:8px 8px 10px;
}
/* 요청사항 — "여백 알아서 줘야지... 지금 다 붙어있어서 이상하니까
   여백을 줘줘. 각각 버튼 크기를 동일하게 줄이고." 버튼 사이에
   gap을 주되, flex-basis(%)로 비율(14/14/24/24/24)만 지정하고
   flex-shrink:1을 켜두면, 브라우저가 gap이 차지하는 폭만큼 5개
   버튼 모두에서 동일한 비율로 자동으로 빼준다 — 그 결과 버튼끼리의
   상대적 크기 비율은 그대로 유지되면서, gap 만큼만 전체적으로
   조금씩 줄어들어 100%를 넘지 않는다(width: 고정폭 방식은 gap을
   더하면 100%를 초과해버리므로 flex-basis 방식으로 바꿨다).
   [버그 수정] flex-grow를 1로 뒀더니 wide/narrow가 비율과 무관하게
   "남는 공간"을 동일하게 나눠 가지면서 합계가 100%를 넘어 SKIP
   버튼이 화면 밖으로 밀려나는 문제가 있었다(스크린샷으로 확인됨).
   flex-grow:0으로 바꿔 "늘어나지 않고, 필요할 때만 basis 비율대로
   줄어드는" 방식으로 고쳤다. */
.pzc-bottombar-row{
  display:flex;align-items:stretch;width:100%;gap:5px;
}
/* 공용 버튼 베이스 — 이미지3(닫기 버튼)과 같은 계열: 둥근 필,
   테두리 없음, 그림자 없이 평평한 단색.
   [재조정] 요청사항 — "버튼 배경색을 채도가 있는 노란색으로 바꾸자.
   아까 예시로 올려준 파일 색 괜찮은거 같아." 어두운 금빛 갈색
   (#7a5a28) 대신, 설정 팝업의 주 버튼(.settings-popup-btn-primary)과
   동일한 채도 있는 노란색(#d4a84c)으로 교체 — 글자는 어두운 색으로
   바꿔야 가독성이 나오므로 함께 조정했다.
   "모서리 각도를 조금 더 둥글게" — border-radius 최댓값을 12px→16px로
   키웠다.
   [재조정] 요청사항 — "버튼 크기를 통일해줘. 도움말, 다시하기, 힌트
   글자보단 1px 작게 해준 값으로 5개 버튼 통일." 글자 크기를 여기
   기본값에서 지정하고(narrow가 쓰던 "1px 작은" 값 그대로), 아래
   wide/narrow 각각의 개별 font-size 오버라이드는 제거해 5개 버튼이
   완전히 같은 크기를 쓰도록 통일했다. */
/* [폰트 교체] 요청사항 — "버튼을 나눔스퀘어라운드로 바꿔주고, 라이트
   굵기에다가 bold 넣어줘... light에다가 볼드를 넣어달라는거야. 일단
   전부 그렇게 해봐." Light 폰트 파일(NanumSquareRoundL) 하나만 쓰고,
   font-weight:bold로 렌더링만 인위적으로 굵게 만든다 — 진짜 Bold
   폰트 파일보다 덜 각지고 부드러운 인상이라는 확인에 따른 것. */
.pzc-bar-btn{
  position:relative;overflow:hidden;outline:none;
  cursor:pointer;font-family:var(--font-pz-btn,'Noto Sans KR',sans-serif);
  font-weight:bold;letter-spacing:.02em;text-align:center;
  border-radius:clamp(10px,3cqi,16px);
  border:none;
  padding:0;height:var(--pz-btn-height);
  display:flex;align-items:center;justify-content:center;
  line-height:1;
  /* [2026-08-29 버그 수정] 발견된 문제 — "다시하기" 등 3글자 라벨이
     화면이 좁아지는 특정 구간에서 버튼 폭보다 텍스트가 길어져 두 줄로
     줄바꿈되는 현상(04_combat.js에서 확인됨, 원인은 이 파일이 아니라
     이 공통 클래스에 white-space 지정이 없었던 것). --pz-btn-font-size가
     --pz-ui-scale로 줄어들긴 하지만 버튼 자체의 flex 폭(예: r2=flex:2)이
     그보다 더 급격히 좁아지는 화면 크기 구간이 있어 줄바꿈이 발생했다.
     nowrap으로 고정하면 폭이 부족해도 항상 한 줄로 유지된다(대신 폰트가
     이미 --pz-ui-scale로 화면 크기에 맞춰 줄어들고 있으므로 잘리는
     경우는 거의 없다). mountBottomBar()를 쓰는 모든 퍼즐(스토리/퍼즐모드
     공통)에 한 번에 적용된다. */
  white-space:nowrap;
  -webkit-tap-highlight-color:transparent;user-select:none;
  transition:filter .12s, transform .08s;
  /* [색상 통일] 요청사항 — "내부 팝업에 있는 버튼 주황계열 색으로
     공통 버튼 색을 바꿔줘... 색을 만 단색(그라데이션 없이)으로
     단순화해줘." 팝업 버튼(.cpz-continue-btn 등)과 동일한 주황
     단색(#e0871f)으로 통일 — 원래 노란색(#e0b83a) 대체. */
  background:#e0871f;
  color:#ffffff;
  font-size:var(--pz-btn-font-size);
  box-sizing:border-box;
}
.pzc-bar-btn:active{ transform:scale(0.97); filter:brightness(0.9); }
.pzc-bar-btn:disabled{ opacity:0.4;cursor:not-allowed;pointer-events:none; }
/* [버그 수정 재조정] 요청사항 — "왜 자꾸 안 맞지? 지금은 접기
   79.42, skip 58.94 크기로 나오는데?" flex-shrink:1을 5개 버튼이
   공유하면, 줄어드는 양 자체가 각 버튼의 flex-basis 크기에 비례해서
   계산되기 때문에(wide는 24%만큼, narrow는 14%만큼 줄어듦) 원래
   의도한 14:14:24:24:24 비율이 깨져버렸다. flex 계산에 더 이상
   맡기지 않고, gap이 차지하는 폭(4칸×5px=20px)을 각 버튼의 비율에
   정확히 비례해서 calc()로 직접 뺀 고정폭을 계산했다:
     - narrow(14%): 20px × 0.14 = 2.8px씩 빼서 calc(14% - 2.8px)
     - wide(24%):   20px × 0.24 = 4.8px씩 빼서 calc(24% - 4.8px)
   flex-grow:0, flex-shrink:0으로 완전히 고정해, 브라우저의 flex
   재계산에 더 이상 영향받지 않고 항상 정확한 비율을 유지한다.
   [정리] 요청사항 — "skip 버튼만 다르거든? 아마 거기에서만 따로 -
   값이 붙었던거 같아. 그거 지워서 다른 글자와 동일하게 해줘." narrow
   (접기/스킵)에 별도로 걸려 있던 font-size 축소(- 1px) 규칙을
   제거했다 — 이제 5개 버튼 모두 .pzc-bar-btn의 공통 font-size를
   그대로 쓴다. */
.pzc-bar-btn-wide{ flex:0 0 calc(24% - 4.8px);min-width:0; }
.pzc-bar-btn-narrow{ flex:0 0 calc(14% - 2.8px);min-width:0; }

/* ══════════════════════════════════════════════════════════
   [배치 재구성] 요청사항 — "skip 이랑 힌트 버튼을 같은 크기로 해서
   우측에 놔줘. 순서는 도움말-다시하기-힌트-skip. 비율로는 3 3 2 2
   (간격은 알아서 떼야 함). 접기 버튼을 위 4개 버튼 아래에 놔줘.
   접기 대신 삼각형 아래로 뾰족한 색 꽉 찬 특수문자로 해줘(글자도
   1px 줄이고, 세로도 살짝 줄이고)."
   - 1줄(.pzc-bottombar-row): 도움말(3)·다시하기(3)·힌트(2)·SKIP(2).
     기존 .pzc-bar-btn 크기 그대로, 폭 비율만 r3/r2로 새로 지정.
   - 2줄(.pzc-bottombar-row-fold): 접기 자리에 ▼ 삼각형 문자 버튼
     하나만. 높이는 본문 버튼보다 살짝 작게, 글자(삼각형 크기)는
     1px 작게. 클리어("이야기 진행" 전환) 여부와 무관하게 항상
     유지된다(showContinue()가 이 행은 건드리지 않음). ══════════ */
.pzc-bar-btn-r3{ flex:3 1 0;min-width:0; }
.pzc-bar-btn-r2{ flex:2 1 0;min-width:0; }

/* 아이템/오브젝트 액션(viewOnly)으로 퍼즐을 열람 전용으로 열었을 때
   쓰는 버튼 1개("닫기")짜리 바(mountItemViewCloseBar). 위 .pzc-bar-btn
   베이스를 그대로 물려받고, 폭만 꽉 채운다(비율 분할이 필요 없음 —
   개수가 1개뿐이라 r3/r2 대신 이 클래스 하나만 쓴다). */
.pzc-bar-btn-full{ flex:1 1 0;min-width:0; }
.pzc-bottombar-viewonly{ padding-top:8px; }

.pzc-bottombar-row-fold{
  display:flex;width:100%;margin-top:5px;
}
.pzc-bar-fold-btn{
  position:relative;overflow:hidden;outline:none;
  cursor:pointer;font-family:var(--font-pz-btn,'Noto Sans KR',sans-serif);
  text-align:center;
  border-radius:clamp(10px,3cqi,16px);
  border:none;
  width:100%;
  padding:0;
  /* [축소] 요청사항 — "접어두는 화살표 버튼의 세로 길이를 조금 더
     줄여줘(작으면 글자도 줄이고)". 기존 0.8배에서 0.62배로 더 축소. */
  height:calc(var(--pz-btn-height) * 0.62);
  display:flex;align-items:center;justify-content:center;
  line-height:1;
  -webkit-tap-highlight-color:transparent;user-select:none;
  transition:filter .12s, transform .08s;
  background:#e0871f;
  color:#ffffff;
  /* 세로가 더 줄어든 만큼 삼각형 문자 크기도 비례해서 축소(기존
     -1px → -3px) */
  font-size:calc(var(--pz-btn-font-size) - 3px);
  box-sizing:border-box;
}
.pzc-bar-fold-btn:active{ transform:scale(0.97); filter:brightness(0.9); }
.pzc-bar-fold-btn:disabled{ opacity:0.4;cursor:not-allowed;pointer-events:none; }

/* [2026-09-06 신설] 요청사항 — "퍼즐모드는 접기(▼) 바가 없어서 그만큼
   게임영역이 스토리모드보다 커 보인다. 동일한 높이만큼 헤더와 같은
   배경의 풋터를 만들어줘. 스토리모드에는 없어야 해. 화면 종단까지
   꽉 차게(헤더와 동일)." mountBottomBarPuzzleMode()(퍼즐모드 전용
   하단바)에서만 생성해 붙이는 빈 바 — 스토리모드가 쓰는
   mountBottomBar()에는 이 클래스 자체가 등장하지 않으므로 자동으로
   스토리모드엔 나타나지 않는다. 높이는 .pzc-bottombar-row-fold(위
   규칙)와 정확히 같은 margin-top/height 공식을 그대로 재사용해, 두
   모드의 게임 콘텐츠 영역 높이가 완전히 일치하도록 했다. 배경은
   #header(style.css 341번 줄 부근)와 동일한 값을 그대로 복사했다.
   [2026-09-06 재수정] 요청사항 — "하단에 만든 구분선은 지워줘." 처음엔
   #header와 마찬가지로 상단 border를 넣었는데, 이 위치에서는 불필요해
   보인다는 피드백으로 border-top을 제거했다(배경만 유지). 부모
   .pzc-bottombar가 좌우 padding:8px를 갖고 있어(위 1980번 줄) 그
   안에 그대로 두면 버튼처럼 여백이 생기는데, 화면 폭 전체를 꽉 채워야
   하므로 그 padding 값을 정확히 상쇄하는 negative margin으로 좌우로
   밀어냈다 — 부모 padding이 고정 px값이라 뷰포트 크기와 무관하게
   항상 정확히 맞아떨어진다. */
.pzc-pmfooter{
  width:calc(100% + 16px);
  margin:5px -8px 0;
  height:calc(var(--pz-btn-height) * 0.62);
  background:rgba(8,8,20,0.95);
  box-sizing:border-box;
  flex-shrink:0;
}

/* 클리어 시 나타나는 "이야기 진행" 버튼(요청사항 — "5개 버튼이
   사라지고, 그 자리에 계속 버튼이 나오는거야. 꽉 차게... 이름을
   계속이 아니라 이야기 진행으로... 흰색 반짝효과나면서 활성화"). 5
   버튼 행이 차지하던 자리 전체를 그대로 대체한다. 기존 #pz-cont-btn
   (진한 블루 + 활성화 시 노란 테두리·반짝임)과 동일한 색/효과
   체계를 그대로 옮겨왔다.
   [재조정] 요청사항 — "이야기 진행도 크기는 공통 버튼과 동일해야
   해." font-size를 5개 버튼(.pzc-bar-btn)과 완전히 같은 값으로
   맞췄다(기존엔 +1px 더 컸음).
   "이야기 진행 버튼 나올 때 활성화되는 테두리를 노랑에서 흰색으로
   바꿔줘" — border와 반짝임 애니메이션의 글로우 색을 노란색(#f4d068)
   에서 흰색으로 교체했다. */
.pzc-bar-continue-btn{
  width:100%;box-sizing:border-box;
  /* [크기 원복] 요청사항 — "클리어 경우 나오는 이야기 진행 버튼을
     다시 위 4개 버튼 크기로 정해주고". 접기 줄까지 포함하던 확장
     높이를 걷어내고 공통 버튼(--pz-btn-height)과 동일한 높이로 복원. */
  height:var(--pz-btn-height);
  display:flex;align-items:center;justify-content:center;
  line-height:1;
  cursor:pointer;font-family:var(--font-pz-btn,'Noto Sans KR',sans-serif);
  font-weight:bold;font-size:var(--pz-btn-font-size);
  letter-spacing:.05em;text-align:center;
  border-radius:clamp(8px,2.4cqi,12px);
  /* [색상 원복] 요청사항 — "색상도 주황색 버튼이랑 같게해줘. 대신
     흰색 테두리와 배경 효과는 그대로 해주고". 배경을 노랑(#e0b83a)에서
     공통 버튼과 동일한 주황(#e0871f)으로 변경. 흰 테두리(1.5px)와
     반짝임(filter 밝기 애니메이션)은 그대로 유지. */
  background:#e0871f;
  border:1.5px solid #ffffff;color:#ffffff;
  box-shadow:none;
  transition:filter .12s, transform .08s;
  animation:pzc-continue-flash 1.8s ease-in-out infinite;
}
.pzc-bar-continue-btn:active{ transform:scale(0.97); filter:brightness(0.9); }
.pzc-bar-continue-btn:disabled{ opacity:0.6;cursor:not-allowed;pointer-events:none;animation:none; }
@keyframes pzc-continue-flash{
  0%,100%{filter:brightness(1);}
  50%{filter:brightness(1.18);}
}

/* [추가] 47_luminis_find.js 전용 — 필름이 정답 위치에 자동으로 도달했을
   때 "확인" 버튼(다시하기 자리를 재사용)에 거는 강조 효과. 요청사항 —
   "정답 자동판정되면 확인 버튼 테두리에 효과를 넣어줘. 그거 누르면
   클리어 정보 넘겨주고." .pzc-bar-continue-btn(이야기 진행 버튼)과
   동일한 흰 테두리+반짝임 패턴을 그대로 재사용해 시각적 언어를
   통일했다 — 색은 공통 버튼 배경(#e0871f)을 유지하고 테두리/애니메이션만
   덧씌운다. */
.lf-answer-ready{
  border:1.5px solid #ffffff !important;
  animation:pzc-continue-flash 1.8s ease-in-out infinite !important;
}

/* [추가] 47_luminis_find.js 전용 — "첫번째 원형(L이 위치하는 곳)에
   테두리 반짝 효과 넣어주고... L만은 홀로 잘 보이도록." 필름의
   구멍 중 정답 첫 글자(L)에 대응하는 구멍(holeOffsets[0])에만 얹는
   흰 테두리 링. SVG mask 안의 도형은 색이 보이지 않으므로, mask
   밖에 별도로 그린 stroke-only 원에 건다. 판 시작부터 항상(요청
   사항 — "항상 보임") 켜져 있다. */
/* [2026-08-30 수정] 필름 구조를 SVG mask → CSS mask(div) 방식으로
   전면 단순화하면서, 반짝임 링도 SVG <circle>(stroke)이 아니라 평범한
   원형 <div>(border)로 그리도록 맞췄다 — 47_luminis_find.js의
   renderFilm() 참고. */
/* [2026-08-30 되돌림] 필름 구조를 SVG <mask> 방식(구멍이 안정적으로
   잘 보이는 원본 버전)으로 복원하면서, 반짝임 링도 다시 SVG
   <circle>(stroke 기반)로 그린다 — 47_luminis_find.js의 renderFilm()
   참고. */
.lf-hole-glow{
  stroke:#ffffff;
  stroke-width:2.5;
  filter:drop-shadow(0 0 4px rgba(255,255,255,0.9));
  animation:lf-hole-glow-pulse 1.4s ease-in-out infinite;
}
@keyframes lf-hole-glow-pulse{
  0%,100%{ opacity:0.55; stroke-width:2; }
  50%{ opacity:1; stroke-width:3.5; }
}

/* [추가] 47_luminis_find.js 전용 — "필름 하단에 흰색 잘 보이도록
   정답은 L에 있다 글자를 남겨줘. 기울임효과 넣어서. 퍼즐 내부
   사용하는 글꼴 그대로 사용." 퍼즐 배경/노이즈 글자가 쓰는 것과
   동일한 Share Tech Mono 글꼴을 그대로 사용하고, 필름과 함께
   움직이도록 필름 요소(#…-film) 내부에 렌더링된다(renderFilm()
   참고) — 필름 바로 아래 중앙에 고정된 위치로 표시.
   [2026-08-27 수정] 요청사항 — "L 주변에 원 자체가 있는것도 확인이
   될까?" — 확인 결과 이 텍스트는 필름 하단 바깥쪽에 붙는 것이라
   구멍/글자 판독에는 영향 없음(별도 대응 불필요, 참고 메모). */
.lf-hint-text{
  position:absolute;
  left:50%;
  top:100%;
  transform:translate(-50%,6px);
  font-family:'Share Tech Mono',monospace;
  font-style:italic;
  font-size:13px;
  letter-spacing:0.08em;
  color:#ffffff;
  text-shadow:0 0 6px rgba(0,0,0,0.85),0 0 2px rgba(0,0,0,0.9);
  white-space:nowrap;
  pointer-events:none;
  user-select:none;
}

/* [레거시] puzzle-sub-btn — 아직 mountBottomBar()로 마이그레이션되지
   않은 개별 퍼즐 파일(도움말/다시하기/힌트/SKIP을 자체 HTML로
   그리는 기존 방식)을 위해 당분간 유지한다. 순차적으로 각 퍼즐
   파일을 옮기면서 이 블록은 점차 쓰이지 않게 될 예정이다. */
.puzzle-btn-row{display:flex;gap:6px;width:100%;}
.puzzle-sub-btn{
  position:relative;overflow:hidden;outline:none;
  cursor:pointer;font-family:var(--font-ui,'Noto Sans KR',sans-serif);
  font-weight:600;letter-spacing:.02em;
  border-radius:clamp(6px,1.8cqi,9px);
  transition:transform .08s,filter .08s;
  padding:0;height:var(--pz-btn-height);display:flex;align-items:center;justify-content:center;
  font-size:var(--pz-btn-font-size);-webkit-tap-highlight-color:transparent;user-select:none;
  background:#e0871f;
  border:none;
  color:#ffffff;
  /* [입체감 제거] 요청사항 — "그림자 전부 없애기로 했어" */
  box-shadow:none;
  text-shadow:none;
}
.puzzle-sub-btn.large{flex:1.8;}
.puzzle-sub-btn.small{flex:1;font-size:var(--pz-btn-font-size);}
.puzzle-sub-btn:hover{
  filter:brightness(1.06);
}
.puzzle-sub-btn:active{
  transform:scale(0.97);
  filter:brightness(0.9);
}
.puzzle-sub-btn:disabled{opacity:0.45;cursor:not-allowed;pointer-events:none;}

/* [제거] 요청사항 — "퍼즐 공통 버튼의 글자 중 skip 버튼만 다르거든?
   아마 거기에서만 따로 - 값이 붙었던거 같아. 그거 지워서 다른
   글자와 동일하게 해줘." 예전엔 SKIP 버튼(id가 "-skip-btn"으로
   끝나는 모든 요소)에 font-size:9.5px !important를 전역으로 강제해서
   다른 버튼(도움말/힌트/다시하기 등)보다 글자가 작게 보였다. 이제
   그런 차이 없이 다른 버튼과 동일한 크기를 그대로 상속받는다(새
   5버튼 구조·아직 마이그레이션 전인 다른 퍼즐 모두 동일하게 적용). */

/* [모듈화] 요청사항 — "퍼즐 내부에서 게임 성공 실패 다시하기 등등
   토스트 메시지로 뜨는거 그거도 공통파일에 모듈화 해줘. 글씨 크기
   색상 내용 전부 공통파일에서 수정하도록". puzzle_common.js의
   _showSuccessToast()가 이 클래스 하나로 배경/테두리/글자를 모두
   그린다(퍼즐 화면 상단 중앙, "알람을 껐다." "연결에 성공했다."
   "다시 하기" 등). 위치 이동(fade in/out)만 JS가 .show 클래스
   토글로 제어하고, 나머지 디자인은 이 블록만 고치면 모든 퍼즐에
   한번에 반영된다. */
.pzc-toast{
  /* [버그 수정] 요청사항 — "하단 다시하기 글자 나오고 사라짐". 기존
     position:absolute는 부모(mount, 보통 #puzzle-view)의 위치·스크롤
     상태에 따라 엉뚱한 곳(화면 하단 등)에 나타나는 문제가 있었다.
     position:fixed로 바꿔 항상 뷰포트(화면) 기준 상단 중앙에 뜨도록
     고정한다 — 부모 요소의 position/overflow와 완전히 무관해진다. */
  /* [버그 수정] 요청사항 — "01,02,03번 퍼즐 토스트가 위로 올라간 것
     같다 / 헤더 영역을 넘어오면 안 된다". 퍼즐 화면 진입 시 #scene-hdr
     (장면이름 바)는 숨고 #header(로고 바)만 남는데, 기존 top:72px는
     #scene-hdr까지 있던 상태를 기준으로 잡힌 값이라 실제로는 헤더에
     더 붙어 보였다. 또한 고정 72px는 노치 기기의
     env(safe-area-inset-top)을 고려하지 않아 헤더와 겹칠 수도 있었다.
     헤더 높이(padding 10px+8px+안전영역+내부 컨텐츠) 아래로 항상
     여유를 두도록 calc()로 안전영역을 명시적으로 더한다. */
  position:fixed;
  top:calc(64px + env(safe-area-inset-top));  /* 헤더 아래 + 여유(안전영역 보정) */
  left:50%;
  transform:translateX(-50%) translateY(-10px);
  background:rgba(16,12,4,0.93);
  border:1px solid rgba(180,130,40,0.5);
  border-radius:10px;
  padding:9px 22px;
  font-family:var(--pzc-font, 'Noto Sans KR', 'Gowun Batang', sans-serif);
  font-size:var(--font-b, 12px);
  font-weight:700;
  color:#e8d49a;
  letter-spacing:1.5px;
  white-space:nowrap;
  box-shadow:0 4px 20px rgba(0,0,0,0.6);
  z-index:300;
  pointer-events:none;
  opacity:0;
  transition:opacity 0.3s ease, transform 0.3s ease;
}
.pzc-toast.show{
  opacity:1;
  transform:translateX(-50%) translateY(0);
}

/* [모듈화] 요청사항 — "상단 우측에 나오는 타이머 경우는 공통파일에
   있나? 디자인 수정 한번에 되나해서". puzzle_common.js의 타이머
   기능(opts.timer)이 만드는 숫자 표시 요소의 폰트/글자크기/자간
   디자인을 이 클래스 하나로 전담한다 — 위치(top/right 등)와 위험
   구간 색상만 퍼즐별로 JS가 인라인으로 지정하고, 나머지는 이
   블록만 고치면 모든 퍼즐의 타이머 디자인이 한번에 바뀐다. */
.pzc-timer{
  font-family:'Share Tech Mono',monospace;
  font-size:var(--font-a, 14px);
  color:rgba(212,168,76,0.65);
  letter-spacing:1px;
  pointer-events:none;
  z-index:50;
  transition:color 0.3s;
}

/* [2026-08-30 신설] 퍼즐모드 전용 상단 스톱워치 — 요청사항 —
   "퍼즐모드에서 01번 불러오면 상단 중앙에 둥근사각배경으로 타이머좀
   넣어줘. 소수점 2자리까지 나오는 숫자. 시간 흐르는거." 다른 퍼즐
   에서도 그대로 재사용되는 공통 클래스(puzzle_common.js의
   _pmEnsureStopwatchEl()이 생성) — 여기 디자인만 고치면 모든 퍼즐의
   퍼즐모드 스톱워치가 한번에 바뀐다. */
/* [2026-09-06 수정] 요청사항 — "타이머를 헤더 중앙에 붙여줘." 이제
   이 배지는 #header-center-slot(flex; justify-content:center) 안에
   일반 흐름으로 들어가므로 position:absolute/top/left/transform이
   더 이상 필요 없다 — 부모의 flex 정렬이 중앙 배치를 대신 처리한다.
   구버전 index.html(그 슬롯이 없는 경우)에서는 puzzle_common.js가
   기존 방식(퍼즐 컨테이너 내부)으로 폴백해 붙이므로, 그 경로에서도
   보기 흉하지 않도록 크기/색/폰트 등 디자인 속성은 그대로 둔다. */
.pzc-pmstopwatch{
  padding:4px 14px;
  border-radius:12px;
  background:rgba(10,10,14,0.55);
  border:1px solid rgba(212,168,76,0.35);
  backdrop-filter:blur(3px);
  font-family:'Share Tech Mono',monospace;
  font-size:var(--font-a, 14px);
  font-weight:700;
  letter-spacing:1px;
  color:#f0e6c8;
  pointer-events:none;
  white-space:nowrap;
}

/* pzc-skip-wrap / pzc-skip-toast — SKIP 딜레이 타이머용 말풍선 (puzzle_common.js 동적 생성) */
.pzc-skip-wrap{position:relative;}
.pzc-skip-toast{
  position:absolute;
  left:50%;
  bottom:calc(100% + 10px);
  transform:translateX(-50%);
  background:rgba(16,12,4,0.93);
  border:1px solid rgba(180,130,40,0.5);
  border-radius:8px;
  padding:4px 10px;
  font-family:var(--pzc-font, 'Noto Sans KR', 'Gowun Batang', sans-serif);
  font-size:11px;
  font-weight:700;
  color:#e8d49a;
  letter-spacing:.5px;
  white-space:nowrap;
  box-shadow:0 3px 12px rgba(0,0,0,.55);
  pointer-events:none;
  z-index:5;
  animation:pzc-skip-toast-float 2.2s ease-in-out infinite;
}
.pzc-skip-toast::after{
  content:'';
  position:absolute;
  top:100%;
  left:50%;
  transform:translateX(-50%);
  border:5px solid transparent;
  border-top-color:rgba(180,130,40,0.5);
}
@keyframes pzc-skip-toast-float{
  0%,100%{ transform:translateX(-50%) translateY(0); }
  50%{ transform:translateX(-50%) translateY(-5px); }
}

/* ══ 팝업 공통 (cpz) ══ */
/* ══ 퍼즐 팝업 공통 (cpz) ══ */
.cpz-popup-overlay{
  visibility:hidden;
  opacity:0;
  pointer-events:none;
  position:fixed;inset:0;
  background:transparent;
  z-index:300;
  display:flex;
  align-items:center;justify-content:center;padding:20px;
  transition:opacity 0.15s ease, visibility 0.15s ease;
  will-change:opacity;
}
.cpz-popup-overlay.show{
  visibility:visible;
  opacity:1;
  pointer-events:auto;
  /* [수정] 요청사항 — "가방에서 퍼즐 열 때 카운트다운 98%(92%)
     투명도를 100%로 바꾼 것처럼, 도움말 창 뜰 때도 동일하게 해줘.
     퍼즐 시작하자마자 깜박거린다." 기존 60%(rgba(...,.6))는 40%
     투명이라, #puzzle-view/#item-puzzle-body 안에서 별도로 깔아주는
     완전 불투명 ::before 레이어가 없는 곳(또는 그 레이어가 아직 덜
     그려진 찰나)에서는 뒤가 옅게 비쳐 깜박이는 것처럼 보일 수
     있었다. 완전 불투명(100%)으로 바꿔 그 레이어 유무와 무관하게
     항상 확실히 가리도록 한다. */
  background:rgba(0,0,0,1);
}
/* puzzle-view 또는 item-puzzle-body 안에서만 게임 화면 완전 암전
   (헤더/하단 패널은 그대로) — item-puzzle-body는 아이템/오브젝트
   액션에서 여는 퍼즐(item_actions.js)의 마운트 위치, 이게 빠지면
   도움말 뒤로 게임 화면(광원/그림자 등)이 비쳐 보이는 문제가 생김 */
#puzzle-view .cpz-popup-overlay.show::before,
#item-puzzle-body .cpz-popup-overlay.show::before{
  content:'';
  position:absolute;inset:0;
  background:rgba(6,6,4,1);
  z-index:-1;
  animation:cpzMaskIn .18s ease forwards;
}
@keyframes cpzMaskIn{from{opacity:0;}to{opacity:1;}}
.cpz-popup-box{
  background:linear-gradient(160deg,#2a2418 0%,#1e1a10 100%);
  border:2px solid #8a6830;border-radius:8px;
  padding:28px 22px 20px;max-width:310px;width:100%;
  display:flex;flex-direction:column;align-items:center;gap:16px;
  box-shadow:0 0 0 1px #4a3010,0 8px 40px rgba(0,0,0,.85),inset 0 1px 0 rgba(220,180,90,.08);
  animation:cpzPopIn .18s ease;
  will-change:transform,opacity;
  transform:translateZ(0);
}
@keyframes cpzPopIn{from{opacity:0;transform:scale(.94) translateY(8px);}to{opacity:1;transform:none;}}
.cpz-popup-label{
  /* [폰트 통일] 요청사항 — "팝업창 내부 제목 글꼴도 통일시켜줘. 색상만
     그대로, 크기도 맞춰주고. 자간이나 글자 변형 없이 기본으로".
     공통 버튼(.pzc-bar-btn)과 동일한 폰트(--font-pz-btn)+굵기(bold)로
     통일. letter-spacing/text-transform(자간·글자 변형)은 제거해
     기본값으로 되돌림. 색상(#b8902e)만 기존 그대로 유지.
     [크기 조정] 요청사항 — "팝업내부 +2 한거 +1로 줄여줘". 제목·설명
     모두 공통버튼 크기(--pz-btn-font-size)에서 +1px로 통일했었다.
     [2026-08-24 재조정] 요청사항 — "글자가 더 잘 안보이는데... 팝업
     내부 글자 +1 크기 해주고." +1px → +2px(원본 +1px 주석 보존).
     [2026-08-24 폰트 교체 → 되돌림] 한때 진짜 700 파일
     (NanumSquareRoundB, --font-pz-popup-bold)로 바꿨다가, "L+bold로
     다시 돌려놓자" 요청에 따라 원래대로 --font-pz-btn
     (NanumSquareRoundL + 합성 볼드)으로 되돌린다. */
  font-family:var(--font-pz-btn,'Noto Sans KR',sans-serif);font-weight:bold;
  font-size:calc(var(--pz-btn-font-size) + 2px);/* 원본:+1px */color:#b8902e;
}
.cpz-popup-close-btn{
  /* [폰트 통일] 요청사항 — "폰트 크기 굵기 종류 색상도 전부 공통버튼과
     통일". 공통 버튼(.pzc-bar-btn)과 동일한 --font-pz-btn + font-weight
     bold로 통일(기존엔 --font-ui + 600이라 서체가 미묘하게 달랐음).
     [2026-08-24 폰트 교체 → 되돌림] 위 .cpz-popup-label과 동일 —
     L+bold로 되돌림. */
  font-family:var(--font-pz-btn,'Noto Sans KR',sans-serif);font-weight:bold;
  color:#ffffff;letter-spacing:.02em;
  /* [색상 통일] 요청사항 — "퍼즐 공통 버튼 눌러 나오는 팝업을 보면
     취소가 빨간색이고 그러던데?" 예전엔 취소 버튼만 빨간 계열
     (#a24940)로 따로 강조돼 있었는데, "계속하기" 버튼과 완전히
     동일한 스타일로 통일해달라는 요청에 맞춰 배경/그림자 색도 오렌지
     계열로 맞춘다.
     [입체감 제거] 요청사항 — "그림자 전부 없애기로 했어" */
  background:#e0871f;
  border:none;border-radius:clamp(6px,1.8cqi,9px);
  cursor:pointer;transition:transform .08s,filter .08s;width:100%;text-align:center;
  text-shadow:none;
  box-shadow:none;
  /* [원복] 요청사항 — "팝업 내부 버튼 크기는 원래대로 해줘". 88%로
     축소했던 걸 되돌려 공통 버튼과 동일한 --pz-btn-height 그대로 사용. */
  padding:0;height:var(--pz-btn-height);display:flex;align-items:center;justify-content:center;
  font-size:var(--pz-btn-font-size);
}
.cpz-popup-close-btn:hover{filter:brightness(1.06);}
.cpz-popup-close-btn:active{transform:scale(0.97);filter:brightness(0.9);}
.cpz-continue-btn{
  /* [2026-08-24 폰트 교체 → 되돌림] 위 .cpz-popup-label과 동일 —
     L+bold로 되돌림. */
  font-family:var(--font-pz-btn,'Noto Sans KR',sans-serif);font-weight:bold;letter-spacing:.02em;
  color:#ffffff;
  background:#e0871f;
  border:none;border-radius:clamp(6px,1.8cqi,9px);
  cursor:pointer;transition:transform .08s,filter .08s;width:100%;text-align:center;
  text-shadow:none;
  box-shadow:none;
  /* [통일] 요청사항 — "다시하기, 힌트, skip 눌렀을 때 나오는 팝업의
     버튼 크기와 색, 글꼴, 글자색 등을 도움말 팝업의 '계속하기' 버튼과
     동일하게". 배경/글자색은 이미 .puzzle-sub-btn과 같았지만, 높이
     (padding 기반 vs 고정 height)와 글자 크기 변수가 서로 달라
     팝업마다 버튼 크기가 미묘하게 다르게 보였다. .puzzle-sub-btn과
     동일한 높이/폰트 크기 변수를 그대로 가져와 완전히 통일한다.
     [입체감 제거] 요청사항 — "그림자 전부 없애기로 했어"
     [원복] 요청사항 — "팝업 내부 버튼 크기는 원래대로 해줘". */
  padding:0;height:var(--pz-btn-height);display:flex;align-items:center;justify-content:center;
  font-size:var(--pz-btn-font-size);
}
.cpz-continue-btn:hover{filter:brightness(1.06);}
.cpz-continue-btn:active{transform:scale(0.97);filter:brightness(0.9);}
.cpz-help-body{display:flex;flex-direction:column;gap:12px;width:100%;}
.cpz-help-section{
  /* [2026-08-24 수정 → 되돌림] 요청사항 — "글자 뒤 배경도 검정으로
     바꿔줘." 완전 불투명 검정(#000000)으로 바꿨었으나, 이후 "다시
     원래대로 바꿔줘" 요청에 따라 원본 rgba(0,0,0,.25)(연한 반투명
     검정)로 되돌린다. 참고로 팝업 폰트를 진짜 700 파일
     (NanumSquareRoundB, --font-pz-popup-bold)로 교체한 상태라, 대비
     문제는 검정 배경이 아니라 그쪽에서 개선된 상태다. */
  background:rgba(0,0,0,.25);border:1px solid rgba(200,160,60,.18);
  border-radius:5px;padding:13px 15px;display:flex;flex-direction:column;gap:8px;
}
/* CONTROLS 섹션(두 번째 section) 숨김 */
.cpz-help-body .cpz-help-section:nth-child(2){ display:none; }
.cpz-help-section-title{
  display:none;
}
.cpz-help-rule{
  /* [폰트/크기/굵기 통일] 요청사항 — "설명도 통일해야해" → "제목 설명
     같도록 +2로 해줘". 제목(.cpz-popup-label)과 완전히 동일하게
     공통버튼 폰트(--font-pz-btn)+굵기(bold)+크기(--pz-btn-font-size
     + 2px)로 통일했었다.
     [2026-08-24 재조정 → 되돌림] 요청사항 — "내용이 너무 굵어서 얇게
     해줘." 당시엔 --font-pz-btn(NanumSquareRoundL)이 Bold 전용
     파일이 없어 font-weight:bold가 가짜 볼드(합성 볼드)로 렌더링돼
     실제보다 두껍게 보였고, 그래서 font-weight를 normal로 낮췄었다.
     [2026-08-24 폰트 교체 → 재차 되돌림] 한때 진짜 700 파일
     (NanumSquareRoundB)로 바꿨다가 "L+bold로 다시 돌려놓자" 요청에
     따라 --font-pz-btn(NanumSquareRoundL) + font-weight:bold(합성
     볼드) 조합으로 최종 복원한다.
     [2026-08-24 재조정] 요청사항 — "글자가 더 잘 안보이는데... 팝업
     내부 글자 +1 크기 해주고." +1px → +2px(원본 +1px 주석 보존).
     [2026-08-24 재조정] 요청사항 — "03번 퍼즐(destination_puzzle) 힌트
     팝업 글자가 다른 퍼즐(13px)보다 크게(15px) 나온다" — 이 클래스가
     .cpz-help-desc와 같은 "설명" 취급을 못 받고 +2px 그대로 남아있던
     것이 원인이었다. .cpz-help-desc와 동일하게 +2px → +1px로 맞춘다. */
  font-family:var(--font-pz-btn,'Noto Sans KR',sans-serif);font-weight:bold;
  font-size:calc(var(--pz-btn-font-size) + 1px);color:#ffffff;
  line-height:2.2;text-align:center;letter-spacing:2px;
}
.cpz-help-rule .on{color:#d4a83c;}
.cpz-help-rule .off{color:#6a5630;}
.cpz-help-desc{
  /* [폰트/크기/굵기 통일] 요청사항 — "설명도 통일해야해" → "제목 설명
     같도록 +2로 해줘". 제목(.cpz-popup-label)과 완전히 동일하게
     공통버튼 폰트(--font-pz-btn)+굵기(bold)+크기(--pz-btn-font-size
     + 2px)로 통일했었다.
     [2026-08-24 재조정 → 되돌림 → 재차 되돌림] 위 .cpz-help-rule과
     동일한 흐름(normal → 진짜 Bold+bold → "L+bold로 다시" 요청에
     따라 최종적으로 --font-pz-btn + font-weight:bold(합성 볼드)로
     복원).
     [2026-08-24 재조정] 요청사항 — "팝업 내부 글자 +1 크기 해주고."
     +1px → +2px(원본 +1px 주석 보존).
     [2026-08-24 재조정] 요청사항 — "설명 부분의 글자 크기를 1 줄여줘."
     +2px → +1px로 되돌림. */
  font-family:var(--font-pz-btn,'Noto Sans KR',sans-serif);font-weight:bold;
  font-size:calc(var(--pz-btn-font-size) + 1px);
  color:#ffffff;line-height:1.9;text-align:center;letter-spacing:.3px;
}

/* ══ 카운트다운 ══ */
@keyframes cpzCountPop{
  0%  {opacity:0;transform:scale(1.5);}
  20% {opacity:1;transform:scale(1.0);}
  70% {opacity:1;transform:scale(1.0);}
  100%{opacity:0;transform:scale(.7);}
}
.cpz-countdown-ov{
  display:none;position:fixed;inset:0;z-index:200;
  align-items:center;justify-content:center;
  /* [수정] 요청사항 — "가방에서 06번 열 때, 카운트다운 도중 하단
     닫기 버튼이 흐릿하게 비쳐 보인다. 배경 검정에 투명도를 빼줘."
     기존 92%(rgba(...,.92))는 8% 투명이라, 이 오버레이 뒤에 있는
     요소가 옅게 비쳐 보일 수 있었다(가방 경로 전용 틀에서만
     증상이 보였음 — 정식 진행 경로는 겹치는 층 구조가 달라 92%로도
     티가 안 났던 것으로 보임). 완전 불투명(100%)으로 바꿔 어느
     경로에서 열리든, 뒤에 무엇이 있든 확실히 안 비치게 한다. */
  background:rgba(5,5,12,1);
  will-change:opacity;
  transform:translateZ(0);
  /* [버그 수정] 요청사항 — "카운트다운 뜰때 게임영역이 이미 진행
     중인가? 클릭하니까 카운트다운 숫자가 깜박거리는데?" 원인: 이
     오버레이가 화면을 시각적으로는 덮지만 pointer-events를 지정하지
     않아(기본값 auto라 사실 막고는 있었으나) puzzle_common.js의
     runCountdown()이 이 오버레이와 별개로 만드는 임시 오버레이가
     pointer-events:none이라, 두 오버레이의 z-index 관계와 클릭 통과
     여부가 퍼즐마다 다르게 겹칠 수 있었다. 여기서 명시적으로
     pointer-events:auto를 지정해, 카운트다운이 떠 있는 동안(.show)은
     뒤쪽 게임 영역의 클릭/터치가 절대 전달되지 않도록 확실히 막는다. */
  pointer-events:auto;
}
.cpz-countdown-ov.show{display:flex;}
.cpz-countdown-num{
  font-family:'Impact','Anton',sans-serif;font-weight:900;font-size:96px;
  color:#c49030;
  text-shadow:
    0 0 14px rgba(180,130,40,.55),0 0 36px rgba(160,110,20,.25),
    0 4px 0 rgba(60,30,0,.85),0 6px 12px rgba(0,0,0,.65);
  animation:cpzCountPop 1s ease forwards;line-height:1;letter-spacing:2px;
  will-change:transform,opacity;
  transform:translateZ(0);
}
/* 퍼즐 내 패딩 래퍼 */
#pz-body > div{padding:8px 8px;display:flex;flex-direction:column;flex:1;}

/* 토스트 */
#toast{position:fixed;top:50%;left:50%;transform:translate(-50%,-50%) translateY(-4px);background:rgba(8,8,20,0.95);border:1px solid rgba(212,168,76,0.25);padding:7px 16px;border-radius:2px;font-family:'Share Tech Mono',monospace;font-size:10px;letter-spacing:0.14em;color:var(--gold);opacity:0;transition:opacity 0.22s,transform 0.22s;pointer-events:none;z-index:500;white-space:nowrap;}
#toast.show{opacity:1;transform:translate(-50%,-50%) translateY(0);}

@keyframes fadeUp{from{opacity:0;transform:translateY(10px);}to{opacity:1;transform:translateY(0);}}

/* 모바일 미디어쿼리 */
@keyframes fadeIn{from{opacity:0;}to{opacity:1;}}

/* 모바일 폰트 축소 */
@media(max-width:480px){
  :root{
    --font-tab-label: 10px;
    --font-tab-icon: 22px; /* 아이콘은 패딩 확대와 함께 더 크게 (라벨은 축소 유지) */
    --font-obj-label: 9px;
    --font-log-body: 12px;
    --font-archive-note: 14px;
  }
  /* 모바일: 헤더/탭바 세로 크기 키우기 */
  #header{padding:16px 16px 14px;padding-top:calc(16px + env(safe-area-inset-top));}
  .tb{padding:22px 0 20px !important;}
  /* 조사수첩 팝업 — 좁은 화면에서 프레임 여백/제목 여백도 함께 축소 */
  #archive-note-frame{padding:24px 18px 18px;}
  #archive-note-title{margin-bottom:10px;padding-bottom:8px;}
  #archive-note-close{font-size:16px;padding:5px;}
}

/* ── 낮은 화면 높이 대응 (노트북 125% 확대, 가로형 등) ──
   노트북에서 브라우저 확대율 125% 적용 시 실제 레이아웃 높이가
   600px 이하로 줄어드는 경우를 px 기반 max-height 미디어쿼리로 처리.
   dvh는 OS/브라우저 확대율에 따라 기대와 다르게 계산될 수 있어 사용하지 않음. */

@media(max-height:700px){
  /* msg-body 패딩 축소 */
  #msg-body{padding:16px 24px 60px !important;}
  /* 선택지 버튼 — 높이+글자 축소 */
  .cb,.cb.pri,.sb{height:33px !important;min-height:33px !important;}
  /* 탭바 축소 */
  .tb{padding:10px 0 9px !important;}
  :root{ --font-tab-icon: 16px; --font-archive-note: 14px; }
  /* scene-hdr 패딩 */
  #scene-hdr{padding:7px 14px !important;}
  /* 조사수첩 팝업 — 낮은 화면에서 프레임 여백도 함께 축소해 내용이 잘리지 않게 */
  #archive-note-frame{padding:20px 18px 16px !important;max-height:88vh;}
  #archive-note-title{margin-bottom:8px !important;padding-bottom:6px !important;}
}

@media(max-height:580px){
  #msg-body{padding:12px 20px 52px !important;}
  .cb,.cb.pri,.sb{height:29px !important;min-height:29px !important;}
  .tb{padding:8px 0 7px !important;}
  :root{ --font-tab-icon: 14px; --font-tab-label: 9px; --font-sbb: 12px; --font-archive-note: 13px; }
  #scene-hdr{padding:5px 14px !important;}
  /* 조사수첩 팝업 — 더 낮은 화면에서 한 번 더 축소 */
  #archive-note-frame{padding:16px 14px 14px !important;max-height:92vh;}
  #archive-note-title{margin-bottom:6px !important;padding-bottom:5px !important;}
  #archive-note-close{font-size:15px !important;padding:4px !important;}
}

@media(max-height:460px){
  #msg-body{padding:8px 16px 46px !important;}
  .cb,.cb.pri,.sb{height:26px !important;min-height:26px !important;}
  .tb{padding:6px 0 !important;}
  :root{ --font-tab-label: 9px; --font-tab-icon: 13px; --font-sbb: 11px; }
}

/* 종료 확인 팝업 — 오버레이(배경 딤/블러)만 여기서 담당하고, 내부
   박스/텍스트/버튼 디자인은 공용 클래스(.pop-card/.pop-title/
   .pop-desc/.settings-popup-btn, style.css 상단 참고)로 통일했다
   (요청사항 — "디자인 통일"). */
#exit-popup{
  display:none;position:absolute;inset:0;
  background:rgba(0,0,0,0.7);backdrop-filter:blur(4px);
  /* [수정] 요청사항 — "퍼즐 접어두기를 누르면... 상단좌측 로고
     눌렀을 때 뜨는 팝업까지도 막아버리네." #minimize-block(퍼즐
     접어두기 시 scene-view 클릭 차단용, z-index:999)이 이 팝업
     (기존 z-index:500)보다 높아서 팝업이 화면엔 보여도 클릭이
     막혔다. #minimize-block을 건드리지 않고, 이 팝업 쪽을 그보다
     높게 올려 항상 위에서 클릭 가능하게 한다. */
  justify-content:center;align-items:center;z-index:1000;
  padding:20px;box-sizing:border-box;
}
#exit-popup.show{display:flex;}
#exit-popup-box{
  width:100%;max-width:300px;text-align:center;
}
.fade-out{animation:fo 0.25s ease forwards;}
@keyframes fo{to{opacity:0;}}

/* 엔딩 씬 헤더 — 배드 엔딩 강조 */
#scene-hdr.ending .hdr-badge {
  border-color: #8b1a1a;
  background: rgba(139, 26, 26, 0.2);
  color: #9b2d6e;
}
#scene-hdr.ending .hdr-title {
  color: #9b2d6e;
}

/* 인터루드 (챕터 전환) */
#interlude-ov{
  display:none;
  position:fixed;inset:0;z-index:500;
  background:#000;
  flex-direction:column;align-items:center;justify-content:center;
  text-align:center;padding:40px;gap:16px;
  will-change:opacity;
  transform:translateZ(0);
}
#interlude-ov.show{display:flex;}
#interlude-ov.fade-in{animation:ilvFadeIn 1.2s ease forwards;}
#interlude-ov.fade-out{animation:ilvFadeOut 0.8s ease forwards;}

/* 인터루드 전용 전체화면 오버레이 (카운트다운과 동일한 구조) */
#ilv-ov{
  display:none;
  position:fixed;inset:0;
  z-index:600;
  background:rgba(5,5,12,1);
  flex-direction:column;
  align-items:center;justify-content:center;
  text-align:center;
  padding:40px;
  gap:20px;
  will-change:opacity;
  transform:translateZ(0);
}
#ilv-ov.show{display:flex;}
#ilv-msg{
  display:flex;flex-direction:column;
  align-items:center;gap:6px;
  width:100%;padding:0 32px;box-sizing:border-box;
  will-change:opacity;
  transform:translateZ(0);
}
/* ilv-msg 안의 mp — 기본 .mp 스타일 그대로 사용, 인터루드용 최소 재정의만 */
#ilv-msg .mp{
  text-align:center !important;
  text-indent:0 !important;
  padding:0 !important;
  border:none !important;
}
#ilv-msg .mp.narrc{
  text-align:center !important;
  text-indent:0 !important;
  padding:0 !important;
}
#ilv-msg .mp.narr{
  text-align:center !important;
  text-indent:0 !important;
  padding:0 !important;
  border:none !important;
}
#ilv-msg .mp.scene{
  text-align:center !important;
  text-indent:0 !important;
  padding:0 !important;
}
#ilv-tap{
  display:none;
  position:fixed;
  top:70%;left:50%;
  transform:translateX(-50%);
  z-index:9999;
  pointer-events:none;
  white-space:nowrap;
}
#ilv-tap.visible{display:block;}

@keyframes ilvFadeIn{from{opacity:0;}to{opacity:1;}}
@keyframes ilvFadeOut{from{opacity:1;}to{opacity:0;}}
.ilv-line{
  font-family:'Gowun Batang',serif;
  font-size:clamp(16px, 4vw, 26px);
  color:#ffffff;
  letter-spacing:3px;
  line-height:1.7;
  opacity:0;animation:ilvLineFade 0.8s ease forwards;
}
.ilv-line.gold{color:var(--gold);font-size:clamp(14px,3.2vw,20px);letter-spacing:4px;}
.ilv-line.small{color:rgba(255,255,255,0.65);font-size:clamp(13px,2.8vw,17px);}
@keyframes ilvLineFade{from{opacity:0;transform:translateY(8px);}to{opacity:1;transform:translateY(0);}}

/* ── 설정 팝업 토글 스위치 */
.settings-toggle{
  width:48px;height:26px;
  background:rgba(255,255,255,0.1);
  border:1px solid rgba(255,255,255,0.15);
  border-radius:13px;
  position:relative;cursor:pointer;
  transition:background .22s,border-color .22s;
  flex-shrink:0;
}
.settings-toggle.on{
  background:#3a68bc;
  border-color:rgba(100,160,255,0.5);
}
.settings-toggle-knob{
  position:absolute;top:2px;left:2px;
  width:20px;height:20px;
  background:#fff;border-radius:50%;
  box-shadow:0 1px 4px rgba(0,0,0,0.4);
  transition:transform .22s;
}
.settings-toggle.on .settings-toggle-knob{transform:translateX(22px);}
@media(max-height:800px){
  .cb,.cb.pri,.sb{height:33px !important;min-height:33px !important;}
}

@media(max-width:480px){
  .cb,.cb.pri{height:clamp(32px,9vw,40px) !important;min-height:clamp(32px,9vw,40px) !important;}
  .sb{height:clamp(32px,9vw,40px) !important;}
  :root{
    --font-tab-label: clamp(9px,2.5vw,11px);
    --font-tab-icon: clamp(18px,5vw,24px);
  }
  #header{padding:16px 16px 14px;padding-top:calc(16px + env(safe-area-inset-top));}
  .tb{padding:clamp(16px,5vw,22px) 0 clamp(14px,4.5vw,20px) !important;}
}

/* ── 퍼즐 글자 크기: puzzle_common.js의 --pzc-content-font-size 시스템으로 통합됨 ── */
/* (이전의 --pz-text-size 강제 셀렉터 블록은 더 이상 필요하지 않아 제거됨.
   각 퍼즐 CSS가 var(--pzc-content-font-size) / var(--pzc-font-size)를 직접 사용한다.) */

/* ── settings 숫자 버튼 공통 ── */
.settings-num-btn {
  flex:1; height:32px; border-radius:4px;
  font-family:'Share Tech Mono',monospace; font-size:12px; font-weight:700;
  cursor:pointer; transition:background .15s,border-color .15s,color .15s;
  background:rgba(212,168,76,0.05);
  border:1px solid rgba(212,168,76,0.2);
  color:rgba(212,168,76,0.5);
}
.settings-num-btn.active {
  background:rgba(212,168,76,0.22);
  border-color:rgba(212,168,76,0.7);
  color:var(--gold);
}
/* 요청사항 — "글자 크기 1 2 3 4 5 버튼을 작게해서 퍼즐 텍스트 크기
   글자 우측에 넣어줘." 기존 .settings-num-btn(flex:1, height:32px)은
   한 줄 전체 폭을 5등분하는 큰 버튼이었는데, 이제 라벨과 같은 줄
   오른쪽에 좁게 들어가야 하므로 고정된 작은 크기로 별도 클래스를
   뒀다. */
.settings-num-btn-sm {
  flex:none; width:22px; height:22px;
  font-size:10px;
  border-radius:3px;
}

/* ── 스토리 텍스트 크기 CSS 변수 적용 ── */
:root { --story-text-size: 17px; }
.mp       { font-size: var(--story-text-size) !important; }
.mp.narr  { font-size: var(--story-text-size) !important; }
.mp.narrc { font-size: var(--story-text-size) !important; }
.mp.mono  { font-size: var(--story-text-size) !important; }

/* ══════════════════════════════════════════════════════════════
   게임 화면 온보딩 가이드 (요청사항) — p1 씬에 처음(또는 아직
   game_screen_guide_seen이 아닌 상태로) 도달했을 때, 화면 렌더링이
   끝난 뒤 그 위에 단계별로 상단 챕터/장면명 · 저장 표시 · 상단
   이미지/오브젝트 영역 · 하단 스토리 영역 · 탭바를 순서대로 짚어
   주고, 마지막으로 화면 중앙에 "루미니스 시작" 확인 화면을 보여준다.
   게이지 퍼즐(44_afterimage.js 등)의 온보딩 가이드와 완전히
   같은 톤(스포트라이트 + 카드 + 다음 버튼)으로 맞췄다.
   화면 전체를 대상으로 하므로 컨테이너에 종속되지 않는 position:fixed
   레이어로 만든다(게이지 퍼즐은 퍼즐 컨테이너 내부용이라 absolute였지만,
   이번엔 body 전체가 대상이라 fixed가 더 안전하다 — 별도 relative
   부모가 필요 없다).
   ══════════════════════════════════════════════════════════════ */
#game-guide-ov{
  position:fixed;inset:0;z-index:900;display:none;
  /* [버그 수정] pointer-events:none이면 오버레이 자체는 클릭을
     가로채지 않고 그대로 통과시켜서, 스포트라이트 대상이 아닌 뒷배경
     요소(탭바, 씬 선택지 등)를 가이드가 떠 있는 동안에도 그대로 누를
     수 있었다(요청사항으로 확인된 버그 — "가이드 확인 버튼 외에는
     못 누르게 막아줘야 하는데 그게 안 됨"). auto로 바꿔 오버레이
     자체가 배경 클릭을 막고, 카드(다음 버튼)만 그 안에서
     pointer-events:auto로 다시 열어 누를 수 있게 한다.
     스포트라이트 대상 요소는 처음부터 실제 요소가 아니라 시각 효과일
     뿐이라(box-shadow로 그린 사각형) 그 위를 눌러도 오버레이가
     이미 클릭을 가로챈다 — 즉 가이드가 떠 있는 동안은 카드의 [다음]
     버튼 외에는 아무 것도 눌리지 않는다. */
  pointer-events:auto;
}
#game-guide-ov.show{ display:block; }
#game-guide-spot{
  position:absolute;border-radius:10px;
  box-shadow:0 0 0 2000px rgba(4,4,8,0.6), 0 0 0 2px rgba(244,208,104,0.95), 0 0 20px rgba(244,208,104,0.75);
  transition:left .25s ease, top .25s ease, width .25s ease, height .25s ease;
  pointer-events:none;
}
#game-guide-card{
  position:absolute;width:min(280px, calc(100vw - 32px));
  background:rgba(18,14,8,0.97);border:1px solid rgba(244,208,104,0.5);
  border-radius:12px;padding:14px 16px;
  box-shadow:0 8px 24px rgba(0,0,0,0.5);
  transition:left .25s ease, top .25s ease, width .25s ease;
  pointer-events:auto;
}
#game-guide-text{
  font-family:var(--font-ui);
  font-size:13px;line-height:1.6;
  color:rgba(245,240,225,0.95);
}
#game-guide-step{
  font-family:'Share Tech Mono',monospace;
  font-size:11px;
  color:rgba(244,208,104,0.85);letter-spacing:0.05em;margin-bottom:6px;
}
#game-guide-foot{
  display:flex;align-items:center;justify-content:flex-end;gap:10px;
  margin-top:12px;
}
#game-guide-next{
  padding:7px 16px;border-radius:8px;border:none;cursor:pointer;
  font-family:var(--font-ui);font-weight:700;
  font-size:12px;color:#2a1c08;
  background:linear-gradient(180deg,#f4d068 0%,#c99a3a 100%);
  box-shadow:0 2px 0 #8a6e1f;
  flex-shrink:0;white-space:nowrap;
}
#game-guide-next:active{ transform:translateY(1px); }

/* ══════════════════════════════════════════════════════════════
   01번(clock) 퍼즐 온보딩 가이드 (요청사항 — "01번 퍼즐이 첫번째
   퍼즐이라서 가이드를 만들어야겠어"). 위 게임 화면 가이드
   (#game-guide-*)와 완전히 동일한 톤·구조라 CSS도 그대로 복제하고
   id만 clock-guide-*로 분리했다. 01번 퍼즐 컨테이너 위에 뜨므로
   게임 화면 가이드와 마찬가지로 position:fixed(화면 전체 기준)로
   만든다 — 퍼즐 컨테이너의 position/overflow와 무관하게 항상 화면
   기준으로 스포트라이트/카드 좌표를 잡을 수 있다.
   ══════════════════════════════════════════════════════════════ */
#clock-guide-ov{
  position:fixed;inset:0;z-index:900;display:none;
  pointer-events:auto; /* 게임 화면 가이드와 동일 — [다음] 버튼 외 배경 클릭 차단 */
}
#clock-guide-ov.show{ display:block; }
#clock-guide-spot{
  position:absolute;border-radius:10px;
  box-shadow:0 0 0 2000px rgba(4,4,8,0.6), 0 0 0 2px rgba(244,208,104,0.95), 0 0 20px rgba(244,208,104,0.75);
  transition:left .25s ease, top .25s ease, width .25s ease, height .25s ease;
  pointer-events:none;
}
#clock-guide-card{
  position:absolute;width:min(280px, calc(100vw - 32px));
  background:rgba(18,14,8,0.97);border:1px solid rgba(244,208,104,0.5);
  border-radius:12px;padding:14px 16px;
  box-shadow:0 8px 24px rgba(0,0,0,0.5);
  transition:left .25s ease, top .25s ease, width .25s ease;
  pointer-events:auto;
}
#clock-guide-text{
  font-family:var(--font-ui);
  font-size:13px;line-height:1.6;
  color:rgba(245,240,225,0.95);
}
#clock-guide-step{
  font-family:'Share Tech Mono',monospace;
  font-size:11px;
  color:rgba(244,208,104,0.85);letter-spacing:0.05em;margin-bottom:6px;
}
#clock-guide-foot{
  display:flex;align-items:center;justify-content:flex-end;gap:10px;
  margin-top:12px;
}
#clock-guide-next{
  padding:7px 16px;border-radius:8px;border:none;cursor:pointer;
  font-family:var(--font-ui);font-weight:700;
  font-size:12px;color:#2a1c08;
  background:linear-gradient(180deg,#f4d068 0%,#c99a3a 100%);
  box-shadow:0 2px 0 #8a6e1f;
  flex-shrink:0;white-space:nowrap;
}
#clock-guide-next:active{ transform:translateY(1px); }
