/* ── themes/book.css ── */
/* ============================================================
   테마: 성경책 (id=book) — 달력을 펼친 성경책 안에 그린다.

   ⭐ **이 파일의 모든 규칙은 `html[data-theme="book"]` 아래에 있어야 한다.**
      스코프를 벗어나면 다른 테마를 오염시킨다. 테마는 서로를 몰라야 한다.
   ⭐ 수치는 화면 크기 대비 비율(clamp/vw/%)로 잡는다 — 특정 기기 px 고정 금지.
   ⚠️ 이 파일은 calendar.css 를 **덮어쓰는 층**이다. 원본은 건드리지 않는다.
      테마를 '기본'으로 바꾸면 이 파일의 규칙이 통째로 꺼진다.
   ============================================================ */

html[data-theme="book"] {
  --paper:      #f3e9d6;
  --paper-back: #e9dcc2;
  --ink:        #2e2620;
  /* ⚠️ --ink-soft 는 원래 #8a7659 였다 — 종이(#f3e9d6) 대비 3.5:1 로 본문에 못 쓴다(WCAG AA 4.5:1).
     요일·보조 글자가 전부 이 값이라 "예쁜데 안 읽힌다"의 주범이었다(2026-08-21 검수).
     #6b573c = 5.7:1. 분위기(세피아)는 그대로 두고 명도만 내렸다. */
  --ink-soft:   #6b573c;
  /* 표 머리(요일)처럼 작고 굵은 글자용 — 7.0:1 */
  --ink-head:   #5c4a2e;
  --leather:    #4a2f1e;
  --leather2:   #33200f;
  --gilt:       #b08a3c;
  --ribbon:     #8e2b2b;
  --rule:       rgba(120, 90, 45, 0.16);
  --rule-strong:rgba(120, 90, 45, 0.34);
  --mark:       rgba(176, 138, 60, 0.5);
  /* 설정 카드 버튼 — 캘린더 이동 버튼과 같은 반투명 종이·옅은 금갈색 테두리 */
  --dock-option-bg: rgba(255, 253, 246, 0.62);
  --dock-option-border: rgba(150, 118, 62, 0.28);
  --dock-option-hover: rgba(232, 214, 176, 0.90);
  /* 실제 색인 성경의 구약(남색)·신약(적색) 탭. 중간색은 크림 글자와 4.5:1 이상이다. */
  --book-index-old: #24364f;
  --book-index-old-edge: #17263b;
  --book-index-new: #7a2e36;
  --book-index-new-edge: #4f1f25;

  /* ── 활자 ────────────────────────────────────────────────
     ⚠️ 예전엔 시스템 글꼴에만 기댔다(`"Nanum Myeongjo", "Batang", …`).
        **리눅스에는 그 셋이 다 없어서** 밋밋한 기본 serif 로 떨어졌다.
        이제 themes.py 가 웹폰트를 실어 준다(EB Garamond · 나눔명조 · 송명조).
     ⭐ 라틴·숫자를 **앞에** 둔다 — 한글은 EB Garamond 에 없으므로 자동으로
        나눔명조가 받는다. 달력은 숫자가 주인공이라 이 순서가 중요하다.
     ⚠️ 이름을 바꾸면 themes.py 의 폰트 주소도 같이 고칠 것. 한쪽만 바꾸면
        조용히 시스템 글꼴로 떨어진다(오류도 경고도 안 난다). */
  --serif:         "EB Garamond", "Nanum Myeongjo", "Batang", "AppleMyungjo", serif;
  /* 제목용 — 송명조는 붓에서 온 획이라 본문보다 훨씬 고서에 가깝다. 굵기가 400 한 벌뿐이라
     bold 를 주면 브라우저가 가짜 굵기를 만든다(획이 뭉갠다) → 쓰는 곳마다 400 으로 못 박는다. */
  --serif-display: "EB Garamond", "Song Myung", "Nanum Myeongjo", "Batang", serif;
}

/* ── 책상 ─────────────────────────────────────────────── */
html[data-theme="book"] body {
  background:
    radial-gradient(120% 90% at 50% 0%, #4a3a2c 0%, transparent 60%),
    linear-gradient(160deg, #2e2118 0%, #1c1410 100%) !important;
  color: var(--ink);
  font-family: var(--serif);
}

/* ── 책 (가죽 표지 + 속지) ────────────────────────────── */
/* ⭐ 책이 화면에 안 차던 진짜 원인 — `.container` 의 max-width 가 아니라 **main 이 안 늘어난 것**.
   calendar.css 의 `body { display: flex; justify-content: center }` 때문에 `main#main-content` 가
   flex 아이템이 되어 **내용 폭까지만** 자란다. max-width 는 상한일 뿐 넓히는 힘이 없어서,
   2560x1440 화면에서 책이 1088px(화면의 43%)에 멈춰 있었다
   (2026-09-08 사용자: "웨일로 켰을 때 캘린더랑 성경 모드 둘 다 화면에 꽉 안 찼다").
   ⚠️ min-width: 0 이 없으면 flex 아이템이 내용보다 안 줄어들어 좁은 화면에서 넘친다. */
html[data-theme="book"] #main-content { flex: 1 1 auto; min-width: 0; }

html[data-theme="book"] .container {
  position: relative;
  max-width: min(96vw, 1180px);
  margin: clamp(12px, 3vh, 40px) auto;
  /* ⭐ 가죽 여백은 **한 곳에서** 정한다 — 표지의 padding 과 종이(::before) 의 inset 이 같은 값이어야
     내용이 종이 안에 앉는다. 예전에 좁은 폰에서 padding 만 조이고 inset 을 그대로 둬서
     내용이 종이보다 좌우 7px 씩 넓어졌다(2026-09-09 사용자 지적, Flip6=360px).
     ⚠️ 이름은 반드시 --leather 와 **달라야** 한다. 예전에 여기서 `--leather` 를 길이로 덮었는데
        그 이름은 위에서 **가죽 색**(#4a2f1e)으로 쓰이고 있어, 바로 아래 background 의
        `var(--leather)` 가 색 자리에 길이를 받아 **background 롱핸드 전체가 무효**가 됐다.
        표지 그라데이션이 한 번도 안 칠해졌고(계산값 background-image: none), 상속을 받는
        자손들(릴리즈 노트 판번호 배지 등)의 배경까지 같이 죽었다(2026-09-10 실측). */
  --cover-pad: clamp(16px, 2.6vw, 34px);
  /* ⭐ 종이 안쪽 여백 — 내용이 종이 가장자리에 붙지 않게 한다(2026-09-29 사용자: 성경책 테마에서는
     항상 종이면 외곽 경계 안쪽에 여백이 조금 있었으면). 표지 여백(--cover-pad)과 따로 둬야
     종이(::before) 위치는 그대로 두고 내용만 안으로 들인다. 실측(수정 전): 소개·약관·성경 목록은
     폰·태블릿에서 좌우 1px, 릴리즈 노트는 모든 폭에서 사방 1px, 달력 범례 상자는 좌우 1px 이었다.
     ⚠️ 이 여백은 .container 의 padding 에 더하지 않는다. book-turn.js·read.js 가 종이 = content box
        (padding 을 뺀 상자)로 읽으므로, padding 을 늘리면 넘어가는 종이가 실제 종이보다 좁게 그려진다.
        넘김이 없는 화면은 아래 `:not(.calendar-book):not(.read-book)` 에서, 달력은 지면 래퍼에서 준다.
        성경 읽기는 본문 자체 여백이 이미 22px 이상이라(실측) 따로 주지 않는다.
     ⚠️ 책배 색인·가름끈처럼 종이 끝에 붙어야 하는 세간은 absolute 라 이 여백을 안 탄다. */
  --paper-pad: clamp(10px, 1.8vw, 22px);
  padding: var(--cover-pad);
  background: linear-gradient(152deg, var(--leather) 0%, var(--leather2) 100%);
  border-radius: clamp(6px, 0.9vw, 14px);
  box-shadow:
    0 clamp(10px, 2vh, 26px) clamp(20px, 4vh, 60px) rgba(0, 0, 0, 0.55),
    inset 0 0 0 1px rgba(255, 255, 255, 0.06);
  /* calendar.css 의 backdrop-filter 는 fixed 자식의 containing block 을 이 책으로 바꾼다.
     모바일 월 도크가 화면 바닥이 아니라 책 내용 아래(y=882)에 생긴 원인이라 걷는다.
     가죽 바탕은 불투명하므로 시각적으로 잃는 흐림은 없다. */
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
}

/* 속지 — 책등 그늘과 종이 결 */
html[data-theme="book"] .container::before {
  content: "";
  position: absolute;
  inset: var(--cover-pad);
  border-radius: clamp(3px, 0.4vw, 6px);
  background:
    linear-gradient(90deg, rgba(70, 45, 20, 0.18) 0%, rgba(70, 45, 20, 0.05) 4%, transparent 9%),
    repeating-linear-gradient(0deg, rgba(0, 0, 0, 0.012) 0 2px, transparent 2px 4px),
    var(--paper);
  box-shadow: inset 0 0 clamp(20px, 3vw, 50px) rgba(120, 96, 60, 0.18);
  pointer-events: none;
}
html[data-theme="book"] .container > * { position: relative; z-index: 1; }

/* 종이 안쪽 여백 — 넘김이 없는 화면(소개·약관·성경 목록·릴리즈 노트)은 컨테이너에 그대로 더한다. */
html[data-theme="book"] .container:not(.calendar-book):not(.read-book) {
  padding: calc(var(--cover-pad) + var(--paper-pad));
}
/* 달력은 지면 래퍼에 준다. 폰은 래퍼가 상자이고, 펼침면(≥900px)은 래퍼가 display: contents 라
   두 지면(.page)이 받는다. 넘김 무대(body 직속 복제본)는 .calendar-book 밖이라 .bc-peel-stage--cal 로 따로 고른다 —
   빠지면 끄는 동안만 여백이 0 이 되어 말씀 줄바꿈과 달력 칸이 바뀐다(2026-10-08 사용자 녹화). */
@media (max-width: 899px), (max-width: 999px) and (max-height: 500px) {
  html[data-theme="book"] .calendar-book-pages { padding-inline: var(--paper-pad); }
}
@media (min-width: 1000px), (min-width: 900px) and (min-height: 501px) {
  html[data-theme="book"] :is(.calendar-book, .bc-peel-stage--cal) .page { padding-inline: var(--paper-pad); padding-bottom: var(--paper-pad); }
}

/* 가름끈 — 가죽 윗변에서 내려온다.
   ⭐ 끈은 가죽 경계 안쪽에만 있어야 한다(2026-09-29 사용자). 예전엔 top 을 음수로 줘 가죽 위로
   최대 22px 튀어나왔다. 시작점만 가죽 윗변(0)으로 내리고 **끝점은 예전 자리 그대로** 둔다 —
   read.js 가 끈 끝(top+height)을 읽어 폰 색인을 그 아래로 내리므로, 끝이 움직이면 색인도 같이 밀린다. */
html[data-theme="book"] .container::after {
  content: "";
  position: absolute;
  top: 0;
  right: clamp(28px, 6vw, 80px);
  width: clamp(10px, 1.6vw, 18px);
  height: calc(clamp(70px, 12vh, 130px) - clamp(10px, 2vh, 22px));
  background: linear-gradient(180deg, var(--ribbon) 0%, #6d1f1f 100%);
  clip-path: polygon(0 0, 100% 0, 100% 88%, 50% 100%, 0 88%);
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.35);
  z-index: 0;
  pointer-events: none;
}

/* ── 머리말 ───────────────────────────────────────────── */
html[data-theme="book"] .header {
  background: none !important;
  border: none !important;
  box-shadow: none !important;
  padding: clamp(10px, 2.2vh, 26px) clamp(8px, 2vw, 28px) clamp(6px, 1.2vh, 14px);
}
html[data-theme="book"] .month-title {
  font-family: var(--serif);
  /* ⚠️ 원본이 그라데이션을 글자에 넣고 -webkit-text-fill-color:transparent 로 비운다.
     그래서 color 만 바꾸면 **아무 일도 안 일어난다.** 셋을 다 되돌려야 한다. */
  background: none !important;
  -webkit-background-clip: border-box !important;
  background-clip: border-box !important;
  -webkit-text-fill-color: currentColor !important;
  color: var(--ink) !important;
  font-size: clamp(20px, 3.4vw, 32px) !important;
  letter-spacing: 0.02em;
  white-space: nowrap;
  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.6);
}
/* 읽기 화면의 월 제목은 **장 선택 버튼**이다. 위의 달력 제목 초기화(background:none!important)가
   read.css의 은은한 버튼 바탕까지 지우지 않게 읽기 버튼에만 도로 넣는다. */
html[data-theme="book"] .read-ref.month-title {
  background: var(--read-ref-bg) !important;
  border-color: var(--read-ref-border) !important;
}
html[data-theme="book"] .read-ref.month-title:hover,
html[data-theme="book"] .read-ref.month-title:focus-visible {
  background: var(--read-ref-hover) !important;
}
html[data-theme="book"] .month-title-container { min-width: max-content; }
/* 금박 밑줄 */
html[data-theme="book"] .month-title-container::after {
  content: "";
  display: block;
  height: 2px;
  margin: clamp(4px, 0.8vh, 10px) auto 0;
  width: clamp(60px, 22%, 180px);
  background: linear-gradient(90deg, transparent, var(--gilt), transparent);
}
html[data-theme="book"] .nav-btn,
html[data-theme="book"] .today-link {
  background: none !important;
  border: 1px solid rgba(120, 96, 60, 0.35) !important;
  color: var(--ink-soft) !important;
  font-family: var(--serif);
  border-radius: 999px !important;
  box-shadow: none !important;
}
html[data-theme="book"] .nav-btn:hover,
html[data-theme="book"] .today-link:hover { background: rgba(184, 145, 47, 0.12) !important; }

/* ── 달력 — 괘선만 남긴다 ─────────────────────────────── */
html[data-theme="book"] .calendar-table {
  background: none !important;
  border-collapse: collapse !important;
  box-shadow: none !important;
}
html[data-theme="book"] .calendar-table th {
  background: none !important;
  color: var(--ink-soft) !important;
  font-family: var(--serif);
  font-weight: 600;
  border: none !important;
  border-bottom: 1px solid var(--rule-strong) !important;
  padding-bottom: clamp(4px, 0.8vh, 10px) !important;
}
html[data-theme="book"] .calendar-table td {
  background: none !important;
  border: none !important;
  border-bottom: 1px solid var(--rule) !important;
  color: var(--ink) !important;
  font-family: var(--serif);
  vertical-align: top;
}
html[data-theme="book"] .calendar-table td.empty-day { border-bottom-color: transparent !important; }

/* ⭐ 펼침면(PC)에서 칸이 허전하던 것 — 괘선 위에 글자를 앉힌다.
   책을 펼치면 달력이 지면의 절반만 쓰므로 칸이 63x100 짜리 **세로로 긴 빈 상자**가 되고,
   calendar.css 의 height:100px 은 154px 폭 칸을 전제로 만든 값이라 숫자가 상자 맨 위에
   붙고 아래로 70px 이 죽는다. 실측: 칸 63x100 · 숫자 19px · 아래 여백 ~64px(2026-08-27).
   ⚠️ 칸을 줄이는 쪽은 못 쓴다 — 지면 높이(940px)는 왼쪽 면이 정하므로, 줄이면 빈자리가
      칸 안에서 **지면 아래로 옮겨갈 뿐**이다(74px 로 줄여 재봤더니 표만 657→441 로 줄고
      container 940 · scrollH 1068 은 그대로였다).
   그래서 높이는 그대로 두고 **글자를 괘선 한가운데에 앉힌다** —
   빈 상자가 아니라 줄 쳐진 장부로 읽힌다. 폭이 좁은 화면은 손대지 않는다.
   ⚠️ 글자 크기는 여기서 건드리지 않는다. `.day-number` 의 font-size 는 이 파일 700줄쯤에서
      !important 로 이미 정해져 있어서(clamp(14px,3.1vw,19px)) 여기 한 줄을 더 두면
      **먹지도 않으면서 규칙만 네 벌**이 된다(핸드북 0절 — 규칙 수를 줄여서 통일을 지킨다).
      실제로 21px 로 키워 봤지만 계산값은 19px 그대로였다(2026-08-27 실측). */
@media (min-width: 1000px), (min-width: 900px) and (min-height: 501px) {
  html[data-theme="book"] .page-right .calendar-table td { vertical-align: middle; }
}

/* 날짜 숫자 — calendar.css 가 안쪽 요소에 색을 걸어 두므로 여기까지 내려가야 이긴다 */
html[data-theme="book"] .day-number {
  color: var(--ink) !important;
  background: none !important;
  font-family: var(--serif);
  font-weight: 600;
}
/* 오늘 — 손으로 두른 동그라미.
   ⚠️ 칸 가운데에 그리면 안 된다. 날짜 숫자는 칸 **왼쪽 위**에 있어서 동그라미만 따로 논다
      (2026-08-20 실제로 그랬다). 숫자 자체에 두른다 — 숫자가 어디로 가든 따라간다. */
html[data-theme="book"] .today .day-number {
  color: var(--ribbon) !important;
  font-weight: 700;
  display: inline-grid;
  place-items: center;
  width: 1.9em;
  height: 1.9em;
  border: 1.6px solid rgba(142, 43, 43, 0.5);
  border-radius: 50%;
  transform: rotate(-4deg);
  background: none !important;
}
/* 읽은 날 — 채운 동그라미.
   ⭐ 2026-09-08 사용자 지시: 형광펜 자국(`linear-gradient(180deg, transparent 55%, --mark 55%)`)이
      아래 45% 만 칠해서 **원의 아래쪽 반원만 채운 것처럼** 보였다 — "그냥 깔끔하게 원 모양으로 다 채워".
   ⚠️ 모양·크기는 '오늘'(1.9em 원)과 **같은 값**을 쓴다. 같은 자리의 같은 역할인데 규칙이 두 벌이면
      결국 어긋난다(핸드북 0절 — 규칙 수를 줄여서 통일을 지킨다).
   ⚠️ 오늘이면서 읽은 날이면 이 규칙이 배경만 덮고 '오늘'의 붉은 테두리는 그대로 남는다. */
html[data-theme="book"] .calendar-table td.day-with-reading { background: none !important; }
html[data-theme="book"] .day-with-reading .day-number {
  display: inline-grid;
  place-items: center;
  width: 1.9em;
  height: 1.9em;
  border-radius: 50%;
  background: var(--mark) !important;
  padding: 0;
  color: var(--ink) !important;
}
html[data-theme="book"] .day-chapters-badge {
  background: rgba(200, 137, 47, 0.2) !important;
  color: var(--ink-soft) !important;
  border: none !important;
  font-family: var(--serif);
}
html[data-theme="book"] .reading-item,
html[data-theme="book"] .verse-abbr,
html[data-theme="book"] .verse-full,
html[data-theme="book"] .verse-range {
  color: var(--ink-soft) !important;
  font-family: var(--serif);
}

/* ── 범례·통계·버튼 — 종이 톤으로 ─────────────────────── */
html[data-theme="book"] .legend,
html[data-theme="book"] .legend-item,
html[data-theme="book"] .monthly-stats-section,
html[data-theme="book"] .stats-section,
html[data-theme="book"] .stat-card,
html[data-theme="book"] .goal-section {
  background: rgba(255, 253, 246, 0.72) !important;
  border: 1px solid rgba(120, 96, 60, 0.22) !important;
  color: var(--ink) !important;
  font-family: var(--serif);
  box-shadow: none !important;
}
html[data-theme="book"] .legend-item span,
html[data-theme="book"] .stats-section *,
html[data-theme="book"] .monthly-stats-section * { color: var(--ink) !important; }

html[data-theme="book"] [class*="goal"],
html[data-theme="book"] .goal-btn,
html[data-theme="book"] .login-btn,
html[data-theme="book"] .version-badge,
html[data-theme="book"] .donate-btn,
html[data-theme="book"] .submit-btn {
  background: linear-gradient(180deg, #f3e6c9, #e6d3aa) !important;
  color: var(--ink) !important;
  border: 1px solid rgba(184, 145, 47, 0.55) !important;
  font-family: var(--serif);
  box-shadow: none !important;
  text-shadow: none !important;
}

/* ── 광고 — 책 사이에 끼운 쪽지 ───────────────────────
   규격을 바꾸려면 --ad-w/--ad-h 두 줄만 고친다(애드핏 광고 단위 크기와 맞출 것). */
html[data-theme="book"] .ad-banner {
  /* 애드핏 승인 규격 = 320×50 (2026-08-20 확인).
     규격을 바꾸면 여기 두 줄과 index.html 의 data-ad-width/height 를 함께 고친다. */
  --ad-w: 320px;
  --ad-h: 50px;
  /* ⚠️ 애드핏이 넣는 iframe 은 **320×50 고정**이라 쪽지의 안쪽 폭이 320 이어야 한다.
     border-box 로 두면 안쪽이 320−테두리−여백 = 306 이 되어 광고가 쪽지 밖으로 삐져나온다
     (2026-09-08 사용자: "비로그인 시 하단 광고가 칸 내에 잘 들어가도록"). */
  box-sizing: content-box;
  width: var(--ad-w);
  min-height: var(--ad-h);
  /* 종이 안쪽이 320 보다 좁은 폰에서도 광고를 **자르지 않는다** — 가운데를 기준으로 놓아
     모자란 폭은 책 여백 쪽으로 고르게 넘긴다(자르면 광고가 잘려 보이고 정책에도 어긋난다). */
  position: relative;
  left: 50%;
  transform: translateX(-50%) rotate(-0.5deg);
  margin: clamp(10px, 2vh, 22px) 0 !important;
  padding: 6px;
  background: #fffdf6;
  border: 1px solid rgba(120, 96, 60, 0.3);
  border-radius: 2px;
  box-shadow: 0 2px 6px rgba(60, 44, 26, 0.18), 0 0 0 6px rgba(246, 239, 226, 0.6);
}
/* ⭐ 좁은 폰(≤400px): 320px 고정 배너가 **판면 안에** 들어가도록 판면과 쪽지를 함께 조인다.
   애드핏 배너는 320px 고정이라 판면이 그보다 좁으면 종이 여백을 먹는다. 광고를 줄이거나
   자르는 것은 정책에 어긋나므로, 좁힐 수 있는 것은 판면 여백과 쪽지 장식뿐이다
   (2026-09-08 사용자: "폰에서 광고가 양쪽 종이 여백 침범하는 것도 거슬린다").

   실측(판면 폭 / 쪽지 폭, 쪽지는 바깥 링까지 포함):
     고치기 전  360px  311.6 / 338.5 → 좌우 13.5px 씩 침범
                375px  324.0 / 338.5 → 좌우  7.3px 씩 침범
                390px  338.4 / 338.5 → 좌우  0.1px 씩 침범
     고친 뒤    360px  325.6 / 322.4 → 좌우  1.6px 씩 여유
                375px  338.0 / 322.4 → 좌우  7.8px 씩 여유
                390px  356.4 / 322.4 → 좌우 17.0px 씩 여유

   ⚠️ **바깥 링(box-shadow 의 spread)은 `getBoundingClientRect` 에 안 잡힌다.** 그런데 경계가
      또렷해 눈에는 그대로 보이므로, 링을 안 세고 재면 "판면에 들어감"으로 잘못 판정된다
      (실제로 그렇게 재서 한 번 통과시켰다가 캡처를 보고 알았다). 좁은 폰에서는 링을 걷고
      은은한 그림자만 남긴다.
   ⚠️ 판면 여백은 **광고가 있는 화면에만** 조인다. 로그인 사용자에게는 광고가 없으므로 조일
      이유가 없다 — 여백은 이 테마의 대전제(실물 성경책)에 속한다.
   ⚠️ 세로 여백은 clamp 그대로 두고 **가로만** 조인다.
   ⚠️ 320px 화면(아이폰 SE 1 세대)은 판면을 0 으로 만들어도 320 이 안 들어간다 — 침범이
      26.6px 에서 17.6px 로 줄 뿐이다. 그 폭까지 없애려면 250x250 규격뿐인데 높이가 250 이라 더 나쁘다. */
@media (max-width: 400px) {
  html[data-theme="book"] .container:has(.ad-banner) {
    /* 광고 쪽지가 차지하는 폭(320 + 테두리 2 + 그림자 3×2 = 328)이 종이에 들어갈 만큼만 조인다.
       넉넉하면 min() 이 원래 여백을 그대로 쓰므로 375px 이상에서는 아무것도 안 바뀐다.
       하한 6px 은 표지 안쪽 금박 테(clamp(5px, 0.7vw, 9px)) 보다 크게 둔 값이다 —
       더 조이면 종이가 금박을 덮어 표지 장식이 사라진다. */
    --leather-x: max(6px, min(var(--cover-pad), (96vw - 330px) / 2));
    padding-inline: var(--leather-x);
  }
  /* 광고 쪽지만은 종이 여백까지 써야 320 규격이 들어간다. 자리가 남으면 가운데에 두고,
     모자라면 종이 여백(--paper-pad)까지만 양옆으로 내민다. 다른 내용은 그대로 안쪽에 앉는다.
     (322px = 쪽지 안쪽 320 + 테두리 1×2) */
  html[data-theme="book"] .calendar-book-pages .ad-banner {
    margin-inline: max(calc(-1 * var(--paper-pad)), calc((100% - var(--ad-w) - 2px) / 2)) !important;
  }
  /* ⭐ 종이도 같은 값으로 넓힌다. 이 두 줄이 없으면 여백만 좁아지고 종이는 그대로라
     내용이 종이 밖으로 나간다 — 실제로 그 상태로 배포돼 있었다(2026-09-09). */
  html[data-theme="book"] .container:has(.ad-banner)::before {
    left: var(--leather-x);
    right: var(--leather-x);
  }
  html[data-theme="book"] .ad-banner {
    padding: 0;
    /* 그림자를 좌우 3px 로 줄여 쪽지가 차지하는 폭을 낮춘다(그만큼 종이 여백이 남는다) */
    box-shadow: 0 1px 3px rgba(60, 44, 26, 0.18);
  }
}

html[data-theme="book"] .ad-notice {
  font-family: var(--serif);
  color: var(--ink-soft) !important;
  font-size: clamp(10px, 1.5vw, 12px);
  text-align: center;
}

/* ── 좁은 화면: 펼침이 아니라 한 장 ───────────────────── */
@media (max-width: 700px) {
  html[data-theme="book"] .container::after { right: clamp(14px, 5vw, 28px); }
}

/* 남은 원본 강조색 — 그라데이션을 쓰는 것들을 종이 톤으로 눕힌다.
   ⚠️ 클래스가 제각각이라 배경 이미지를 쓰는 것을 넓게 잡는다. 스코프 안이라 다른 테마엔 영향 없다. */
html[data-theme="book"] .container [style*="linear-gradient"],
html[data-theme="book"] .stat-progress,
html[data-theme="book"] .progress-bar {
  background-image: none !important;
}
html[data-theme="book"] .legend-item .legend-color { border: 1px solid rgba(120,96,60,.35); }

/* ── 난외주(欄外註) — 그 달 읽은 곳 ───────────────────
   성경에서 각주·관주가 놓이는 자리. 날짜 칸에 구절까지 넣으면 표가 되므로 여기로 옮겼다. */
html[data-theme="book"] .margin-note {
  margin: clamp(8px, 1.6vh, 16px) clamp(4px, 1vw, 14px) 0;
  padding-top: clamp(6px, 1.2vh, 12px);
  border-top: 1px solid var(--rule-strong);
  font-family: var(--serif);
  color: var(--ink-soft);
  font-size: clamp(11px, 1.7vw, 13px);
  line-height: 1.9;
}
html[data-theme="book"] .margin-note-title {
  font-size: clamp(10px, 1.5vw, 12px);
  letter-spacing: 0.1em;
  color: var(--gilt);
  font-weight: 700;
  margin-bottom: 2px;
}
html[data-theme="book"] .mn-entry { margin-right: 0.9em; white-space: nowrap; }
html[data-theme="book"] .mn-entry b { color: var(--ink); font-weight: 600; margin-right: 0.15em; }
html[data-theme="book"] .margin-note-empty { color: var(--ink-soft); }

/* 난외주로 옮겼으니 날짜 칸의 구절 글자는 숨긴다 — 장수 뱃지는 남긴다 */
html[data-theme="book"] .day-content .reading-item { display: none; }

/* ⭐ 펼침면(PC)에서는 **축약형만** 칸에 되살린다 (2026-08-27 사용자 결정).
   구절을 통째로 감춘 탓에 칸에 숫자밖에 없어 "기본 테마가 훨씬 읽기 편하다"는 검수를 받았다.
   난외주(전체 표기)는 그대로 두고, 칸에는 "오늘 뭘 읽었나"만 짧게 얹는다.
   ⚠️ 약어는 새로 만들지 않는다 — `bible_parser.abbreviate()` 가 만들어 템플릿이 이미
      `.verse-abbr` 로 그려 두었다(난외주가 쓰는 것과 **같은 문자열**이다). 여기서는
      calendar.css 가 넓은 화면에서 켜 두는 `.verse-full` 을 끄고 축약형으로 바꾸기만 한다.
   ⚠️ 칸 폭은 63px 그대로다. 넘치는 것은 `.verse-range` 가 이미 가진
      `overflow:hidden + text-overflow:ellipsis` 가 받는다 — 글자가 칸 밖으로 나가지 않는다.
   ⚠️ 폰·기본 테마는 손대지 않는다(`.page-right` 는 펼침면에만 있다). */
@media (min-width: 1000px), (min-width: 900px) and (min-height: 501px) {
  /* ⚠️ **한 건만** 보인다. 칸 안에서 글자가 놓일 자리는 32px 뿐이라(행 100px − 안쪽여백 16px
        − 머리(날짜+뱃지) 52px), 한 줄 21px 은 들어가지만 두 줄 46px 은 넘친다 —
        실측으로 행이 100→118→143→168px 로 자라 **달마다 책 높이가 달라졌다**(고친 지 얼마 안 된
        결함이 되살아난다). 그래서 칸은 첫 건만 맡고, 나머지는 난외주와 날짜 모달이 맡는다. */
  html[data-theme="book"] .page-right .day-content .reading-item { display: none; }
  html[data-theme="book"] .page-right .day-content .reading-item:first-child { display: block; }
  /* 가려진 것이 있으면 그렇다고 말해 준다 — 마크업을 안 늘리고 형제 유무로만 판단한다 */
  html[data-theme="book"] .page-right .day-content .reading-item:first-child:not(:last-child) .verse-range::after {
    content: " 외";
  }
  html[data-theme="book"] .page-right .verse-full { display: none; }
  html[data-theme="book"] .page-right .verse-abbr { display: inline; }
  /* ⚠️ 글자가 놓일 폭은 34px 밖에 없었다(칸 63 − td 여백 16 − .verse-range 여백 12).
        긴 이름("고전 15장")이 9px 넘쳤다. 글꼴을 줄이는 것보다 **여백을 줄이는 쪽이
        같은 값을 더 싸게 번다** — 좌우 여백 6→2px 로 8px 을 되찾는다. */
  html[data-theme="book"] .page-right .verse-range {
    font-size: clamp(9px, 0.78vw, 10px);
    padding: 1px 2px;
  }
}

/* 기본 테마에서는 난외주를 보이지 않는다 (원래 화면 그대로) */
html:not([data-theme="book"]) .margin-note { display: none; }

/* ============================================================
   다른 화면들 — 로그인·가입·릴리즈 노트도 같은 결로.
   ⚠️ 이 화면들은 .container 안에 카드가 하나 더 있는 구조다.
      책(가죽) 안에 카드가 또 뜨면 이중 액자가 되므로 카드 테두리를 눕힌다.
   ============================================================ */
html[data-theme="book"] .login-container,
html[data-theme="book"] .register-container {
  background: transparent !important;
  border: none !important;
  box-shadow: none !important;
  color: var(--ink);
  font-family: var(--serif);
}
html[data-theme="book"] .form-label,
html[data-theme="book"] .form-help { color: var(--ink-soft) !important; font-family: var(--serif); }
html[data-theme="book"] .form-input {
  background: rgba(255, 253, 246, 0.85) !important;
  border: 1px solid rgba(120, 96, 60, 0.35) !important;
  color: var(--ink) !important;
  font-family: var(--serif);
  box-shadow: none !important;
}
html[data-theme="book"] .form-input:focus {
  border-color: var(--gilt) !important;
  outline: 2px solid rgba(184, 145, 47, 0.35);
  outline-offset: 1px;
}
html[data-theme="book"] .back-btn {
  background: none !important;
  border: 1px solid rgba(120, 96, 60, 0.35) !important;
  color: var(--ink-soft) !important;
  font-family: var(--serif);
  box-shadow: none !important;
}

/* 제목류 — 그라데이션 글자를 쓰는 것이 여럿이라 함께 되돌린다 */
html[data-theme="book"] h1,
html[data-theme="book"] h2,
html[data-theme="book"] h3 {
  background: none !important;
  -webkit-background-clip: border-box !important;
  background-clip: border-box !important;
  -webkit-text-fill-color: currentColor !important;
  color: var(--ink) !important;
  font-family: var(--serif);
}

/* 링크 */
html[data-theme="book"] a { color: #7a5c2e; }
html[data-theme="book"] a:hover { color: var(--ribbon); }

/* ── 튜토리얼 ────────────────────────────────────────
   ⭐ 위치는 손댈 것이 없다. 튜토리얼이 선택자(.month-title, .calendar-table …)로 요소를 잡고
      좌표를 그 요소에서 계산하므로, 테마가 배치를 바꿔도 **저절로 따라간다.**
      여기서 바꾸는 건 색뿐이다 — 원본이 보라(103,126,234)를 쓴다. */
html[data-theme="book"] .tutorial-modal,
html[data-theme="book"] .tutorial-tooltip,
html[data-theme="book"] .tutorial-popup {
  background: #fffdf6 !important;
  border: 1px solid rgba(120, 96, 60, 0.3) !important;
  box-shadow: 0 6px 20px rgba(60, 44, 26, 0.25) !important;
  color: var(--ink) !important;
  font-family: var(--serif);
}
html[data-theme="book"] .tutorial-modal *,
html[data-theme="book"] .tutorial-tooltip * { font-family: var(--serif); }
html[data-theme="book"] #tutorialSpotlight {
  box-shadow: 0 0 0 3px rgba(184, 145, 47, 0.75), 0 0 0 9999px rgba(28, 20, 16, 0.55) !important;
  border-radius: 6px !important;
}
/* 다음/이전 버튼 */
html[data-theme="book"] .tutorial-btn,
html[data-theme="book"] [class*="tutorial"] button {
  background: linear-gradient(180deg, #f3e6c9, #e6d3aa) !important;
  color: var(--ink) !important;
  border: 1px solid rgba(184, 145, 47, 0.55) !important;
  font-family: var(--serif);
  box-shadow: none !important;
}
html[data-theme="book"] [class*="tutorial"] p,
html[data-theme="book"] [class*="tutorial"] span,
html[data-theme="book"] [class*="tutorial"] div { color: var(--ink) !important; }
html[data-theme="book"] [class*="tutorial"] .step,
html[data-theme="book"] [class*="tutorial"] [class*="count"] { color: var(--ink-soft) !important; }

/* ============================================================
   글자 크기·색 마무리 (2026-08-20 사용자 지적)
   ⚠️ 명조 계열은 같은 px 라도 고딕보다 넓게 잡힌다 — 원본 크기를 그대로 두면
      버튼 글자가 줄바뀜한다(실제로 "이전달"이 두 줄로 깨졌다).
   ============================================================ */
html[data-theme="book"] .nav-btn {
  font-size: clamp(11px, 1.9vw, 13px) !important;
  padding: clamp(5px, 1vw, 8px) clamp(8px, 1.6vw, 14px) !important;
  white-space: nowrap !important;
  line-height: 1.25 !important;
  gap: 4px;
}
html[data-theme="book"] .nav-btn span { white-space: nowrap; }
html[data-theme="book"] .today-link {
  font-size: clamp(10px, 1.7vw, 12px) !important;
  padding: clamp(4px, 0.8vw, 7px) clamp(7px, 1.4vw, 12px) !important;
  white-space: nowrap !important;
}
html[data-theme="book"] .month-title {
  font-size: clamp(17px, 3vw, 28px) !important;
}
html[data-theme="book"] .calendar-table th { font-size: clamp(10px, 1.6vw, 13px) !important; }
html[data-theme="book"] .day-number { font-size: clamp(11px, 1.8vw, 14px) !important; }
html[data-theme="book"] .day-chapters-badge { font-size: clamp(8px, 1.3vw, 10px) !important; }

/* 범례 색칠 — 원본의 주황·파랑이 그대로 남아 있었다 */
html[data-theme="book"] .legend-item .legend-color,
html[data-theme="book"] .legend-color,
html[data-theme="book"] .legend-item > span:first-child {
  background: var(--mark) !important;
  border: 1px solid rgba(120, 96, 60, 0.4) !important;
  box-shadow: none !important;
}
html[data-theme="book"] .legend-item:last-child .legend-color,
html[data-theme="book"] .legend-item:last-child > span:first-child {
  background: rgba(142, 43, 43, 0.35) !important;
}

/* 배지·작은 버튼 글자도 명조로, 크기는 한 단계 내린다 */
html[data-theme="book"] .version-badge,
html[data-theme="book"] .login-btn,
html[data-theme="book"] .goal-btn {
  font-size: clamp(10px, 1.6vw, 12px) !important;
  white-space: nowrap;
}
html[data-theme="book"] .legend,
html[data-theme="book"] .legend-item { font-size: clamp(11px, 1.7vw, 13px) !important; }

/* 통계 숫자·라벨 */
html[data-theme="book"] .monthly-stats-section,
html[data-theme="book"] .stats-section { font-size: clamp(11px, 1.7vw, 13px) !important; }

/* 진행 막대 — 원본 파랑/초록을 금박으로
   ⚠️ **채움만** 칠한다. `.progress-bar` 는 트랙(빈 홈)이고 `.progress-fill` 이 채움이다.
      둘 다 금박으로 칠했더니 "18장 · 6 읽은 날"인데도 막대가 **꽉 찬 것처럼** 읽혔다
      (2026-08-21 검수). 트랙은 종이에 눌린 빈 홈으로 남겨 둔다. */
html[data-theme="book"] [class*="progress"] > div {
  background: linear-gradient(90deg, var(--gilt), #d8b96a) !important;
}
html[data-theme="book"] .progress-bar,
html[data-theme="book"] .stat-progress {
  background: rgba(120, 96, 60, 0.16) !important;
  background-image: none !important;
}

/* ============================================================
   가독성 수리 (2026-08-21 사용자 검수)
   ⭐ 이 절의 원칙: **분위기는 지키되 읽히는 것이 먼저다.**
      색을 바꿀 땐 종이색(#f3e9d6) 대비 4.5:1 을 넘기는지 확인하고 값을 적는다.
   ============================================================ */

/* ── 1. 로그인·가입 화면 — 책이 아예 안 그려지고 있었다 ─────────
   ⚠️ 원인: 이 두 화면에는 `.container` 가 **없다**. base.html 이 <main> 안에
      `.login-container` 카드 하나만 넣는다. 그런데 이 파일은 책(가죽+속지)을
      `.container::before/::after` 로만 그리고, 카드는 `background: transparent` 로
      눕혀 놓았다 — 그래서 **어두운 책상 위에 잉크색 글자**만 남아 대비가 1:1 이었다.
   → 카드 자체를 속지로 만들고, 가죽 표지는 box-shadow 링으로 두른다
      (요소를 못 늘리므로 링이 가장 싸다). */
html[data-theme="book"] .login-container,
html[data-theme="book"] .register-container {
  --cover: clamp(10px, 2.6vw, 22px);   /* 가죽 표지 두께 */
  background:
    linear-gradient(90deg, rgba(70, 45, 20, 0.16) 0%, rgba(70, 45, 20, 0.05) 5%, transparent 12%),
    repeating-linear-gradient(0deg, rgba(0, 0, 0, 0.012) 0 2px, transparent 2px 4px),
    var(--paper) !important;
  border: 1px solid rgba(184, 145, 47, 0.45) !important;
  border-radius: clamp(3px, 0.5vw, 6px) !important;
  /* 링이 화면 밖으로 잘리지 않도록 표지 두께보다 큰 여백을 둔다.
     가로는 auto — 네 방향을 같은 값으로 주면 max-width 카드의 남는 폭이
     오른쪽에만 쌓여 가운데가 깨진다(/admin/password-resets 등, 2026-09-17). */
  margin: clamp(14px, 3.4vw, 30px) auto !important;
  padding: clamp(20px, 4vw, 40px) !important;
  color: var(--ink) !important;
  backdrop-filter: none !important;
  box-shadow:
    0 0 0 var(--cover) var(--leather),
    0 0 0 calc(var(--cover) + 1px) rgba(0, 0, 0, 0.45),
    inset 0 0 clamp(20px, 3vw, 50px) rgba(120, 96, 60, 0.18),
    0 clamp(8px, 2vh, 22px) clamp(18px, 4vh, 50px) rgba(0, 0, 0, 0.55) !important;
}

/* 제목 — 원본이 보라 그라데이션을 글자에 부어 넣는다. 셋을 다 되돌려야 색이 먹는다. */
html[data-theme="book"] .login-title,
html[data-theme="book"] .register-title {
  background: none !important;
  -webkit-background-clip: border-box !important;
  background-clip: border-box !important;
  -webkit-text-fill-color: currentColor !important;
  color: var(--ink) !important;
  font-family: var(--serif);
  font-size: clamp(21px, 4.4vw, 30px) !important;
  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.6);
}
html[data-theme="book"] .login-subtitle,
html[data-theme="book"] .register-subtitle {
  color: var(--ink-soft) !important;
  font-family: var(--serif);
  font-size: clamp(13px, 2.4vw, 16px) !important;
}
/* 머리말 밑 금박 괘선 — 속표지처럼 */
html[data-theme="book"] .login-header,
html[data-theme="book"] .register-header {
  border-bottom: 1px solid var(--rule-strong);
  padding-bottom: clamp(8px, 1.6vh, 16px);
}

html[data-theme="book"] .form-input::placeholder { color: rgba(107, 87, 60, 0.75) !important; }
html[data-theme="book"] .form-label { color: var(--ink-head) !important; }
html[data-theme="book"] .form-help  { color: var(--ink-soft) !important; }

/* 안내줄 — "계정이 없으신가요?" 가 안 보이던 자리 */
html[data-theme="book"] .register-link,
html[data-theme="book"] .login-link {
  border-top: 1px solid var(--rule-strong) !important;
  color: var(--ink) !important;
}
html[data-theme="book"] .register-link p,
html[data-theme="book"] .login-link p {
  color: var(--ink) !important;
  font-family: var(--serif);
}
html[data-theme="book"] .register-link a,
html[data-theme="book"] .login-link a {
  color: #7a4a1e !important;          /* 종이 대비 6.2:1 */
  text-decoration: underline;
  text-underline-offset: 3px;
}
html[data-theme="book"] .register-link a:hover,
html[data-theme="book"] .login-link a:hover { color: var(--ribbon) !important; }

/* 🔑 로그인 버튼 — 혼자 보라 그라데이션으로 남아 있었다.
   가죽색 바탕 + 크림 글자(10.4:1). 표지와 같은 재질이라 화면 안에서 겉돌지 않는다. */
html[data-theme="book"] .btn-primary,
html[data-theme="book"] .btn.btn-primary,
html[data-theme="book"] button.btn-primary {
  background: linear-gradient(180deg, #6b4a2a 0%, var(--leather) 100%) !important;
  color: #f6ecd8 !important;
  border: 1px solid rgba(0, 0, 0, 0.35) !important;
  box-shadow: none !important;
  text-shadow: none !important;
  font-family: var(--serif);
}
html[data-theme="book"] .btn-secondary {
  background: rgba(255, 253, 246, 0.55) !important;
  color: var(--ink) !important;
  border: 1px solid rgba(120, 96, 60, 0.45) !important;
  box-shadow: none !important;
  text-shadow: none !important;
  font-family: var(--serif);
}

/* ── 2. 범례 줄 — 크림 속지 위의 흰 종이(#f8f9fa)를 걷어낸다 ──── */
html[data-theme="book"] .legend-container {
  background: none !important;
  background-color: transparent !important;
  border-top: 1px solid var(--rule-strong);
  border-radius: 0 !important;
  padding: clamp(8px, 1.6vh, 14px) clamp(4px, 1vw, 12px) !important;
  gap: clamp(8px, 2vw, 20px) !important;
}
/* 범례 항목도 판을 깔지 않는다 — 속지 위에 바로 얹힌다 */
html[data-theme="book"] .legend,
html[data-theme="book"] .legend-item {
  background: none !important;
  border: none !important;
  box-shadow: none !important;
  color: var(--ink) !important;
}

/* ── 3. 남은 파랑/보라 ────────────────────────────────────── */
/* 푸터 링크(이용약관·개인정보처리방침·환불정책·고객센터) — rgb(102,126,234) 였다.
   ⚠️ 선택자가 `.business-info-line.policy-links a`(0,2,1) 라 이 파일의 `a` 규칙(0,1,2)으로는 못 이긴다. */
html[data-theme="book"] .business-info-compact {
  color: var(--ink-soft) !important;
  border-top-color: var(--rule-strong) !important;
  font-family: var(--serif);
}
html[data-theme="book"] .business-info-line,
html[data-theme="book"] .business-info-line span { color: var(--ink-soft) !important; }
html[data-theme="book"] .business-info-line.policy-links a { color: #7a4a1e !important; }
html[data-theme="book"] .business-info-line.policy-links a:hover { color: var(--ribbon) !important; }
html[data-theme="book"] .business-info-copyright { color: var(--ink-soft) !important; }

/* 설정 손잡이(⚙) — 흰 원 대신 종이 쪽지색·가죽 글자. 값은 base.html 의 --dock-toggle-* 토큰이 읽는다.
   ⚠️ 옆의 .theme-switcher 는 건드리지 않는다(모든 테마에서 보여야 한다). */
html[data-theme="book"] {
  --dock-toggle-bg: rgba(243, 233, 214, 0.96);
  --dock-toggle-fg: var(--leather);
  --dock-toggle-border: rgba(120, 96, 60, 0.45);
  /* 설정 카드 안 그룹 구분선·제목(2026-09-30) — 기존 밑줄·보조글자 토큰을 그대로 쓴다 */
  --dock-divider: var(--rule-strong);
  --dock-group-title-fg: var(--ink-soft);
}

/* 한/영 버튼 — 밑줄·활성 배경이 보라였다 */
html[data-theme="book"] .language-switcher {
  background: rgba(243, 233, 214, 0.96) !important;
  border: 1px solid rgba(120, 96, 60, 0.35) !important;
  box-shadow: 0 2px 10px rgba(28, 20, 16, 0.35) !important;
}
/* 선택 표시는 테마 줄과 같은 가죽 채움 — 카드 안 세 줄이 한 언어를 쓴다(핸드북 0절) */
html[data-theme="book"] { --control-on-bg: var(--leather); --control-on-fg: #f3e9d6; }
/* 도크 막대(읽기 화면 '글자 크기') — 트랙은 괘선색, 채움은 금박, 값은 잉크(2026-09-06 검수 #9) */
html[data-theme="book"] { --dock-range-track: rgba(120, 90, 45, 0.22); --dock-range-fill: var(--gilt); --dock-range-ink: var(--ink); }
html[data-theme="book"] .lang-btn { font-family: var(--serif) !important; }

/* 튜토리얼 강조 테두리 — 보라 3px 가 남아 있었다(스포트라이트 그림자만 금박이었다) */
html[data-theme="book"] .tutorial-spotlight,
html[data-theme="book"] #tutorialSpotlight {
  border-color: rgba(184, 145, 47, 0.95) !important;
}
html[data-theme="book"] .tutorial-text { color: var(--ink) !important; }

/* ── 4. 작은 알약 버튼 — 글자가 잘리고, 흰 글자가 크림 위에 있었다 ──
   ⚠️ 원인 둘. (a) calendar.css 가 좁은 화면에서 `height: 32/36/40px` 을 **고정**하는데
      명조는 같은 px 라도 넓어서 두 줄이 되고 위아래가 깎였다.
      (b) 안쪽 span(.version-number/.update-date/.auth-text)이 `color: white` 라
      크림 바탕 위에서 사라졌다 — 바깥 색만 바꿔서는 안 보인다. */
html[data-theme="book"] .version-badge,
html[data-theme="book"] .auth-badge,
html[data-theme="book"] .admin-badge {
  height: auto !important;
  min-height: 0 !important;
  padding: clamp(5px, 1.1vw, 9px) clamp(9px, 1.8vw, 15px) !important;
  line-height: 1.4 !important;
  font-size: clamp(11px, 1.8vw, 13px) !important;
  gap: clamp(3px, 0.8vw, 8px) !important;
  border-radius: 999px !important;
  align-items: center !important;
}
html[data-theme="book"] .version-number,
html[data-theme="book"] .update-date,
html[data-theme="book"] .auth-text,
html[data-theme="book"] .auth-icon,
html[data-theme="book"] .admin-text,
html[data-theme="book"] .admin-icon {
  color: var(--ink) !important;
  background: none !important;
  text-shadow: none !important;
  font-size: inherit !important;
  line-height: 1.4 !important;
  padding: 0 !important;
  font-family: var(--serif);
}
/* 판번호는 금박 칩으로 남겨 둔다 — 날짜와 구분이 필요하다 */
html[data-theme="book"] .version-number {
  background: rgba(176, 138, 60, 0.22) !important;
  padding: 1px clamp(5px, 1.1vw, 8px) !important;
  border-radius: 999px !important;
  font-weight: 700 !important;
}
/* 로그아웃 칩 — 원본은 빨강 그라데이션. 가름끈 색으로 눕힌다 */
html[data-theme="book"] .auth-action {
  background: rgba(142, 43, 43, 0.16) !important;
  color: var(--ribbon) !important;
  text-shadow: none !important;
  font-size: inherit !important;
  line-height: 1.4 !important;
  padding: 1px clamp(5px, 1.1vw, 8px) !important;
  border-radius: 999px !important;
  font-family: var(--serif);
}

/* ── 5. 요일 글자 — 3.5:1 이라 옅었다 → 7.0:1 ─────────────── */
html[data-theme="book"] .calendar-table th {
  color: var(--ink-head) !important;
  font-weight: 700 !important;
  letter-spacing: 0.08em;
  font-size: clamp(12px, 2.2vw, 15px) !important;
}

/* ── 6. 가독성 전반 ───────────────────────────────────────
   기본 테마의 날짜는 18px 인데 여기는 11~14px 이었다. 명조는 같은 px 에서
   고딕보다 작아 보이므로 오히려 **기본보다 크게** 잡아야 비슷하게 읽힌다. */
html[data-theme="book"] .day-number {
  font-size: clamp(14px, 3.1vw, 19px) !important;
  width: auto !important;
  height: auto !important;
  min-width: 1.5em;
  line-height: 1.5 !important;
  color: #241d17 !important;   /* 종이 대비 13:1 */
  font-weight: 700 !important;
}
/* 오늘 동그라미는 위에서 width/height 를 auto 로 눕혔으니 여기서 되살린다 */
html[data-theme="book"] .today .day-number {
  width: 1.85em !important;
  height: 1.85em !important;
  min-width: 0 !important;
  border-width: 2px !important;
  border-color: rgba(142, 43, 43, 0.75) !important;
  line-height: 1 !important;
}
/* 읽은 날 동그라미 — 위에서 1.9em 정사각형으로 잡았으므로 좌우 여백을 주면 타원이 된다.
   (형광펜이던 시절의 `padding: 0 0.22em` 을 걷는다, 2026-09-08) */
html[data-theme="book"] .day-with-reading .day-number { padding: 0 !important; }

/* 통계 상자 — 원본 회색(#374151 / #6b7280)이 남아 있었다 */
html[data-theme="book"] .stats-container,
html[data-theme="book"] .stat-box { color: var(--ink) !important; font-family: var(--serif); }
html[data-theme="book"] .stat-box {
  background: rgba(255, 253, 246, 0.62) !important;
  /* ⭐ 2026-09-08 사용자 요청: 흰 쪽지와 바탕 종이 사이의 **경계선을 흐린다.**
     테두리를 옅히고, 같은 흰색을 밖으로 번지게 해 선이 종이로 녹아들게 한다. */
  border: 1px solid rgba(120, 96, 60, 0.10) !important;
  box-shadow: 0 0 12px 8px rgba(255, 253, 246, 0.42) !important;
}

/* ⭐ 목표 칸의 **번짐**이 종이 밖으로 나가던 것 — 칸 자체는 판면 안인데(폭 325.6 / 판면 327.6)
   흰 번짐이 15px 이라 좌우로 14px 씩 종이를 넘었다
   (2026-09-08 사용자: "종이 사이즈랑 딱 맞는데 그 밖에 블러가 종이 밖으로 튀어나간다").
   ⚠️ 번짐은 경계선을 녹이려고 사용자가 요청해 넣은 것이라(위 주석) 그대로 두고 **칸을 좁힌다.**
   ⚠️ 펼침면(≥900px)은 판면이 넓어 여유가 있으므로 건드리지 않는다. */
@media (max-width: 899px), (max-width: 999px) and (max-height: 500px) {
  html[data-theme="book"] { --book-stat-inset: 15px; }
  html[data-theme="book"] .stat-box {
    margin-left: var(--book-stat-inset) !important;
    margin-right: var(--book-stat-inset) !important;
  }
  /* 버전 버튼(범례 줄 오른쪽 끝)의 오른쪽 끝을 위 달력·아래 통계 칸의 오른쪽 끝에 맞춘다
     (2026-09-30 사용자: "버전 버튼 우측끝이 위아래 요소의 우측끝과 맞았으면").
     통계 칸을 좁힌 값과 같은 변수를 써서, 한쪽만 바뀌어 다시 어긋나는 일을 막는다. */
  html[data-theme="book"] .legend-container { padding-right: var(--book-stat-inset) !important; }
}
html[data-theme="book"] .stat-title { color: var(--ink) !important; font-weight: 700 !important; }
html[data-theme="book"] .stat-details,
html[data-theme="book"] .stat-details * { color: var(--ink-soft) !important; }
html[data-theme="book"] .stats-container * { font-family: var(--serif); }

/* 머리말이 가름끈보다 앞에 와야 한다 — 안 그러면 '다음달' 버튼을 끈이 덮는다.
   ⚠️ z-index 만으로는 안 됐다. 이동 버튼이 `background: none` 이라 **투명해서**
      뒤의 가름끈이 글자 뒤로 비쳤다(대비 붕괴). 옅은 종이 바탕을 깔아 끈을 가린다. */
html[data-theme="book"] .header { position: relative; z-index: 2; }
html[data-theme="book"] .nav-btn,
html[data-theme="book"] .today-link {
  background: rgba(255, 253, 246, 0.62) !important;
  color: var(--ink-head) !important;
}
html[data-theme="book"] .nav-btn:hover,
html[data-theme="book"] .today-link:hover { background: rgba(232, 214, 176, 0.9) !important; }

/* ============================================================
   펼침면 — 넓은 화면에서 좌우 두 지면으로 가른다 (2026-08-21)
   ⭐ 시안 4차 「PC·태블릿 — 펼침」 그대로:
      **왼쪽 지면이 그달 읽은 기록, 오른쪽이 달력.**
   ⚠️ 900px 은 base.html 의 .book-spine 이 나타나는 폭과 **같아야 한다.**
      한쪽만 바꾸면 선은 있는데 지면이 안 갈리거나 그 반대가 되어,
      접힘선이 달력 한가운데를 세로로 관통한다(고치기 전이 그랬다).
   ⚠️ column-gap 과 .book-spine 의 width 도 같은 값이라야 선이 두 지면 사이에 앉는다.
   ============================================================ */
@media (min-width: 1000px), (min-width: 900px) and (min-height: 501px) {
  /* ⚠️ `.calendar-book` 이 **꼭 있어야 한다.** `.container` 는 달력 화면만의 것이 아니다 —
        릴리즈 노트 화면도 같은 클래스를 쓰는데 거기엔 지면(.page)이 없다. 조건 없이 걸었더니
        뒤로가기 상자·제목·판번호가 두 열로 흩어지고 제목이 "업데이/트 내역"으로 접혔다
        (2026-08-21 캡처). 지면이 있는 컨테이너에서만 펼친다. */
  html[data-theme="book"] .container.calendar-book {
    display: grid;
    grid-template-columns: 1fr 1fr;
    column-gap: clamp(30px, 4.4vw, 64px);   /* = .book-spine 의 width */
    /* ⚠️ start 로 두면 지면 높이가 제 내용만큼이라 왼쪽이 짧게 끝난다 —
          판권지(사업자 정보)의 margin-top:auto 가 먹지 않아 통계에 붙어 버렸다.
          두 지면 키를 맞춰야 펼친 책처럼 보이고 아래쪽 것이 바닥에 앉는다. */
    align-items: stretch;
  }
  html[data-theme="book"] .page {
    display: flex;
    flex-direction: column;
    min-width: 0;            /* 표가 제 열을 밀어내지 못하게 */
  }
  /* DOM 은 달력(오른쪽)이 먼저다 — order 로 지면 순서를 바로잡는다 */
  html[data-theme="book"] .page-left  { grid-column: 1; order: 1; }
  html[data-theme="book"] .page-right { grid-column: 2; order: 2; }

  /* 두 지면 밖 — 펼침면 위·아래로 전체 폭을 쓴다 */
  html[data-theme="book"] .container > #successMessage {
    grid-column: 1 / -1; order: 0;
  }
  /* 왼쪽 지면은 오른쪽(달력)보다 글이 성기다 — 위쪽에 붙여 두면 허전하지 않다 */
  html[data-theme="book"] .page-left > .margin-note { margin-top: 0; }
}

/* 성구 — 지면마다 한 줄. 시안의 VERSES 자리다. */
html[data-theme="book"] .page-verse {
  font-family: var(--serif);
  font-style: italic;
  color: var(--ink-soft);
  text-align: center;
  font-size: clamp(11px, 1.5vw, 13.5px);
  line-height: 1.7;
  /* ⚠️ 한국어는 기본이 **글자 단위** 줄바꿈이라 성경 책 이름이 잘렸다
        ("…묵상하여 · 여/호수아 1:8"). keep-all 이라야 낱말째로 넘어간다.
        단 keep-all 만 두면 긴 낱말이 상자를 삐져나가므로 break-word 를 같이 준다. */
  word-break: keep-all;
  overflow-wrap: break-word;
  margin: clamp(10px, 2vh, 20px) 0;
  padding: 0 clamp(8px, 2vw, 20px);
}
/* 기본 테마에는 없던 것이다 — 흔적도 남기지 않는다 */
html:not([data-theme="book"]) .page-verse { display: none !important; }

/* ⚠️ 속지(.container::before)보다 위로 올리는 규칙은 `.container > *` 로 걸려 있다.
      지면 래퍼가 생기면서 그 안쪽 요소들은 **더 이상 .container 의 직계가 아니다** —
      래퍼가 display:contents 인 좁은 화면·기본 테마에서는 래퍼 자신도 박스를 안 만들어
      z-index 가 무효가 된다. 그래서 안쪽 요소에 같은 규칙을 한 번 더 건다.
      (안 걸면 난외주·통계·광고가 속지 밑으로 숨는다) */
html[data-theme="book"] .page > * { position: relative; z-index: 1; }

/* ── 왼쪽 지면 안쪽 — 열이 절반이 되면 가로로 늘어선 것들이 깨진다 ──────
   ⚠️ 한 줄이던 것들이 열 폭 안에서 글자 단위로 접혔다:
      "이번 달 통/계", "성경 읽은/날", "오/늘"(2026-08-21 펼침면 첫 캡처).
      폭을 못 늘리므로 **세로로 세워** 각자 제 줄을 갖게 한다. */
@media (min-width: 1000px), (min-width: 900px) and (min-height: 501px) {
  html[data-theme="book"] .page-left .stats-container {
    display: flex !important;
    flex-direction: column;
    gap: clamp(10px, 1.6vh, 18px);
  }
  html[data-theme="book"] .page-left .legend-container {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    align-items: center;
    gap: clamp(8px, 1.2vw, 14px);
  }
  html[data-theme="book"] .page-left .legend { flex-wrap: wrap; }
  /* 낱말이 글자 단위로 쪼개지지 않게 — 못 들어가면 통째로 다음 줄에 간다 */
  html[data-theme="book"] .page-left .legend-item span,
  html[data-theme="book"] .page-left .stat-title,
  html[data-theme="book"] .page-left .stat-details span { white-space: nowrap; }
}

/* 오른쪽 지면 머리말 — 열이 절반이라 제목이 버튼에 닿는다.
   ⚠️ 제목 크기가 3.4vw 라 **화면 폭**을 따라 커지는데, 펼침면에서 제목이 앉는 곳은
      화면이 아니라 **절반 열**이다. 그래서 열 기준으로 다시 잡는다. */
@media (min-width: 1000px), (min-width: 900px) and (min-height: 501px) {
  /* ⚠️ flex-wrap 으로 두었더니 제목이 한 글자 길어지는 달(9월)에 **"다음달 ▶"이
        아래 줄로 떨어졌다.** 3열 격자로 못 박아 무슨 달이든 한 줄을 지킨다.
        (가운데 1fr 이 남는 폭을 다 먹으므로 양쪽 버튼은 항상 끝에 붙는다) */
  html[data-theme="book"] .page-right .header {
    display: grid !important;
    grid-template-columns: auto minmax(0, 1fr) auto;
    align-items: center;
    gap: clamp(4px, 0.8vw, 12px);
    flex-wrap: nowrap;
  }
  /* 제목+"이번달로" 묶음이 max-content 라 안 줄어든다 — 펼침면에서는 풀어 준다 */
  html[data-theme="book"] .page-right .month-title-container {
    min-width: 0;
    justify-self: center;
  }
  html[data-theme="book"] .page-right .month-title {
    font-size: clamp(16px, 1.8vw, 23px) !important;
  }
}

/* ============================================================
   책장 넘김 (2026-08-21) — 지면을 **띠로 복제해** 원기둥에 감는다.
   ⭐ 띠 안에 든 것은 진짜 DOM 복제다. 베낀 그림이 아니라 **화면 그 자체**라
      글자 크기·자리·밑줄이 어긋날 수가 없다.
   ⚠️ 각도·위치 계산은 book-turn.js 의 bend() 가 한다. 여기는 **무대와 재질**만 정한다.
   ============================================================ */
.bc-turn-stage {
  perspective: 2600px;
  perspective-origin: center center;
  transform-style: preserve-3d;
}
.bc-strip {
  /* ⚠️ 지면(.page-*)은 배경이 없다 — 종이 바탕은 속지(.container::before)가 그린다.
        띠에 종이색을 깔지 않으면 돌아가는 내내 **아래(새 달)가 그대로 비친다.** */
  background: var(--paper);
  backface-visibility: visible;   /* 뒤집힌 띠는 종이 뒷면처럼 비쳐 보인다 */
  /* ⚠️ 띠마다 그림자를 주면 **이음새가 세로 줄로** 드러난다. 입체감은 명암(filter:
        brightness — book-turn.js 가 굽은 각도로 계산한다)만으로 낸다. */
}
/* 넘기는 동안에는 아래 지면을 만지지 못하게 — 띠가 덮고 있어 잘못 눌린다 */
.container.bc-turning .page-left,
.container.bc-turning .page-right,
.container.bc-turning .calendar-frame { pointer-events: none; }

/* 종이 뒷면 — **아무것도 안 그린다.** 종이색과 음영만으로 충분하다(사용자 결정).
   거울상 글자를 비치게 해 봤지만 어수선하기만 했다.
   ⚠️ 뒷면 막(.bc-back-face)은 book-turn.js 가 띠 안에 **종이 영역 크기로** 넣고 켠다 —
      예전의 .bc-strip::after 는 띠 전체를 덮어, 무대가 탭까지 넓어진 뒤로는 가죽 위에도
      막이 생겨 뺐다(2026-09-03). */

/* ============================================================
   페이지 필 (2026-09-06) — 읽기 화면의 책장 넘김. 네이버 시리즈 뷰어 벤치마크.
   ⭐ 층은 book-turn.js 의 peelMake 가 만든다(무대·앞면·뒷면·그림자·반대 장 덮개).
      기하(접힘선·clip-path·반사 변환·명암 그라데이션)는 전부 JS 가 인라인으로 넣는다.
      여기는 **재질**만 — 종이색·뒷면색·글자 선택 금지.
   ⚠️ 지면(.read-sheet)은 배경이 없다(종이 바탕은 속지 ::before). 앞면·뒷면 층에 종이색을
      깔지 않으면 접히는 동안 아래 새 면이 그대로 비친다.
   ============================================================ */
/* ⚠️ paint 를 가두면 무대 밖으로 나가는 종이가 잘린다. 무대는 이미 제 overflow:hidden 으로
   화면 가장자리에서 자르므로 paint 가두기는 중복이고, 실물처럼 표지 밖으로 들리는 종이를 지운다
   (2026-09-10). 레이아웃·스타일 가두기는 성능을 위해 남긴다. */
html[data-theme="book"] .bc-peel-stage { contain: layout style; }
/* 넘기는 동안 표지가 자식을 자르지 않게 한다 — 무대는 body 에 붙이지만
   촤르륵 밑장(.bc-riffle-base)은 아직 표지 안에 있다. */
html[data-theme="book"] .container.bc-peeling,
html[data-theme="book"] .container.bc-turning { overflow: visible; }
/* ⚠️ 폰 월 이동 줄은 fixed 인데도 **지면(.page-right, z-index:2)의 쌓임 맥락 안**에 갇혀 있다
   (아래 1916 줄 참고). 무대가 표지 밖(body)으로 나간 뒤로는 그 갇힘 때문에 줄이 무대 아래로
   내려가, 넘기기 시작하는 순간 줄이 통째로 사라졌다 — 화면 구성이 확 바뀌어 보인다
   (2026-09-17 사용자: "글자 여백이 달라져서 어색하다", 첫 프레임 캡처로 확인).
   넘기는 동안만 맥락을 풀어 줄을 화면 층(9985)으로 돌려놓는다. 지면끼리 실제로 겹치는 것은
   이 줄뿐이라 다른 영향이 없다(1916 줄의 근거와 같다). */
html[data-theme="book"] .container.bc-peeling > .calendar-book-pages > .page-right,
html[data-theme="book"] .container.bc-turning > .calendar-book-pages > .page-right { z-index: auto; }
/* ⭐ 복제본은 **지금 화면에 이미 떠 있는 것의 사진**이다. 복제하면 CSS 애니메이션은 처음부터
   다시 돈다 — 달력 칸에 걸린 `.fade-in`(opacity 0 → 1, 칸마다 0.05s 지연, calendar.js)이
   되살아나, 넘기기 시작하는 순간 날짜가 사라졌다가 물결처럼 떠올랐다
   (2026-09-17 사용자: "책장에 원래 있던 내용들이 모양이 달라진다", 실측 opacity 1 → 0.65).
   무대 층(.bc-peel-*)은 JS 가 프레임마다 직접 그리므로 CSS 애니메이션을 쓰지 않는다. */
html[data-theme="book"] .bc-peel-stage *,
html[data-theme="book"] .bc-riffle-base *,
html[data-theme="book"] .bc-riffle-pile * { animation: none !important; }
/* ⚠️ animation 만 끄면 `.fade-in { opacity: 0 }` 이 남아 내용이 아예 안 보인다. */
html[data-theme="book"] .bc-peel-stage .fade-in,
html[data-theme="book"] .bc-riffle-base .fade-in,
html[data-theme="book"] .bc-riffle-pile .fade-in { opacity: 1 !important; transform: none !important; }
/* 복제본 안의 .read-flow 는 will-change:transform(read.css)을 물려받아 잎마다 합성 층을 하나씩 더 만든다 —
   폰에서 층 수·GPU 메모리만 늘린다(깜빡임 후보, 2026-09-07). 복제본은 움직이지 않으니 층을 만들지 않는다. */
html[data-theme="book"] .bc-peel-stage .read-flow { will-change: auto; }
html[data-theme="book"] .bc-peel-front,
html[data-theme="book"] .bc-peel-cover { background: var(--paper); overflow: hidden; }
/* ⭐ 덮개는 **제 쌓임 맥락**을 가져야 한다. 안 그러면 복제한 옛 달의 z-index 조각(달력 칸·머리글·통계 z=1~2)이
   무대 안에서 위 층과 순서를 다투어, 덮개 위로 넘어오는 새 달 앞면(z 없음)보다 **위에** 그려진다 —
   폰 다음달(역재생, 덮개가 있는 유일한 폰 경로)에서 새 종이가 반투명해 보이고 두 달 글자가 포개졌다(2026-10-07 사용자). */
html[data-theme="book"] .bc-peel-cover { isolation: isolate; }
html[data-theme="book"] .bc-peel-front { will-change: clip-path; }
html[data-theme="book"] .bc-peel-back {
  background: var(--paper);
  overflow: hidden;
  will-change: transform, clip-path;
}
/* 폰(한 장): 뒷면은 종이 뒷면색. 앞면 글자는 얇은 종이처럼 아주 옅게만 비친다(JS 가 0.08) */
html[data-theme="book"] .bc-peel-back--paper { background: var(--paper-back); }
/* 뒷면 인쇄는 JS(peelDraw)가 .bc-peel-back-content 의 진하기를 낮춰 흐린다 — 종이색 겹을 덮으면
   알약 버튼 같은 불투명한 조각이 그대로 남아 종이 위에 떠 보였다(2026-09-08). */
html[data-theme="book"] .bc-peel-shadow { overflow: hidden; }
/* 명암 — 잎 크기의 층 3장. JS 가 접힘선의 방향(--peel-angle)과 그라데이션 선 위의 위치(--peel-pos)만 넣는다.
   폭(--peel-w1/--peel-w2)은 무대를 만들 때 지면 폭 비율로 한 번 넣는다.
   ⚠️ 예전엔 대각선 2.2배 정사각형(폰 ~1700px²)을 프레임마다 돌려 놓았다 — 큰 합성 층 3개가 GPU 메모리를 먹고
      cssText 를 통째로 다시 써 레이아웃까지 일으켰다(폰 웨일 '파바바박' 후보, 2026-09-07). 지금은 배경만 바뀐다.
   ⚠️ 인라인 그라데이션은 위 `[style*="linear-gradient"]` 규칙이 지우므로 반드시 여기 둔다. */
html[data-theme="book"] .bc-peel-shadow-g,
html[data-theme="book"] .bc-peel-front-g,
html[data-theme="book"] .bc-peel-back-g { will-change: opacity; }   /* 제 층 — 배경이 바뀌어도 글자 층은 다시 안 그린다 */
html[data-theme="book"] .bc-peel-shadow-g {            /* 들린 종이가 새 면에 드리우는 그림자(접힘선 바깥) */
  background-image: linear-gradient(var(--peel-angle, 90deg),
    transparent calc(var(--peel-pos, 0px) - 1px), rgba(40, 25, 10, 0.34) var(--peel-pos, 0px),
    rgba(40, 25, 10, 0.20) calc(var(--peel-pos, 0px) + var(--peel-w1, 24px)),
    transparent calc(var(--peel-pos, 0px) + var(--peel-w2, 80px)));
}
html[data-theme="book"] .bc-peel-front-g {             /* 앞면 접힘선 안쪽 — 종이가 굽는 자리 */
  background-image: linear-gradient(var(--peel-angle, 90deg),
    transparent calc(var(--peel-pos, 0px) - var(--peel-w1, 30px)), rgba(40, 25, 10, 0.18) var(--peel-pos, 0px),
    transparent calc(var(--peel-pos, 0px) + 1px));
}
html[data-theme="book"] .bc-peel-back-g {              /* 뒷면 원통 명암 — 접힘선 가까이 밝고 멀수록 살짝 어둡다 */
  background-image: linear-gradient(var(--peel-angle, 90deg),
    transparent calc(var(--peel-pos, 0px) - 1px), rgba(255, 255, 255, 0.30) var(--peel-pos, 0px),
    rgba(40, 25, 10, 0.16) calc(var(--peel-pos, 0px) + var(--peel-w1, 30px)),
    rgba(40, 25, 10, 0.06) calc(var(--peel-pos, 0px) + var(--peel-w2, 140px)),
    rgba(40, 25, 10, 0.06) 100%);
}
/* 잎·뒷면·덮개·그림자의 모서리 = 종이의 모서리(15-7 의 --paper-r). 읽기 화면은 잎이 종이 전체(폰) 또는 절반(펼침면)이라
   바깥 모서리가 종이 모서리와 겹친다 — 사각 층이면 넘김이 시작되는 순간 종이 밖 가죽 위에 종이색 귀가 튀어나온다.
   폰 본문은 왼쪽 책등이라 오른쪽만 둥글고, 폰 달력(`page-left`)은 오른쪽 책등이라 아래 899px 규칙에서 왼쪽만 둥글다.
   펼침면: 오른쪽 장은 오른쪽만, 왼쪽 장(거울 무대)은 왼쪽만. */
/* ⭐ **달력·읽기 화면 모두**에 건다(2026-09-08 사용자: "모션에서만 종이 네 모서리가 각지게 나온다").
   쉬고 있는 종이는 모서리가 둥근데(15-7 --paper-r) 넘어가는 종이만 각지면 다른 물건으로 보인다.
   책등 쪽은 각지고 바깥 쪽만 둥글다 — 폰은 화면별 면 방향, 펼침면은 잎이 어느 쪽 장이냐에 따른다. */
html[data-theme="book"] .bc-peel-front,
html[data-theme="book"] .bc-peel-back,
html[data-theme="book"] .bc-peel-shadow,
html[data-theme="book"] .bc-peel-cover,
html[data-theme="book"] .bc-riffle-base,
html[data-theme="book"] .bc-riffle-pile { border-radius: 0 var(--paper-r) var(--paper-r) 0; }
@media (min-width: 1000px), (min-width: 900px) and (min-height: 501px) {
  /* 펼침면: 잎(오른쪽 장)은 오른쪽만, 덮개(왼쪽 장)는 왼쪽만 둥글다. 거울 무대는 서로 바뀐다. */
  html[data-theme="book"] .bc-peel-cover,
  html[data-theme="book"] .bc-peel-stage--mirror .bc-peel-front,
  html[data-theme="book"] .bc-peel-stage--mirror .bc-peel-back,
  html[data-theme="book"] .bc-peel-stage--mirror .bc-peel-shadow { border-radius: var(--paper-r) 0 0 var(--paper-r); }
  html[data-theme="book"] .bc-peel-stage--mirror .bc-peel-cover { border-radius: 0 var(--paper-r) var(--paper-r) 0; }
}
/* ⭐ 달력 종이 위의 **가로 제스처는 우리 것**이라고 선언한다. 안 하면 브라우저가 가로 스와이프를
   스크롤·뒤로가기로 가져가며 pointercancel 을 보내 넘김이 도중에 되돌아간다
   (읽기 화면은 .read-spread 에 같은 선언이 있어 잘 됐다 — 달력에만 빠져 있었다, 2026-09-08).
   세로는 그대로 스크롤한다.
   ⚠️ **책 전체(.container)에 건다.** 폰에서는 지면(.page-*)이 `display: contents` 라 상자가 없어
   거기 건 touch-action 은 아무 효과가 없다 — 달력 격자 아래(통계·범례·광고 자리)에서만 브라우저가
   가로 스와이프를 가져가 pointercancel 이 났다(2026-09-08 사용자가 자리를 짚어 주었다:
   "달력 일자가 적혀있는 높이에서는 잘 되는데 아랫쪽에서만 인식을 못하네"). 실측으로 확인:
   y=300 은 pointerdown→move…, y=700 은 pointerdown→move→**pointercancel**.
   달력 화면에는 가로로 스크롤하는 것이 없으므로 책 전체에 걸어도 잃는 것이 없다. */
html[data-theme="book"] .container.calendar-book { touch-action: pan-y; }
/* ⚠️ 폰의 지면 묶음(.calendar-book-pages)은 **세로 스크롤 상자**다. touch-action 은 손이 닿은 요소에서
   가장 가까운 스크롤 상자까지의 조상만 합쳐 정하므로, 위 선언이 이 상자 안에서 시작한 손짓에는 닿지 않는다.
   격자 아래 빈 자리에서 끌면 넘김이 시작되기도 전(40ms)에 웨일이 pointercancel 을 보냈다
   (2026-10-07 플립 기록기: 71.5초·73.1초 두 번). 상자 자신에도 같은 선언을 건다. */
html[data-theme="book"] .container.calendar-book .calendar-book-pages { touch-action: pan-y; }

/* ⚠️ 무대(넘어가는 종이)의 복제본에서 **화면에 떠 있는 것**은 지운다. 복제본은 종이의 일부로 함께 접히는데,
   달 이동 줄은 화면에 고정된 조작 줄이라 종이에 한 벌 더 인쇄된 것처럼 보였다(2026-09-08 사용자 녹화로 드러남).
   줄이 PC 에서도 보이게 되면서 지면(.page-right) 복제에 딸려 들어온 것이다. */
html[data-theme="book"] .bc-peel-stage .mobile-month-nav,
html[data-theme="book"] .bc-riffle-base .mobile-month-nav,
html[data-theme="book"] .bc-riffle-pile .mobile-month-nav { display: none !important; }

/* ⭐ 폰(한 장 화면)의 월 색인은 **종이 책배에 파인 홈**이다(핸드북 §0-1 실물 기준) — 그 종이가
   넘어가면 색인도 함께 넘어간다. 그래서 무대 복제본의 색인은 **지우지 않는다.** 대신 넘어가는 잎이
   색인을 싣고 있는 동안에는 아래의 **진짜 색인을 감춘다** — 안 그러면 같은 탭이 두 벌 보이고,
   지우기만 하면 넘기는 내내 색인이 사라진다(2026-09-08 사용자: "왼쪽으로 넘길 때 색인이 사라지네").
   ⚠️ 경로를 **실제 DOM 그대로** 적을 것. `.container > .page` 로 적혀 있던 동안 이 규칙은 한 번도
      맞지 않았다 — 사이에 `.calendar-book-pages` 래퍼가 있다. 넘기는 내내 색인이 두 벌 보였고,
      겹쳐 있던 두 벌 중 한 벌이 종이와 함께 돌아 나가 **색인이 딴 자리로 튀는 것처럼** 보였다
      (2026-09-23 사용자, 핸드북 §22). 무대는 body 에 붙으므로(peelMake) 복제본은 안 걸린다. */
html[data-theme="book"] .container.bc-turn-carries-index > .calendar-book-pages > .page .month-index { visibility: hidden; }

/* ⭐ 넘김 중에도 **책의 세간은 제자리에 남는다**(2026-09-22 사용자 녹화: "애니메이션 중간에 이상한 장면").
   무대는 종이에 인쇄된 것만 복제하는데(read.js paperParts), 그 종이가 책등 그늘·책배 색인·가름끈이 있던
   자리를 덮어 넘김이 시작되는 프레임에서 셋이 한꺼번에 사라졌다가 끝나면 돌아왔다 — 시작과 끝에서 두 번 튄다.
   1280x800 실측: 책등 띠 가운데가 접힘 그늘 rgb(207,194,173) → 종이색 rgb(243,233,214) 로 평평해졌다.
   실물에서 접힘 그늘·책배 홈·가름끈은 **책의 것**이고 넘어가는 장이 그 밑을 지난다 — 무대(9980) 위로 올린다.
   ⚠️ 9984(광고 도크)보다 낮게 둔다 — book-turn.js STAGE_Z 주석의 층 순서를 깨지 않는다.
   ⚠️ 폰 달력 월 색인은 여기 없다 — 그쪽은 잎이 색인을 싣고 아래 진짜 색인을 감추는 방식이다(바로 위 규칙). */
/* 책등 그늘은 여기서 올리지 않는다 — 잎 복제본에 실어 넘긴다(book-turn.js spineOnLeaf, 2026-10-07: 폰에서 잎 위로 그늘선이 올라왔다). */
html[data-theme="book"] :is(.container.bc-peeling, .container.bc-turning)::after { z-index: 9981; }
html[data-theme="book"] :is(.container.read-book.bc-peeling, .container.read-book.bc-turning) > .book-index { z-index: 9981 !important; }

/* ⭐ 펼침면 월 색인은 책의 것이다 — 읽기 화면 색인과 같이 무대 위에 제자리로 남긴다(핸드북 §22).
   폰처럼 잎에 싣지 못하는 이유: 색인은 position:absolute 에 top/bottom/right 로 잡혀 있고 정지 상태의
   기준 상자는 .container.calendar-book 인데(펼침면에서 .calendar-book-pages 는 display:contents 라
   상자를 안 만든다), 무대 안에서는 복제된 .page-right 가 기준이 되어 값이 다시 풀린다 —
   1280x800 실측 1152,143 44x432 → 1119,176 44x365 로 33px 어긋난 자리에 섰다(2026-09-23 사용자: "튄다").
   조상에 쌓임 문맥이 없어 올릴 수 있다(폰은 .calendar-book-pages 가 z-index:1 스크롤 상자라 못 올린다). */
@media (min-width: 1000px), (min-width: 900px) and (min-height: 501px) {
  html[data-theme="book"] :is(.container.bc-peeling, .container.bc-turning) .month-index { z-index: 9981 !important; }
  /* 진짜 색인이 제자리에 남으니 무대 복제본의 색인은 지운다 — 두면 어긋난 자리에 한 벌 더 보인다. */
  html[data-theme="book"] .bc-peel-stage .month-index,
  html[data-theme="book"] .bc-riffle-base .month-index,
  html[data-theme="book"] .bc-riffle-pile .month-index { visibility: hidden; }
}

html[data-theme="book"] .bc-peel-stage .read-sheet { box-shadow: none; }
html[data-theme="book"] .bc-peel-stage .read-flow { transition: none !important; }
/* 끌어 넘기는 동안 글자가 선택되지 않게. 아래 지면은 덮여 있으니 누르지도 못하게 */
html[data-theme="book"] .read-book.bc-peeling { user-select: none; -webkit-user-select: none; }
html[data-theme="book"] .read-book.bc-peeling .read-spread { pointer-events: none; }
/* 복제본 안의 머리글·아래 줄은 .container > * 규칙(z-index 층)을 안 받는다 — 종이 위에 평평하게 */
html[data-theme="book"] .bc-peel-stage .read-header,
html[data-theme="book"] .bc-peel-stage .read-foot { z-index: auto; }
/* ⚠️ 필은 첫 픽셀부터 아래 새 면을 드러낸다. .read-flow 의 transform 전환(280ms)이 살아 있으면
      새 면이 미끄러져 들어오는 도중이 접힌 자리로 비친다(첫 캡처에서 단이 조각나 보였다). */
html[data-theme="book"] .read-book.bc-peeling .read-flow { transition: none !important; }
/* 가림판(.bc-peel-shield)이 옛 면의 글자를 대신 보여 주는 동안 진짜 지면의 글자는 숨긴다 — 장 경계·색인 넘김에서
   새 장으로 바뀐 글자가 무대보다 먼저 비치지 않게(2026-10-13 플립6). 종이·책등·색인은 그대로 보인다.
   자리는 그대로 남아야 하므로(복제·측정) display 가 아니라 visibility 다. */
.read-book.bc-shielded .read-header,
.read-book.bc-shielded .read-spread { visibility: hidden; }

/* ============================================================
   고전 판면 (2026-08-21) — "모든 걸 고전 느낌으로" (사용자 요청)

   ⭐ 이 절의 원칙은 위 「가독성 수리」와 같다. **분위기보다 읽히는 것이 먼저다.**
      색을 새로 쓰면 종이색(#f3e9d6) 대비를 계산해 값 옆에 적는다.
   ⭐ 여기서 하는 일은 넷이다.
      1) 활자 — 웹폰트로 실제 명조·가라몽을 신는다(위 --serif 참고)
      2) 판면 — 광곽(匡郭)·계선(界線)·어미(魚尾) 같은 고서 요소를 넣는다
      3) 금속 — 둥근 알약을 네모난 활판 상자로 바꾼다
      4) 그림 — 컬러 이모지를 걷어내고 활자 장식으로 대신한다
   ============================================================ */

html[data-theme="book"] {
  /* 장식용 마름모 — 고서의 어절 구분표(❖)에서 가져왔다. 글자색이 아니라 장식색이다. */
  --ornament: rgba(176, 138, 60, 0.85);
  /* 계선은 괘선보다 옅게 — 같은 굵기로 두면 달력이 장부(스프레드시트)처럼 보인다 */
  --rule-v: rgba(120, 90, 45, 0.10);
}

/* ── 1. 활자 다듬기 ───────────────────────────────────────
   ⚠️ 한국어는 기본이 **글자 단위** 줄바꿈이다. 낱말째 넘기려면 keep-all 이 필요하고,
      그것만 두면 긴 낱말이 상자를 삐져나가므로 break-word 를 짝으로 준다. */
html[data-theme="book"] body {
  font-family: var(--serif);
  /* 가라몽은 합자(fi·fl)와 커닝이 살아 있을 때 제 모양이 난다 */
  font-kerning: normal;
  font-feature-settings: "kern" 1, "liga" 1, "clig" 1;
  word-break: keep-all;
  overflow-wrap: break-word;
}

/* 제목은 송명조로 — 붓에서 온 획이라 본문 명조보다 훨씬 고서에 가깝다.
   ⚠️ 송명조는 400 한 벌뿐이다. 굵기를 올리면 브라우저가 획을 부풀려 뭉갠다 → 400 고정. */
html[data-theme="book"] .month-title,
html[data-theme="book"] .login-title,
html[data-theme="book"] .register-title,
html[data-theme="book"] .header h1,
html[data-theme="book"] h1 {
  font-family: var(--serif-display) !important;
  font-weight: 400 !important;
  letter-spacing: 0.06em;
}

/* 숫자 ────────────────────────────────────────────────────
   ⚠️ EB Garamond 의 기본 숫자는 **옛숫자(oldstyle)** 라 3·4·5·7·9 가 밑으로 내려간다.
      본문 속에서는 그게 고전적이지만, 달력처럼 **격자에 줄 맞춰 서는 숫자**에 쓰면
      같은 칸의 숫자끼리 높이가 달라 보인다. 그래서 자리를 갈라 쓴다:
        · 격자·수치(달력 날짜·통계·판번호) → lining  (줄 맞춤이 먼저)
        · 산문(난외주 날짜·판권지·성구)     → oldstyle (고서의 맛) */
html[data-theme="book"] .day-number,
html[data-theme="book"] .day-chapters-badge,
html[data-theme="book"] .stats-container,
html[data-theme="book"] .stat-details,
html[data-theme="book"] .version-number,
html[data-theme="book"] .update-date,
html[data-theme="book"] .calendar-table {
  font-variant-numeric: lining-nums tabular-nums;
  font-feature-settings: "lnum" 1, "tnum" 1;
}
html[data-theme="book"] .margin-note,
html[data-theme="book"] .page-verse,
html[data-theme="book"] .business-info-compact,
html[data-theme="book"] .release-date,
html[data-theme="book"] .release-section li {
  font-variant-numeric: oldstyle-nums proportional-nums;
  font-feature-settings: "onum" 1, "pnum" 1;
}

/* ── 2. 종이 — 세월 얼룩(foxing) ──────────────────────────
   ⚠️ 위쪽 `.container::before` 규칙을 **통째로 다시 적는다.** background 는 층 목록이라
      한 층만 덧붙일 수 없다. 기존 층(책등 그늘·종이 결·종이색)은 그대로 두고 얼룩을 얹었다.
   ⚠️ 알파는 0.05 를 넘기지 않는다 — 넘기면 그 자리의 글자 대비가 떨어진다. */
html[data-theme="book"] .container::before {
  background:
    radial-gradient(ellipse 6% 4% at 12% 22%, rgba(150, 110, 55, 0.05), transparent 70%),
    radial-gradient(ellipse 4% 3% at 84% 12%, rgba(150, 110, 55, 0.045), transparent 70%),
    radial-gradient(ellipse 8% 3% at 70% 78%, rgba(150, 110, 55, 0.04), transparent 70%),
    radial-gradient(ellipse 5% 4% at 28% 88%, rgba(150, 110, 55, 0.05), transparent 70%),
    linear-gradient(90deg, rgba(70, 45, 20, 0.18) 0%, rgba(70, 45, 20, 0.05) 4%, transparent 9%),
    repeating-linear-gradient(0deg, rgba(0, 0, 0, 0.012) 0 2px, transparent 2px 4px),
    var(--paper);
}

/* 표지 — 고서는 모서리가 거의 각지다. 둥근 정도를 확 줄이고 가장자리에 금박 테를 두른다 */
html[data-theme="book"] .container {
  border-radius: 3px;
  box-shadow:
    0 clamp(10px, 2vh, 26px) clamp(20px, 4vh, 60px) rgba(0, 0, 0, 0.55),
    inset 0 0 0 1px rgba(255, 255, 255, 0.06),
    inset 0 0 0 clamp(5px, 0.7vw, 9px) rgba(0, 0, 0, 0.14),
    inset 0 0 0 calc(clamp(5px, 0.7vw, 9px) + 1px) rgba(184, 145, 47, 0.30);
}
html[data-theme="book"] .container::before { border-radius: 1px; }

/* ── 3. 광곽(匡郭) — 판면을 두 줄로 두른다 ────────────────
   고서의 사주쌍변(四周雙邊). `outline` 은 바깥으로 그려지고 offset 을 줄 수 있어
   테두리 한 벌만으로 **두 줄**이 된다(가짜 요소를 하나 더 만들 필요가 없다).
   ⚠️ 표(.calendar-table)가 아니라 틀(.calendar-frame)에 건다 — book-turn.js 가
      넘길 때 표를 통째로 갈아 끼우므로 표에 걸면 테가 같이 사라진다. */
html[data-theme="book"] .calendar-frame {
  border: 1px solid rgba(120, 90, 45, 0.42);
  outline: 1px solid rgba(120, 90, 45, 0.22);
  outline-offset: 4px;
  padding: clamp(6px, 1.2vw, 14px) clamp(4px, 0.9vw, 12px);
  /* 테가 화면·이웃 요소에 닿지 않게 outline 두께+offset 만큼 자리를 비운다 */
  margin: clamp(8px, 1.6vh, 16px) 6px clamp(12px, 2.2vh, 22px);
  background: rgba(255, 253, 246, 0.28);
}

/* ── 4. 계선(界線) — 칸 사이 세로줄 ───────────────────────
   고서에서 글줄을 가르던 선. 가로 괘선보다 **옅게** 둔다(같으면 장부처럼 보인다). */
html[data-theme="book"] .calendar-table th,
html[data-theme="book"] .calendar-table td {
  border-right: 1px solid var(--rule-v) !important;
}
html[data-theme="book"] .calendar-table th:last-child,
html[data-theme="book"] .calendar-table td:last-child {
  border-right-color: transparent !important;
}
/* 요일줄 아래는 쌍선 — 머리와 본문을 가르는 자리다 */
html[data-theme="book"] .calendar-table thead th {
  border-top: 1px solid var(--rule-strong) !important;
  border-bottom: 3px double var(--rule-strong) !important;
  padding-top: clamp(4px, 0.8vh, 9px) !important;
}

/* ── 5. (걷어냄) 어미(魚尾) — 2026-09-08 ────────────────────
   책등 한가운데의 ▼▲ 는 고서(선장본)의 판심에 찍던 표다. **성경책에는 없다.**
   이 앱의 대전제는 "실물 성경책"이므로(핸드북 맨 앞) 고서 장식은 여기 있을 자리가 아니다.
   읽기 화면에서는 이미 걷었고("책등이 씹힌 것 같다", 2026-09-07), 달력에만 남아 있던 것을
   사용자가 "저 위아래 화살표는 뭐냐"고 물어 같은 이유로 걷는다. 책등은 접힘 그늘 하나면 된다. */

/* ── 6. 활판 상자 — 둥근 알약을 네모로 ────────────────────
   ⚠️ 위 「가독성 수리」에서 `border-radius: 999px !important` 로 못 박아 둔 것들이라
      여기서 다시 !important 로 눌러야 이긴다(같은 파일 안이라 순서로도 이기지만,
      원본 calendar.css 의 !important 도 함께 눌러야 해서 그대로 둔다).
   활판 느낌 = 얇은 테두리 + 안쪽 실선 한 겹(눌린 자국). 그림자는 쓰지 않는다. */
html[data-theme="book"] .nav-btn,
html[data-theme="book"] .today-link,
html[data-theme="book"] .version-badge,
html[data-theme="book"] .auth-badge,
html[data-theme="book"] .admin-badge,
html[data-theme="book"] .goal-btn,
html[data-theme="book"] .goal-setting-btn,
html[data-theme="book"] .login-btn,
html[data-theme="book"] .donate-btn,
html[data-theme="book"] .coffee-button,
html[data-theme="book"] .submit-btn,
html[data-theme="book"] .btn,
html[data-theme="book"] .form-input,
html[data-theme="book"] .back-btn {
  border-radius: 2px !important;
  font-family: var(--serif) !important;
  letter-spacing: 0.03em;
  word-break: keep-all;
}
html[data-theme="book"] .nav-btn,
html[data-theme="book"] .today-link,
html[data-theme="book"] .version-badge,
html[data-theme="book"] .auth-badge,
html[data-theme="book"] .admin-badge,
html[data-theme="book"] .goal-setting-btn,
html[data-theme="book"] .coffee-button {
  box-shadow: inset 0 0 0 1px rgba(255, 253, 246, 0.55) !important;
}
/* 금박 칩(판번호)·로그아웃 칩은 안쪽 조각이라 네모로만 맞춘다 */
html[data-theme="book"] .version-number,
html[data-theme="book"] .auth-action { border-radius: 2px !important; }

/* 이동 화살표 — 글자보다 한 단 작게, 잉크빛을 옅게 */
html[data-theme="book"] .nav-icon {
  font-size: 0.8em;
  color: var(--gilt);
  vertical-align: 0.05em;
}

/* 범례 색칠 — 도장처럼 각지게 */
html[data-theme="book"] .legend-item .legend-color,
html[data-theme="book"] .legend-color {
  border-radius: 0 !important;
  width: 0.85em; height: 0.85em;
}

/* ── 7. 진행 막대 — 종이에 눌린 홈과 금박 채움 ────────────
   ⚠️ 트랙과 채움을 **갈라** 칠한다. 둘 다 칠하면 늘 100% 처럼 보인다(이미 겪었다).
      여기서는 모양만 네모로 바꾸고 색 규칙은 위 절을 그대로 따른다. */
html[data-theme="book"] .progress-bar,
html[data-theme="book"] .stat-progress {
  border-radius: 0 !important;
  height: 7px !important;
  border: 1px solid rgba(120, 90, 45, 0.30) !important;
  box-shadow: inset 0 1px 2px rgba(90, 70, 40, 0.16) !important;
}
html[data-theme="book"] [class*="progress"] > div { border-radius: 0 !important; }

/* ── 8. 장식 괘선 — 마름모를 문 가는 줄 ───────────────────
   가운데 ❖ 하나에 양쪽으로 가늘어지는 금박 선. 고서의 어절 구분표에서 가져왔다. */
html[data-theme="book"] .page-verse::before,
html[data-theme="book"] .page-verse::after {
  content: "❖";
  display: block;
  text-align: center;
  color: var(--ornament);
  font-size: 0.8em;
  line-height: 1;
  letter-spacing: 0;
  margin: 0.5em auto;
  width: 60%;
  /* 마름모 좌우로 뻗는 실선 — 글자 가운데 높이에 걸린다 */
  background:
    linear-gradient(90deg, transparent, var(--gilt) 45%, transparent 46%,
                    transparent 54%, var(--gilt) 55%, transparent) center/100% 1px no-repeat;
}
/* 성구 자체는 인용이므로 조금 더 눕히고 자간을 준다 */
html[data-theme="book"] .page-verse {
  font-family: var(--serif) !important;
  letter-spacing: 0.02em;
}

/* 난외주 머리 — 고서의 어깨표처럼 마름모를 앞에 세운다 */
html[data-theme="book"] .margin-note-title::before {
  content: "❖ ";
  color: var(--ornament);
  font-weight: 400;
}
html[data-theme="book"] .margin-note-title {
  font-family: var(--serif) !important;
  letter-spacing: 0.14em;
}
/* 난외주 본문 — 관주는 원래 잔글씨다. 자간을 조금 벌려 읽기를 지킨다 */
html[data-theme="book"] .margin-note { letter-spacing: 0.01em; }

/* 범례줄 위 괘선을 쌍선으로 — 판면과 주석을 가르는 자리 */
html[data-theme="book"] .legend-container {
  border-top: 3px double var(--rule-strong) !important;
}

/* ── 9. 컬러 이모지를 걷어낸다 ────────────────────────────
   ⭐ 이모지는 글자색(color)으로 안 바뀐다 — **색 그림**이라 테마를 덮어도 혼자 남는다.
      본문 뜻을 지고 있지 않은 장식 이모지만 지운다(기능 아이콘은 아래에서 활자로 바꾼다).
   ⚠️ 붙박이 텍스트로 박힌 것은 CSS 로 못 잡는다 → 템플릿에서 `.ui-emoji` 로 감쌌다
      (index/login/register/release_notes). 기본 테마에서는 그냥 span 이라 아무 변화가 없다. */
html[data-theme="book"] .ui-emoji,
html[data-theme="book"] .auth-icon,
html[data-theme="book"] .admin-icon { display: none !important; }

/* CSS 로 박힌 것들 — 마름모나 빈 값으로 갈아 끼운다 */
html[data-theme="book"] .stat-title::before {
  content: "❖ " !important;
  color: var(--ornament);
}
html[data-theme="book"] .coffee-button::before { content: "" !important; }
html[data-theme="book"] .header h1::before { content: "" !important; }

/* 설정 카드 — 흰 유리 대신 책 위에 놓인 종이 쪽지로 */
html[data-theme="book"] .dock-items {
  background: rgba(246, 236, 216, 0.97) !important;
  border: 1px solid rgba(164, 126, 63, 0.34);
  box-shadow: 0 8px 24px rgba(22, 13, 9, 0.30) !important;
}
html[data-theme="book"] .dock-row-label {
  font-family: var(--serif) !important;
  color: var(--ink) !important;
}

/* 커피 후원 — 책 사이에 끼운 쪽지처럼 */
html[data-theme="book"] .coffee-button {
  background: linear-gradient(180deg, #f3e6c9, #e6d3aa) !important;
  color: var(--ink) !important;
  border: 1px solid rgba(184, 145, 47, 0.55) !important;
  text-shadow: none !important;
  font-family: var(--serif) !important;
  letter-spacing: 0.02em;
}

/* ── 10. 로그인·가입 — 속표지처럼 ────────────────────────── */
html[data-theme="book"] .login-container,
html[data-theme="book"] .register-container { border-radius: 2px !important; }
/* 표제 아래위로 장식 괘선 — 옛 속표지의 두 줄 */
html[data-theme="book"] .login-header,
html[data-theme="book"] .register-header {
  border-bottom: 3px double var(--rule-strong) !important;
}
html[data-theme="book"] .login-title::after,
html[data-theme="book"] .register-title::after {
  content: "❖";
  display: block;
  color: var(--ornament);
  font-size: 0.42em;
  line-height: 1;
  margin-top: 0.5em;
  -webkit-text-fill-color: var(--ornament);
}
html[data-theme="book"] .form-input {
  border-radius: 2px !important;
  letter-spacing: 0.02em;
}
/* 라벨 — 고서의 항목표처럼 자간을 벌린다 */
html[data-theme="book"] .form-label {
  letter-spacing: 0.1em;
  font-weight: 700;
}

/* ── 11. 릴리즈 노트 — 판목(版木) 기록처럼 ────────────────
   ⚠️ 이 화면의 스타일은 release_notes.html 안 <style> 에 있다. 그 규칙이 이 파일보다
      **먼저** 실리므로(base.html 은 페이지 CSS 뒤에 테마 CSS 를 싣는다) 여기서 덮인다. */
html[data-theme="book"] .release-item {
  background: rgba(255, 253, 246, 0.72) !important;
  border: 1px solid rgba(120, 96, 60, 0.28) !important;
  border-radius: 2px !important;
  box-shadow: none !important;
  color: var(--ink) !important;
}
/* 판번호 — 보라 그라데이션이 그대로 남아 있었다. 가죽 표지와 같은 재질로 눕힌다(크림 글자 10.4:1) */
html[data-theme="book"] .release-version {
  background: linear-gradient(180deg, #6b4a2a 0%, var(--leather) 100%) !important;
  color: #f6ecd8 !important;
  border-radius: 2px !important;
  font-family: var(--serif) !important;
  letter-spacing: 0.04em;
}
html[data-theme="book"] .release-date { color: var(--ink-soft) !important; }
html[data-theme="book"] .release-commit {
  background: rgba(176, 138, 60, 0.16) !important;
  color: var(--ink-head) !important;
  border: 1px solid rgba(120, 96, 60, 0.30) !important;
  border-radius: 2px !important;
}
html[data-theme="book"] .release-title {
  color: var(--ink) !important;
  font-family: var(--serif-display) !important;
  font-weight: 400 !important;
  letter-spacing: 0.03em;
  border-bottom: 1px solid var(--rule);
  padding-bottom: 0.4em;
}
html[data-theme="book"] .release-section h4 {
  color: var(--ink-head) !important;
  font-family: var(--serif) !important;
  letter-spacing: 0.08em;
}
html[data-theme="book"] .release-section h4::before {
  content: "❖";
  color: var(--ornament);
  font-weight: 400;
}
html[data-theme="book"] .release-section li { color: var(--ink) !important; }
html[data-theme="book"] .release-section ul { list-style: none; padding-left: 1.1em; }
/* 글머리 — 검은 동그라미 대신 고서의 가운뎃점 */
html[data-theme="book"] .release-section li::before {
  content: "·";
  color: var(--ornament);
  font-weight: 700;
  display: inline-block;
  width: 1.1em;
  margin-left: -1.1em;
}
html[data-theme="book"] .release-footer {
  border-top: 3px double var(--rule-strong) !important;
  color: var(--ink-soft) !important;
}
html[data-theme="book"] .release-footer p { color: var(--ink-soft) !important; }
html[data-theme="book"] .release-footer a { color: #7a4a1e !important; }
/* 이 화면의 머리말은 달력의 .header 와 클래스가 같다 — 가운데로 모으고 쌍선을 두른다 */
html[data-theme="book"] .release-notes ~ * { font-family: var(--serif); }

/* ── 12. 통계 상자·목표 버튼 ─────────────────────────────── */
html[data-theme="book"] .stat-box,
html[data-theme="book"] .stats-section,
html[data-theme="book"] .monthly-stats-section,
html[data-theme="book"] .goal-section { border-radius: 2px !important; }
html[data-theme="book"] .stat-title {
  font-family: var(--serif) !important;
  letter-spacing: 0.06em;
}
html[data-theme="book"] .goal-setting-btn {
  background: linear-gradient(180deg, #f3e6c9, #e6d3aa) !important;
  color: var(--ink) !important;
  border: 1px solid rgba(184, 145, 47, 0.55) !important;
  text-shadow: none !important;
  white-space: nowrap;
}

/* ── 13. 펼침면 머리말 — 제목이 '이전달' 버튼을 파고들던 것 ────
   ⚠️ 실측(2026-08-21): 폭 920 에서 **17px**, 1000 에서 **6px** 겹쳤다. 1280 은 21px 남았다.
      → 900~1050 구간에서만 나던 것이라 캡처를 1280 만 보면 못 잡는다.
   원인: `.month-title` 이 `white-space: nowrap` 이라 **줄어들 수가 없는데**,
      `.month-title-container` 가 제목과 '이번달로'를 **가로로** 안고 있어 묶음 폭이
      절반 열보다 넓어졌다. 가운데 정렬이라 넘친 만큼 좌우로 똑같이 삐져나가고,
      왼쪽으로 삐져나간 부분이 '이전달' 버튼 위에 얹혔다.
   → 펼침면에서는 둘을 **세로로** 세운다. 묶음 폭이 둘 중 넓은 쪽으로 줄어 열 안에 들어오고,
      제목 아래 부제가 붙은 책의 머리말 모양이 되어 오히려 고전에 가깝다. */
@media (min-width: 1000px), (min-width: 900px) and (min-height: 501px) {
  html[data-theme="book"] .page-right .month-title-container {
    display: flex;
    flex-direction: column;
    align-items: center;
    gap: clamp(2px, 0.4vh, 6px);
  }
}

/* ── 14. 릴리즈 노트 — 판목 기록을 이어진 종이 위에 ──────────
   ⚠️ `.container:not(.calendar-book)` = 달력이 아닌 컨테이너 = 릴리즈 노트 화면.
      달력(펼침면)에는 걸리지 않는다. */
html[data-theme="book"] .container:not(.calendar-book):not(.read-book) .header {
  display: block !important;
  text-align: center;
  border-bottom: 3px double var(--rule-strong) !important;
}
html[data-theme="book"] .container:not(.calendar-book):not(.read-book) .header p {
  color: var(--ink-soft) !important;
  font-family: var(--serif);
  margin-top: 0.5em;
}
/* 판마다 크림 판을 깔면 종이가 조각조각 끊긴다. 책은 한 장으로 이어진다 —
   판을 걷고 쌍선으로만 가른다. */
html[data-theme="book"] .release-item {
  background: none !important;
  border: none !important;
  border-bottom: 3px double var(--rule-strong) !important;
  padding: clamp(14px, 2.4vw, 26px) clamp(4px, 1vw, 14px) !important;
  margin-bottom: 0 !important;
}
html[data-theme="book"] .release-notes .release-item:last-child {
  border-bottom: none !important;
}
/* 뒤로 가기 — 커다란 흰 상자였다. 활판 상자로 눕히고 왼쪽에 붙인다 */
html[data-theme="book"] .back-btn {
  display: inline-block;
  background: rgba(255, 253, 246, 0.62) !important;
  color: var(--ink-head) !important;
  border: 1px solid rgba(120, 96, 60, 0.40) !important;
  border-radius: 2px !important;
  box-shadow: inset 0 0 0 1px rgba(255, 253, 246, 0.55) !important;
  padding: clamp(5px, 1vw, 9px) clamp(9px, 1.8vw, 16px) !important;
  letter-spacing: 0.04em;
}

/* 속표지 마름모는 표제 크기의 절반쯤이 보기 좋다 — 0.42em 은 티가 안 났다 */
html[data-theme="book"] .login-title::after,
html[data-theme="book"] .register-title::after { font-size: 0.5em; }

/* ── 15. 난외주 머리 글자 대비 ────────────────────────────
   ⚠️ `.margin-note-title` 은 예전부터 통째로 금박(--gilt #b08a3c)이었다.
      종이(#f3e9d6) 대비 **2.66:1** — 장식이면 몰라도 이건 "이 달 읽은 곳"이라는
      **읽어야 하는 글**이다(2026-08-21 계산으로 잡았다. 눈으로는 안 보였다).
   → 글자는 --ink-head(7.0:1)로 내리고, 금박은 앞의 마름모에만 남긴다.
      분위기는 마름모가 지고, 읽기는 글자가 진다. */
html[data-theme="book"] .margin-note-title { color: var(--ink-head) !important; }
html[data-theme="book"] .margin-note-title::before { color: var(--ornament); }

/* ============================================================
   15. 각 죽이기 — "그은 선"을 "스민 결"로 (2026-08-22, 사용자 지시)
   지시: "다 너무 딱딱하고 각졌다. 테두리에 명확한 선이 딱 나 있는 게 거슬린다."
   ⭐ 선을 없애는 게 아니라 **끝이 흐려지게** 만든다. 고서의 판면 느낌은 남기고
      직각·실선만 걷어낸다(§22 — 지금 잘 되는 것을 죽이지 않는다).
   ⚠️ 여기가 파일 끝인 이유: 앞 절들이 !important 로 못 박아 둔 값을 순서로 이긴다.
   ============================================================ */

/* ── 15-1. 광곽 — 사주쌍변(두 줄 직각 테)을 걷는다 ──────────
   outline 은 radius 를 따라가긴 하나 두 줄이면 무조건 '틀'로 읽힌다.
   테 대신 **판면만 아주 옅게 떠 있게** 한다. */
html[data-theme="book"] .calendar-frame {
  border-color: transparent !important;
  outline: none !important;
  border-radius: clamp(12px, 1.8vw, 24px) !important;
  background: rgba(255, 253, 246, 0.34) !important;
  box-shadow: inset 0 0 clamp(16px, 2.4vw, 34px) rgba(120, 96, 60, 0.10) !important;
}

/* ── 15-2. 계선(세로줄) — 통째로 뺀다 ─────────────────────
   ⭐ 화면이 '표'로 읽히던 가장 큰 원인. 가로 괘선만 남으면 장부가 아니라 글줄이 된다. */
html[data-theme="book"] .calendar-table th,
html[data-theme="book"] .calendar-table td {
  border-right-color: transparent !important;
}

/* ── 15-3. 괘선(가로줄) — 양 끝이 흐려지는 선으로 ──────────
   실선을 배경 그라데이션으로 바꾼다. 끝이 사라지므로 '그은 자국'이 아니라 '결'로 보인다. */
html[data-theme="book"] .calendar-table td,
html[data-theme="book"] .calendar-table thead th {
  border-bottom-color: transparent !important;
  border-top: none !important;
}
/* ⚠️ 페이드는 **줄(tr)** 에 건다. 칸(td)에 걸면 7칸이 각각 흐려져
      셀마다 짧은 호가 반복되는 물결이 된다(2026-08-22 첫 시도에서 실제로 그랬다).
   ⚠️⚠️ 그런데 `border-collapse: collapse` 에서는 **접힌 테두리가 차지하는 자리가
      줄 배경 칠에서 빠진다** — 그래서 tr 로 옮겨도 칸 경계마다 1px 씩 끊겨 여전히
      물결로 보였다. 칸 사이를 안 벌리는 separate 로 바꿔야 한 줄로 이어진다.
      (칸 테두리는 이 절에서 전부 투명으로 눕혔으므로 collapse 가 할 일이 없다.) */
html[data-theme="book"] .calendar-table {
  border-collapse: separate !important;
  border-spacing: 0 !important;
}
/* ⚠️ separate 로 바꾸면 collapse 가 눌러 두던 **칸별 카드**(원본 calendar.css 의
      배경·모서리·그림자)가 되살아난다 — 달력이 타일 무더기가 된다. 다시 눕힌다. */
html[data-theme="book"] .calendar-table td,
html[data-theme="book"] .calendar-table th {
  background-color: transparent !important;
  box-shadow: none !important;
  border-radius: 0 !important;
}
html[data-theme="book"] .calendar-table tbody tr {
  background-image: linear-gradient(90deg,
      transparent 0%, rgba(120, 90, 45, 0.15) 8%,
      rgba(120, 90, 45, 0.15) 92%, transparent 100%) !important;
  background-repeat: no-repeat !important;
  background-position: 50% 100% !important;
  background-size: 100% 1px !important;
}
/* 요일줄 아래 쌍선(3px double) → 흐려지는 한 줄 */
html[data-theme="book"] .calendar-table thead tr {
  background-image: linear-gradient(90deg,
      transparent 0%, rgba(120, 90, 45, 0.30) 6%,
      rgba(120, 90, 45, 0.30) 94%, transparent 100%) !important;
  background-repeat: no-repeat !important;
  background-position: 50% 100% !important;
  background-size: 100% 1px !important;
}

/* ── 15-4. 구획선들 — 범례줄·난외주 위의 실선도 같은 결로 ── */
html[data-theme="book"] .legend-container,
html[data-theme="book"] .margin-note {
  border-top-color: transparent !important;
  border-top-style: solid !important;
  border-top-width: 1px !important;
  background-image: linear-gradient(90deg,
      transparent 0%, rgba(120, 90, 45, 0.26) 15%,
      rgba(120, 90, 45, 0.26) 85%, transparent 100%) !important;
  background-repeat: no-repeat !important;
  background-position: 50% 0 !important;
  background-size: 100% 1px !important;
}

/* ── 15-5. 상자류 — 테두리를 지우고 종이 결로만 구분 ──────── */
html[data-theme="book"] .stat-box,
html[data-theme="book"] .stats-section,
html[data-theme="book"] .monthly-stats-section,
html[data-theme="book"] .goal-section {
  border-color: transparent !important;
  border-radius: clamp(10px, 1.5vw, 20px) !important;
  /* ⭐ 2026-09-08 사용자 요청: 흰 쪽지와 바탕 종이 사이의 **경계선을 흐린다.**
     테두리는 이미 없고 남은 것은 배경 대비였다 — 같은 흰색을 밖으로 번지게 해 선을 녹인다.
     아래 그림자는 그대로 둔다(쪽지가 종이 위에 놓인 느낌). */
  box-shadow:
    0 1px clamp(6px, 1vw, 14px) rgba(90, 68, 40, 0.10),
    0 0 clamp(10px, 1.6vw, 18px) clamp(5px, 0.9vw, 10px) rgba(255, 253, 246, 0.5) !important;
}

/* ── 15-6. 활판 상자 → 모서리를 눕힌다 ─────────────────────
   ⚠️ 어제 넣은 `border-radius: 2px`(6절 '활판 상자')를 **사용자 지시로 되돌린다.**
      알약(999px)은 그대로 두고, 네모였던 것만 둥글린다. */
html[data-theme="book"] .goal-setting-btn,
html[data-theme="book"] .goal-btn,
html[data-theme="book"] .login-btn,
html[data-theme="book"] .donate-btn,
html[data-theme="book"] .coffee-button,
html[data-theme="book"] .submit-btn,
html[data-theme="book"] .btn,
html[data-theme="book"] .form-input,
html[data-theme="book"] .back-btn {
  border-radius: clamp(10px, 1.4vw, 16px) !important;
}
html[data-theme="book"] .nav-btn,
html[data-theme="book"] .today-link,
html[data-theme="book"] .version-badge,
html[data-theme="book"] .auth-badge,
html[data-theme="book"] .admin-badge { border-radius: 999px !important; }
html[data-theme="book"] .version-number,
html[data-theme="book"] .auth-action { border-radius: 999px !important; }

/* 테두리를 옅게 — 선이 '보이는' 대신 '있는 줄만 아는' 세기로 */
html[data-theme="book"] .nav-btn,
html[data-theme="book"] .today-link,
html[data-theme="book"] .version-badge,
html[data-theme="book"] .auth-badge,
html[data-theme="book"] .admin-badge,
html[data-theme="book"] .goal-setting-btn,
html[data-theme="book"] .goal-btn,
html[data-theme="book"] .login-btn,
html[data-theme="book"] .donate-btn,
html[data-theme="book"] .coffee-button,
html[data-theme="book"] .submit-btn {
  border-color: rgba(150, 118, 62, 0.28) !important;
  /* 안쪽 흰 실선(눌린 자국)이 한 겹 더 각을 만들고 있었다 → 부드러운 그림자로 */
  box-shadow: 0 1px clamp(4px, 0.8vw, 9px) rgba(90, 68, 40, 0.14) !important;
}

/* 버튼 **안쪽** 조각에 남은 직각 테 — 바깥을 둥글려도 이건 따로 남는다 */
html[data-theme="book"] .goal-btn-text,
html[data-theme="book"] .goal-setting-btn span,
html[data-theme="book"] .coffee-button span {
  border: none !important;
  box-shadow: none !important;
}

/* ── 15-7. 책 자체의 모서리 ─────────────────────────────
   토큰 두 개(--book-r 가죽, --paper-r 종이). 넘김 무대의 층(§14)도 --paper-r 를 써서 종이와 같은 모양이 된다.
   ⭐ 폰(한 장 화면, <900px)은 **왼쪽 변이 책등**(접히는 곳) — 왼쪽 위아래 모퉁이는 각지고 오른쪽만 둥글다
      (2026-09-07 사용자: "종이 왼쪽 위아래 모퉁이는 접히는 곳이니 각져야 하고, 넘김 시작 모양도 이 종이와 같아야").
      달력·읽기 화면(책)에만 — 로그인·가입 카드는 책이 아니다. */
/* ⚠️ 값은 **테마 뿌리**에 둔다. 표지(.container)에 두면 무대(.bc-peel-*)가 못 받는다 —
   무대는 body 직속이라 표지의 후손이 아니고, `border-radius: 0 var(--paper-r) ...` 가
   통째로 무효가 되어 넘어가는 종이만 네 모서리가 각졌다(2026-09-17). */
html[data-theme="book"] { --book-r: clamp(14px, 2.2vw, 30px); --paper-r: clamp(10px, 1.6vw, 22px); }
html[data-theme="book"] .container { border-radius: var(--book-r) !important; }
html[data-theme="book"] .container::before { border-radius: var(--paper-r) !important; }
@media (max-width: 899px), (max-width: 999px) and (max-height: 500px) {
  /* 한쪽 면도 펼친 책의 어느 쪽인지 드러낸다(핸드북 §15).
     달력=왼쪽 면(바깥 모서리 왼쪽, 책등 오른쪽), 본문=오른쪽 면(책등 왼쪽). */
  html[data-theme="book"] .container.calendar-book {
    border-radius: var(--book-r) 0 0 var(--book-r) !important;
  }
  html[data-theme="book"] .container.calendar-book::before {
    border-radius: var(--paper-r) 0 0 var(--paper-r) !important;
  }
  html[data-theme="book"] .container.read-book {
    border-radius: 0 var(--book-r) var(--book-r) 0 !important;
  }
  html[data-theme="book"] .container.read-book::before {
    border-radius: 0 var(--paper-r) var(--paper-r) 0 !important;
  }
}

/* ── 15-9. 다른 화면들(로그인·가입·릴리즈 노트)도 같은 결로 ──
   같은 지시가 이 화면들에도 걸린다 — 달력만 눕히면 페이지를 옮길 때 다시 각져 보인다. */
html[data-theme="book"] .login-container,
html[data-theme="book"] .register-container,
html[data-theme="book"] .release-item {
  border-radius: clamp(12px, 1.8vw, 22px) !important;
}
html[data-theme="book"] .release-item {
  border-color: transparent !important;
  box-shadow: 0 1px clamp(6px, 1vw, 14px) rgba(90, 68, 40, 0.10) !important;
}
html[data-theme="book"] .release-version,
html[data-theme="book"] .release-commit {
  border-radius: 999px !important;
}
html[data-theme="book"] .release-commit { border-color: rgba(150, 118, 62, 0.28) !important; }

/* ============================================================
   16. 월 색인 — 실제 색인 성경처럼 책배를 반달로 파낸다 (2026-08-24)

   ⭐ 바깥으로 붙은 탭이 아니다. 가죽색 홈을 종이 안쪽으로 걸쳐 놓고,
      왼쪽 가장자리에 종이 단면의 밝은 림을 남겨 **오목한 구멍**으로 읽히게 한다.
   ⭐ 각 홈은 실제 월 링크다. 현재 달은 조금 더 깊고 금박이 밝다.
   ============================================================ */
html[data-theme="book"] .month-index {
  position: absolute !important;
  z-index: 5 !important;
  top: clamp(118px, 14vh, 156px);
  /* 색인은 표지가 아니라 종이 책배에 닿는다. 종이 배경과 같은 여백을 쓴다. */
  right: var(--cover-pad);
  bottom: clamp(72px, 9vh, 108px);
  width: var(--index-width, clamp(42px, 4vw, 50px));
  display: flex;
  flex-direction: column;
  justify-content: space-around;
  align-items: flex-end;
  pointer-events: none;
}
html[data-theme="book"] .month-index-link {
  pointer-events: auto;
  position: relative;
  display: flex;
  align-items: center;
  justify-content: flex-start;
  gap: 1px;
  width: clamp(38px, 3.5vw, 46px);
  min-height: clamp(23px, 2.7vh, 29px);
  padding: 2px 5px 2px 8px;
  border: 1px solid rgba(238, 220, 180, 0.34);
  border-right: 0;
  border-radius: 999px 0 0 999px;
  background:
    linear-gradient(90deg, rgba(43, 27, 17, 0.98), rgba(77, 48, 29, 0.96) 74%, rgba(37, 23, 15, 0.98));
  box-shadow:
    inset 5px 0 7px rgba(0, 0, 0, 0.50),
    inset 0 1px 0 rgba(255, 248, 224, 0.20),
    -1px 0 0 rgba(226, 205, 164, 0.82),
    -3px 0 5px rgba(59, 39, 23, 0.22);
  color: #d7c18d;
  font-family: var(--serif-display);
  font-size: clamp(11px, 1.05vw, 13px);
  line-height: 1;
  text-decoration: none;
  text-shadow: 0 1px 1px #1e140d;
  transform: translateX(0);
  transition: width 160ms ease, transform 160ms ease, color 160ms ease;
}
html[data-theme="book"] .month-index-link::before {
  content: "";
  position: absolute;
  inset: 3px auto 3px 3px;
  width: 4px;
  border-radius: 999px;
  background: linear-gradient(90deg, rgba(255, 248, 224, 0.46), rgba(151, 119, 72, 0.08));
  opacity: 0.78;
}
html[data-theme="book"] .month-index-link small {
  font-size: 0.72em;
  color: inherit;
}
html[data-theme="book"] .month-index-link:hover,
html[data-theme="book"] .month-index-link:focus-visible {
  width: clamp(43px, 4vw, 52px);
  transform: translateX(0);
  color: #f1daa0;
  opacity: 1;
}
html[data-theme="book"] .month-index-link:focus-visible {
  outline: 2px solid #d2ae58;
  outline-offset: 2px;
}
html[data-theme="book"] .month-index-link.is-current {
  width: clamp(46px, 4.3vw, 56px);
  transform: translateX(0);
  color: #f4dc97;
  background: linear-gradient(90deg, #352116, #6a4328 72%, #2d1c13);
  box-shadow:
    inset 7px 0 9px rgba(0, 0, 0, 0.58),
    inset 0 1px 0 rgba(255, 246, 208, 0.28),
    -1px 0 0 rgba(238, 216, 168, 0.92),
    -4px 0 7px rgba(46, 28, 17, 0.30);
  pointer-events: none;
}

/* ============================================================
   17. 좁은 화면의 월 이동 — 머리말에서 화면 아래 손가락 자리로
   ============================================================ */
/* ⭐ 2026-09-08 사용자 결정: 달 이동 줄은 **모든 폭에서** 화면 바닥에 둔다(폰과 같은 자리).
   머리말에는 제목만 남는다 — 조작 자리가 폭에 따라 달라지지 않게(§0 통일성). */
html[data-theme="book"] .page-right > .header > .nav-btn,
html[data-theme="book"] .page-right > .header .today-link {
  display: none !important;
}
html[data-theme="book"] .page-right > .header .month-title-container {
  margin-inline: auto;
}

@media (max-width: 899px), (max-width: 999px) and (max-height: 500px) {
  html[data-theme="book"] .page-right > .header {
    justify-content: center !important;
    padding-left: calc(clamp(14px, 5vw, 28px) + clamp(10px, 1.6vw, 18px) + 8px - clamp(16px, 2.6vw, 34px)) !important;
  }

  html[data-theme="book"] .month-index {
    top: clamp(108px, 14vh, 138px);
    /* display:contents 인 한 장 화면에서는 containing block 이 책 전체다.
       책 안쪽여백만큼 되짚어야 속지의 실제 책배에 홈이 열린다. */
    right: clamp(14px, 5vw, 20px);
    bottom: auto;
    height: min(58vh, 430px);
    width: 42px;
  }
  html[data-theme="book"] .month-index-link {
    width: 39px;
    min-height: 24px;
    font-size: 12px;   /* 2026-10-13 평가: 10px 는 40~60대에게 읽기 어렵다. 두 글자(1월)라 39px 탭에 들어간다 */
    transform: translateX(0);
  }
  html[data-theme="book"] .month-index-link.is-current { width: 47px; transform: translateX(0); }

  /* ⚠️ .container > * 가 지면(.page)에 z-index:1 스태킹 컨텍스트를 만들어
     그 안의 fixed 월 이동 줄(z 9985)이 **뒤 형제(page-left 통계 카드) 아래** 깔린다
     (CDP 실측: elementFromPoint = stat-box). 줄이 든 지면만 한 층 올린다 —
     문서 흐름상 지면끼리 실제로 겹치는 건 fixed 인 이 줄뿐이라 다른 영향이 없다. */
  html[data-theme="book"] .page-right { z-index: 2; }

  /* 설정 도크를 펼쳐도 월 막대는 바닥에 그대로 — 카드는 손잡이 위로 자란다(2026-09-06). */
}

/* 달 이동 줄 — 모든 폭에서 같은 모양·같은 자리(위 결정). 폰 전용 예외는 아래 낮은 화면 규칙뿐이다. */
html[data-theme="book"] .mobile-month-nav {
  position: fixed !important;
  z-index: 9985 !important;
  left: 50%;
  right: auto;
  /* ⭐ 2026-09-06 사용자 결정: 월 이동 줄이 맨 바닥, 후원·설정은 그 위(base.html bottom 80px).
     2026-09-30: "화면 바닥에서 애매하게 떠 있다" 피드백으로 바닥에 붙이고, 안전영역은
     바깥 여백이 아니라 줄 안쪽 padding 으로 흡수한다(calendar.css 와 같은 처리). */
  bottom: 0;
  transform: translateX(-50%);
  width: min(calc(100vw - 28px), 440px);
  display: grid;
  grid-template-columns: 1fr auto auto 1fr; /* 이전달 · 이번달로 · 성경 읽기 · 다음달 (calendar.css 와 같다) */
  align-items: center;
  gap: 5px;
  padding: 6px; /* 안전영역을 더하지 않는다 — 앱 웹뷰는 시스템 바 위에 그려지면서도 inset(~48px)을 보고해 줄이 부푼다(2026-09-30) */
  border: 1px solid rgba(164, 126, 63, 0.34);
  border-radius: 999px;
  background:
    repeating-linear-gradient(0deg, rgba(70, 45, 20, 0.018) 0 1px, transparent 1px 3px),
    rgba(246, 236, 216, 0.96);
  box-shadow: 0 8px 24px rgba(22, 13, 9, 0.34), inset 0 1px 0 rgba(255, 255, 255, 0.58);
  backdrop-filter: blur(8px);
  -webkit-backdrop-filter: blur(8px);
  }
html[data-theme="book"] .mobile-month-nav .nav-btn,
html[data-theme="book"] .mobile-month-nav .today-link {
  min-height: 42px;
  margin: 0 !important;
  padding: 7px 9px !important;
  display: flex !important;
  align-items: center;
  justify-content: center;
  gap: 3px;
  white-space: nowrap;
  font-size: clamp(11px, 3vw, 13px) !important;
  border-radius: 999px !important;
  background: rgba(255, 252, 242, 0.58) !important;
  }
html[data-theme="book"] .mobile-month-nav .today-link {
  color: #6b4b20 !important;
  border-color: rgba(176, 138, 60, 0.48) !important;
  font-weight: 700;
  }
/* 좁은 화면에서만 두 줄(줄 + 그 위 도크) — 넓은 화면은 한 줄이라 기본 여백으로 충분하다(2026-09-08). */
@media (max-width: 899px), (max-width: 999px) and (max-height: 500px) { html[data-theme="book"] body { padding-bottom: 146px !important; } }

/* ============================================================
   20. 모달 — 성경책 위에 놓인 기록용 속지 (2026-08-24 / 범위 확대 2026-08-27)

   ⭐ **모달 하나마다 규칙을 한 벌씩 쓰지 않는다.** 예전엔 이 절이 `#inputModal` 만
      맡았고("목표·로그아웃·년월 선택 모달은 공용 모습을 유지한다"), 그 결과 나머지
      모달 다섯이 보라 헤더·흰 유리 카드로 남아 사용자가 "모달에 테마 적용 안 된 게
      남아있다"고 지적했다(2026-08-27). 개별 모달을 하나씩 칠하면 다음 모달에서 또 어긋난다.
      그래서 **껍데기(막·카드·머리·바닥·버튼·입력칸)는 아래 한 목록이 통째로** 맡는다.
      새 모달이 생기면 고칠 곳은 이 목록 하나뿐이다.

   ⚠️ 목록에 든 것: 날짜 기록(#inputModal) · 목표(#goalModal) · 로그아웃(#logoutModal) ·
      년월 선택(#monthYearPickerModal) · 후원 결제(#payment-modal) · 축하(#celebrationOverlay).
   ⚠️ 목록 밖: 튜토리얼은 위 절(396줄쯤)이 이미 맡는다. 미리보기(.preview-modal)와
      플래시 토스트는 **JS가 style 을 직접 박아** CSS로 덮을 수 없다 — 그쪽을 고쳐야 한다.
      confirm()/alert() 24곳은 OS 대화상자라 원리상 테마를 못 입힌다.
   ⚠️ 속지 무늬·팝오버 화살표·기록 목록·모드 토글처럼 **날짜 기록 모달에만 있는 것**은
      아래에서 계속 `#inputModal` 로 좁혀 둔다. 넓히면 남의 모달에 없는 것을 칠하게 된다.
   ============================================================ */
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) {
  background: rgba(35, 24, 16, 0.46) !important;
  backdrop-filter: blur(4px) sepia(0.22) !important;
  -webkit-backdrop-filter: blur(4px) sepia(0.22) !important;
}
/* popover의 부모에 filter가 있으면 모바일의 position:fixed 내용물이 작은 popover 상자를
   기준으로 배치되어 화면 밖으로 밀린다. 팝오버는 종이 본체만 꾸미고 부모는 투명하게 둔다. */
html[data-theme="book"] #inputModal.popover-style {
  background: transparent !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
}

html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) :is(.modal-content, .payment-modal-content, .celebration-content),
html[data-theme="book"] #inputModal.popover-style .modal-content {
  background:
    repeating-linear-gradient(0deg, rgba(89, 63, 35, 0.022) 0 1px, transparent 1px 4px),
    linear-gradient(100deg, rgba(126, 91, 47, 0.08), transparent 9%, transparent 91%, rgba(126, 91, 47, 0.06)),
    #f4ead5 !important;
  color: var(--ink) !important;
  border: 1px solid rgba(151, 115, 57, 0.48) !important;
  border-radius: 5px 12px 12px 5px !important;
  box-shadow:
    0 18px 36px rgba(24, 14, 8, 0.34),
    0 5px 12px rgba(24, 14, 8, 0.22),
    inset 4px 0 8px rgba(113, 80, 42, 0.08) !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
  font-family: var(--serif) !important;
}

/* 공용 modal.css가 취소·삭제·상세 추가 버튼에 Arial을 직접 지정한다.
   모달 안의 모든 조작 활자도 기록지 본문과 같은 명조로 통일한다. */
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) button {
  font-family: var(--serif) !important;
}

html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .modal-header {
  background:
    linear-gradient(90deg, rgba(142, 105, 51, 0.10), transparent 18%),
    rgba(242, 230, 207, 0.92) !important;
  color: var(--ink) !important;
  border-bottom: 1px solid rgba(151, 115, 57, 0.42) !important;
  border-radius: 4px 11px 0 0 !important;
  box-shadow: inset 0 -1px rgba(255, 255, 255, 0.48) !important;
}
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .modal-header h3 {
  color: var(--ink) !important;
  font-family: var(--serif-display) !important;
  font-weight: 400 !important;
  -webkit-text-fill-color: currentColor !important;
  letter-spacing: 0.01em;
}
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .modal-control-btn {
  color: #654a2d !important;
  background: rgba(255, 252, 242, 0.48) !important;
  border: 1px solid rgba(151, 115, 57, 0.32) !important;
  box-shadow: none !important;
}
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .modal-control-btn:hover,
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .modal-control-btn:focus-visible {
  color: #402b19 !important;
  background: rgba(221, 198, 150, 0.34) !important;
  transform: none !important;
}

html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .modal-body {
  color: var(--ink) !important;
  background: transparent !important;
}
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .modal-footer {
  background: rgba(239, 225, 199, 0.82) !important;
  border-top: 1px solid rgba(151, 115, 57, 0.30) !important;
  border-radius: 0 0 11px 4px !important;
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
}

html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .form-group label,
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .input-header label,
html[data-theme="book"] #inputModal .legend-item,
html[data-theme="book"] #inputModal .record-verse {
  color: var(--ink) !important;
  font-family: var(--serif) !important;
}
html[data-theme="book"] #inputModal .help-text,
html[data-theme="book"] #inputModal .example,
html[data-theme="book"] #inputModal .no-records-msg,
html[data-theme="book"] #inputModal .record-chapters {
  color: var(--ink-soft) !important;
}

html[data-theme="book"] #inputModal .chapter-count-input-group,
html[data-theme="book"] #inputModal .mode-legend,
html[data-theme="book"] #inputModal .record-item {
  background: rgba(255, 252, 242, 0.34) !important;
  border: 1px solid rgba(151, 115, 57, 0.28) !important;
  border-radius: 7px !important;
  box-shadow: inset 3px 0 rgba(176, 138, 60, 0.12) !important;
}
html[data-theme="book"] #inputModal .record-item:hover {
  background: rgba(255, 252, 242, 0.54) !important;
  border-color: rgba(151, 115, 57, 0.42) !important;
  transform: none !important;
}

html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) input[type="text"],
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) input[type="number"],
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) input[type="date"],
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) select {
  color: var(--ink) !important;
  background: rgba(255, 253, 246, 0.56) !important;
  border: 0 !important;
  border-bottom: 1px solid rgba(118, 86, 45, 0.52) !important;
  border-radius: 2px !important;
  box-shadow: inset 0 -1px rgba(255, 255, 255, 0.48) !important;
  font-family: var(--serif) !important;
}
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) input:focus,
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) select:focus {
  outline: 2px solid rgba(176, 138, 60, 0.34) !important;
  outline-offset: 1px !important;
  border-bottom-color: #8b672f !important;
  background: rgba(255, 253, 246, 0.82) !important;
  box-shadow: none !important;
}
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) input::placeholder {
  color: rgba(78, 61, 43, 0.56) !important;
}

html[data-theme="book"] #inputModal .help-icon {
  color: #8a672e !important;
}
html[data-theme="book"] #inputModal .example {
  background: rgba(176, 138, 60, 0.07) !important;
  border-left-color: rgba(139, 103, 47, 0.66) !important;
  border-radius: 2px !important;
}

html[data-theme="book"] #inputModal .toggle-btn {
  color: #664a2b !important;
  background: rgba(255, 252, 242, 0.52) !important;
  border: 1px solid rgba(151, 115, 57, 0.38) !important;
  box-shadow: none !important;
  font-size: 13px !important;
  font-family: var(--serif);
  transform: none !important;
}
html[data-theme="book"] #inputModal .toggle-btn.active {
  color: #3e2918 !important;
  background: linear-gradient(180deg, #ead8ae, #d7bc7e) !important;
  border-color: rgba(139, 103, 47, 0.78) !important;
  box-shadow: inset 0 1px rgba(255, 255, 255, 0.62), 0 1px 3px rgba(80, 53, 25, 0.18) !important;
  transform: none !important;
}
html[data-theme="book"] #inputModal .toggle-btn:hover:not(.active),
html[data-theme="book"] #inputModal .toggle-btn:focus-visible:not(.active) {
  background: rgba(226, 207, 168, 0.56) !important;
  transform: none !important;
}

html[data-theme="book"] #inputModal .record-index {
  color: #674819 !important;
  background: rgba(176, 138, 60, 0.15) !important;
  border: 1px solid rgba(151, 115, 57, 0.24) !important;
  border-radius: 3px !important;
}
html[data-theme="book"] #inputModal .record-chapters {
  background: rgba(142, 43, 43, 0.08) !important;
  border-radius: 2px !important;
}
/* 삭제 버튼의 🗑️ 는 JS 가 textContent 로 박아 CSS 로 지울 수 없다 —
   도움말 ? 와 **같은 방식**을 쓴다(글자 크기 0 + 가짜 요소로 활자 다시 그리기).
   title 속성은 그대로라 화면 낭독기에는 영향이 없다. */
html[data-theme="book"] #inputModal .delete-record-btn {
  font-size: 0 !important;
}
html[data-theme="book"] #inputModal .delete-record-btn::before {
  content: "✕";
  font-size: 13px;
  font-family: var(--serif);
  line-height: 1;
}
html[data-theme="book"] #inputModal .delete-record-btn {
  color: #fff7e7 !important;
  background: #7d312c !important;
  border: 1px solid rgba(77, 25, 21, 0.48) !important;
  border-radius: 4px !important;
  box-shadow: none !important;
  transform: none !important;
}
/* 수정 폼 맨 아래의 삭제는 **글자로 적힌 행동**이다 — 위 ✕ 치환(font-size:0)을 되돌린다 */
html[data-theme="book"] #inputModal #editDeleteRow .delete-record-btn {
  font-size: 13px !important;
  font-family: var(--serif) !important;
}
html[data-theme="book"] #inputModal #editDeleteRow .delete-record-btn::before {
  content: none !important;
}
html[data-theme="book"] #inputModal #editDeleteRow {
  border-top: 1px solid var(--rule) !important;
}
/* 상세 보기의 수정 버튼 — 금박 바탕. 글자는 마크업의 「수정」을 그대로 쓴다(예전엔 「고침」으로 덮어썼다) */
html[data-theme="book"] #inputModal .edit-record-btn {
  font-size: 13px !important;
  font-family: var(--serif);
  color: #3f2c19 !important;
  background: linear-gradient(180deg, #ead8ae, #d7bc7e) !important;
  border: 1px solid rgba(139, 103, 47, 0.56) !important;
  border-radius: 4px !important;
  box-shadow: none !important;
  transform: none !important;
}

html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .submit-btn,
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .add-btn {
  color: #3f2c19 !important;
  background: linear-gradient(180deg, #ead8ae, #d7bc7e) !important;
  border: 1px solid rgba(139, 103, 47, 0.56) !important;
  border-radius: 6px !important;
  box-shadow: inset 0 1px rgba(255, 255, 255, 0.64), 0 2px 5px rgba(79, 53, 27, 0.16) !important;
}
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .cancel-btn {
  color: #65503a !important;
  background: rgba(255, 252, 242, 0.42) !important;
  border: 1px solid rgba(118, 86, 45, 0.34) !important;
  border-radius: 6px !important;
  box-shadow: none !important;
}
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .submit-btn:hover,
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .add-btn:hover,
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .cancel-btn:hover {
  transform: none !important;
  filter: brightness(0.98);
}

html[data-theme="book"] #inputModal .resize-handle {
  border-color: rgba(139, 103, 47, 0.52) !important;
  background-color: rgba(176, 138, 60, 0.24) !important;
}
html[data-theme="book"] #inputModal .resize-handle-se {
  background-image:
    linear-gradient(135deg, transparent 54%, rgba(116, 83, 39, 0.68) 54%, rgba(116, 83, 39, 0.68) 59%, transparent 59%),
    linear-gradient(135deg, transparent 70%, rgba(116, 83, 39, 0.68) 70%, rgba(116, 83, 39, 0.68) 75%, transparent 75%) !important;
}

html[data-theme="book"] #inputModal.popover-style .modal-content::before {
  border-bottom-color: #efe2c9 !important;
  filter: drop-shadow(0 -1px 1px rgba(72, 47, 23, 0.20)) !important;
}
/* ── 20-1. 껍데기로 안 덮이는 조각들 — **역할별로 한 벌씩** ────────────
   위 목록이 막·카드·머리·바닥·입력칸·주버튼/취소버튼을 이미 맡는다. 여기 남은 것은
   모달마다 **이름이 다른** 같은 역할들이다. 이름이 다를 뿐 역할이 같으므로,
   모달별로 쓰지 않고 **역할별로 묶어** 한 벌씩만 쓴다.
   ⚠️ 색은 전부 이 파일 맨 위 토큰에서 온다 — 여기에 새 색을 지어내지 않는다. */

/* (1) 주 버튼 — 초록(기록)·빨강(로그아웃)·보라(QR·축하·년월 이동)로 흩어져 있던 것 */
html[data-theme="book"] :is(
  .logout-confirm-btn,
  .celebration-close-btn,
  .view-header .nav-btn
) {
  background: linear-gradient(180deg, #5c3b23, var(--leather)) !important;
  background-image: linear-gradient(180deg, #5c3b23, var(--leather)) !important;
  color: #f6ecd8 !important;
  border: 1px solid rgba(151, 115, 57, 0.55) !important;
  box-shadow: 0 2px 6px rgba(24, 14, 8, 0.28) !important;
  font-family: var(--serif) !important;
}
/* (2) 보조 버튼 — 주황(목표 미리설정)·보라(월·년·연대 고르기) */
html[data-theme="book"] :is(
  .preset-btn,
  .month-btn, .year-btn, .decade-btn,
  .view-title
) {
  background: rgba(255, 252, 242, 0.62) !important;
  background-image: none !important;
  color: var(--ink) !important;
  border: 1px solid rgba(151, 115, 57, 0.40) !important;
  box-shadow: none !important;
  font-family: var(--serif) !important;
}
/* 지금 고른 것 — 선택색은 토큰이 정한다(공용 CSS에 테마색을 박지 않는다는 원칙) */
html[data-theme="book"] :is(.month-btn, .year-btn, .decade-btn).current,
html[data-theme="book"] :is(.month-btn, .year-btn, .decade-btn).selected,
html[data-theme="book"] :is(.month-btn, .year-btn, .decade-btn).active {
  background: var(--leather) !important;
  background-image: none !important;
  color: #f6ecd8 !important;
  border-color: var(--gilt) !important;
}

/* (3) 닫기 버튼 */
html[data-theme="book"] .payment-modal-close {
  color: var(--ink-soft) !important;
  font-family: var(--serif) !important;
}

/* (4) ⚠️ **`color` 로는 절대 안 바뀌는 것** — 글자에 그라데이션을 깔고
       `-webkit-text-fill-color: transparent` 로 비워 둔 제목들. 세 속성을 다 되돌려야 한다.
       (`.month-title` 에서 이미 한 번 겪은 유형이다 — 이 파일 109줄 참고) */
html[data-theme="book"] :is(
  .amount-display,
  .donation-header h1,
  .donation-header-compact :is(h1, h2),
  .celebration-title
) {
  background: none !important;
  background-image: none !important;
  -webkit-background-clip: border-box !important;
  background-clip: border-box !important;
  -webkit-text-fill-color: currentColor !important;
  color: var(--ink) !important;
  text-shadow: none !important;
  font-family: var(--serif-display) !important;
  font-weight: 400 !important;
}

/* (5) 옅은 판때기들 — 회색·연보라 상자를 종이 톤으로 */
html[data-theme="book"] :is(
  .payment-amount,
  .donation-details,
  .donation-amount-section,
  .usage-list,
  .faq-item,
  .celebration-stats
) {
  background: rgba(255, 252, 242, 0.55) !important;
  background-image: none !important;
  border: 1px solid rgba(151, 115, 57, 0.30) !important;
  color: var(--ink) !important;
}
html[data-theme="book"] .usage-list { border-left: 4px solid var(--gilt) !important; }
html[data-theme="book"] .donation-header,
html[data-theme="book"] .donation-header-compact {
  border-bottom-color: rgba(151, 115, 57, 0.40) !important;
}

/* (6) 축하 오버레이 — 카드는 위 목록이 종이로 만들었다. 그 위 글자가 아직 흰색이라
       종이 위에서 안 보인다(공용 celebration.css 가 `color: white` 로 박아 둔다). */
html[data-theme="book"] :is(
  .celebration-message,
  .celebration-stat-item
) {
  color: var(--ink) !important;
  font-family: var(--serif) !important;
}
/* 색종이 — 형광 자홍·청록을 금박·세피아로 눕힌다(한 벌로, nth-child 20벌을 덮는다) */
html[data-theme="book"] .confetti {
  background: var(--gilt) !important;
}
html[data-theme="book"] .confetti:nth-child(3n) { background: var(--leather) !important; }
html[data-theme="book"] .confetti:nth-child(3n + 1) { background: var(--ribbon) !important; }

/* (8) 본문 글자·링크 — 공용 CSS 가 회청색(#374151)과 보라(#667eea)를 **태그에 직접**
       걸어 둔 자리들. 클래스가 없어 위 규칙들이 못 닿는다. 역할별로 한 벌로 묶는다.
   ⚠️ 넓게 잡으면 안 된다(`div`·`span` 까지 잡으면 가죽 버튼 안 글자까지 먹으로 뒤집힌다).
      실제로 어긋난 자리만 이름으로 짚는다 — 실측으로 고른 목록이다(2026-08-27). */
html[data-theme="book"] :is(
  .logout-message,
  .usage-list, .usage-list li,
  .faq-item, .faq-item p, .faq-item strong,
  .donation-details summary,
  .donation-subtitle, .donation-usage-list, .donation-usage-list li,
  .donation-faq, .donation-faq p, .donation-faq strong,
  .donation-thanks,
  .donation-note, .payment-notice
) {
  color: var(--ink) !important;
  font-family: var(--serif) !important;
}
html[data-theme="book"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) a {
  color: #7a5c2e !important;
}

/* (7) 결제 입력칸 — 위 목록의 input 규칙이 `#payment-modal` 안쪽까지 닿지만,
       payment.css 가 `#payment-form input` 으로 더 좁게 박아 둔 테두리만 남는다 */
html[data-theme="book"] #payment-form input {
  border: 1px solid rgba(151, 115, 57, 0.45) !important;
}

html[data-theme="book"] #inputModal.popover-style .modal-content.arrow-bottom::before {
  border-bottom-color: transparent !important;
  border-top-color: #efe2c9 !important;
  filter: drop-shadow(0 1px 1px rgba(72, 47, 23, 0.20)) !important;
}

/* 넓은 화면(한 줄 배치)에서는 줄의 아래 끝을 후원·설정 단추(base.html bottom 10px)와 맞춘다 —
   calendar.css 의 같은 규칙과 같은 경계·같은 값이다(2026-10-14). */
@media (min-width: 900px) and (min-height: 501px) {
  html[data-theme="book"] .mobile-month-nav {
    bottom: 10px;
  }
}

/* 넓은 화면에서 책 밖 정책 푸터(서비스 소개·이용약관 …)는 바닥 띠 128px 안에 달 이동 줄(바닥 10 + 높이 56)과
   같이 놓인다. 푸터 기본값(위 여백 30 + 안 여백 20)이면 글이 바닥에서 30~104px 에 앉아 이동 줄이 링크 줄을
   덮었다(2026-10-14 실측 1080x879: 푸터 755~849, 줄 813~869 — 36px 겹침, 줄을 10px 올리자 링크 줄이 가려짐).
   위·안 여백을 줄여 글 두 줄이 이동 줄 위에 들어가게 한다. 12/10 이면 링크 줄과 이동 줄 사이가 3px 뿐이라
   글자 배율이 조금만 커져도 다시 겹친다 — 4/6 으로 더 줄여 15px 를 둔다(실측 1080x879·1366x650·1920x1080). */
@media (min-width: 900px) and (min-height: 501px) {
  html[data-theme="book"] body:has(.calendar-book) .business-info-compact {
    /* 책의 아래 여백 clamp(12px,3vh,40px)(1080x879 에서 26px)과 접히므로 양수 위 여백은 효과가 없다 —
       음수로 두어 접힌 여백을 18px 로 줄인다(실측: 4px 일 때 간격 7px → -8px 일 때 15px). */
    margin-top: -8px;
    padding: 6px 20px 10px;
  }
}

/* 낮은 가로 화면에서는 좌우 모서리 도크 사이가 비어 있다.
   월 막대를 그 자리에 내려 달력의 날짜 행을 덮지 않게 한다.
   설정을 펼치면 위의 더 구체적인 :has 규칙이 계속 122px로 피한다. */
@media (max-width: 999px) and (max-height: 500px) {
  html[data-theme="book"] .mobile-month-nav {
    bottom: 0;
  }
  html[data-theme="book"] body {
    padding-bottom: 80px !important;
  }
}

/* ============================================================
   18. 색인·모바일 월 이동 교정 — 버튼을 얹지 않고 책배를 판다

   month-index 전체가 가죽 단면이고, ::before가 그 위의 종이 책배다.
   반복 마스크의 투명 반달 12개를 통해 아래 가죽이 보이므로 홈들이
   서로 떨어진 버튼이 아니라 한 장의 종이에서 실제로 파인 것으로 읽힌다.
   ============================================================ */
html[data-theme="book"] .month-index {
  display: grid !important;
  /* 칸 수는 변수로 받는다. 달력은 12(기본값), 성경 본문 읽기 화면은 22묶음이다.
     ⚠️ 값을 안 주면 12 — 달력 동작은 그대로다. */
  grid-template-rows: repeat(var(--index-count, 12), minmax(0, 1fr));
  align-items: stretch;
  justify-content: stretch;
  overflow: hidden;
  background: linear-gradient(90deg, #29180f 0%, #50301d 58%, #21130c 100%);
  border-right: 1px solid rgba(25, 13, 8, 0.86);
  box-shadow:
    inset 8px 0 12px rgba(0, 0, 0, 0.55),
    inset 0 1px 0 rgba(255, 235, 190, 0.10);
}
html[data-theme="book"] .month-index::before {
  content: "";
  position: absolute;
  z-index: 0;
  inset: 0;
  pointer-events: none;
  background:
    repeating-linear-gradient(0deg, rgba(80, 58, 30, 0.035) 0 1px, transparent 1px 3px),
    linear-gradient(90deg, rgba(225, 211, 181, 0.72), transparent 18%),
    var(--paper);
  /* 파인 홈의 크기도 변수로 받는다. 달력은 12칸에 두 글자('1월')라 31×14 로 충분하지만,
     성경 본문 읽기 화면은 23칸에 세 글자('창출레')라 더 넓고 낮아야 글자가 홈 안에 든다.
     ⚠️ 값을 안 주면 31px 14px — 달력 동작은 그대로다. */
  -webkit-mask-image:
    radial-gradient(ellipse var(--index-notch-w, 31px) var(--index-notch-h, 14px) at 100% 50%, transparent 0 92%, #000 100%);
  mask-image:
    radial-gradient(ellipse var(--index-notch-w, 31px) var(--index-notch-h, 14px) at 100% 50%, transparent 0 92%, #000 100%);
  -webkit-mask-size: 100% calc(100% / var(--index-count, 12));
  mask-size: 100% calc(100% / var(--index-count, 12));
  -webkit-mask-repeat: repeat-y;
  mask-repeat: repeat-y;
  filter: drop-shadow(-2px 0 1px rgba(92, 65, 34, 0.38));
}
/* ⚠️ 넘김 무대 복제본에서 이 반복 mask-image(홈 장식)가 걸리면 글자층(.month-index-link, z-index:1)이
   사라지고 파인 홈만 남는다 — 앱 WebView(안드로이드 시스템 웹뷰)에서만 재현되고 폰 크롬은 정상이다
   (2026-09-17 S21 실기기: "넘기기 시작하면 원래 있던 내용의 모양이 달라진다"). 무대 안에서만 마스크를
   꺼서 확정했다 — 끄니 "1월"~"12월" 글자가 실기기 확대 캡처에서 다시 보였다. */
html[data-theme="book"] .bc-peel-stage .month-index::before,
html[data-theme="book"] .bc-riffle-base .month-index::before,
html[data-theme="book"] .bc-riffle-pile .month-index::before {
  -webkit-mask-image: none;
  mask-image: none;
}
html[data-theme="book"] .month-index-link,
html[data-theme="book"] .month-index-link:hover,
html[data-theme="book"] .month-index-link:focus-visible,
html[data-theme="book"] .month-index-link.is-current {
  z-index: 1;
  width: 100% !important;
  min-height: 0;
  padding: 0 3px 0 14px;
  justify-content: flex-end;
  align-items: center;
  border: 0;
  border-radius: 0;
  background: transparent !important;
  box-shadow: none;
  transform: none;
  color: #d7c18d;
  opacity: 0.88;
}
html[data-theme="book"] .month-index-link::before {
  display: none;
}
html[data-theme="book"] .month-index-link:hover,
html[data-theme="book"] .month-index-link:focus-visible {
  color: #fff0bc;
  opacity: 1;
}
html[data-theme="book"] .month-index-link:focus-visible {
  outline: 1px solid rgba(222, 183, 91, 0.9);
  outline-offset: -2px;
}
html[data-theme="book"] .month-index-link.is-current {
  color: #ffe5a0;
  opacity: 1;
  text-shadow: 0 1px 1px #160b07, 0 0 5px rgba(219, 171, 67, 0.72);
}
html[data-theme="book"] .month-index-link.is-current::after {
  content: "";
  position: absolute;
  right: 4px;
  bottom: 3px;
  width: 14px;
  height: 1px;
  background: linear-gradient(90deg, transparent, #d9ae50, transparent);
}

@media (max-width: 899px), (max-width: 999px) and (max-height: 500px) {
  html[data-theme="book"] .page-right {
    display: block !important;
    position: relative;
  }

  html[data-theme="book"] .month-index {
    height: auto;
    bottom: 72px;
  }

  /* 월 이동 줄은 16절의 **하단 고정(플로팅 알약)** 그대로 둔다 —
     예전엔 여기서 정적 배치로 되돌렸는데, 후원·설정처럼 항상 아래 떠 있는 것이
     사용자 결정이다(2026-08-31). body 바닥 여백도 16절 것이 유효해야 한다. */
}

/* 표제 아래 쌍선·실선 → 끝이 흐려지는 한 줄 */
html[data-theme="book"] .login-header,
html[data-theme="book"] .register-header,
html[data-theme="book"] .release-title {
  border-bottom-color: transparent !important;
  border-bottom-width: 1px !important;
  border-bottom-style: solid !important;
  background-image: linear-gradient(90deg,
      transparent 0%, rgba(120, 90, 45, 0.26) 12%,
      rgba(120, 90, 45, 0.26) 88%, transparent 100%) !important;
  background-repeat: no-repeat !important;
  background-position: 50% 100% !important;
  background-size: 100% 1px !important;
}

@media (max-width: 999px) and (max-height: 500px) {
  /* 낮은 가로 화면의 우측 아래 설정 손잡이가 4·5월 색인을 덮는다.
     색인이 시작되기 전인 우측 위로 올려 월 라벨과 누르기 영역을 모두 지킨다. */
  html[data-theme="book"] body:has(.month-index) .fixed-dock {
    top: 10px !important;
    bottom: auto !important;
  }
  /* ⚠️ 손잡이만 위로 올리면 안 된다. 설정 카드(.dock-items)는 손잡이 **바닥**에 붙어
        위로 자라도록(bottom:0) 되어 있어서, 손잡이가 맨 위로 가면 카드가 화면 밖으로
        솟는다 — 780x390 에서 카드가 y=-100 부터 시작해 도움말·테마 두 줄이 통째로
        안 보였다(2026-08-27 실측). 손잡이가 위에 있으면 카드도 **아래로** 자라야 한다. */
  html[data-theme="book"] body:has(.month-index) .fixed-dock .dock-items {
    top: 0 !important;
    bottom: auto !important;
  }
  html[data-theme="book"] .month-index {
    height: min(70vh, 320px);
  }
}


/* ============================================================
   19. 실물 thumb-indexed Bible 기준 교정 (2026-08-24)

   실제 색인은 검은 버튼을 책 위에 붙이지 않는다.
   종이 책배에서 안쪽으로 파인 밝은 통로의 끝에 검은 반원 라벨이 있다.
   이 화면에서는 달력 폭을 지키기 위해 12개 홈을 한 열로 곧게 배열한다.
   ============================================================ */
html[data-theme="book"] .page-right .calendar-frame {
  margin-right: clamp(38px, 3.4vw, 44px);
}

html[data-theme="book"] .month-index {
  width: clamp(38px, 3.4vw, 44px);
  overflow: visible;
  background: transparent;
  border: 0;
  box-shadow: none;
}
html[data-theme="book"] .month-index::before {
  display: none;
}

html[data-theme="book"] .month-index-link,
html[data-theme="book"] .month-index-link:hover,
html[data-theme="book"] .month-index-link:focus-visible,
html[data-theme="book"] .month-index-link.is-current {
  position: relative;
  width: 100% !important;
  min-height: 0;
  padding: 0;
  overflow: visible;
  border: 0;
  outline: 0;
  background: transparent !important;
  box-shadow: none;
  transform: none;
  opacity: 1;
}

/* 종이를 도려낸 통로 — 바깥 책배에서 반원 라벨까지 이어지는 밝은 절삭면 */
html[data-theme="book"] .month-index-link::before {
  content: "";
  display: block !important;
  position: absolute;
  z-index: 1;
  top: 50%;
  left: auto;
  right: 0;
  width: 31px;
  height: clamp(19px, 2.4vh, 24px);
  transform: translateY(-50%);
  border-radius: 999px 0 0 999px;
  background:
    linear-gradient(180deg,
      rgba(174, 151, 111, 0.72) 0%,
      #fff9e9 18%,
      #eadcc1 68%,
      rgba(145, 119, 78, 0.52) 100%);
  box-shadow:
    inset 1px 2px 3px rgba(82, 57, 27, 0.26),
    inset 0 -2px 2px rgba(255, 255, 255, 0.62),
    -1px 0 1px rgba(100, 72, 38, 0.20);
}

/* 통로 안쪽 끝의 검은 반원 라벨 */
html[data-theme="book"] .month-index-link::after {
  content: "";
  display: block;
  position: absolute;
  z-index: 2;
  top: 50%;
  right: 0;
  bottom: auto;
  width: 27px;
  height: clamp(17px, 2.1vh, 21px);
  transform: translateY(-50%);
  border-radius: 999px 0 0 999px;
  background:
    linear-gradient(90deg, #24130c 0%, #4a2b1a 72%, #28160e 100%);
  box-shadow:
    inset 3px 0 4px rgba(0, 0, 0, 0.48),
    inset 0 1px 0 rgba(255, 232, 180, 0.12);
}

html[data-theme="book"] .month-index-label {
  position: absolute;
  z-index: 3;
  top: 50%;
  right: 2px;
  width: 24px;
  transform: translateY(-50%);
  display: flex;
  align-items: baseline;
  justify-content: center;
  gap: 1px;
  color: #d9bd78;
  font-family: var(--serif-display);
  font-size: clamp(8px, 0.82vw, 10px);
  font-weight: 400;
  line-height: 1;
  text-shadow: 0 1px 1px #110906;
  pointer-events: none;
}
html[data-theme="book"] .month-index-label b {
  font: inherit;
  font-weight: 500;
}
html[data-theme="book"] .month-index-label small {
  font-size: 0.68em;
  color: inherit;
}
html[data-theme="book"] .month-index-link:hover::after,
html[data-theme="book"] .month-index-link:focus-visible::after {
  background: linear-gradient(90deg, #321b10, #684226 72%, #2a170e);
}
html[data-theme="book"] .month-index-link.is-current::after {
  content: "";
  display: block;
  position: absolute;
  top: 50%;
  right: 0;
  bottom: auto;
  width: 27px;
  height: clamp(17px, 2.1vh, 21px);
  transform: translateY(-50%);
  border-radius: 999px 0 0 999px;
  background: linear-gradient(90deg, #3a2113, #79502b 72%, #321b10);
  box-shadow:
    inset 3px 0 4px rgba(0, 0, 0, 0.42),
    inset 0 0 0 1px rgba(221, 174, 77, 0.58),
    0 0 4px rgba(205, 156, 60, 0.30);
}
html[data-theme="book"] .month-index-link.is-current .month-index-label {
  color: #ffe291;
}

/* 실제 책에서는 현재 위치보다 앞선 색인이 넘긴 종이 묶음과 함께 오른쪽 책배에서 사라진다.
   이 UI에서는 과거 월로 돌아가는 기능을 남겨야 하므로, 클릭 영역은 유지하고 잔상처럼 비친다.

   ⚠️ 예전엔 링크 **전체**에 opacity 를 걸었다. opacity 는 자식이 되돌릴 수 없어서
      라벨(글자)과 홈(그림)이 **같이** 종이 쪽으로 흐려졌고, 그러면 둘의 대비가 무너진다 —
      실측 1.77:1 로 누를 수 있는 것이 안 읽혔다(2026-08-27, WCAG AA 는 4.5:1).
      opacity 를 올려서 푸는 방법은 0.85 는 되어야 4.5 를 넘어(4.88:1) **잔상 연출이 사라진다.**
   ⭐ 그래서 흐리는 대상을 **그림(홈·로젠지)으로만** 좁힌다. 잔상은 그대로 두고 글자만 건져낸다.
      흐려진 로젠지는 밝은 베이지(rgb 167~181)가 되므로 라벨은 금박이 아니라 **먹**이어야 읽힌다. */
html[data-theme="book"] .month-index-link.is-past::before,
html[data-theme="book"] .month-index-link.is-past::after {
  opacity: 0.38;
}
html[data-theme="book"] .month-index-link.is-past:hover::before,
html[data-theme="book"] .month-index-link.is-past:hover::after,
html[data-theme="book"] .month-index-link.is-past:focus-visible::before,
html[data-theme="book"] .month-index-link.is-past:focus-visible::after {
  opacity: 0.72;
}
/* ⚠️ 그림자는 금박 글자를 검은 로젠지에서 띄우려던 것이다. 밝아진 로젠지 위에서는
      글자를 흐리게만 만든다. 이번달 탭(밝은 금박 on 가죽)과는 **색으로** 구분된다. */
html[data-theme="book"] .month-index-link.is-past .month-index-label {
  color: var(--ink);
  text-shadow: none;
}

@media (max-width: 899px), (max-width: 999px) and (max-height: 500px) {
  html[data-theme="book"] .page-right .calendar-frame {
    margin-right: 40px;
  }
  html[data-theme="book"] .month-index {
    right: 0;
    width: 40px;
    bottom: 72px;
    height: auto;
  }
}

/* ============================================================
   21. 한쪽 면 달력도 성경 본문과 같은 화면 안 책 크기 (2026-09-21)
   ⭐ 표지는 화면 안에 고정하고, 달력·성구·통계·로그인·판권지만 종이 안에서 이어서 스크롤한다.
      `.container` 자체를 스크롤하면 속지(::before)와 책등도 함께 밀려 빈 가죽이 드러난다.
   ⭐ 기본 테마는 문서 스크롤을 유지한다. 900px 이상은 래퍼를 없앤 것처럼(display:contents)
      기존 두 지면 그리드와 왼쪽 지면 독립 스크롤을 그대로 쓴다(핸드북 §15-2).
   ============================================================ */
.calendar-book-pages { display: contents; }

@media (max-width: 899px), (max-width: 999px) and (max-height: 500px) {
  html[data-theme="book"] {
    /* 바닥 띠 = 달 이동 줄 + 그 위 후원·설정 도크. 여기에 문서 흐름에 든 이메일 배너 높이(base.html 이 잰다)를 더한다. */
    --one-page-dock-band: 128px;
    /* 책 위아래 바깥 여백 — 여백(.container margin)과 키 계산이 같은 값을 쓰도록 한 변수로 묶는다.
       PC 값 clamp(12px, 3vh, 40px) 는 폰에서 27px 씩 들어가 본문이 그만큼 줄었다(2026-10-06 사용자: Flip6 위아래 공백). */
    --one-page-book-margin: 8px;
    --one-page-book-bottom-band: calc(var(--one-page-dock-band) + var(--email-nudge-h, 0px));
    --one-page-book-h: min(
      calc(100dvh - 2 * var(--one-page-book-margin) - var(--one-page-book-bottom-band)),
      1000px
    );
  }
  /* 성경 읽기 한 면도 같은 키 — read.js 가 이 상자 안에서 지면 높이를 잡는다(2026-09-22). */
  html[data-theme="book"] :is(.container.read-book, .container.calendar-book) {
    margin-top: var(--one-page-book-margin);
    margin-bottom: var(--one-page-book-margin);
  }
  html[data-theme="book"] .container.read-book {
    height: var(--one-page-book-h);
    min-height: 0;
    box-sizing: border-box;
  }
  html[data-theme="book"] .container.calendar-book {
    height: var(--one-page-book-h);
    min-height: 0;
    box-sizing: border-box;
    display: flex;
    flex-direction: column;
    overflow: hidden;
  }
  html[data-theme="book"] .calendar-book-pages {
    display: block;
    flex: 1 1 auto;
    min-height: 0;
    overflow: hidden auto;
    overscroll-behavior: contain;
    scrollbar-width: thin;
  }
  html[data-theme="book"] .container.calendar-book:is(.bc-peeling, .bc-turning) {
    overflow: visible;
  }
}

/* 한쪽 면(세로 폰) — 책 아래 띠에서 정책 푸터 글귀가 위 여백(바깥 20 + 안쪽 15px) 뒤에 앉아 이동 막대 바로 위(약 3px)까지
   밀려 내려가 답답했다(2026-10-02 사용자 지적, Flip 세로 캡처). 위 여백을 걷어 글귀를 책 쪽으로 올리고,
   남는 높이는 글귀와 막대 사이 숨 쉴 틈으로 둔다. 띠 높이(--one-page-dock-band)는 그대로라 문서 길이는 늘지 않는다.
   ⚠️ 가로 폰은 아래 규칙이 다시 덮는다(그쪽은 한 줄로 접는다). */
@media (max-width: 899px) {
  html[data-theme="book"] .business-info-compact {
    margin-top: 0;
    padding: 8px 10px 0;
  }
}

/* 세로 폰 달력·성경 화면 — 후원 버튼(왼쪽)과 ⚙(오른쪽)이 이동 줄 위 70px 에 떠서 정책 푸터와 같은 높이에 앉는다.
   글자가 조금만 커져도(웨일·앱 글자 배율) 링크 양 끝이 버튼 밑으로 들어갔다(2026-10-06 Flip 캡처 「서비스 소개」→「비스 소개」).
   좌우를 버튼 폭만큼 비워 링크를 두 버튼 사이로 모으고, 안 들어가면 두 줄로 접는다. 위 여백·줄 사이 여백을 걷어
   두 줄이어도 이동 줄 위에 머문다(실측 360x740 글자 11px: 링크 71~280·바닥 674, 이동 줄 684). */
@media (max-width: 899px) and (min-height: 501px) {
  html[data-theme="book"] body.has-month-nav .business-info-compact {
    padding: 2px 68px 0;
  }
  html[data-theme="book"] body.has-month-nav .business-info-compact > .business-info-line { margin: 0; }
}

/* 가로 폰 — 띠는 책 밖 정책 푸터가 들어갈 높이다. 62px 이면 줄바꿈된 푸터(95px)만큼 바깥 화면이
   51px 스크롤됐다(2026-10-01 실측 844x390, 달력·성경 둘 다). */
@media (max-width: 999px) and (max-height: 500px) {
  /* ⭐ 2026-10-02 사용자: 가로 화면에서 성경 지면이 너무 낮아 본문이 거의 안 보인다(832x333 실측: 지면 110px, 본문 3줄).
     띠 114px 중 푸터의 위 여백(20)·안쪽 여백(15)이 비어 있었고, 정책 링크 줄은 이동 막대(56px) 밑에 가려 누를 수도 없었다.
     푸터를 여백 없는 한 줄(문의 · 링크)로 접어 막대 바로 위에 두고, 띠는 막대 + 그 한 줄 높이로 줄인다. */
  html[data-theme="book"] { --one-page-dock-band: 86px; }
  html[data-theme="book"] .business-info-compact {
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    align-items: center;
    column-gap: 10px;
    margin-top: 4px;
    padding: 2px 10px;
    line-height: 1.5;
  }
  html[data-theme="book"] .business-info-compact > .business-info-line { margin: 0; }
}

/* 한쪽 면 달력은 화면 높이에 맞춘 책이다 — 책 아래 바닥 띠(--one-page-dock-band)는 책 밖 정책 푸터와
   떠 있는 달 이동 줄·도크가 차지한다. body 바닥 여백은 성경 화면(read.css body:has(.read-book))처럼 0 이다.
   ⚠️ 여기가 146px(아래 §의 일반 규칙)이면 책 아래 여백과 합쳐 문서가 18px 길어져 바깥 화면에
      스크롤바가 생겼다(2026-09-29 사용자 지적, 실측 390x844 에서 문서 862px).
   ⚠️ 푸터를 책 밖으로 뺀 뒤(2026-10-01) 띠 값(128px)을 그대로 두었더니 푸터 높이(74px)만큼 문서가
      길어져 바깥 화면이 다시 스크롤됐다(실측 390x844 문서 918px). 성경 화면과 같은 0 으로 맞춘다.
   ⭐ 이메일 배너는 떠 있으면 책 윗변과 가죽 위에 '등록하기' 버튼을 얹는다 — 읽기 화면처럼 문서 흐름에 넣고,
      그 높이는 위 --email-nudge-h 로 책에서 뺀다. */
@media (max-width: 899px), (max-width: 999px) and (max-height: 500px) {
  html[data-theme="book"] body:has(.calendar-book) {
    padding-bottom: 0 !important;
    flex-wrap: wrap;
    /* 줄이 둘(배너·책)이 되면 기본값(stretch)이 남는 세로 공간을 두 줄에 나눠 배너 아래가 비고 책이 그만큼 내려갔다
       (2026-10-06 사용자 Flip6 캡처, 실측 411x780 배너 아래 46px). 줄을 위로 붙인다. */
    align-content: flex-start;
  }
  html[data-theme="book"] body:has(.calendar-book) > #email-nudge {
    position: static !important;
    transform: none !important;
    margin: 8px auto 0 !important;
    flex: 1 1 100%;
  }
}

@media (min-width: 1000px), (min-width: 900px) and (min-height: 501px) {
  html[data-theme="book"] .calendar-book-pages { display: contents; }
}

/* ============================================================
   22. 펼침면(PC)이 화면 안에 들어온다 (2026-09-07)
   ⭐ 실측 1366×650: 문서 1066px — 책이 화면 밖으로 스크롤됐다(캘린더 칸 100px 고정, 왼쪽 지면 883px).
      종이책은 책상 위에 통째로 놓인다. 표지 포함 책 전체 = 100vh − 책 위아래 여백 − 떠 있는 버튼 띠(body padding 74px).
   ⭐ 달력 칸은 화면이 정한다 — 틀(.calendar-frame)이 오른쪽 지면의 남는 높이를 채우고(flex), 표가 그 안을
      100% 로 채워 6주 기준으로 줄이 나뉜다(book-turn.js lockPageHeight 가 5주 달엔 표 높이를 5/6 로 준다).
      칸 높이를 px 로 다시 박지 않는다(§6 — 화면 폭·높이마다 다르다).
   ⭐ 왼쪽 지면은 제 안에서 스크롤한다(overflow) — 광고·판권지가 있어도 책 밖으로 나가지 않는다.
   낮은 화면(≤760px)은 머리말·요일줄·칸 여백을 죄고 칸의 축약 구절을 접는다(난외주가 전체를 보여 준다).
   ============================================================ */
@media (min-width: 1000px), (min-width: 900px) and (min-height: 501px) {
  /* ⭐ 책 키는 달력과 성경 읽기가 **한 값**을 쓴다(2026-09-22 사용자: 화면 크기별로 성경과 캘린더 높이를 맞춰라).
     읽기 화면은 키 규칙이 없어 read.js 가 뷰포트 82% 안에서 내용만큼 키를 잡았고, 그래서 어느 폭에서도
     달력보다 24~93px 컸다(헤드리스 844 실측: 달력 665 · 읽기 689~754). 값을 두 벌 두면 또 갈린다(§6). */
  html[data-theme="book"] :is(.container.calendar-book, .container.read-book) {
    --book-h: min(calc(100vh - 2 * clamp(12px, 3vh, 40px) - var(--book-bottom-band, 128px)), 1600px);
    height: var(--book-h);
    box-sizing: border-box;
  }
  html[data-theme="book"] .container.calendar-book {
    /* 바닥 띠 = 달 이동 줄(바닥 10px + 높이 56px) + 그 위의 후원·설정 도크 — body padding-bottom 146px 과 같은 값.
       실측(1366x650): 줄이 바닥에서 10~66px, 그 위 도크가 80~124px → 124px 위로 책이 끝나야 한다. 4px 은 여유.
       1000px 이상은 지금까지의 책 키. */
    /* 책 키 — 상한 1000px 은 2560x1440 에서 화면의 69% 밖에 안 채웠다. 1600px 로 올린다. */
    /* ⭐ 폭은 **키에 연동**한다 — 고정 상한으로 키우면 낮고 넓은 화면에서 지면이 정사각형에
       가깝게 납작해진다(실물 책 지면은 세로가 길다). 1.75 는 펼침면 가로:세로 비로,
       한 지면이 대략 1:1.14 가 된다(실물 1:1.4 보다 넓지만 화면을 버리지 않는 절충).
       ⚠️ max(1180px, …) 하한을 둔다 — 이게 없으면 세로가 낮은 화면(1280x800)에서 폭이
          지금보다 **작아진다**. 어느 화면에서도 지금보다 작아지지 않아야 한다.
       실측 채움(가로/세로): 1280x800 92%/73% · 1920x1080 77%/78% · 2560x1440 81%/83%. */
    max-width: min(96vw, max(1180px, calc(var(--book-h) * 1.75)));
    grid-template-rows: auto minmax(0, 1fr);
  }
  html[data-theme="book"] .container.calendar-book > #successMessage { grid-row: 1; }
  html[data-theme="book"] .container.calendar-book > .calendar-book-pages > .page { grid-row: 2; min-height: 0; }
  html[data-theme="book"] .page-left { overflow: hidden auto; scrollbar-width: thin; }
  html[data-theme="book"] .page-right .calendar-frame { flex: 1 1 auto; min-height: 0; overflow: hidden; container-type: size; }
  html[data-theme="book"] .page-right .calendar-table { height: 100%; }
  html[data-theme="book"] .page-right .calendar-table td { height: auto; padding: clamp(3px, 0.8vh, 8px) 8px; }
  html[data-theme="book"] .page-right .day-content { overflow: hidden; }
  /* 책 키를 화면에 맞춰 잘랐으니 바닥 여백은 필요 없다 — 두면 빈 자리만 스크롤된다(실측 +18px). */
  html[data-theme="book"] body:has(.page) { padding-bottom: 0 !important; }

  /* ⭐ PC 광고(728x90)를 놓으면 바닥 띠가 그만큼 두꺼워진다 — 책 키가 그만큼 줄어야
     광고가 책을 덮지 않는다(정책: 콘텐츠를 가리는 배치 금지).
     170px = 조작줄(바닥 10 + 높이 56) + 광고 90 + 안내 문구·여백 14.
     실측 여유: 1280x800 12px · 1280x720 10px · 1920x1080 28px.
     ⚠️ 광고 슬롯이 있는 화면(비로그인)에만 건다. */
  html[data-theme="book"] body:has(#bcAdMobile) .container.calendar-book {
    --book-bottom-band: 170px;
  }
}

/* ⭐ 성경 읽기 화면도 같은 이유로 좁았다(2560px 화면에서 1140px = 45%).
   ⚠️ 달력과 달리 여기는 **글줄 길이**가 읽기를 좌우한다 — 폭을 화면만큼 늘리면 한 줄이
      너무 길어져 눈이 되돌아올 자리를 잃는다. 그래서 키 연동이 아니라 고정 상한을 올린다. 2000px = 펼침면 한 면 약 1000px.
   실측 채움(가로): 1280x800 96% · 1920x1080 96% · 2560x1440 78%. */
@media (min-width: 1000px), (min-width: 900px) and (min-height: 501px) {
  html[data-theme="book"] .container.read-book { max-width: min(96vw, 2000px); }
}

/* ── 광고 자리를 옮길 때 — 문구와 쪽지를 **한 묶음**으로 ─────────────
   ⚠️ 둘을 따로 두고 각자 bottom 을 계산하면 어긋난다. PC 에서 문구가 쓰던 `--ad-h` 기본값(90px)과
      쪽지의 실제 높이(안여백·테두리까지 100px)가 달라 **간격이 0px** 이 되어 겹쳐 보였다
      (2026-09-09 사용자 지적). 묶어 두면 광고 규격이 바뀌어도 겹칠 수 없다
      (§6 — 같은 값을 두 곳에서 세지 않는다). 스크립트가 `.bc-ad-dock` 을 만들어 둘을 담아 옮긴다. */
html[data-theme="book"] .bc-ad-dock {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
}
/* PC — 책 밖, 바닥 조작줄 위의 빈 띠.
   ⚠️ 슬롯은 서버가 책 안(왼쪽 지면)에 렌더한다. 왼쪽 지면은 제 안에서 스크롤해서
      거기 두면 광고가 첫 화면에 47px 만 보인다 — 그래서 900px 이상에서만 밖으로 옮긴다.
   ⚠️ z-index 는 조작줄(9985)보다 **아래** 로 둔다 — 달 이동이 광고에 가리면 안 된다. */
html[data-theme="book"] .bc-ad-dock--pc {
  position: fixed;
  left: 50%;
  transform: translateX(-50%);
  bottom: 66px; /* 줄(바닥 0 · 높이 56) 위 10px */
  z-index: 9984;
}
/* 아주 좁은 폰(<358px) — 320px 고정 광고가 종이에 안 들어가는 폭. 책 **밑**, 문서 흐름.
   종이 여백을 더 깎는 대신 책 아래로 내려 **책은 책대로 온전하게** 둔다
   (2026-09-09 사용자 결정: "커버가 안 되는 좁은 폭에서는 아예 성경책 밑으로 빼버려").
   ⚠️ body 는 flex(가운데 정렬)라 body 직속으로 옮기면 책 **옆**에 선다 — main 안에 넣어야 밑에 온다. */
html[data-theme="book"] .bc-ad-dock--below {
  margin: clamp(10px, 2vh, 18px) auto clamp(4px, 1vh, 10px);
}
/* 묶음 안에서는 쪽지·문구가 **제 자리 계산을 하지 않는다** — 자리는 묶음이 정한다 */
html[data-theme="book"] .bc-ad-dock .ad-banner,
html[data-theme="book"] .bc-ad-dock .ad-notice {
  position: static;
  left: auto;
  margin: 0 !important;
}
html[data-theme="book"] .bc-ad-dock .ad-banner { transform: rotate(-0.5deg); }
html[data-theme="book"] .bc-ad-dock--pc .ad-banner {
  min-width: var(--ad-w, 728px);
  min-height: var(--ad-h, 90px);
  width: auto;
  padding: 4px;
  transform: none;                    /* 넓은 쪽지는 기울이지 않는다 */
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.35);
}
html[data-theme="book"] .bc-ad-dock--below .ad-banner {
  padding: 0;
  /* 책 밖은 어두운 바탕이라 그림자를 조금 진하게 — 쪽지가 떠 보이게 한다 */
  box-shadow: 0 3px 10px rgba(0, 0, 0, 0.38);
}
/* 가죽 바깥의 어두운 바탕 위 — 종이 위 잉크색으로는 안 읽힌다 */
html[data-theme="book"] .bc-ad-dock .ad-notice {
  font-size: 11px;
  color: rgba(240, 232, 214, 0.78) !important;
  text-shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
}

/* ⚠️ 애드핏이 소재를 못 주면 `ins` 가 빈 채로 남는다 — 그때 쪽지 테두리·배경만 그리면
   내용 없는 흰 상자가 종이 아래 덩그러니 놓인다(로컬 확인에서 세로 막대로 드러났다).
   iframe 이 실제로 들어왔을 때만 쪽지를 그린다. 안내 문구도 같이 숨긴다. */
html[data-theme="book"] .ad-banner:not(:has(iframe)) {
  background: none !important;
  border: none !important;
  box-shadow: none !important;
  min-height: 0 !important;
  min-width: 0 !important;
}
html[data-theme="book"] body:not(:has(.ad-banner iframe)) .ad-notice { display: none; }

/* 칸 안의 내용은 **틀의 높이**가 정한다(컨테이너 쿼리 — 뷰포트가 아니라 틀이 실제로 받은 높이).
   읽은 날 칸의 자연 높이: 숫자 29 + 뱃지 20 + 축약 구절 22 + 여백 ≈ 91px. 6주 × 91 + 요일줄 57 + 여백 28 = 631px.
   틀이 그보다 낮으면 축약 구절을 접고(난외주가 전체를 보여 준다), 더 낮으면 뱃지를 숫자 옆에 붙인다(칸 ≈ 43px). */
@container (max-height: 650px) {
  html[data-theme="book"] .page-right .day-content { display: none; }
}
@container (max-height: 460px) {
  html[data-theme="book"] .page-right .day-header { display: flex !important; align-items: center; gap: 4px; flex-wrap: nowrap; min-width: 0; }
  html[data-theme="book"] .page-right .day-header .day-chapters-badge { display: inline-block !important; margin: 0 !important; padding-left: 4px !important; padding-right: 4px !important; }
  html[data-theme="book"] .page-right .calendar-table thead th { height: 28px !important; line-height: 28px !important; padding-top: 2px !important; }
  html[data-theme="book"] .page-right .calendar-table td { padding-top: 3px; padding-bottom: 3px; }
}
@media (min-width: 1000px) and (max-height: 760px), (min-width: 900px) and (min-height: 501px) and (max-height: 760px) {
  html[data-theme="book"] .page-right .header { padding-bottom: 0 !important; margin-bottom: 0 !important; }
  html[data-theme="book"] .page-right .month-title-container { gap: 2px !important; }
  html[data-theme="book"] .page-right .header .today-link,
  html[data-theme="book"] .page-right .header .nav-btn { padding-top: 4px !important; padding-bottom: 4px !important; }
  html[data-theme="book"] .page-right .calendar-frame {
    margin-top: 4px !important; margin-bottom: 6px !important;
    padding-top: 6px !important; padding-bottom: 6px !important;
  }
  /* 왼쪽 지면 — 세로 여백만 죈다(글자 크기는 그대로). 1366×650 실측: 통계 상자 2 + 난외주 + 성구 + 범례 + 판권지 = 465px 지면 */
  html[data-theme="book"] .page-left .margin-note { margin-top: 2px; padding-top: 3px; line-height: 1.55; }
  html[data-theme="book"] .page-left .page-verse { margin-top: 2px !important; margin-bottom: 2px !important; padding-top: 2px !important; padding-bottom: 2px !important; }
  html[data-theme="book"] .page-left .legend-container { padding-top: 3px !important; padding-bottom: 3px !important; }
  html[data-theme="book"] .page-left .stats-container { gap: 4px !important; margin-top: 4px !important; margin-bottom: 4px !important; }
  html[data-theme="book"] .page-left .stat-box { padding: 5px 12px !important; }
}

/* 한쪽 면 최종 배치 — 앞 절의 오래된 폰 보정들보다 뒤에서 실제 책 방향을 확정한다(핸드북 §15). */
@media (max-width: 899px), (max-width: 999px) and (max-height: 500px) {
  /* 월·연 목표 상자는 왼쪽만 넓어 보였다(411px 실측: 종이 안쪽 25~397 에 상자 50~385 — 왼쪽 25 · 오른쪽 12).
     지면 래퍼(.calendar-book-pages)의 좌우 padding 10px 중 왼쪽은 종이 안에, 오른쪽은 종이 밖에 놓이기 때문이다.
     왼쪽 몫만큼 당겨 두 쪽 간격을 맞춘다(2026-10-06 피드백). */
  html[data-theme="book"] .page-left .stats-container { margin-left: -10px !important; }
  /* 달력은 왼쪽 면: 월 색인과 둥근 책배는 왼쪽, 책등은 오른쪽. */
  /* ⚠️ 무대 쪽은 **복제된 .page-right 안의 색인**만 고른다(2026-10-07 플립 녹화). 넘어오는 앞면(.bc-peel-front)은
        색인을 .page-right 없이 따로 복제해 peelPlace 가 잰 자리에 세운다 — 여기 값(.page-right 기준)이 그 자리를
        !important 로 덮으면 기준 상자가 달라 색인이 10px 왼쪽으로 밀려 잘린 채 내려앉았다. */
  html[data-theme="book"] .container.calendar-book .month-index,
  html[data-theme="book"] .bc-peel-stage--page-left .page-right .month-index {
    left: 0 !important;
    right: auto !important;
  }
  html[data-theme="book"] .container.calendar-book::before {
    background:
      linear-gradient(270deg, rgba(70, 45, 20, 0.18) 0%, rgba(70, 45, 20, 0.05) 4%, transparent 9%),
      repeating-linear-gradient(0deg, rgba(0, 0, 0, 0.012) 0 2px, transparent 2px 4px),
      var(--paper);
  }
  html[data-theme="book"] .container.calendar-book .page-right .calendar-frame,
  html[data-theme="book"] .bc-peel-stage--page-left .page-right .calendar-frame {
    margin-left: 40px !important;
    margin-right: 18px !important;
  }
  /* ⭐ 2026-09-22 사용자: "왼쪽 면인 달력에서는 오른쪽 색인과 반대로 생겨야" · "제일 위 칸은 종이 최상단까지".
     자리만 왼쪽으로 옮겨 두고(위) 통로·반원 라벨은 §19 의 오른쪽 면 모양 그대로였다 — 왼쪽 책배에서
     오른쪽을 향해 열린 홈이었다. 여기서 좌우를 뒤집는다: 둥근 쪽·그늘·글자 기준점 전부. */
  html[data-theme="book"] .container.calendar-book .month-index-link::before,
  html[data-theme="book"] .bc-peel-stage--page-left .month-index-link::before {
    right: auto;
    left: -1px;
    border-radius: 0 999px 999px 0;
    box-shadow:
      inset -1px 2px 3px rgba(82, 57, 27, 0.26),
      inset 0 -2px 2px rgba(255, 255, 255, 0.62),
      1px 0 1px rgba(100, 72, 38, 0.20);
  }
  html[data-theme="book"] .container.calendar-book .month-index-link::after,
  html[data-theme="book"] .bc-peel-stage--page-left .month-index-link::after {
    right: auto;
    left: 0;
    border-radius: 0 999px 999px 0;
    background: linear-gradient(270deg, #24130c 0%, #4a2b1a 72%, #28160e 100%);
    box-shadow:
      inset -3px 0 4px rgba(0, 0, 0, 0.48),
      inset 0 1px 0 rgba(255, 232, 180, 0.12);
  }
  html[data-theme="book"] .container.calendar-book .month-index-link:hover::after,
  html[data-theme="book"] .container.calendar-book .month-index-link:focus-visible::after {
    background: linear-gradient(270deg, #321b10, #684226 72%, #2a170e);
  }
  html[data-theme="book"] .container.calendar-book .month-index-link.is-current::after,
  html[data-theme="book"] .bc-peel-stage--page-left .month-index-link.is-current::after {
    right: auto;
    left: 0;
    border-radius: 0 999px 999px 0;
    background: linear-gradient(270deg, #3a2113, #79502b 72%, #321b10);
    box-shadow:
      inset -3px 0 4px rgba(0, 0, 0, 0.42),
      inset 0 0 0 1px rgba(221, 174, 77, 0.58),
      inset 0 1px 0 rgba(255, 232, 180, 0.16);
  }
  html[data-theme="book"] .container.calendar-book .month-index-label,
  html[data-theme="book"] .bc-peel-stage--page-left .month-index-label {
    right: auto;
    left: 2px;
  }
  /* ⭐ 색인 상자는 calendar.js(layoutPhoneMonthIndex)가 잰 값으로 선다(2026-09-30 사용자):
     왼쪽 변 = 종이 가장자리(예전엔 종이 안쪽 여백만큼 11px 떨어져 있었다),
     윗변 = 가름끈 끝 아래(성경 색인과 같은 방식 — 끈이 맨 위 칸을 가리지 않게),
     아랫변 = 달력 칸(.calendar-frame) 바닥. 칸은 grid 1fr 이라 높이만 주면 12칸이 고르게 나뉜다.
     ⚠️ 값은 루트 변수로 둔다 — 달을 넘기면 book-turn.js 가 .month-index 노드를 통째로 갈아 끼워
        인라인 스타일은 사라진다. 변수가 없을 때(스크립트 전)는 예전 자리(top 0 · bottom 72px)다. */
  html[data-theme="book"] .container.calendar-book .month-index,
  html[data-theme="book"] .bc-peel-stage--page-left .page-right .month-index {
    left: var(--cal-idx-left, 0px) !important;
    top: var(--cal-idx-top, 0px) !important;
    bottom: var(--cal-idx-bottom, 72px) !important;
    height: var(--cal-idx-h, auto) !important;
  }
  /* ⭐ 2026-10-01 사용자: "스크롤되어 올라가면 종이는 둥근데 색인은 삐죽 튀어나오고 책갈피 위로 겹친다 —
     책갈피가 종이 위에 있으니 올라오면 안 된다". 색인은 달력과 함께 스크롤되는 것이 맞다 —
     ⚠️ 색인을 책 상자에 고정했더니(d756f66) 달력이 스크롤돼 올라가도 색인만 남아 범례·통계·푸터 위에
        떠 버렸다(사용자: "고정은 되는데 지맘대로 튀어나간다"). 고칠 것은 위치가 아니라 두 가지였다:
     ① 스크롤 상자(.calendar-book-pages)가 각진 사각형이라 종이 둥근 모서리 밖까지 탭을 그렸다 →
        스크롤 상자 모서리를 종이(::before)와 같은 반지름으로 깎아 그 밖은 잘리게 한다.
     ② 가름끈(::after, z-index 0)이 스크롤 상자(z-index 1) 아래라 탭이 끈 위로 지나갔다 → 끈을 올린다.
     넘김 중(bc-peeling·bc-turning)에는 기존 연출을 건드리지 않는다. */
  html[data-theme="book"] .container.calendar-book:not(.bc-peeling):not(.bc-turning) > .calendar-book-pages {
    border-radius: var(--paper-r) 0 0 var(--paper-r);
  }
  html[data-theme="book"] .container.calendar-book:not(.bc-peeling):not(.bc-turning)::after {
    z-index: 2;
  }
  /* 가름끈은 달력(왼쪽 면)에서 색인 열 위로 옮긴다 — 끈 가운데 = 색인 열(40px) 가운데.
     끈 끝 아래에서 색인이 시작하므로 둘이 겹치지 않는다. */
  html[data-theme="book"] .container.calendar-book::after {
    left: calc(var(--cover-pad) + 20px - clamp(10px, 1.6vw, 18px) / 2);
    right: auto;
  }
  /* 색인이 머리말 옆까지 올라오므로 머리말은 색인 폭(40px)만큼 왼쪽을 비운다. */
  html[data-theme="book"] .container.calendar-book .page-right > .header {
    padding-left: 44px !important;
    padding-right: calc(clamp(14px, 5vw, 28px) + clamp(10px, 1.6vw, 18px) + 8px - clamp(16px, 2.6vw, 34px)) !important;
  }

  /* 넓은 화면 가운데 있던 책등을 한쪽 면의 안쪽 변으로 옮긴다. */
  html[data-theme="book"] .container.calendar-book > .book-spine,
  html[data-theme="book"] .container.read-book > .book-spine {
    display: block !important;
    width: clamp(16px, 4vw, 24px);
    transform: none;
    z-index: 3;
  }
  html[data-theme="book"] .container.calendar-book > .book-spine {
    left: auto;
    right: var(--cover-pad);
  }
  /* 본문은 오른쪽 면: 책등 왼쪽, 책 색인과 둥근 책배는 기존 오른쪽. */
  html[data-theme="book"] .container.read-book > .book-spine {
    left: var(--cover-pad);
    right: auto;
  }

  /* ⭐ 책등 쪽에는 가죽 여백이 없다 — 달력의 오른쪽·본문의 왼쪽 종이가 화면 가장자리까지 이어진다.
     펼친 책을 반으로 갈라 한 면씩 보여 주는 것이므로, 안쪽 변에 가죽 띠가 끼면 두 면이 서로 다른
     책처럼 보인다(2026-09-21 사용자: "성경과 캘린더 연장되어있는 느낌이 들도록 여백 없애라").
     ⚠️ 가죽을 걷는 곳은 네 군데이고 **넷이 같이 움직여야** 한다. 하나라도 남으면 띠가 되살아난다.
        ① .container 의 바깥 margin(책등 쪽 0)  ② padding(책등 쪽 0)  ③ 종이 ::before 의 inset(책등 쪽 0)
        ④ 금박 테를 그리는 안쪽 그림자는 종이가 그 자리를 덮으므로 따로 지우지 않는다.
     ⚠️ ②와 ③은 **한 쌍**이다. book-turn.js·read.js 는 종이 = content box(padding 을 뺀 상자)로 읽으므로
        padding 만 걷고 inset 을 두면 넘기는 종이가 실제 종이보다 좁게 그려진다.
     ⚠️ 종이가 책등 쪽 가장자리에서 끝나는 것이므로 내용의 종이 기준 위치는 그대로다(content box == 종이). */
  html[data-theme="book"] .container.calendar-book {
    margin-left: 2vw;
    margin-right: 0;
    width: auto; /* calendar.css 가 calc(100% - 16px) 로 못 박아 둔 폭 — 그대로면 오른쪽으로 넘친다 */
    max-width: none;
    padding-right: 0;
  }
  html[data-theme="book"] .container.calendar-book::before { right: 0; }
  html[data-theme="book"] .container.read-book {
    margin-left: 0;
    margin-right: 2vw;
    width: auto; /* read.css 의 calc(100% - 20px) 대신 여백으로 폭을 정한다 */
    max-width: none;
    padding-left: 0;
  }
  html[data-theme="book"] .container.read-book::before { left: 0; }
  html[data-theme="book"] .container.calendar-book > .book-spine { right: 0; }
  html[data-theme="book"] .container.read-book > .book-spine { left: 0; }

  /* 넘어가는 달력 종이(page-left)는 쉬는 왼쪽 면과 같은 바깥 모서리를 쓴다. 축(mirror)이 아니라 **면**이 정한다 —
     달력→성경은 왼쪽 축이라 --mirror 가 없어도 달력 잎은 왼쪽 모서리가 둥글어야 하고, 성경→달력의 성경 잎은 --mirror 여도
     오른쪽 모서리가 둥글어야 한다(2026-09-21). */
  html[data-theme="book"] .bc-peel-stage--page-left .bc-peel-front,
  html[data-theme="book"] .bc-peel-stage--page-left .bc-peel-back,
  html[data-theme="book"] .bc-peel-stage--page-left .bc-peel-shadow,
  html[data-theme="book"] .bc-peel-stage--page-left .bc-peel-cover,
  html[data-theme="book"] .container.calendar-book > .bc-riffle-base,
  html[data-theme="book"] .container.calendar-book > .bc-riffle-pile {
    border-radius: var(--paper-r) 0 0 var(--paper-r);
  }
}

/* ── 범위 전환(개인 | 그룹) — 변수는 입력 방식 토글(#inputModal .toggle-btn)의 크림·금박, 크기·글꼴은 배지(.auth-badge)를 따른다 ── */
html[data-theme="book"] .scope-wrap,
html[data-theme="book"] .scope-switch {
  --scope-track: rgba(255, 252, 242, 0.52);
  --scope-line: rgba(151, 115, 57, 0.38);
  --scope-ink: #664a2b;
  --scope-hover: rgba(226, 207, 168, 0.56);
  --scope-focus: var(--gilt);
  --scope-on-bg: linear-gradient(180deg, #ead8ae, #d7bc7e);
  --scope-on-ink: #3e2918;
  --scope-on-shadow: inset 0 1px rgba(255, 255, 255, 0.62), 0 1px 3px rgba(80, 53, 25, 0.18);
  --scope-card-bg: rgba(176, 138, 60, 0.07);
  --scope-banner-bg: rgba(176, 138, 60, 0.11);
  --scope-accent: rgba(139, 103, 47, 0.66);
}
html[data-theme="book"] .scope-switch {
  height: auto;
  padding: 1px;
  font-family: var(--serif);
  font-size: clamp(10px, 1.6vw, 12px);
  letter-spacing: 0.03em;
  white-space: nowrap;
}
html[data-theme="book"] .scope-switch button { padding: clamp(4px, 1vw, 7px) clamp(9px, 1.8vw, 15px); }
html[data-theme="book"] .scope-info,
html[data-theme="book"] .scope-card,
html[data-theme="book"] .scope-banner,
html[data-theme="book"] .scope-pick,
html[data-theme="book"] .scope-actions button { font-family: var(--serif); color: var(--ink); }
html[data-theme="book"] .scope-actions button:first-child { color: var(--scope-on-ink); border-color: rgba(139, 103, 47, 0.78); }
html[data-theme="book"] .scope-card,
html[data-theme="book"] .scope-banner,
html[data-theme="book"] .scope-pick { border-radius: 3px; }

/* ── 성경 책배 색인: 구약 남색 · 신약 적색 (2026-09-23 테스터 피드백) ──
   달력 월 색인의 파인 통로·반원 모양은 그대로 재사용하고 **라벨 재질색만** 바꾼다.
   현재 위치의 금박 테두리(box-shadow)는 위 공용 규칙이 계속 맡는다. */
html[data-theme="book"] .read-book .book-index-link.is-old-testament::after {
  background: linear-gradient(90deg,
    var(--book-index-old-edge), var(--book-index-old) 72%, var(--book-index-old-edge));
}
html[data-theme="book"] .read-book .book-index-link.is-new-testament::after {
  background: linear-gradient(90deg,
    var(--book-index-new-edge), var(--book-index-new) 72%, var(--book-index-new-edge));
}
html[data-theme="book"] .read-book .book-index-link.is-old-testament:hover::after,
html[data-theme="book"] .read-book .book-index-link.is-old-testament:focus-visible::after {
  background: linear-gradient(90deg, #213653, #3d5a80 72%, #213653);
}
html[data-theme="book"] .read-book .book-index-link.is-new-testament:hover::after,
html[data-theme="book"] .read-book .book-index-link.is-new-testament:focus-visible::after {
  background: linear-gradient(90deg, #68272e, #96434b 72%, #68272e);
}
/* 지나온 장은 넘긴 종이와 함께 물러난다 — 색은 남기고 진하기만 낮춘다(2026-09-23 사용자: "조금 더 연하게").
   ⚠️ 연해진 탭은 종이색과 섞여 밝아진다(구약 rgb(150,152,153)·신약 rgb(189,149,142)) — 크림 글자로는
      2.4:1 밖에 안 된다. 달력의 지난달과 같은 **먹 글자**로 바꿔야 읽힌다(5.1:1·5.6:1). */
html[data-theme="book"] .read-book .book-index-link.is-past::after { opacity: 0.45; }
html[data-theme="book"] .read-book :is(
  .book-index-link.is-old-testament,
  .book-index-link.is-new-testament
).is-past .month-index-label {
  color: var(--ink);
  text-shadow: none;
}
html[data-theme="book"] .read-book :is(
  .book-index-link.is-old-testament,
  .book-index-link.is-new-testament
) .month-index-label {
  color: #f5e9cf;
  text-shadow: 0 1px 1px rgba(10, 8, 7, 0.82);
}
html[data-theme="book"] .read-book :is(
  .book-index-link.is-old-testament,
  .book-index-link.is-new-testament
).is-current .month-index-label {
  color: #ffe291;
}

/* ============================================================
   가로 폰 공용 — 성경(.read-book)·달력(.calendar-book) 한 벌 (2026-10-02 사용자 Flip 가로 캡처)
   · 이동 막대는 왼쪽 세로 띠, 후원·설정은 띠 아래 같은 세로줄, 바닥 푸터 띠는 없앤다
     (정책 링크는 설정 카드 .dock-policy).
   · 책은 화면 왼쪽 끝까지 깔고 띠는 그 위에 뜬다 — 세로 폰처럼 왼쪽 변이 화면 가장자리에 붙고, 가죽 한 줄
     (--cover-pad-left)이 화면 끝에 남아 경계가 보인다(2026-10-02 사용자: 띠 밑은 성경이 채워져야 한다).
     띠 옆에 책을 띄워 두었던 앞 판(64px 에서 시작 · 네 모서리 둥글게)은 화면 왼쪽에 빈 띠를 남겨 되돌렸다.
     글·격자는 띠 밑으로 들어가지 않게 --lp-strip 만큼 안쪽에서 시작한다.
   · 왼쪽 모서리는 각지게 — 화면 가장자리에 붙은 변이다(§15-7 과 같은 표현).
   · 달력은 이 좌우를 거울로 뒤집는다(블록 끝) — 세로 폰에서 달력 책등이 오른쪽이기 때문이다.
   · 폭 조건은 999px 까지 — Flip 6 의 DPR 2.625 면 가로 웹 영역이 약 914px 라 899px 에 안 걸린다.
     높이(≤500px)가 주 기준이라 태블릿·데스크톱 가로는 영향이 없다.
   ============================================================ */
@media (max-width: 999px) and (max-height: 500px) and (orientation: landscape) {
  html[data-theme="book"]:has(:is(.read-book, .calendar-book)) { --one-page-dock-band: 0px; }
  html[data-theme="book"]:has(:is(.read-book, .calendar-book)) body { padding-bottom: 0 !important; }
  html[data-theme="book"]:has(:is(.read-book, .calendar-book)) .business-info-compact { display: none !important; }
  /* 띠 오른쪽 끝(6 + 48 = 54px) + 틈 — 이 안쪽으로는 글·격자를 두지 않는다 */
  html[data-theme="book"] { --lp-strip: 62px; }
  html[data-theme="book"] :is(.container.read-book, .container.calendar-book) {
    border-radius: 0 var(--book-r) var(--book-r) 0 !important;
  }
  html[data-theme="book"] :is(.container.read-book, .container.calendar-book)::before {
    border-radius: 0 var(--paper-r) var(--paper-r) 0 !important;
  }

  /* 왼쪽 띠 */
  html[data-theme="book"] :is(.read-book > .read-mobile-nav, .calendar-book > .mobile-month-nav) {
    position: fixed !important;
    left: 6px !important;
    right: auto !important;
    top: 6px !important;
    bottom: 104px !important;     /* 아래 두 칸(후원 · 설정, 각 44px + 간격)을 띠와 같은 줄에 세운다 */
    transform: none !important;
    width: 48px !important;
    max-width: none !important;
    height: auto !important;
    margin: 0 !important;
    display: flex !important;
    flex-direction: column;
    gap: 4px;
    padding: 4px !important;
    border-radius: 24px !important;
    align-items: stretch;
    z-index: 9992 !important;
    box-shadow: 0 6px 18px rgba(0, 0, 0, 0.5), 0 1px 0 rgba(255, 240, 210, 0.25) inset !important;
  }

  /* 후원 · 설정 — 띠 아래 같은 세로줄 */
  html[data-theme="book"]:has(:is(.read-book, .calendar-book)) body .coffee-button {
    left: 8px !important; right: auto !important; bottom: 54px !important; top: auto !important;
    box-shadow: 0 6px 18px rgba(0, 0, 0, 0.5) !important;
  }
  html[data-theme="book"]:has(:is(.read-book, .calendar-book)) body .fixed-dock {
    left: 8px !important; right: auto !important; bottom: 6px !important; top: auto !important;
    justify-content: flex-start;
  }
  html[data-theme="book"]:has(:is(.read-book, .calendar-book)) .dock-toggle { box-shadow: 0 6px 18px rgba(0, 0, 0, 0.5); }
  /* 설정 카드는 ⚙ 오른쪽으로 펼친다. 낮은 화면이라 넘치면 카드 안에서 스크롤 */
  html[data-theme="book"]:has(:is(.read-book, .calendar-book)) body .fixed-dock .dock-items {
    right: auto !important; left: 52px !important; bottom: 0 !important; top: auto !important;
    max-width: calc(100vw - 70px);
    max-height: calc(100vh - 12px);
    overflow-y: auto;
    transform: translate(-40px, 0);
  }
  html[data-theme="book"]:has(:is(.read-book, .calendar-book)) body .fixed-dock .dock-toggle-input:checked ~ .dock-items { transform: translate(0, 0); }
  html[data-theme="book"]:has(:is(.read-book, .calendar-book)) .fixed-dock .dock-policy { display: flex !important; flex-direction: column; gap: 4px; }
  html[data-theme="book"]:has(:is(.read-book, .calendar-book)) .dock-policy-links { display: flex; flex-wrap: wrap; gap: 4px 10px; font-size: 12px; }
  html[data-theme="book"]:has(:is(.read-book, .calendar-book)) .dock-policy-links a { color: inherit; text-decoration: underline; text-underline-offset: 2px; }
  html[data-theme="book"]:has(:is(.read-book, .calendar-book)) .dock-policy-mail { font-size: 11px; opacity: 0.75; }

  /* ── 달력 ── */
  /* ⭐ 넘김 무대(body 직속 복제본, .bc-peel-stage--cal)도 지면 규칙(월 탭 숨김·머리글·글자 크기·격자)을 받는다(핸드북 4-12).
     안 받으면 넘기는 동안만 세로 폰 배치로 그려져 월 탭이 튀어나오고 글자가 커졌다(2026-10-07 사용자 플립 가로 녹화). */
  html[data-theme="book"] .container.calendar-book {
    --cover-pad: 8px;
    --cover-pad-left: 4px;
    margin: 6px 8px 6px 0 !important;
    max-width: none !important;
    width: auto !important;
    height: calc(100vh - 12px) !important;
    min-height: 0 !important;
    padding: var(--cover-pad) var(--cover-pad) var(--cover-pad) var(--cover-pad-left) !important;
    box-sizing: border-box;
  }
  html[data-theme="book"] .container.calendar-book::before { inset: var(--cover-pad) var(--cover-pad) var(--cover-pad) var(--cover-pad-left) !important; }
  html[data-theme="book"] .container.calendar-book::after { display: none !important; }   /* 가름끈 */
  html[data-theme="book"] :is(.calendar-book, .bc-peel-stage--cal) .month-index { display: none !important; }      /* 월 탭 — 월은 제목을 눌러 고른다 */
  html[data-theme="book"] .calendar-book > .calendar-book-pages {
    position: relative;
    inset: auto !important;
    height: 100% !important;
    max-height: none !important;
    padding: 0 6px 0 calc(var(--lp-strip) - var(--cover-pad-left)) !important;
    border-radius: 0 var(--paper-r) var(--paper-r) 0;
  }
  html[data-theme="book"] .calendar-book .page-right { display: flex; flex-direction: column; padding: 0 !important; }
  html[data-theme="book"] .calendar-book .page-right > .monthly-stats-section { order: 2; }   /* 격자 먼저, 이 달 통계는 그 아래로 */
  html[data-theme="book"] :is(.calendar-book .page-right > .header, .bc-peel-stage--cal .header) {
    display: flex !important;
    justify-content: center;
    margin: 0 !important;
    padding: 2px 0 0 !important;
    min-height: 0 !important;
  }
  html[data-theme="book"] :is(.calendar-book .page-right > .header, .bc-peel-stage--cal .header) > :not(.month-title-container) { display: none !important; }
  html[data-theme="book"] :is(.calendar-book, .bc-peel-stage--cal) .month-title-container { margin: 0 !important; padding: 0 !important; line-height: 1.1 !important; font-size: 11px !important; }
  html[data-theme="book"] :is(.calendar-book, .bc-peel-stage--cal) .month-title {
    font-size: 15px !important;
    line-height: 1.3 !important;
    padding: 1px 10px !important;
    margin: 0 !important;
    min-height: 0 !important;
  }
  html[data-theme="book"] :is(.calendar-book, .bc-peel-stage--cal) .calendar-frame { margin: 2px 0 0 !important; padding: 0 !important; }
  html[data-theme="book"] :is(.calendar-book, .bc-peel-stage--cal) .calendar-table th { padding: 0 !important; height: 14px; font-size: 10px !important; line-height: 14px; }
  /* 6주가 남은 높이에 다 들어가게: 화면 - 바깥 여백(12) - 표지(16) - 제목(24) - 요일(16) - 틈(6) */
  html[data-theme="book"] :is(.calendar-book, .bc-peel-stage--cal) .calendar-table td {
    height: calc((100vh - 74px) / 6) !important;
    min-height: 0 !important;
    max-height: calc((100vh - 74px) / 6);
    padding: 1px 2px !important;
    vertical-align: top;
    overflow: hidden;
  }
  html[data-theme="book"] :is(.calendar-book, .bc-peel-stage--cal) .calendar-table td .day-header { min-height: 0 !important; height: auto !important; margin: 0 !important; padding: 0 !important; line-height: 1.1 !important; font-size: 11px !important; }
  html[data-theme="book"] :is(.calendar-book, .bc-peel-stage--cal) .calendar-table td .day-number { font-size: 11px !important; line-height: 1.1 !important; }
  html[data-theme="book"] :is(.calendar-book, .bc-peel-stage--cal) .calendar-table td .day-content { min-height: 0 !important; max-height: calc((100vh - 74px) / 6 - 16px); overflow: hidden; }
  html[data-theme="book"] .calendar-book > .mobile-month-nav > * {
    flex: 1 1 0;
    min-width: 0 !important;
    min-height: 0 !important;
    width: auto !important;
    margin: 0 !important;
    padding: 2px !important;
    display: flex !important;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    font-size: 10px !important;
    line-height: 1.15;
    gap: 1px;
    white-space: normal;
    text-align: center;
    word-break: keep-all;
    overflow: hidden;
    border-radius: 18px !important;
  }
  /* 이전달·다음달은 화살표만(읽기 화면 .read-turn 과 같은 모양) — 글자는 화면 읽기용으로 남긴다 */
  html[data-theme="book"] .calendar-book > .mobile-month-nav > .nav-btn > span:not([aria-hidden="true"]) {
    position: absolute; width: 1px; height: 1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap;
  }
  html[data-theme="book"] .calendar-book > .mobile-month-nav > .nav-btn > span[aria-hidden="true"] { font-size: 16px; }

  /* ── 달력은 좌우를 뒤집는다 (2026-10-02 사용자: "캘린더는 방향을 반대로") ──
     세로 폰에서 성경은 책등이 왼쪽, 달력은 책등이 오른쪽이라 달력 책은 화면 오른쪽 끝으로 넘어간다.
     가로 폰도 같은 방향을 따른다 — 띠·후원·설정은 오른쪽 세로줄, 책은 띠 밑을 지나 화면 오른쪽 끝까지
     가고 가죽 한 줄(--cover-pad-right)을 남긴다. 각진 모서리는 오른쪽, 둥근 모서리는 왼쪽이다. */
  html[data-theme="book"] .container.calendar-book {
    --cover-pad-left: var(--cover-pad);
    --cover-pad-right: 4px;
    margin: 6px 0 6px 8px !important;
    padding: var(--cover-pad) var(--cover-pad-right) var(--cover-pad) var(--cover-pad) !important;
    border-radius: var(--book-r) 0 0 var(--book-r) !important;
  }
  html[data-theme="book"] .container.calendar-book::before {
    inset: var(--cover-pad) var(--cover-pad-right) var(--cover-pad) var(--cover-pad) !important;
    border-radius: var(--paper-r) 0 0 var(--paper-r) !important;
  }
  html[data-theme="book"] .calendar-book > .calendar-book-pages {
    padding: 0 calc(var(--lp-strip) - var(--cover-pad-right)) 0 6px !important;
    border-radius: var(--paper-r) 0 0 var(--paper-r);
  }
  html[data-theme="book"] .calendar-book > .mobile-month-nav { left: auto !important; right: 6px !important; }
  html[data-theme="book"]:has(.calendar-book) body .coffee-button { left: auto !important; right: 8px !important; }
  html[data-theme="book"]:has(.calendar-book) body .fixed-dock { left: auto !important; right: 8px !important; justify-content: flex-end; }
  /* 설정 카드는 ⚙ 왼쪽으로 펼친다 */
  html[data-theme="book"]:has(.calendar-book) body .fixed-dock .dock-items {
    left: auto !important; right: 52px !important;
    transform: translate(40px, 0);
  }
}

/* 일러스트(templates/illust/*.svg) — 종이 위에 놓이므로 먹색 선과 금박 채움으로 바꾼다. */
html[data-theme="book"] .illust-empty-state .illust-slot,
html[data-theme="book"] #celebrationOverlay .celebration-emoji { color: var(--ink); --illust-accent: var(--gilt); }

/* 오늘 분량 줄 — 월 색인 홈(폰은 왼쪽·펼침면은 오른쪽 가장자리) 위로 올라타지 않게 비킨다 */
html[data-theme="book"] .plan-today { margin-left: 36px; margin-right: 12px; }

/* 달력 아래 줄의 「오늘 기록하기」 — 이 줄에서 가장 눈에 띄는 단추(2026-10-13 평가 #4).
   황동 바탕에 밝은 글자. 같은 줄의 보조 단추(성경 읽기)는 종이색 그대로다. */
html[data-theme="book"] .mobile-month-nav .nav-record-today {
  background: linear-gradient(180deg, #936b29, #80591b) !important;
  border-color: rgba(92, 60, 14, 0.7) !important;
  color: #fff8e6 !important;
  text-shadow: 0 1px 0 rgba(60, 36, 8, 0.45);
  font-size: clamp(13px, 3.4vw, 15px) !important;
  font-weight: 800;
}
/* ==== NIGHT:BEGIN — tools/book_night_gen.py 가 만든다. 손으로 고치지 않는다 ==== */
/* 변수·책상 — 손으로 정한 값. 종이는 램프빛을 받은 호박빛 상아(화면에서 가장 밝은 물체), 글자는 먹,
   가죽은 어둠 속에 가라앉고, 금박은 불빛을 받아 조금 밝다. 책상은 캄캄하고 위쪽 가운데에만 스탠드 불빛이 떨어진다. */
html[data-theme="book"][data-sys="dark"] {
  color-scheme: light;
  --paper: #e8cfa6;
  --paper-back: #daba87;
  --ink: #1b120b;
  --ink-soft: #4a3826;
  --ink-head: #3d2c18;
  --leather: #2e1b0f;
  --leather2: #1a0f07;
  --gilt: #d4ad57;
  --ribbon: #8c2d2d;
  --rule: rgba(74, 52, 30, 0.22);
  --rule-strong: rgba(74, 52, 30, 0.42);
  --mark: rgba(170, 120, 40, 0.45);
  --dock-option-bg: rgba(238, 213, 174, 0.72);
  --dock-option-border: rgba(74, 52, 30, 0.28);
  --dock-option-hover: rgba(244, 224, 189, 0.95);
  --control-on-fg: #f6ecd8;
  --dock-range-track: rgba(74, 52, 30, 0.22);
  --dock-range-ink: var(--ink);
  --book-index-old: #2a4466;
  --book-index-old-edge: #1b2d45;
  --book-index-new: #8a2f3a;
  --book-index-new-edge: #5c1f27;
}
/* 읽기 화면의 알약·장 제목·역본 단추는 read.css 의 --rp-*·--read-* 변수를 쓰므로 생성기가 못 뒤집는다.
   낮에는 종이보다 살짝 짙은 갈색 기운(rgba(120,90,45,0.16))이라 종이와 거의 같았는데, 밤에는 기본 테마의 연보라
   알약색이 호박빛 종이 위에 그대로 남아 붕 떠 보였다(2026-10-14 사용자 지적). 종이와 같은 갈색 기운으로 돌린다. */
html[data-theme="book"][data-sys="dark"] .read-book {
  --rp-paper: var(--paper);
  --rp-ink: var(--ink);
  --rp-ink-soft: var(--ink-soft);
  --rp-num: var(--ink-soft);
  --rp-rule: var(--rule);
  --rp-chip: rgba(74, 52, 30, 0.10);
  --rp-chip-ink: var(--ink);
  --read-ref-bg: rgba(74, 52, 30, 0.14);
  --read-ref-border: transparent;
  --read-ref-hover: rgba(74, 52, 30, 0.22);
  --read-ver-bg: rgba(74, 52, 30, 0.07);
  --read-ver-hover: rgba(74, 52, 30, 0.13);
}
html[data-theme="book"][data-sys="dark"] body {
  background:
    radial-gradient(46% 34% at 50% -6%, rgba(255, 176, 92, 0.26) 0%, rgba(255, 150, 60, 0.06) 48%, transparent 70%),
    linear-gradient(160deg, #0a0704 0%, #030201 100%) !important;
}
/* 스탠드 불빛 웅덩이 — 종이 위쪽 가운데가 가장 밝고(거의 낮의 종이색), 아래·가장자리로 갈수록 호박빛이 깊어진다 */
html[data-theme="book"][data-sys="dark"] .container::before {
  background:
    radial-gradient(62% 50% at 50% 8%, rgba(255, 234, 192, 0.50) 0%, rgba(255, 224, 176, 0.16) 42%, transparent 72%),
    radial-gradient(110% 85% at 50% 35%, transparent 42%, rgba(34, 26, 14, 0.40) 100%),
    linear-gradient(90deg, rgba(34, 26, 14, 0.28) 0%, rgba(34, 26, 14, 0.09) 4%, transparent 9%),
    repeating-linear-gradient(0deg, rgba(60, 36, 14, 0.04) 0 2px, transparent 2px 4px),
    var(--paper);
  /* 가장자리 비네트 — 40px·0.65 는 폰 폭에서 경계가 급해 불빛 웅덩이 테두리처럼 보였다(2026-10-14). 넓고 옅게 */
  box-shadow: inset 0 0 clamp(90px, 14vw, 220px) rgba(30, 18, 6, 0.32);
}
/* 책상(검은 바탕) 위에 직접 놓이는 푸터 — 종이색 규칙을 뒤집은 먹색은 어둠에 묻히므로 밝은 양피지색으로 */
html[data-theme="book"][data-sys="dark"] .release-footer,
html[data-theme="book"][data-sys="dark"] .release-footer p { color: rgba(222, 208, 180, 0.78) !important; }
html[data-theme="book"][data-sys="dark"] .release-footer a { color: #e2c07a !important; }
html[data-theme="book"][data-sys="dark"] .release-footer { border-top-color: rgba(222, 208, 180, 0.35) !important; }
/* 실제 정책 푸터는 .release-footer 가 아니라 .business-info-compact 다 — 위 규칙이 엉뚱한 클래스를 겨냥해 닿지 않았고,
   뒤집힌 먹색이 검은 책상 위에서 대비 1.7~1.9 였다(2026-10-14 측정). 생성에서 빼고 여기서 밝은 양피지색으로 정한다.
   선택자는 낮 규칙(.business-info-line.policy-links a)과 같은 모양으로 맞춘다. */
html[data-theme="book"][data-sys="dark"] .business-info-line,
html[data-theme="book"][data-sys="dark"] .business-info-line span,
html[data-theme="book"][data-sys="dark"] .business-info-copyright { color: rgba(222, 208, 180, 0.80) !important; }
html[data-theme="book"][data-sys="dark"] .business-info-line.policy-links a { color: #e2c07a !important; }
html[data-theme="book"][data-sys="dark"] .business-info-line.policy-links a:hover { color: #f1dfbb !important; }
/* 「오늘 기록하기」 — 생성기가 .mobile-month-nav .today-link 의 바탕만 크림으로 뒤집고 낮의 밝은 글자(#fff8e6)는 색 표에 없어
   남아 대비 3.3 이었다(2026-10-14 측정). 낮처럼 황동 바탕에 밝은 글자로 두되, 불빛 아래라 황동을 한 단 어둡게 한다.
   생성 규칙(0,4,1)보다 높은 (0,5,1) 로 둔다 — MANUAL 이 생성 규칙보다 앞에 놓이기 때문이다. */
html[data-theme="book"][data-sys="dark"] .mobile-month-nav .nav-record-today.today-link {
  background: linear-gradient(180deg, #8a6224, #704c16) !important;
  border-color: rgba(60, 38, 8, 0.75) !important;
  color: #fff3d6 !important;
}
/* 설정 카드 안 「언어」 줄 — 낮처럼 껍데기 없이 버튼만(base.html 「카드 안 조각은 알약 껍데기를 벗는다」).
   10/14 에 옅은 테두리 띠를 줬더니 낮에 없는 테두리가 야간에만 생겼다(2026-10-16 사용자 지적).
   생성 규칙 .language-switcher(0,3,1)가 base.html(0,3,0)을 이기므로 여기서 (0,4,1)로 다시 걷는다. */
html[data-theme="book"][data-sys="dark"] .dock-items .language-switcher {
  background: transparent !important;
  box-shadow: none !important;
  border: none !important;
}
/* 달력 아래 범례(읽은 날·오늘) — 낮에는 뒤 규칙(「범례 항목도 판을 깔지 않는다」)이 앞의 종이 판을 걷지만,
   생성기는 색이 바뀌는 선언만 옮기므로 그 걷는 규칙(none)이 야간에 없어 항목마다 상자가 생겼다(2026-10-16 사용자 지적).
   생성 규칙 .legend(0,3,1)보다 높게 .legend-container 를 붙여 (0,4,1)로 걷는다.
   ⚠️ 생성기에서 none 을 통째로 옮기면 안 된다 — 뒤에서 판을 되살리는 낮 규칙(읽은 날 동그라미·로그인 종이)이
      색이 같아 안 옮겨지므로 야간에서만 지워진다(같은 날 시도해 계산값 비교로 확인). */
html[data-theme="book"][data-sys="dark"] .legend-container .legend,
html[data-theme="book"][data-sys="dark"] .legend-container .legend-item {
  background: none !important;
  border: none !important;
  box-shadow: none !important;
}

html[data-theme="book"][data-sys="dark"] .container {
  box-shadow: 0 clamp(10px, 2vh, 26px) clamp(20px, 4vh, 60px) rgba(0, 0, 0, 0.55),
    inset 0 0 0 1px rgba(255, 245, 225, 0.03);
}
html[data-theme="book"][data-sys="dark"] .month-title {
  text-shadow: 0 1px 0 rgba(255, 245, 225, 0.6);
}
html[data-theme="book"][data-sys="dark"] .legend, html[data-theme="book"][data-sys="dark"] .legend-item, html[data-theme="book"][data-sys="dark"] .monthly-stats-section, html[data-theme="book"][data-sys="dark"] .stats-section, html[data-theme="book"][data-sys="dark"] .stat-card, html[data-theme="book"][data-sys="dark"] .goal-section {
  background: rgba(247, 226, 189, 0.72) !important;
}
html[data-theme="book"][data-sys="dark"] [class*="goal"], html[data-theme="book"][data-sys="dark"] .goal-btn, html[data-theme="book"][data-sys="dark"] .login-btn, html[data-theme="book"][data-sys="dark"] .version-badge, html[data-theme="book"][data-sys="dark"] .donate-btn, html[data-theme="book"][data-sys="dark"] .submit-btn {
  background: linear-gradient(180deg, #e4c899, #d8b680) !important;
}
html[data-theme="book"][data-sys="dark"] .ad-banner {
  background: #f2ddba;
}
html[data-theme="book"][data-sys="dark"] .form-input {
  background: rgba(247, 226, 189, 0.85) !important;
}
html[data-theme="book"][data-sys="dark"] .tutorial-modal, html[data-theme="book"][data-sys="dark"] .tutorial-tooltip, html[data-theme="book"][data-sys="dark"] .tutorial-popup {
  background: #f2ddba !important;
}
html[data-theme="book"][data-sys="dark"] .tutorial-btn, html[data-theme="book"][data-sys="dark"] [class*="tutorial"] button {
  background: linear-gradient(180deg, #e4c899, #d8b680) !important;
}
html[data-theme="book"][data-sys="dark"] .login-title, html[data-theme="book"][data-sys="dark"] .register-title {
  text-shadow: 0 1px 0 rgba(255, 245, 225, 0.6);
}
html[data-theme="book"][data-sys="dark"] .register-link a, html[data-theme="book"][data-sys="dark"] .login-link a {
  color: #6b3f18 !important;
}
html[data-theme="book"][data-sys="dark"] .btn-secondary {
  background: rgba(247, 226, 189, 0.55) !important;
}
html[data-theme="book"][data-sys="dark"] .language-switcher {
  background: rgba(230, 192, 132, 0.96) !important;
}
html[data-theme="book"][data-sys="dark"] .stat-box {
  background: rgba(247, 226, 189, 0.62) !important;
  box-shadow: 0 0 12px 8px rgba(247, 226, 189, 0.42) !important;
}
html[data-theme="book"][data-sys="dark"] .nav-btn, html[data-theme="book"][data-sys="dark"] .today-link {
  background: rgba(247, 226, 189, 0.62) !important;
}
html[data-theme="book"][data-sys="dark"] .nav-btn:hover, html[data-theme="book"][data-sys="dark"] .today-link:hover {
  background: rgba(224, 178, 105, 0.9) !important;
}
html[data-theme="book"][data-sys="dark"] .bc-peel-back-g {
  background-image: linear-gradient(var(--peel-angle, 90deg),
    transparent calc(var(--peel-pos, 0px) - 1px), rgba(255, 245, 225, 0.15) var(--peel-pos, 0px),
    rgba(40, 25, 10, 0.16) calc(var(--peel-pos, 0px) + var(--peel-w1, 30px)),
    rgba(40, 25, 10, 0.06) calc(var(--peel-pos, 0px) + var(--peel-w2, 140px)),
    rgba(40, 25, 10, 0.06) 100%);
}
html[data-theme="book"][data-sys="dark"] .container {
  box-shadow: 0 clamp(10px, 2vh, 26px) clamp(20px, 4vh, 60px) rgba(0, 0, 0, 0.55),
    inset 0 0 0 1px rgba(255, 245, 225, 0.03),
    inset 0 0 0 clamp(5px, 0.7vw, 9px) rgba(0, 0, 0, 0.14),
    inset 0 0 0 calc(clamp(5px, 0.7vw, 9px) + 1px) rgba(184, 145, 47, 0.30);
}
html[data-theme="book"][data-sys="dark"] .calendar-frame {
  background: rgba(247, 226, 189, 0.28);
}
html[data-theme="book"][data-sys="dark"] .nav-btn, html[data-theme="book"][data-sys="dark"] .today-link, html[data-theme="book"][data-sys="dark"] .version-badge, html[data-theme="book"][data-sys="dark"] .auth-badge, html[data-theme="book"][data-sys="dark"] .admin-badge, html[data-theme="book"][data-sys="dark"] .goal-setting-btn, html[data-theme="book"][data-sys="dark"] .coffee-button {
  box-shadow: inset 0 0 0 1px rgba(247, 226, 189, 0.55) !important;
}
html[data-theme="book"][data-sys="dark"] .dock-items {
  background: rgba(241, 217, 179, 0.97) !important;
}
html[data-theme="book"][data-sys="dark"] .coffee-button {
  background: linear-gradient(180deg, #e4c899, #d8b680) !important;
}
html[data-theme="book"][data-sys="dark"] .release-item {
  background: rgba(247, 226, 189, 0.72) !important;
}
html[data-theme="book"][data-sys="dark"] .goal-setting-btn {
  background: linear-gradient(180deg, #e4c899, #d8b680) !important;
}
html[data-theme="book"][data-sys="dark"] .back-btn {
  background: rgba(247, 226, 189, 0.62) !important;
  box-shadow: inset 0 0 0 1px rgba(247, 226, 189, 0.55) !important;
}
html[data-theme="book"][data-sys="dark"] .calendar-frame {
  background: rgba(247, 226, 189, 0.34) !important;
}
html[data-theme="book"][data-sys="dark"] .stat-box, html[data-theme="book"][data-sys="dark"] .stats-section, html[data-theme="book"][data-sys="dark"] .monthly-stats-section, html[data-theme="book"][data-sys="dark"] .goal-section {
  box-shadow: 0 1px clamp(6px, 1vw, 14px) rgba(90, 68, 40, 0.10),
    0 0 clamp(10px, 1.6vw, 18px) clamp(5px, 0.9vw, 10px) rgba(247, 226, 189, 0.5) !important;
}
html[data-theme="book"][data-sys="dark"] .mobile-month-nav {
  background: repeating-linear-gradient(0deg, rgba(70, 45, 20, 0.018) 0 1px, transparent 1px 3px),
    rgba(241, 217, 179, 0.96);
  box-shadow: 0 8px 24px rgba(22, 13, 9, 0.34), inset 0 1px 0 rgba(255, 245, 225, 0.29);
}
html[data-theme="book"][data-sys="dark"] .mobile-month-nav .nav-btn, html[data-theme="book"][data-sys="dark"] .mobile-month-nav .today-link {
  background: rgba(245, 222, 184, 0.58) !important;
}
html[data-theme="book"][data-sys="dark"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) :is(.modal-content, .payment-modal-content, .celebration-content), html[data-theme="book"][data-sys="dark"] #inputModal.popover-style .modal-content {
  background: repeating-linear-gradient(0deg, rgba(89, 63, 35, 0.022) 0 1px, transparent 1px 4px),
    linear-gradient(100deg, rgba(126, 91, 47, 0.08), transparent 9%, transparent 91%, rgba(126, 91, 47, 0.06)),
    #e8cfa6 !important;
}
html[data-theme="book"][data-sys="dark"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .modal-header {
  box-shadow: inset 0 -1px rgba(255, 245, 225, 0.24) !important;
}
html[data-theme="book"][data-sys="dark"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .modal-control-btn {
  background: rgba(245, 222, 184, 0.48) !important;
}
html[data-theme="book"][data-sys="dark"] #inputModal .chapter-count-input-group, html[data-theme="book"][data-sys="dark"] #inputModal .mode-legend, html[data-theme="book"][data-sys="dark"] #inputModal .record-item {
  background: rgba(245, 222, 184, 0.34) !important;
}
html[data-theme="book"][data-sys="dark"] #inputModal .record-item:hover {
  background: rgba(245, 222, 184, 0.54) !important;
}
html[data-theme="book"][data-sys="dark"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) input[type="text"], html[data-theme="book"][data-sys="dark"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) input[type="number"], html[data-theme="book"][data-sys="dark"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) input[type="date"], html[data-theme="book"][data-sys="dark"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) select {
  background: rgba(247, 226, 189, 0.56) !important;
  box-shadow: inset 0 -1px rgba(255, 245, 225, 0.24) !important;
}
html[data-theme="book"][data-sys="dark"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) input:focus, html[data-theme="book"][data-sys="dark"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) select:focus {
  background: rgba(247, 226, 189, 0.82) !important;
}
html[data-theme="book"][data-sys="dark"] #inputModal .toggle-btn {
  background: rgba(245, 222, 184, 0.52) !important;
}
html[data-theme="book"][data-sys="dark"] #inputModal .toggle-btn.active {
  background: linear-gradient(180deg, #ddbc87, #cea565) !important;
  box-shadow: inset 0 1px rgba(255, 245, 225, 0.31), 0 1px 3px rgba(80, 53, 25, 0.18) !important;
}
html[data-theme="book"][data-sys="dark"] #inputModal .toggle-btn:hover:not(.active), html[data-theme="book"][data-sys="dark"] #inputModal .toggle-btn:focus-visible:not(.active) {
  background: rgba(214, 167, 93, 0.56) !important;
}
html[data-theme="book"][data-sys="dark"] #inputModal .edit-record-btn {
  background: linear-gradient(180deg, #ddbc87, #cea565) !important;
}
html[data-theme="book"][data-sys="dark"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .submit-btn, html[data-theme="book"][data-sys="dark"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .add-btn {
  background: linear-gradient(180deg, #ddbc87, #cea565) !important;
  box-shadow: inset 0 1px rgba(255, 245, 225, 0.32), 0 2px 5px rgba(79, 53, 27, 0.16) !important;
}
html[data-theme="book"][data-sys="dark"] :is(#inputModal, #goalModal, #logoutModal, #monthYearPickerModal, #payment-modal, #celebrationOverlay) .cancel-btn {
  background: rgba(245, 222, 184, 0.42) !important;
}
html[data-theme="book"][data-sys="dark"] :is(
  .preset-btn, .month-btn, .year-btn, .decade-btn, .view-title
) {
  background: rgba(245, 222, 184, 0.62) !important;
}
html[data-theme="book"][data-sys="dark"] :is(
  .payment-amount, .donation-details, .donation-amount-section, .usage-list, .faq-item, .celebration-stats
) {
  background: rgba(245, 222, 184, 0.55) !important;
}
html[data-theme="book"][data-sys="dark"] .month-index-link::before {
  box-shadow: inset 1px 2px 3px rgba(82, 57, 27, 0.26),
    inset 0 -2px 2px rgba(255, 245, 225, 0.31),
    -1px 0 1px rgba(100, 72, 38, 0.20);
}
@media (max-width: 899px), (max-width: 999px) and (max-height: 500px) {
html[data-theme="book"][data-sys="dark"] .container.calendar-book .month-index-link::before, html[data-theme="book"][data-sys="dark"] .bc-peel-stage--page-left .month-index-link::before {
  box-shadow: inset -1px 2px 3px rgba(82, 57, 27, 0.26),
      inset 0 -2px 2px rgba(255, 245, 225, 0.31),
      1px 0 1px rgba(100, 72, 38, 0.20);
}
}
/* ==== NIGHT:END ==== */

/* ── themes/dark.css ── */
/* ============================================================
   자동 테마의 어두운 판 — 기본(classic) 화면을 어둡게.
   ⭐ 스코프는 한 벌뿐이다:
      html[data-theme="classic"][data-sys="dark"]     — '자동' + 기기(브라우저)가 어두움
      (data-sys 는 base.html 부트 스크립트가 그리기 전에 찍는다)
   별도 '다크'·'자동' 선택지는 2026-09-02 에 뺐다 — 옛 쿠키 dark/auto 는 themes.py 가
   classic 으로 흡수한다.
   ⚠️ 새 배치는 만들지 않는다 — 색·명암만 바꾼다. 배치가 갈라지면 테마마다
      버그가 두 벌이 된다(플레이북 룰 6).
   ============================================================ */

html[data-theme="classic"][data-sys="dark"] {
  color-scheme: dark;
}

html[data-theme="classic"][data-sys="dark"] body {
  background: linear-gradient(135deg, #191d2e 0%, #241f36 100%);
  color: #dfe4f5;
}

html[data-theme="classic"][data-sys="dark"] .container {
  background: rgba(24, 27, 41, 0.96);
  border-color: rgba(255, 255, 255, 0.06);
  box-shadow: 0 20px 40px rgba(0, 0, 0, 0.45), 0 1px 3px rgba(0, 0, 0, 0.4);
}

/* ── 머리말·월 제목 ── */
html[data-theme="classic"][data-sys="dark"] .header {
  border-bottom-color: rgba(139, 156, 255, 0.14);
}
html[data-theme="classic"][data-sys="dark"] .month-title,
html[data-theme="classic"][data-sys="dark"] .header h1 {
  color: #eceffc;
}

/* ── 달력 ── */
html[data-theme="classic"][data-sys="dark"] .calendar-table th {
  background: linear-gradient(135deg, #3d4a86 0%, #4c3d78 100%);
  box-shadow: 0 4px 15px rgba(0, 0, 0, 0.35);
}
html[data-theme="classic"][data-sys="dark"] .calendar-table td {
  background: linear-gradient(135deg, #232840 0%, #262b45 100%);
  box-shadow: 0 4px 15px rgba(0, 0, 0, 0.25), 0 1px 3px rgba(0, 0, 0, 0.3);
}
html[data-theme="classic"][data-sys="dark"] .calendar-table td:hover {
  border-color: rgba(139, 156, 255, 0.4);
  box-shadow: 0 12px 30px rgba(0, 0, 0, 0.4);
}
html[data-theme="classic"][data-sys="dark"] .day-number {
  color: #9daeff;
}

/* ── 범례·버전 배지 ── */
html[data-theme="classic"][data-sys="dark"] .legend-container {
  background-color: #1e2338;
}

/* ── 통계 카드 ── */
html[data-theme="classic"][data-sys="dark"] .stat-box {
  background: linear-gradient(135deg, rgba(32, 36, 56, 0.95) 0%, rgba(28, 32, 50, 0.95) 100%);
  border-color: rgba(139, 156, 255, 0.14);
  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.3);
}

/* ── 항상 떠 있는 월 이동 줄 ── */
@media (max-width: 768px) {
  html[data-theme="classic"][data-sys="dark"] .mobile-month-nav {
    border-color: rgba(139, 156, 255, 0.3);
    background: rgba(26, 29, 46, 0.94);
    box-shadow: 0 4px 14px rgba(0, 0, 0, 0.5);
  }
}

/* ── 모달·입력 ── */
html[data-theme="classic"][data-sys="dark"] .modal-content,
html[data-theme="classic"][data-sys="dark"] .goal-modal-content {
  background: #20243a;
  color: #dfe4f5;
}
html[data-theme="classic"][data-sys="dark"] input,
html[data-theme="classic"][data-sys="dark"] select,
html[data-theme="classic"][data-sys="dark"] textarea {
  background: #171a2b;
  color: #e5e9f8;
  border-color: rgba(139, 156, 255, 0.25);
}

/* ── 바닥 사업자 정보 ── */
html[data-theme="classic"][data-sys="dark"] .business-info-compact {
  border-top-color: rgba(255, 255, 255, 0.08);
  color: #8a93b4;
}

/* ── 설정 손잡이(⚙) — 카드와 같은 남색 바탕·밝은 글자(base.html --dock-toggle-* 토큰) ── */
html[data-theme="classic"][data-sys="dark"] {
  --dock-toggle-bg: #20243a;
  --dock-toggle-fg: #dfe4f5;
  --dock-toggle-border: rgba(139, 156, 255, 0.25);
  --dock-option-bg: rgba(139, 156, 255, 0.12);
  --dock-option-border: rgba(139, 156, 255, 0.28);
  --dock-option-hover: rgba(139, 156, 255, 0.20);
  /* 글자 크기 범위값 — 밝은 테마 대체값 #3a3a3a은 이 카드에서 대비 1.34:1뿐이다. */
  --dock-range-ink: var(--dock-toggle-fg);
  /* 설정 카드 안 그룹 구분선·제목(2026-09-30) */
  --dock-divider: rgba(139, 156, 255, 0.22);
  --dock-group-title-fg: rgba(223, 228, 245, 0.64);
}

/* ── 설정 도크 카드 ── */
html[data-theme="classic"][data-sys="dark"] .dock-items {
  background: #20243a;
  color: #dfe4f5;
}

/* 카드 안의 옅은 남색 버튼에서도 밝은 글자를 직접 지정한다. 선택된 버튼 색은 유지한다. */
html[data-theme="classic"][data-sys="dark"] .dock-items .seg-opt:not(.on),
html[data-theme="classic"][data-sys="dark"] .dock-items .theme-opt:not(.on),
html[data-theme="classic"][data-sys="dark"] .dock-items .lang-btn:not(.active),
html[data-theme="classic"][data-sys="dark"] .dock-items .dock-row-label {
  color: var(--dock-toggle-fg);
}

/* ── 어두운 바탕 위 글자 — 1차 캡처에서 안 읽히던 것들 ── */
html[data-theme="classic"][data-sys="dark"] .legend,
html[data-theme="classic"][data-sys="dark"] .legend-item,
html[data-theme="classic"][data-sys="dark"] .stat-header,
html[data-theme="classic"][data-sys="dark"] .stat-box {
  color: #d6dbf0;
}
html[data-theme="classic"][data-sys="dark"] .business-info-line a,
html[data-theme="classic"][data-sys="dark"] .policy-links a {
  color: #9daeff;
}
html[data-theme="classic"][data-sys="dark"] .stats-days,
html[data-theme="classic"][data-sys="dark"] .stat-header h3 {
  color: #d6dbf0;
}
html[data-theme="classic"][data-sys="dark"] #monthly-stats-text,
html[data-theme="classic"][data-sys="dark"] #yearly-stats-text {
  color: #d6dbf0;
}
/* 통계 카드 제목 — calendar.css 가 #374151 로 박아 두어 어두운 카드에서 대비 1.5 였다
   (2026-09-02 tools/darkscan.mjs 실측, PC·모바일 공통). */
html[data-theme="classic"][data-sys="dark"] .stat-title {
  color: #eceffc;
}

/* ── 범위 전환(개인 | 그룹) — scope-switch.css 의 변수만 바꾼다. 켜진 쪽은 배지와 같은 보라를 쓴다 ── */
html[data-theme="classic"][data-sys="dark"] .scope-wrap,
html[data-theme="classic"][data-sys="dark"] .scope-switch {
  --scope-track: rgba(28, 32, 50, 0.92);
  --scope-line: rgba(139, 156, 255, 0.34);
  --scope-ink: #b7c0f2;
  --scope-hover: rgba(139, 156, 255, 0.16);
  --scope-focus: #9daeff;
  --scope-on-shadow: 0 4px 14px rgba(0, 0, 0, 0.45);
  --scope-card-bg: rgba(139, 156, 255, 0.08);
  --scope-banner-bg: rgba(139, 156, 255, 0.13);
  --scope-accent: #9daeff;
}

/* ── 공용 밝은 테마 색이 남던 화면·조작 ─────────────────────────
   calendar/auth/정책/release CSS는 기본 보라를 직접 넣는다. 다크 판은 배치를 복사하지 않고
   여기서 재질색만 한 벌로 덮는다(핸드북 §21 전체 화면·폭 스캔). */
html[data-theme="classic"][data-sys="dark"] {
  --dark-accent: #9daeff;
  --dark-accent-start: #3d4a86;
  --dark-accent-end: #4c3d78;
  --dark-panel: #20243a;
  --dark-panel-soft: #262b45;
  --dark-ink: #dfe4f5;
  --dark-ink-soft: #a7b0cc;
}

/* 그라데이션 글자는 color만 바꾸면 투명 채움 위로 옛 보라가 그대로 남는다. */
html[data-theme="classic"][data-sys="dark"] .month-title,
html[data-theme="classic"][data-sys="dark"] .login-title,
html[data-theme="classic"][data-sys="dark"] .register-title,
html[data-theme="classic"][data-sys="dark"] .header h1 {
  background: none;
  background-clip: border-box;
  -webkit-background-clip: border-box;
  -webkit-text-fill-color: currentColor;
  color: #eceffc;
}

html[data-theme="classic"][data-sys="dark"] .mobile-month-nav .nav-btn,
html[data-theme="classic"][data-sys="dark"] .mobile-month-nav .nav-record-today,
html[data-theme="classic"][data-sys="dark"] .mobile-month-nav .nav-record-today:hover,
html[data-theme="classic"][data-sys="dark"] .version-badge,
html[data-theme="classic"][data-sys="dark"] .auth-badge,
html[data-theme="classic"][data-sys="dark"] .btn-primary,
html[data-theme="classic"][data-sys="dark"] .back-btn,
html[data-theme="classic"][data-sys="dark"] .release-version,
html[data-theme="classic"][data-sys="dark"] .progress-fill,
/* 안내(튜토리얼) "다음" — tutorial.css 가 옛 보라 그라데이션을 박아 둔다(모든 폭). */
html[data-theme="classic"][data-sys="dark"] .tutorial-next {
  background: linear-gradient(135deg, var(--dark-accent-start), var(--dark-accent-end));
  color: #fff;
}
/* 안내 문구 — tutorial.css 가 보라 #667eea 를 박아 둔다. 안내 상자는 다크에서도 흰 바탕이라 짙은 강조색으로. */
html[data-theme="classic"][data-sys="dark"] .tutorial-text {
  color: var(--dark-accent-start);
}

html[data-theme="classic"][data-sys="dark"] .today {
  background: linear-gradient(135deg, var(--dark-accent-start), var(--dark-accent-end)) !important;
  border-color: var(--dark-accent) !important;
}
html[data-theme="classic"][data-sys="dark"] .today .day-number {
  color: #27325e;
}
html[data-theme="classic"][data-sys="dark"] .legend-today {
  background-color: var(--dark-accent);
}

/* 로그인·가입: 바깥만 어둡고 카드가 흰색으로 남지 않게 공용 인증 화면 한 벌을 뒤집는다. */
html[data-theme="classic"][data-sys="dark"] .login-container,
html[data-theme="classic"][data-sys="dark"] .register-container {
  background: rgba(24, 27, 41, 0.96);
  color: var(--dark-ink);
  border-color: rgba(255, 255, 255, 0.08);
  box-shadow: 0 20px 40px rgba(0, 0, 0, 0.45);
}
html[data-theme="classic"][data-sys="dark"] .login-subtitle,
html[data-theme="classic"][data-sys="dark"] .register-subtitle,
html[data-theme="classic"][data-sys="dark"] .register-link p,
html[data-theme="classic"][data-sys="dark"] .login-link p {
  color: var(--dark-ink-soft);
}
html[data-theme="classic"][data-sys="dark"] .form-label {
  color: var(--dark-ink);
}
html[data-theme="classic"][data-sys="dark"] .form-input:focus {
  border-color: var(--dark-accent);
  background: #171a2b;
  box-shadow: 0 0 0 3px rgba(157, 174, 255, 0.16);
}
html[data-theme="classic"][data-sys="dark"] .btn-secondary {
  background: rgba(157, 174, 255, 0.10);
  color: var(--dark-ink);
  border-color: rgba(157, 174, 255, 0.24);
}
html[data-theme="classic"][data-sys="dark"] .register-link {
  border-top-color: rgba(255, 255, 255, 0.10);
}
html[data-theme="classic"][data-sys="dark"] .login-link {
  border-top-color: rgba(255, 255, 255, 0.10);
}

/* 정책·릴리즈 화면도 홈과 같은 남색 카드·보라빛 강조를 쓴다. */
html[data-theme="classic"][data-sys="dark"] .release-item {
  background: rgba(255, 255, 255, 0.055);
  border-color: rgba(157, 174, 255, 0.16);
  box-shadow: 0 4px 15px rgba(0, 0, 0, 0.24);
}
html[data-theme="classic"][data-sys="dark"] .release-title,
html[data-theme="classic"][data-sys="dark"] .release-section h4,
html[data-theme="classic"][data-sys="dark"] .release-footer p {
  color: var(--dark-ink);
}
html[data-theme="classic"][data-sys="dark"] .release-date,
html[data-theme="classic"][data-sys="dark"] .release-section li,
html[data-theme="classic"][data-sys="dark"] .header p {
  color: var(--dark-ink-soft);
}
html[data-theme="classic"][data-sys="dark"] .release-commit {
  background: rgba(255, 255, 255, 0.07);
  color: var(--dark-ink);
  border-color: rgba(157, 174, 255, 0.20);
}
html[data-theme="classic"][data-sys="dark"] .release-footer {
  border-top-color: rgba(255, 255, 255, 0.10);
}
html[data-theme="classic"][data-sys="dark"] .register-link a,
html[data-theme="classic"][data-sys="dark"] .login-link a,
html[data-theme="classic"][data-sys="dark"] .release-footer a,
html[data-theme="classic"][data-sys="dark"] .business-info-line.policy-links a,
html[data-theme="classic"][data-sys="dark"] .policy-content a {
  color: var(--dark-accent);
}
html[data-theme="classic"][data-sys="dark"] .business-info-line {
  color: var(--dark-ink-soft);
}

/* 일러스트(templates/illust/*.svg) — 어두운 바탕의 「내 구절」 빈 상태에서 선이 묻히지 않게 밝힌다. */
html[data-theme="classic"][data-sys="dark"] .illust-empty-state .illust-slot { color: #cbd5e1; --illust-accent: #e0b45a; }
