/* ================================================================
   Shoka (書架) by SAKUOLIA — サイト固有スタイル
   tokens.css / components.css の後に読み込む。
   ================================================================ */

/* Web フォントはテンプレート側 <head> の <link>(preconnect 付き)で読み込む */

* {
  box-sizing: border-box;
}

html {
  -webkit-text-size-adjust: 100%;
}

body {
  margin: 0;
  background: var(--bg);
  color: var(--text);
  font-family: var(--font-body);
  line-height: var(--leading-body);
  /* 保険。表・図・行内数式はどれも自前で横スクロールする箱に収めてある
     (.diagram-body 等の overflow: auto と、.reader-layout の
     minmax(0, 1fr) / min-width: 0)。ただしSafari系のエンジンでは、
     版元幅を大きく超える実寸のMermaid図などがあると、grid の
     minmax(0, 1fr) が効き切らずに列そのものが広がり、ページ全体が
     右にはみ出すことがある(中の箱は正しく横スクロールするのに、紙の
     右に余分な余白が付いて見える)。ここで最終的に断ち切る。 */
  overflow-x: hidden;
}

a {
  color: var(--link);
}

:focus-visible {
  outline: var(--focus-ring);
  outline-offset: 3px;
}

.skip-link {
  position: absolute;
  left: var(--sp-3);
  top: var(--sp-2);
  z-index: 10;
  padding: var(--sp-1) var(--sp-3);
  background: var(--surface);
  border: var(--hairline);
  border-radius: var(--radius);
  transform: translateY(-200%);
}

.skip-link:focus-visible {
  transform: none;
}

img,
svg {
  max-width: 100%;
}

.container {
  max-width: var(--container);
  margin: 0 auto;
  padding: 0 var(--sp-4);
}

/* ----------------------------------------------------------------
   ヘッダー
   ---------------------------------------------------------------- */
.site-header {
  /* ヘッダーは画面上端に貼り付けたままにする。PWA(ホーム画面から開いた
     スタンドアロン表示)ではブラウザのバーが無いぶん縦が広く、ページ全体が
     一画面に収まってヘッダーが見えたままになるが、Safari で開くとバーぶん
     縦が足りず、少しスクロールしただけでヘッダーが画面の外へ出てしまう。
     どちらの見え方でも「書架」への戻り道とパンくずを残すため、sticky にする。
     高さは reader.js の trackHeaderHeight が --header-h に実寸で置き、
     下に続く sticky(目次・ツールバー)と見出しの逃げがそれを基準に並ぶ。 */
  position: sticky;
  top: 0;
  z-index: 20;
  background: var(--bg);
  border-bottom: var(--hairline);
}

/* 読書画面だけは、ヘッダー・フッターの帯も本文と同じ広さに合わせる
   (templates.ts が <body class="reader"> を付ける)。 */
body.reader .site-header .container,
body.reader .site-footer .container {
  max-width: var(--reader-container);
}

.site-header .container {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-4);
  padding-top: var(--sp-3);
  padding-bottom: var(--sp-3);
}

.brand {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  text-decoration: none;
  color: var(--text);
  /* 長いパンくずに押されて「書架」が縦積みにならないようにする */
  flex: none;
  white-space: nowrap;
}

.brand img {
  width: 28px;
  height: 28px;
  flex: none;
}

/* 明面用(紺)と夜面用(白)のマークを両方置いて、面ごとに入れ替える。 */
.brand-mark-night {
  display: none;
}

[data-theme="night"] .brand-mark-day {
  display: none;
}

[data-theme="night"] .brand-mark-night {
  display: inline-block;
}

.brand-word {
  font-family: var(--font-logotype);
  font-size: var(--fs-lg);
  letter-spacing: var(--tracking-brand);
}

.crumb-nav {
  font-family: var(--font-data);
  font-size: var(--fs-sm);
  color: var(--text-muted);
  display: flex;
  gap: var(--sp-2);
  flex-wrap: wrap;
  min-width: 0;
}

.crumb-nav a {
  color: var(--text-muted);
  text-decoration: none;
}

.crumb-nav a:hover {
  color: var(--link);
}

/* ----------------------------------------------------------------
   書架 (トップ)
   ---------------------------------------------------------------- */
/* 書架のヒーローは、姉妹サイト(HIZUKE)と同じ「静かな紺の帯」の骨格に合わせる。
   中央揃えの題号＋小さなリード1行だけを置き、帯の高さは最小限に抑える。
   その紺の面に、うっすらと背表紙(::before)と棚板(::after)を敷いて書棚に見せる。
   装飾はどちらも z-index を負にして本文の下に置く。 */
.shelf-hero {
  position: relative;
  isolation: isolate;
  overflow: hidden;
  background: var(--saku-night);
  color: var(--geppaku);
  padding: var(--sp-5) 0 var(--sp-5);
  text-align: center;
}

/* 背表紙の列。下端 8px は棚板の分だけ空ける（本が板に載る）。 */
.shelf-hero::before {
  content: "";
  position: absolute;
  inset: 0 0 8px;
  z-index: -2;
  background:
    /* 天（上端）に当たる淡い反射 */
    linear-gradient(180deg, rgba(232, 236, 245, 0.10), transparent 30%),
    /* 背表紙の題簽（各巻の背に貼られた金の小札）。
       背表紙より内側で切れるように、幅方向に余白を挟んで刻む。 */
    repeating-linear-gradient(
      90deg,
      transparent 0 5px,
      color-mix(in srgb, var(--getsurin) 22%, transparent) 5px 21px,
      transparent 21px 34px,
      color-mix(in srgb, var(--getsurin) 15%, transparent) 34px 39px,
      transparent 39px 51px,
      color-mix(in srgb, var(--getsurin) 20%, transparent) 51px 65px,
      transparent 65px 76px,
      color-mix(in srgb, var(--getsurin) 14%, transparent) 76px 81px,
      transparent 81px 91px,
      color-mix(in srgb, var(--getsurin) 20%, transparent) 91px 107px,
      transparent 107px 120px,
      color-mix(in srgb, var(--getsurin) 16%, transparent) 120px 132px,
      transparent 132px 139px
    ),
    repeating-linear-gradient(
      90deg,
      color-mix(in srgb, var(--tsukikage) 55%, var(--shinya)) 0 26px,
      var(--saku-night) 26px 29px,
      var(--tsukikage) 29px 43px,
      var(--saku-night) 43px 46px,
      var(--shinya) 46px 70px,
      var(--saku-night) 70px 73px,
      color-mix(in srgb, var(--moon-silver) 18%, var(--tsukikage)) 73px 83px,
      var(--saku-night) 83px 86px,
      color-mix(in srgb, var(--tsukikage) 45%, var(--shinya)) 86px 112px,
      var(--saku-night) 112px 115px,
      var(--shinya) 115px 136px,
      var(--saku-night) 136px 139px
    );
  /* 反射 / 題簽 / 背表紙 の3層。題簽だけ高さ 5px の帯に閉じ込める。 */
  background-size: auto, 139px 5px, auto;
  background-position: 0 0, 0 62%, 0 0;
  background-repeat: no-repeat, repeat-x, repeat;
}

/* 文字は中央に置くので、覆いは左右対称にかける（中央ほど濃い）。
   最下部は棚板（月暈の金を薄く敷き、天面に 1px の当たりを置く）。 */
.shelf-hero::after {
  content: "";
  position: absolute;
  inset: 0;
  z-index: -1;
  background:
    linear-gradient(
      180deg,
      transparent calc(100% - 8px),
      color-mix(in srgb, var(--getsurin) 55%, transparent) calc(100% - 8px) calc(100% - 7px),
      color-mix(in srgb, var(--getsurin) 22%, var(--saku-night)) calc(100% - 7px) calc(100% - 3px),
      color-mix(in srgb, var(--getsurin) 10%, var(--saku-night)) calc(100% - 3px)
    ),
    radial-gradient(
      120% 150% at 50% 45%,
      rgba(11, 18, 32, 0.93) 0 45%,
      rgba(11, 18, 32, 0.74) 75%,
      rgba(11, 18, 32, 0.44)
    );
}

/* 題号は明朝・中央・やや広い字間。帯を厚くしないため display サイズは使わない。 */
.shelf-hero h1 {
  font-family: var(--font-display);
  font-size: var(--fs-2xl);
  font-weight: 400;
  letter-spacing: var(--tracking-display);
  line-height: var(--leading-tight);
  margin: 0;
}

/* 英字タグライン。姉妹サイト(HIZUKE)と同じく、明朝のイタリックを
   広い字間で小さく敷く。帯の主役は題号なので、あくまで添え物の重み。 */
.shelf-hero .hero-tagline {
  font-family: var(--font-display);
  font-style: italic;
  font-size: var(--fs-sm);
  letter-spacing: 0.16em;
  line-height: 1.6;
  color: var(--usuzuki);
  margin: var(--sp-2) auto 0;
  /* 字間の分だけ右に寄って見えるので、末尾のアキを相殺する */
  text-indent: 0.16em;
}

/* 棚の段。書架には教科書・小説・設計資料が混在するので、種類ごとに段を分け、
   段見出し(何の段か)と背表紙の色帯(どの段の本か)の二重で見分けられるようにする。
   色帯は色だけに意味を持たせないため、必ず段見出しか種別ラベルと併走させる。 */
.shelf-section {
  padding-top: var(--sp-6);
}

.shelf-section[data-kind="novel"]    { --kind: var(--getsurin); }
.shelf-section[data-kind="textbook"] { --kind: var(--hagane); }
.shelf-section[data-kind="document"] { --kind: var(--tsukikage); }

/* 段の中身は <details>。PCでは常に開いた状態で使うので、開閉の手がかり
   (マーカー・カーソル・当たり判定)を消して、ただの見出しとして見せる。
   畳むのはスマホだけ (@media (max-width: 480px)) 。 */
.shelf-details > summary {
  list-style: none;
  cursor: default;
  pointer-events: none;
}

.shelf-details > summary::-webkit-details-marker {
  display: none;
}

.shelf-section-head {
  display: grid;
  grid-template-columns: 1fr auto;
  align-items: baseline;
  gap: 0 var(--sp-3);
  padding-bottom: var(--sp-2);
  border-bottom: var(--hairline);
}

/* 開閉の山形。スマホでのみ出す (既定は非表示)。 */
.shelf-section-head::after {
  content: "";
  display: none;
  width: 8px;
  height: 8px;
  margin-left: var(--sp-2);
  border-right: 1.5px solid var(--text-muted);
  border-bottom: 1.5px solid var(--text-muted);
  transform: rotate(45deg);
  transition: transform var(--dur-fast) var(--ease);
}

.shelf-section-head h2 {
  font-family: var(--font-display);
  font-size: var(--fs-lg);
  letter-spacing: var(--tracking-display);
  margin: 0;
  display: flex;
  align-items: center;
  gap: var(--sp-2);
}

/* 段見出しの前に置く小口(こぐち)の印。段の色を最初に宣言する役。 */
.shelf-section-head h2::before {
  content: "";
  width: 3px;
  height: 1em;
  background: var(--kind);
  border-radius: 1px;
}

.shelf-section-note {
  grid-column: 1 / 2;
  margin: var(--sp-1) 0 0;
  color: var(--text-muted);
  font-size: var(--fs-sm);
}

.shelf-section-count {
  font-family: var(--font-data);
  font-size: var(--fs-xs);
  color: var(--text-muted);
  white-space: nowrap;
}

.series-grid {
  padding: var(--sp-4) 0 var(--sp-2);
  display: grid;
  gap: var(--sp-4);
  grid-template-columns: repeat(auto-fill, minmax(280px, 1fr));
  /* リードは省略しないので、カードの丈は作品ごとにまちまちになる。
     いちばん長いリードに全段の丈を合わせて、棚板が通ったように見せる。 */
  grid-auto-rows: 1fr;
}

/* その段に1点しかないとき、3列グリッドの1枠だけが埋まると棚が寂しく、
   題号も不自然に折り返す。1点の段は枠を広げて1点ぶんの幅で見せる。 */
.series-grid:has(> .series-card:only-child) {
  grid-template-columns: minmax(0, min(680px, 100%));
}

.series-card {
  position: relative;
  display: flex;
  flex-direction: column;
  text-decoration: none;
  color: var(--text);
  background: var(--surface);
  border: var(--hairline);
  border-radius: var(--radius-lg);
  padding: var(--sp-5);
  padding-left: calc(var(--sp-5) + 4px);
  overflow: hidden;
  transition: border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}

/* 背表紙。カードの左端を段の色で断ち切る。 */
.series-card::before {
  content: "";
  position: absolute;
  inset: 0 auto 0 0;
  width: 4px;
  background: var(--kind);
}

.series-card:hover {
  border-color: var(--accent);
  box-shadow: var(--shadow-moon);
}

/* 種別ラベル。色帯と同じ意味を文字でも持たせる(色覚に依存させない)。
   金は明面で文字コントラストが足りないので、色は点にだけ載せ、
   文字は弱テキスト色のまま置く。 */
.series-kind {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  font-family: var(--font-data);
  font-size: var(--fs-xs);
  letter-spacing: var(--tracking-wide);
  color: var(--text-muted);
  margin-bottom: var(--sp-2);
}

.series-kind::before {
  content: "";
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--kind);
}

.series-card h3 {
  font-family: var(--font-display);
  font-size: var(--fs-xl);
  line-height: var(--leading-tight);
  margin: 0 0 var(--sp-2);
}

.series-card p {
  color: var(--text-muted);
  font-size: var(--fs-sm);
  line-height: 1.8;
  margin: 0 0 var(--sp-4);
}

/* メタ行はカードの底に揃える。丈を揃えたぶんの余りは、リードの下に落とす。 */
.series-card .meta {
  margin-top: auto;
  font-family: var(--font-data);
  font-size: var(--fs-xs);
  color: var(--text-muted);
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-1) var(--sp-4);
}

/* ----------------------------------------------------------------
   シリーズ目次
   ---------------------------------------------------------------- */
.series-header {
  padding: var(--sp-6) 0 var(--sp-4);
  border-bottom: var(--hairline);
}

.series-header h1 {
  font-family: var(--font-display);
  font-size: var(--fs-3xl);
  margin: 0 0 var(--sp-2);
}

.series-header p {
  color: var(--text);
  max-width: 48em;
}

.parts {
  padding: var(--sp-5) 0 var(--sp-8);
}

.part-block {
  margin-bottom: var(--sp-6);
}

.part-block h2 {
  font-family: var(--font-display);
  font-size: var(--fs-lg);
  border-bottom: var(--hairline);
  padding-bottom: var(--sp-2);
  margin: 0 0 var(--sp-3);
  display: flex;
  align-items: center;
  gap: var(--sp-2);
}

/* 段見出しの前に置く小口(こぐち)の印。.shelf-section-head h2::before と同じ役。 */
.part-block h2::before {
  content: "";
  width: 3px;
  height: 1em;
  background: var(--kind, var(--accent));
  border-radius: 1px;
}

/* 巻数選択画面(シリーズ目次)は、書架トップの .series-card と同じ骨格
   (地の色と分かれた紙面 + 左の背表紙色 + hoverで浮く)に揃え、
   トップより一段沈んだ低コントラストな見た目にならないようにする。
   段の色(--kind)は main[data-kind] (下記) が種別ごとに立てる。 */
main[data-kind="novel"]    { --kind: var(--getsurin); }
main[data-kind="textbook"] { --kind: var(--hagane); }
main[data-kind="document"] { --kind: var(--tsukikage); }

.volume-list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: var(--sp-3);
}

.volume-row {
  position: relative;
  display: flex;
  align-items: baseline;
  gap: var(--sp-3);
  padding: var(--sp-3) var(--sp-4);
  padding-left: calc(var(--sp-4) + 4px);
  background: var(--surface);
  border: var(--hairline);
  border-radius: var(--radius-lg);
  text-decoration: none;
  color: var(--text);
  overflow: hidden;
  transition: border-color var(--dur) var(--ease), box-shadow var(--dur) var(--ease);
}

/* 背表紙。.series-card と同じく、行の左端を段の色で断ち切る。 */
.volume-row::before {
  content: "";
  position: absolute;
  inset: 0 auto 0 0;
  width: 4px;
  background: var(--kind, var(--accent));
}

.volume-row:hover {
  border-color: var(--accent);
  box-shadow: var(--shadow-moon);
}

.volume-row .no {
  font-family: var(--font-data);
  font-weight: 600;
  color: var(--text);
  min-width: 2.4em;
}

.volume-row .title {
  flex: 1;
}

.volume-row .chars {
  font-family: var(--font-data);
  font-size: var(--fs-xs);
  color: var(--text-muted);
}

/* 視覚的には隠すが読み上げには残す (フォームの label など) */
.visually-hidden {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* ----------------------------------------------------------------
   巻数選択画面の全文検索

   検索処理そのものはWorkers側(app/worker/search.ts)で行う。ここは
   入力欄と、結果(.search-results)/通常の巻一覧(.parts)を出し分ける
   見た目だけを担う。どちらを見せるかは reader.js が hidden 属性の
   付け外しで切り替える(SSR初期表示は app/worker/templates.ts が
   同じ判定をサーバー側で行って、JS無効でも正しい面が出るようにする)。
   ---------------------------------------------------------------- */
.series-search-wrap {
  padding: var(--sp-4) 0 0;
}

.series-search {
  position: relative;
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  max-width: 32em;
}

.search-icon {
  position: absolute;
  left: var(--sp-3);
  color: var(--text-muted);
  pointer-events: none;
}

.series-search input[type="search"] {
  flex: 1;
  /* input はフレックスアイテムの自動最小幅が「中身」ではなく既定の
     表示幅(size属性由来、だいたい20文字分)になるため、指定しないと
     狭い画面で .series-search ごと画面外へはみ出す。 */
  min-width: 0;
  font-family: var(--font-body);
  font-size: var(--fs-md);
  color: var(--text);
  background: var(--surface);
  border: var(--hairline);
  border-radius: var(--radius-pill);
  padding: var(--sp-2) var(--sp-4) var(--sp-2) calc(var(--sp-3) * 2 + 4px);
  min-height: 42px;
  /* iOS Safari は type=search に丸い✕クリアボタンを既定で足すが、
     自前の .search-clear と役割が重複するので消しておく */
  -webkit-appearance: none;
  appearance: none;
}

.series-search input[type="search"]::-webkit-search-cancel-button,
.series-search input[type="search"]::-webkit-search-decoration {
  -webkit-appearance: none;
  appearance: none;
}

.series-search input[type="search"]:focus-visible {
  border-color: var(--hagane);
}

.search-submit {
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  border: var(--hairline);
  background: var(--surface);
  color: var(--text);
  border-radius: var(--radius-pill);
  padding: var(--sp-1) var(--sp-3);
  min-height: 34px;
  cursor: pointer;
  flex: none;
}

.search-clear {
  flex: none;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  color: var(--text-muted);
  text-decoration: none;
  font-size: var(--fs-sm);
  line-height: 1;
}

.search-clear:hover {
  color: var(--text);
  background: var(--bg);
}

.search-clear[hidden] {
  display: none;
}

.search-status {
  min-height: 1.4em;
  margin: var(--sp-2) 0 0;
  font-family: var(--font-data);
  font-size: var(--fs-xs);
  color: var(--text-muted);
}

.search-status:empty {
  margin: 0;
}

.search-results {
  padding: var(--sp-4) 0 var(--sp-8);
  display: grid;
  gap: var(--sp-3);
}

.search-empty {
  color: var(--text-muted);
  padding: var(--sp-3) 0;
}

.search-result-group {
  border: var(--hairline);
  border-radius: var(--radius);
  padding: var(--sp-3);
}

.search-result-volume {
  display: flex;
  flex-wrap: wrap;
  align-items: baseline;
  gap: var(--sp-2) var(--sp-3);
  text-decoration: none;
  color: var(--text);
  margin-bottom: var(--sp-2);
}

.search-result-volume:hover .search-result-title {
  color: var(--link);
}

.search-result-part {
  font-family: var(--font-data);
  font-size: var(--fs-xs);
  color: var(--text-muted);
}

.search-result-title {
  font-family: var(--font-display);
  font-size: var(--fs-md);
}

.search-result-hits {
  display: grid;
  gap: var(--sp-1);
  padding-left: var(--sp-3);
  border-left: var(--hairline);
}

.search-hit {
  display: block;
  text-decoration: none;
  color: var(--text-muted);
  font-size: var(--fs-sm);
  padding: var(--sp-1) 0;
}

.search-hit:hover {
  color: var(--text);
}

.search-hit-heading {
  display: block;
  color: var(--text);
  font-weight: 500;
  margin-bottom: 0.15em;
}

.search-hit-snippet {
  line-height: var(--leading-body);
}

.search-hit-snippet mark {
  background: color-mix(in srgb, var(--getsurin) 40%, transparent);
  color: inherit;
  border-radius: 2px;
  padding: 0 0.1em;
}

.search-hit-more {
  display: block;
  font-size: var(--fs-xs);
  color: var(--text-muted);
  padding: var(--sp-1) 0;
}

/* ----------------------------------------------------------------
   読書画面
   ---------------------------------------------------------------- */
/* 読書画面だけは、書架・シリーズ目次より広い器を使う。
   1040px の帯のままだと、PCでは目次と左右の余白に取られて本文の一行が
   35字前後まで縮むうえ、実務テキストの3列以上の表やMermaid図が本文と同じ
   幅に押し込められて読めなくなる。器は「目次 + 紙」の実寸から組み立て、

     - 一行の長さ (--measure) は本文の段落・見出しにだけ掛ける
     - 表・図・コード・別行立ての数式は「紙」の幅いっぱいまで出す

   という形にして、読む速さ(行長)と図表の見やすさを両立させる。 */
:root {
  --toc-w: 292px;
  --reader-gap: var(--sp-6);
  /* 「紙」の最大幅。本文一行 (--measure) より広く取り、余った左右が
     表・図のはみ出す余地になる。 */
  --paper-max: 1080px;
  --reader-container: calc(
    var(--toc-w) + var(--reader-gap) + var(--paper-max) + var(--sp-4) * 2
  );
  /* 本文一行の長さ。ここに置いてあるのは文字サイズ「中」のときの値で、
     実際には .page-paper[data-font-scale] が文字サイズと組にして置き直す。 */
  --measure: 44rem;
}

.reader-layout {
  display: grid;
  grid-template-columns: var(--toc-w) minmax(0, 1fr);
  gap: var(--reader-gap);
  align-items: start;
  /* 左右の余白は .container と同じだけ取る (shorthand で 0 にすると
     「紙」がウィンドウの端に貼り付く)。狭い画面ぶんは下で詰める。 */
  padding-block: var(--sp-5) var(--sp-8);
  padding-inline: var(--sp-4);
  /* .container の 1040px を、読書画面だけ上書きする */
  max-width: var(--reader-container);
}

/* グリッド/フレックスの子は既定の min-width:auto のままだと、中身の実寸
   (原寸のMermaid図・広い表) にひきずられて列そのものが広がる。0を明示して
   「はみ出すぶんは中身側でスクロールさせる」形に固定する。 */
.reader-main,
.page-paper,
.markdown-body {
  min-width: 0;
}

.toc-sidebar {
  position: sticky;
  /* 貼り付いたヘッダーの下から始める(--header-h は reader.js が置く実寸) */
  top: calc(var(--header-h, 0px) + var(--sp-4));
  max-height: calc(100dvh - var(--header-h, 0px) - var(--sp-6));
  overflow-y: auto;
  /* 目次を端まで送っても、その先で本文が動き出さないようにする */
  overscroll-behavior: contain;
  scrollbar-width: thin;
  font-size: var(--fs-sm);
  /* 29巻・60巻ものの目次は行数が多い。本文の行間(1.9)のままだと一覧性が
     落ちるので、目次だけ行を詰める。 */
  line-height: 1.6;
}

/* モバイルのドロワー用の幕。デスクトップでは目次を畳まないので出番なし。 */
.toc-backdrop {
  display: none;
}

.toc-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
}

/* TOC開閉ボタンはモバイルでのみ意味を持つ */
.toc-head button {
  display: none;
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  border: var(--hairline);
  background: var(--surface);
  color: var(--text-muted);
  border-radius: var(--radius);
  padding: var(--sp-1) var(--sp-2);
  cursor: pointer;
}

.toc-sidebar h2 {
  font-family: var(--font-data);
  font-size: var(--fs-xs);
  letter-spacing: var(--tracking-wide);
  color: var(--text-muted);
  text-transform: uppercase;
  margin: 0 0 var(--sp-2);
}

.toc-sidebar ol {
  list-style: none;
  margin: 0;
  padding: 0;
  border-left: var(--hairline);
}

.toc-sidebar li a {
  display: block;
  padding: var(--sp-1) var(--sp-3);
  text-decoration: none;
  color: var(--text-muted);
  border-left: 2px solid transparent;
  margin-left: -1px;
}

.toc-sidebar li.depth-3 a {
  padding-left: var(--sp-5);
  font-size: var(--fs-xs);
}

.toc-sidebar li a:hover {
  color: var(--link);
}

.toc-sidebar li a.active {
  color: var(--link);
  border-left-color: var(--link);
  font-weight: 500;
  /* 罫だけだと、長い目次の中で現在位置を目で拾うのに時間がかかる */
  background: color-mix(in srgb, var(--link) 8%, transparent);
}

/* 前後の巻・表示設定は長い本文を読んでいる間ずっと使うため、スクロールしても
   画面内に留まるようにする(sticky)。見出し直下ではなく少し浮かせて置き、
   スクロール前後で見た目が変わらないようにする。
   スクロールで実際に張り付いた瞬間だけ影を足して奥行きを出す
   (.toolbar-sentinel を reader.js の IntersectionObserver で監視し、
   .is-stuck を付け外しする)。 */
.toolbar-sentinel {
  height: 0;
}

.reader-toolbar {
  position: sticky;
  /* ヘッダーも貼り付いているので、その下端を基準にする */
  top: calc(var(--header-h, 0px) + var(--sp-2));
  z-index: 15;
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: var(--sp-3);
  padding: var(--sp-2) var(--sp-3);
  margin-bottom: var(--sp-4);
  border: var(--hairline);
  border-radius: var(--radius);
  background: var(--surface);
  font-size: var(--fs-sm);
  transition: box-shadow var(--dur) var(--ease);
}

.reader-toolbar.is-stuck {
  box-shadow: var(--shadow-moon);
}

/* 読み進みの目安。ツールバーの下辺に沿わせた細い線で、その巻のどのあたりを
   読んでいるかだけを示す。数字は出さない(読書の邪魔になるため)。
   幅は reader.js の updateProgress がスクロール位置から書き込む。
   縦組みでは「紙」自身が右から左へ流れる器になるので、reader.js 側が
   その器のスクロール量を見る。 */
.reading-progress {
  position: absolute;
  inset-inline: 0;
  bottom: -1px;
  height: 2px;
  overflow: hidden;
  border-end-start-radius: var(--radius);
  border-end-end-radius: var(--radius);
  pointer-events: none;
}

.reading-progress > span {
  display: block;
  width: 0;
  height: 100%;
  background: var(--accent);
  transition: width 120ms linear;
}

@media (prefers-reduced-motion: reduce) {
  .reading-progress > span {
    transition: none;
  }
}

.reader-toolbar .prevnext {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: var(--sp-2) var(--sp-3);
}

/* 前後リンクのアイコン+ラベル。狭い画面ではラベルだけ隠してアイコンにする
   (下のブレークポイントを参照)。 */
.nav-link {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-1);
}

.nav-link svg {
  flex: none;
}

/* リンクが無い側(先頭巻の「前」・最終巻の「次」)は、グリッド上の位置を
   保つための空の置き場。 */
.nav-link-placeholder {
  display: inline-block;
}

/* ----------------------------------------------------------------
   表示設定メニュー (ハンバーガー)

   書体・文字サイズ・単純改行・PDF書き出しはすべてこの中に畳む。
   ツールバーに残すのは前後の巻の移動だけ。
   ---------------------------------------------------------------- */
.reader-menu {
  position: relative;
}

.menu-button {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
}

.menu-button svg {
  flex: none;
}

.menu-button[aria-expanded="true"] {
  border-color: var(--hagane);
}

.menu-panel {
  position: absolute;
  right: 0;
  top: calc(100% + var(--sp-2));
  z-index: 5;
  display: grid;
  gap: var(--sp-3);
  min-width: 280px;
  padding: var(--sp-3);
  border: var(--hairline);
  border-radius: var(--radius);
  background: var(--surface);
  box-shadow: var(--shadow-moon);
}

.menu-panel[hidden] {
  display: none;
}

/* パネル内は「ラベル左・操作右」で縦に積む */
.menu-panel .tool-field {
  justify-content: space-between;
}

.menu-panel .tool-field select {
  max-width: 60%;
}

.menu-panel .tool-check {
  align-items: flex-start;
  white-space: normal;
}

.menu-note {
  margin: calc(var(--sp-2) * -1) 0 0;
  font-size: var(--fs-xs);
  line-height: 1.7;
  color: var(--text-muted);
}

.menu-panel .pdf-button {
  width: 100%;
}

/* ツールバー右側のまとまり(目次・表示設定)。 */
.reader-tools {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
}

/* 目次は広い画面では常時表示のサイドバーなので、この呼び出しボタンは
   目次がドロワー化する幅(下のブレークポイント)でのみ出す。 */
.toc-open-button {
  display: none;
  align-items: center;
  gap: var(--sp-1);
}

.toc-open-button svg {
  flex: none;
}

.reader-toolbar button,
.reader-toolbar a.button-like,
.export-dialog button {
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  border: var(--hairline);
  background: var(--surface);
  color: var(--text);
  border-radius: var(--radius);
  padding: var(--sp-1) var(--sp-3);
  cursor: pointer;
  text-decoration: none;
  /* 指で押せる大きさを確保する */
  min-height: 34px;
}

/* 上の .reader-toolbar button が border ショートハンドを指定しているので、
   打ち消せるだけの詳細度でアクセント色を当てる。 */
.reader-toolbar .pdf-button,
.export-dialog .pdf-button {
  border-color: var(--accent);
  /* 明面の墨色を直に置くと夜面で沈むので、面ごとに解決される --text を使う */
  color: var(--text);
}

.reader-toolbar button:hover,
.reader-toolbar a.button-like:hover,
.export-dialog button:hover {
  border-color: var(--hagane);
}

/* ラベル + セレクトの一組 (書体・文字サイズ・書き出し設定で共用) */
.tool-field {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  color: var(--text-muted);
  font-size: var(--fs-xs);
  white-space: nowrap;
}

.tool-field select {
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  color: var(--text);
  background: var(--surface);
  border: var(--hairline);
  border-radius: var(--radius);
  padding: var(--sp-1) var(--sp-2);
  min-height: 34px;
  max-width: 14em;
}

.tool-check {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  color: var(--text-muted);
  font-size: var(--fs-xs);
  cursor: pointer;
  min-height: 34px;
}

.tool-check input {
  width: 16px;
  height: 16px;
  flex: none;
  accent-color: var(--hagane);
}

.resume-banner {
  display: none;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-3);
  padding: var(--sp-2) var(--sp-3);
  margin-bottom: var(--sp-4);
  border: var(--hairline);
  border-left: 3px solid var(--getsurin);
  background: var(--surface);
  font-size: var(--fs-sm);
}

.resume-banner.visible {
  display: flex;
}

.page-paper {
  background: var(--surface);
  border: var(--hairline);
  border-radius: var(--radius-lg);
  padding: var(--sp-7) var(--sp-6);
}

.page-paper :first-child {
  margin-block-start: 0;
}

/* 本文の書体はツールバーの「書体」で差し替える (reader.js が --doc-font を置く)。
   実際に使う書体は --body-font に一度だけ解決させ、font-family も見出しも
   そこから引く。**縦組みは受け皿が明朝に変わる**(下の html[data-vertical="1"])ので、
   解決を1か所にまとめておかないと、本文と見出しで違う受け皿に落ちる。

   見出しの書体 (--heading-font) は分野 (html の data-kind) で決める。

   | 分野 | 見出し | なぜ |
   |---|---|---|
   | 実務テキスト・設計資料 | 本文と同じ書体に追従 | 見出しは索引として拾い読みされる。本文と系統が揃っているほうが目が迷わない。読み手が「書体」を変えれば見出しも一緒に変わる |
   | 小説 | 常に明朝 (--font-display) で固定 | 本文をゴシックに変えても、章題は紙の本と同じ明朝のままにしておきたい |

   kind の無いページ(書架・シリーズ目次)は本文書体に揃える。 */
.markdown-body {
  --body-font: var(--doc-font, var(--font-body));
  --heading-font: var(--body-font);
  font-family: var(--body-font);
  /* palt = 和文プロポーショナル。約物の空きが詰まって字面が揃い、行間1.9との
     釣り合いが取れる。字送り(letter-spacing)は足さない — 詰め組みが崩れる。 */
  font-feature-settings: "palt";
  font-kerning: normal;
  /* 空白を含まない長い語(URL・英数字の識別子)で紙がはみ出すのを防ぐ。
     pre / 表 / 図はそれぞれ自前で横スクロールする。 */
  overflow-wrap: break-word;
}

/* --------------------------------------------------------------
   一行の長さ (--measure) と、そこからはみ出させるもの

   本文の一行だけを --measure で頭打ちにして「紙」の中央に置き、表・図・
   コード・別行立ての数式は上限を外して紙の幅いっぱいに広げる。実務テキスト
   の表とMermaid図は、本文と同じ行長に押し込めると縮小されて読めなくなる
   一方、地の文の行長を図に合わせて伸ばすと今度は本文が読みにくくなるため、
   別々に決める。

   縦組みは行長を版面の高さ(画面の高さ)で決めているので、この指定は
   横組みのときだけ掛ける。
   -------------------------------------------------------------- */
html:not([data-vertical="1"]) .markdown-body > * {
  max-width: var(--measure);
  margin-inline: auto;
}

html:not([data-vertical="1"]) .markdown-body > figure,
html:not([data-vertical="1"]) .markdown-body > img {
  max-width: 100%;
}

/* 表・コード・別行立ての数式・Mermaid図は、中身なりの幅にして、本文一行
   (--measure) を下限、「紙」の幅を上限にする。

     - 一行に収まる中身は、ちょうど --measure になって本文と左右の端が揃う
     - 収まらない中身だけ、足りないぶんだけ紙の幅まではみ出す

   一律に紙の幅いっぱい (max-width: 100%) にしていたころは、幅の要らない
   小さな表まで本文より左右へ 150px ほど張り出して、段落と表で行の始まりが
   食い違って見えていた。

   表は .markdown-body table で width: 100% を持っているので、ここで中身
   なりに戻す。図 (.diagram) は枠の幅から倍率を決めるので、枠が中身なりに
   縮む形にすると「枠 = いまの倍率の幅」になって縮小が掛からなくなる。
   **reader.js の fitZoom は器 (.markdown-body) の幅から使える幅を出す ——
   対で維持すること。**

   画像は中身を引き伸ばしてしまうので下限を掛けない(上のルールのまま)。 */
html:not([data-vertical="1"]) .markdown-body > table,
html:not([data-vertical="1"]) .markdown-body > pre,
html:not([data-vertical="1"]) .markdown-body > .diagram,
html:not([data-vertical="1"]) .markdown-body > .math-block {
  width: fit-content;
  min-width: min(100%, var(--measure));
  max-width: 100%;
}

/* 段落まわりの呼吸。和文は行間だけでなく段落間にも余白が要る。 */
.markdown-body p,
.markdown-body ul,
.markdown-body ol {
  margin: 0;
  margin-block-end: 1.5em;
}

/* PDF組版と同じ全角一字下げ。行頭が開き括弧の段落は render.ts / reader.js が
   付ける .no-indent で外す(約物自身の左空きが字下げの役目を果たすため)。
   引用内の段落は下の blockquote p ルールでまとめて外す。 */
.markdown-body p {
  text-indent: 1em;
}

.markdown-body p.no-indent {
  text-indent: 0;
}

/* 小説だけ、段落間の余白を詰める。
   紙の小説では段落は全角一字下げだけで示し、段落のあいだに一行ぶんの空きは
   入れない。原稿の「空行＝段落」「単純改行＝<br>」の使い分けは残したいので
   余白を 0 にはせず、0.4em(引用内の項目区切りと同じ値)まで縮める。
   実務テキスト・設計資料 (textbook / document) は箇条書きや図表が多く、
   段落間の空きが可読性に効くので 1.5em のままにする。 */
/* 小説の見出しは、本文の書体に関わらず明朝で固定する(上の表を参照)。 */
html[data-kind="novel"] .markdown-body {
  --heading-font: var(--font-display);
}

html[data-kind="novel"] .markdown-body p {
  margin-block-end: 0.4em;
}

/* 場面転換 (`◇`) だけは、詰めると切れ目が読み取れなくなるので余白を残す。
   render.ts / reader.js が記号だけの段落に .scene-break を立てる。 */
html[data-kind="novel"] .markdown-body p.scene-break {
  margin-block: 1.5em;
}

.markdown-body li + li {
  margin-block-start: 0.4em;
}

.markdown-body h1 {
  font-family: var(--heading-font);
  font-size: 1.9em;
  line-height: var(--leading-tight);
  margin-block-end: var(--sp-5);
}

.markdown-body h2 {
  font-family: var(--heading-font);
  font-size: 1.45em;
  line-height: var(--leading-tight);
  margin-block-start: var(--sp-6);
  padding-block-start: var(--sp-3);
  border-block-start: var(--hairline);
  scroll-margin-block-start: var(--sp-4);
}

.markdown-body h3 {
  font-family: var(--heading-font);
  font-size: 1.18em;
  margin-block-start: var(--sp-5);
  margin-block-end: var(--sp-2);
  scroll-margin-block-start: var(--sp-4);
}

/* Markdown の h4 以下には既定のブラウザ様式しか当たっていなかった。
   実務テキストでは小見出しとして使われるので、余白と色だけ整える。 */
.markdown-body h4,
.markdown-body h5,
.markdown-body h6 {
  font-family: var(--heading-font);
  font-size: 1em;
  line-height: var(--leading-tight);
  margin-block: var(--sp-4) var(--sp-2);
  color: var(--text-muted);
  scroll-margin-block-start: var(--sp-4);
}

/* 目次のリンクや #アンカーで見出しへ飛ぶとき、貼り付いたツールバー
   (position: sticky, 高さ約50px) の下に見出しが潜ってしまう。横組みのときだけ
   ツールバーぶんの逃げを足す(縦組みでは block-start が右辺を指すので足さない)。
   貼り付いたヘッダーぶん (--header-h) も同じ理由で足す。 */
html:not([data-vertical="1"]) .markdown-body :is(h1, h2, h3, h4, h5, h6) {
  scroll-margin-block-start: calc(var(--header-h, 0px) + 5rem);
}

/* 実務テキスト・設計資料は、節の見出しがそのまま索引になる。h2 の罫の上に
   短い色の線を重ねて、飛ばし読みでも節の頭が目に留まるようにする。
   小説は地の文の流れを切りたくないので、この装飾は付けない。 */
html[data-kind="textbook"] .markdown-body h2,
html[data-kind="document"] .markdown-body h2 {
  position: relative;
}

html[data-kind="textbook"] .markdown-body h2::before,
html[data-kind="document"] .markdown-body h2::before {
  content: "";
  position: absolute;
  inset-block-start: -1px;
  inset-inline-start: 0;
  inline-size: 3.5em;
  block-size: 2px;
  background: var(--hagane);
}

html[data-kind="textbook"] .markdown-body h3,
html[data-kind="document"] .markdown-body h3 {
  padding-inline-start: 0.55em;
  border-inline-start: 3px solid var(--line);
}

.markdown-body blockquote {
  border-inline-start: 3px solid var(--line);
  margin-block: var(--sp-4);
  margin-inline: 0;
  padding-block: var(--sp-1);
  padding-inline: var(--sp-4);
  color: var(--text-muted);
}

/* 引用は囲み罫で本文と区別されるため、一字下げは付けない
   (PDF組版の noIndent と同じ扱い)。地の文の段落と同じ1.5em(ほぼ1行ぶん)の
   下マージンも、引用の中では大きすぎるので消す(段落間の余白は下のルールで
   0.3〜0.4行ぶん相当に付け直す)。 */
.markdown-body blockquote p {
  text-indent: 0;
  margin-block-end: 0;
}

/* 「対象読者:…/ねらい:…/…」のように、空行を挟まない複数行の項目を1つの
   引用ブロックにまとめて書く規約(shinkin-basicsの巻頭など)は、render.ts /
   reader.js 側で単純改行(br)を境に複数の <p> へ分割して出力している
   (自動折り返しの行と項目の切れ目が同じ間隔になって読みにくいため)。
   2つめ以降の <p> にだけ、地の文の段落間より控えめな上マージンを付ける。 */
.markdown-body blockquote p + p {
  margin-block-start: 0.4em;
}

/* 実務テキスト・設計資料の引用は「対象読者」「担当者の心得」のような
   囲み注記として使われる。薄い罫一本では飛ばし読みで見落とされるので、
   淡い地色を敷いた枠にして、文字も本文と同じ濃さに戻す(注記のほうが
   むしろ読ませたい箇所であるため)。
   小説の引用(付録の掲げ方など)は地の文に寄り添う静かな体裁のままにする。 */
html[data-kind="textbook"] .markdown-body blockquote,
html[data-kind="document"] .markdown-body blockquote {
  border-inline-start: 3px solid var(--accent);
  border-block: var(--hairline);
  border-inline-end: var(--hairline);
  border-start-end-radius: var(--radius);
  border-end-end-radius: var(--radius);
  background: color-mix(in srgb, var(--accent) 8%, var(--surface));
  padding-block: var(--sp-3);
  padding-inline: var(--sp-4);
  color: var(--text);
}

.markdown-body table {
  border-collapse: collapse;
  width: 100%;
  /* rem 固定だと文字サイズ「大」でも表だけ小さいままになる。本文に対する
     比で持たせて、文字サイズの切替に追従させる。 */
  font-size: 0.92em;
  line-height: 1.7;
  margin: var(--sp-5) 0;
}

.markdown-body th,
.markdown-body td {
  border: var(--hairline);
  padding: var(--sp-2) var(--sp-3);
  text-align: left;
  vertical-align: top;
}

/* 器に収まらない表は、reader.js の layoutTableColumns が列幅を配り直す
   (和文には語の切れ目が無く、ブラウザの自動列幅は「貸/付/額」のように列を
   1文字幅まで潰してしまう)。配った幅は先頭行のセルの inline-size に入って
   いるので、そのとおりに置く固定レイアウトで組む。**reader.js 側と対で
   維持すること。** */
.markdown-body table.sized-table {
  table-layout: fixed;
}

/* 表頭と偶数行に淡い地色を敷いて、横方向に目を滑らせても行を見失わない
   ようにする。縦組みの表 (.v-table) は行と列の向きが入れ替わり、縞が
   列方向に出てしまうので対象にしない。 */
html:not([data-vertical="1"]) .markdown-body thead th {
  background: color-mix(in srgb, var(--hagane) 9%, var(--surface));
  font-weight: 600;
  color: var(--text);
}

html:not([data-vertical="1"]) .markdown-body tbody tr:nth-child(even) {
  background: color-mix(in srgb, var(--text) 3%, var(--surface));
}

.markdown-body code {
  font-family: var(--font-data);
  font-size: 0.9em;
  background: var(--bg);
  padding: 0.1em 0.35em;
  border-radius: var(--radius);
}

.markdown-body pre code {
  background: none;
  padding: 0;
}

.markdown-body pre {
  background: var(--bg);
  border: var(--hairline);
  border-radius: var(--radius);
  padding: var(--sp-3) var(--sp-4);
  /* 本文の 1.9 のままだとコードの字面が間延びして塊として読めない */
  line-height: 1.65;
  font-size: 0.9em;
  overflow-x: auto;
}

/* 本文中のリンクは、下線を字面から離して和文の可読性を落とさないようにする */
.markdown-body a {
  text-decoration-thickness: 1px;
  text-underline-offset: 0.25em;
}

/* ----------------------------------------------------------------
   LaTeX数式 (MathJax の tex-svg で組む)

   組版前 / JSが動かないときは TeX ソースが \[ … \] のまま出る。読めなく
   はないので、独立数式だけは中央寄せの余白付きで置いておく。長い式は
   スマホ幅で必ずはみ出すため、枠を横スクロールさせて逃がす。
   ---------------------------------------------------------------- */
.markdown-body .math-block {
  margin: var(--sp-4) 0;
  text-align: center;
  overflow-x: auto;
  overflow-y: hidden;
  /* 行内数式より少し大きく組み、分数・総和記号が潰れないようにする */
  font-size: 1.05em;
}

.markdown-body .math-inline {
  /* 行内数式が行の高さを押し広げて行間が暴れるのを防ぐ */
  display: inline-block;
  max-width: 100%;
  vertical-align: middle;
  /* 長い行内数式(項が多い等式など)は、max-width だけでは収まりきらない
     ことがある。.math-block と同じ理由・同じ逃がし方(横スクロール)を
     行内数式にも揃えておく。 */
  overflow-x: auto;
  overflow-y: hidden;
}

/* 描画前 / JSが動かないときの mermaid ソース。描画後は .diagram に置き換わる。 */
.markdown-body pre.mermaid {
  background: var(--surface);
  color: var(--text-muted);
  overflow-x: auto;
}

/* ----------------------------------------------------------------
   Mermaid図 (描画後)

   図の実寸は reader.js が viewBox から px で与える。ここでは枠を
   スクロールさせるだけにして、拡大縮小と食い違わないようにする。
   ---------------------------------------------------------------- */
.diagram {
  margin: var(--sp-4) 0;
  border: var(--hairline);
  border-radius: var(--radius);
  background: var(--surface);
}

.diagram-bar {
  display: flex;
  align-items: center;
  gap: var(--sp-1);
  padding: var(--sp-1) var(--sp-2);
  border-bottom: var(--hairline);
  font-family: var(--font-data);
  font-size: var(--fs-xs);
  color: var(--text-muted);
}

.diagram-bar button {
  font-family: var(--font-body);
  font-size: var(--fs-xs);
  border: var(--hairline);
  background: var(--surface);
  color: var(--text);
  border-radius: var(--radius);
  min-width: 34px;
  min-height: 30px;
  padding: 0 var(--sp-2);
  cursor: pointer;
}

.diagram-bar button:hover {
  border-color: var(--hagane);
}

.diagram-bar [data-zoom-label] {
  min-width: 4em;
  text-align: center;
}

.diagram-bar [data-zoom="full"] {
  margin-left: auto;
}

.diagram-body {
  overflow: auto;
  padding: var(--sp-3);
  /* 縮小しても図の判別がつく高さは残し、それを超えたら縦もスクロールさせる */
  max-height: 70vh;
  -webkit-overflow-scrolling: touch;
}

.diagram-body svg {
  display: block;
  margin: 0 auto;
}

/* 全画面表示。スマホでは指のピンチ操作にまかせる。 */
.diagram-dialog {
  width: 100vw;
  max-width: 100vw;
  height: 100dvh;
  max-height: 100dvh;
  margin: 0;
  padding: 0;
  border: none;
  background: var(--surface);
  color: var(--text);
}

.diagram-dialog::backdrop {
  background: rgba(11, 18, 32, 0.7);
}

.diagram-dialog-bar {
  display: flex;
  justify-content: flex-end;
  padding: var(--sp-2) var(--sp-3);
  border-bottom: var(--hairline);
}

.diagram-dialog-bar button {
  font-family: var(--font-body);
  font-size: var(--fs-sm);
  border: var(--hairline);
  background: var(--surface);
  color: var(--text);
  border-radius: var(--radius);
  padding: var(--sp-1) var(--sp-3);
  min-height: 38px;
  cursor: pointer;
}

.diagram-dialog-body {
  height: calc(100dvh - 55px);
  overflow: auto;
  padding: var(--sp-3);
  touch-action: pinch-zoom;
  -webkit-overflow-scrolling: touch;
}

.markdown-body hr {
  border: none;
  border-block-start: var(--hairline);
  margin-block: var(--sp-6);
  margin-inline: 0;
}

/* ----------------------------------------------------------------
   文字サイズ切替 (表示設定)

   文字サイズと一行の長さ (--measure) は必ず組で動かす。文字だけ大きくすると
   一行の字数が減り(小さくすると増え)、読みやすさの当たりがそのぶん外れる。
   どの段でも和文で41字前後になるように --measure を合わせてある。
   --measure を rem で持つのは、em だと見出し(文字が大きい)と段落で解決値が
   食い違い、行の左端が揃わなくなるため。
   ---------------------------------------------------------------- */
.page-paper[data-font-scale="small"] {
  --doc-size: 0.9375rem; /* 15px */
  --measure: 39rem;      /* ≒41字 */
}

.page-paper[data-font-scale="medium"] {
  --doc-size: 1.0625rem; /* 17px — 1040px の器で 16px だったものを一段上げる */
  --measure: 44rem;      /* ≒41字 */
}

.page-paper[data-font-scale="large"] {
  --doc-size: 1.1875rem; /* 19px */
  --measure: 49rem;      /* ≒41字 */
}

.page-paper .markdown-body {
  font-size: var(--doc-size, 1.0625rem);
}

/* ----------------------------------------------------------------
   縦書き (表示設定の「縦書きで読む」)

   reader.js が html[data-vertical="1"] を立て、本文の「紙」だけを
   vertical-rl に切り替える。ヘッダー・ツールバー・目次は横組みのまま
   (縦組みにすると操作の場所が読者の予想から外れるため)。

   横組みではウィンドウが縦にスクロールするが、縦組みでは「紙」自身が
   右から左へ横スクロールする器になる。行長(縦組みでは版面の高さ)は
   画面の高さから取り、長くなりすぎないよう上限を置く。スクロール監視
   (reader.js の setupTocAndPosition) は、縦組みのときこの要素の scroll を
   見に行く — 器が window から .page-paper に変わることと対で維持すること。
   ---------------------------------------------------------------- */
/* 「紙」の丈 = 縦組みの一行の長さ。40〜45字くらいで頭打ちにして、大きな
   画面で一行が間延びしないようにする (44rem)。

   引く 8rem は、紙の外にあるもの (ヘッダー・ツールバー・フッターと、その
   まわりの余白) のおおまかな見積り。reader.js の fitPaperFrame が実寸を
   測って --paper-reserve に置き直すと、ページ全体が一画面に収まり、縦に
   スクロールしなくてもフッターまで出る。

   **収めると一行が短くなりすぎる画面では、fitPaperFrame が
   --paper-reserve を置かない。** 丈はこの 8rem のままになり、従来どおり
   ページが縦に伸びる。どこで見切るかは reader.js 側 (MIN_PAPER_LINE)。

   **横組みでは紙を一画面に収めない。** ウィンドウ自身が縦にスクロールし、
   フッターは本文の末尾に置かれたままになる (紙の丈を画面から決めて紙の中だけを
   スクロールさせると、フッターが常に画面の下端に居座ることになるため)。
   --paper-reserve を置くのは縦組みだけ。 */
html[data-vertical="1"] {
  --paper-line: min(calc(100dvh - var(--paper-reserve, 8rem)), 44rem);
  /* dvh(動的ビューポート)はスマホのアドレスバーが出入りするたびに値が変わる。
     縦組みではこの丈がそのまま一行の長さなので、バーが出入りしただけで
     全文が組み直され、読んでいた位置が飛ぶ。バーが出ている前提の svh
     (小さいほう)で固定して、行長を動かさない。 */
  --paper-line: min(calc(100svh - var(--paper-reserve, 8rem)), 44rem);
}

html[data-vertical="1"] .page-paper {
  writing-mode: vertical-rl;
  text-orientation: mixed;
  height: var(--paper-line);
  /* 親(横組み)から見ると、この箱の width は「行を積む向き」の長さになる。
     auto のままだと本文の全長(数万px)まで箱が伸びて、ページ全体が横に
     広がってしまう。幅を親に合わせて固定し、あふれる分を箱の中で
     横スクロールさせる。 */
  width: 100%;
  max-width: 100%;
  overflow-x: auto;
  overflow-y: hidden;
  overscroll-behavior-x: contain;
  -webkit-overflow-scrolling: touch;
  scroll-padding: var(--sp-4);
}

/* 器そのものにフォーカスが当たる (reader.js が tabindex を付ける)。
   キーボードの矢印キーで読み進めている間、どこが動くのかを示す。 */
html[data-vertical="1"] .page-paper:focus-visible {
  outline: 2px solid var(--link);
  outline-offset: 2px;
}

/* 目次は紙と同じ丈で頭打ちにする。グリッドの行の高さは背の高いほうで
   決まるので、巻数の多いシリーズで目次が紙より長いと、そのぶんページが
   縦に伸びてフッターが画面の外へ出てしまう。目次は元から自前でスクロール
   する (.toc-sidebar の overflow-y: auto)ので、詰めても中身は失われない。 */
html[data-vertical="1"] .toc-sidebar {
  max-height: var(--paper-line);
}

/* 縦組みでは紙の丈が画面から決まり、ページ全体が一画面に収まる。下の大きな余白 (読み終わりの
   息継ぎ) をそのまま残すと、それだけでフッターが画面の外へ押し出されるので、
   このときだけ詰める。**詰めたぶんは reader.js の fitPaperFrame が実寸で
   拾うので、値を変えても計算はひとりでに追いつく。**

   フッター自身の上下の padding(既定 sp-5 = 32px x2)も、書架トップ・
   シリーズ目次のような普通のページでは効くが、読書画面では紙のすぐ下に
   「書架 by SAKUOLIA」の一行が来るだけなので、同じ厚みは要らない。
   詰めるほど --paper-reserve(reader.js が測る「紙の外」の実寸)も
   小さくなり、紙そのものの丈も伸びる ―― 隙間を削ったぶんがそのまま
   読める範囲に回る。 */
html[data-vertical="1"] .reader-layout {
  padding-block-end: var(--sp-3);
}

html[data-vertical="1"] .site-footer {
  margin-top: 0;
  padding-block: var(--sp-3);
}

/* 書体は、縦組みで読みやすい明朝に寄せる。「書体」で明示的に選ばれていれば
   --doc-font が置かれるので、そちらが優先される。 */
html[data-vertical="1"] .markdown-body {
  /* font-family を直に書かず受け皿だけ差し替える。こうしておくと、見出しの
     --heading-font(本文追従の分野)も同じ受け皿に落ちる。 */
  --body-font: var(--doc-font, "Zen Old Mincho", "Hiragino Mincho ProN", serif);
}

/* 縦中横。1〜2桁の数字と1〜2字の欧字を正立させる(「6　福神漬」の 6 など)。
   囲まずに済む text-combine-upright: digits は Chrome も Safari も対応して
   いないので、囲む範囲は reader.js の markTatechuyoko が付ける。
   **どこを囲むかは reader.js 側と対で維持すること。**
   -webkit- は unprefixed に対応する前の Safari 用。 */
html[data-vertical="1"] .markdown-body .tcy {
  -webkit-text-combine: horizontal;
  text-combine-upright: all;
}

/* 図版・コード・表・数式は横組みの島として残す(縦に倒すと読めない)。 */
html[data-vertical="1"] .markdown-body pre,
html[data-vertical="1"] .markdown-body table,
html[data-vertical="1"] .markdown-body .diagram,
html[data-vertical="1"] .markdown-body .math-block,
html[data-vertical="1"] .markdown-body .math-inline,
html[data-vertical="1"] .markdown-body img {
  writing-mode: horizontal-tb;
  text-combine-upright: none;
}

/* 横組みの島は縦組みの版面(＝画面の高さ)に収める。はみ出す分は島の中で
   スクロールさせる。

   縦組みの流れの中では、島は「版面の高さいっぱいの帯」を1つ占める。島の背が
   帯より低いと帯の残りがそのまま空白の穴になるので、margin-block: auto で
   帯の中央に置く(島にとっての margin-block は、縦組みの本文から見ると
   行方向＝上下にあたる)。逆に margin-inline が前後の行との間隔になる。 */
html[data-vertical="1"] .markdown-body pre,
html[data-vertical="1"] .markdown-body table,
html[data-vertical="1"] .markdown-body .diagram,
html[data-vertical="1"] .markdown-body .math-block {
  max-height: 100%;
  /* 島1つが1画面に収まる幅までにする(それ以上は島の中でスクロールさせる) */
  max-width: min(80vw, 42rem);
  margin-block: auto;
  margin-inline: var(--sp-4);
}

html[data-vertical="1"] .markdown-body pre,
html[data-vertical="1"] .markdown-body table,
html[data-vertical="1"] .markdown-body .math-block {
  overflow: auto;
}

/* 狭い画面では、島を90°(時計回り)倒して版面の高さいっぱいに使う。
   和書で横長の図表を寝かせて入れるのと同じ扱いで、PDF側も同じ向きに回している
   (pdf-export.js の makeRotatedFrame)。

   transform は場所を取らないので、倒した島が占める帯の厚みは reader.js が
   実寸から測って枠 (.v-rotate) の width に入れる。**枠の寸法決めと回転は
   reader.js の layoutIslands / setRotation と対で維持すること。**
   枠自身は縦組みのまま(=版面の高さいっぱいに伸びる)なので、行方向の間隔は
   margin-block(縦組みでは左右)で取る。 */
html[data-vertical="1"] .markdown-body .v-rotate {
  position: relative;
  margin-block: var(--sp-4);
  margin-inline: 0;
}

html[data-vertical="1"] .markdown-body .v-rotate > * {
  position: absolute;
  top: 0;
  left: 0;
  margin: 0;
  /* 幅は reader.js が版面の高さから決める。正立用の上限は外す。 */
  max-width: none;
  max-height: none;
  transform-origin: 0 0;
}

/* 和文だけの表は倒さず、表そのものを縦組みにする。表頭(Markdownの1行目)が
   右端の列になり、行は右から左へ、セルの文字は正立したまま上から下へ流れる
   — 和書の表の組み方そのもの。どの表をこの形にするかは reader.js の
   tableSuitsVertical が決めて .v-table を立てる(PDF側も同じ判定・同じ向きで
   組む: pdf-export.js の renderTableV)。

   上の「横組みの島」の指定を打ち消す形になっている(クラスのぶんだけ詳細度が
   高いので順序には依らない)。縦組みなので width/height の役割が入れ替わる:
   高さ = 帯(Markdownの列)の長さ、幅 = 行数ぶんの厚み。 */
html[data-vertical="1"] .markdown-body table.v-table {
  writing-mode: vertical-rl;
  display: table;
  /* 帯の長さは版面の高さまで。幅は行数ぶんだけ伸びる(本文と同じ向きに流れる) */
  width: auto;
  max-width: none;
  max-height: 100%;
  overflow: visible;
  /* 縦組みでは margin-block が前後の行との間隔(左右)になる */
  margin-block: var(--sp-4);
  margin-inline: 0;
}

/* セル内の行揃えは物理方向 (left) ではなく行の始まり (start = 上) で指定する */
html[data-vertical="1"] .markdown-body table.v-table th,
html[data-vertical="1"] .markdown-body table.v-table td {
  text-align: start;
}

/* 倒したあとは送り方向(図の高さ)に制限がないので、図の枠の高さ上限も外す */
html[data-vertical="1"] .markdown-body .v-rotate .diagram-body {
  max-height: none;
}

html[data-vertical="1"] .markdown-body img {
  max-height: 100%;
  max-width: none;
}

/* 縦組みの見出しは、横組みのときの「上の罫+余白」がそのまま右の罫になる
   (border-block-start / margin-block-start が縦組みでは右側を指す)。
   字面が大きいままだと一行に収まらないので少しだけ詰める。 */
html[data-vertical="1"] .markdown-body h1 {
  font-size: 1.5em;
}

html[data-vertical="1"] .markdown-body h2 {
  font-size: 1.25em;
}

/* ----------------------------------------------------------------
   PDF書き出しダイアログ
   ---------------------------------------------------------------- */
.export-dialog {
  width: min(560px, calc(100vw - var(--sp-4)));
  max-height: calc(100dvh - var(--sp-5));
  padding: 0;
  border: var(--hairline);
  border-radius: var(--radius-lg);
  background: var(--surface);
  color: var(--text);
}

.export-dialog::backdrop {
  background: rgba(11, 18, 32, 0.5);
}

.export-form {
  display: grid;
  gap: var(--sp-3);
  padding: var(--sp-4);
  /* 設定が縦に伸びても「PDFを保存」に必ず届くようにする */
  max-height: calc(100dvh - var(--sp-5));
  overflow-y: auto;
  overscroll-behavior: contain;
}

.export-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-3);
  position: sticky;
  top: calc(var(--sp-4) * -1);
  padding: var(--sp-4) 0 var(--sp-2);
  margin-top: calc(var(--sp-4) * -1);
  background: var(--surface);
  z-index: 1;
}

.export-head h2 {
  font-family: var(--font-display);
  font-size: var(--fs-lg);
  margin: 0;
}

.export-dialog .close-x {
  min-width: 38px;
  min-height: 38px;
  padding: 0;
}

.export-note {
  margin: 0;
  font-size: var(--fs-xs);
  color: var(--text-muted);
}

.export-dialog fieldset {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: var(--sp-2) var(--sp-3);
  margin: 0;
  padding: var(--sp-2) var(--sp-3) var(--sp-3);
  border: var(--hairline);
  border-radius: var(--radius);
}

.export-dialog legend {
  font-family: var(--font-data);
  font-size: var(--fs-xs);
  letter-spacing: var(--tracking-wide);
  color: var(--text-muted);
  padding: 0 var(--sp-1);
}

.export-dialog .radio {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
  font-size: var(--fs-sm);
  cursor: pointer;
  min-height: 34px;
}

.export-dialog .radio input {
  width: 16px;
  height: 16px;
  accent-color: var(--hagane);
}

.export-grid {
  display: grid;
  gap: var(--sp-3);
  grid-template-columns: repeat(auto-fit, minmax(210px, 1fr));
}

.export-grid .tool-field {
  justify-content: space-between;
}

.export-progress,
.export-error {
  margin: 0;
  font-size: var(--fs-sm);
}

.export-error {
  color: var(--text);
}

.export-actions {
  display: flex;
  justify-content: flex-end;
  gap: var(--sp-2);
}

/* ----------------------------------------------------------------
   ブレークポイント
   ---------------------------------------------------------------- */
/* サイドバーを置いたままだと本文の一行が短くなりすぎる幅から、目次を
   ツールバーの「目次」ボタンで呼び出すドロワーに切り替える。1080px なのは、
   目次(292px)＋間隔(48px)を引いた残りで和文35字を割ってしまう境目がこの
   あたりだから(それより狭いと、目次を残すより畳んで本文を広げたほうが読める)。
   本文の上に畳んで置くやり方だと、どこまで読み進めていても開閉ボタンを
   探すのにページ先頭まで戻る必要があったため、スクロール位置に関係なく
   どこからでも開け、閉じても読んでいた位置がずれない形にした。
   JS 側の初期折りたたみ判定 (reader.js の TOC_COLLAPSE_QUERY) と同じ幅。 */
@media (max-width: 1080px) {
  .reader-layout {
    grid-template-columns: minmax(0, 1fr);
    gap: var(--sp-4);
  }

  .toc-sidebar {
    position: fixed;
    top: 0;
    left: 0;
    bottom: 0;
    width: min(320px, 85vw);
    z-index: 60;
    max-height: none;
    margin: 0;
    border: none;
    border-right: var(--hairline);
    border-radius: 0;
    padding: var(--sp-5) var(--sp-4);
    background: var(--surface);
    box-shadow: var(--shadow-moon);
    overflow-y: auto;
    transform: translateX(-100%);
    transition: transform var(--dur) var(--ease);
  }

  .toc-sidebar[data-collapsed="false"] {
    transform: translateX(0);
  }

  /* 引き出しは画面の天地いっぱいに開く。紙の丈に揃えた頭打ち
     (html[data-vertical="1"] の .toc-sidebar) は、ここでは外す — 引き出しは
     グリッドの行から外れている (position: fixed) ので、背が高くてもページを
     縦に伸ばさない。 */
  html[data-vertical="1"] .toc-sidebar {
    max-height: none;
  }

  /* 目次が引き出しになると紙が画面幅いっぱいまで広がるが、一行の長さは
     横組み共通の --measure(本文の子要素に掛かる)がそのまま頭打ちにする。
     表・図はここでも紙の幅いっぱいを使えるので、狭い画面ほど得をする。 */

  .toc-head button {
    display: inline-block;
  }

  .toc-open-button {
    display: inline-flex;
  }

  .toc-backdrop {
    display: block;
    position: fixed;
    inset: 0;
    z-index: 55;
    background: rgba(11, 18, 32, 0.45); /* --saku-night ベース */
    opacity: 0;
    pointer-events: none;
    transition: opacity var(--dur) var(--ease);
  }

  .toc-backdrop[data-visible="true"] {
    opacity: 1;
    pointer-events: auto;
  }

  body.toc-open {
    overflow: hidden;
  }
}

@media (max-width: 720px) {
  /* コンテナと紙の左右余白が二重にかかると本文の一行が短くなりすぎるので、
     コンテナ側を詰めて、余白は「紙」側に持たせる。縦方向は逆に広げて、
     見出し・段落・図のあいだに息継ぎを作る。 */
  .container {
    padding: 0 var(--sp-3);
  }

  /* パンくずは全段を並べると2〜3行を占めてしまうので、現在地だけを
     1行で見せる(上位階層へはブランドかブラウザの戻るで足りる)。 */
  .crumb-nav {
    flex-wrap: nowrap;
    justify-content: flex-end;
    overflow: hidden;
  }

  .crumb-nav a,
  .crumb-nav > span:not(:last-child) {
    display: none;
  }

  .crumb-nav > span:last-child {
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
  }

  .reader-layout {
    padding-block: var(--sp-4) var(--sp-7);
    padding-inline: var(--sp-3);
  }

  /* 本文が画面の端まで来ていると読みづらいので、紙の左右をひと回り広く
     取る (コンテナ側は上で詰めてあるぶん、余白は紙が持つ)。 */
  .page-paper {
    padding: var(--sp-5);
  }

  .markdown-body p,
  .markdown-body ul,
  .markdown-body ol {
    margin-block-end: 1.7em;
  }

  /* 狭い画面では、リストの既定の字下げ(40px)が一行の長さを目に見えて削る */
  .markdown-body ul,
  .markdown-body ol {
    padding-inline-start: 1.4em;
  }

  .markdown-body h2 {
    margin-block-start: var(--sp-7);
  }

  .markdown-body h3 {
    margin-block-start: var(--sp-5);
  }

  /* 表は縮めずに横スクロールさせる (縮めると数字が読めなくなる)。
     縦組みの表 (.v-table) と、列幅を配り直した表 (.sized-table) は表として
     組む必要があるので display:block にしない (display:block では
     table-layout も列幅も効かない)。 */
  .markdown-body table:not(.v-table):not(.sized-table) {
    display: block;
    width: max-content;
    max-width: 100%;
    overflow-x: auto;
  }

  .diagram-body {
    max-height: 60vh;
  }

  /* 画面が狭いほどヒーローは題号一枚看板に寄せ、帯の厚みを削る。 */
  .shelf-hero {
    padding: var(--sp-4) 0;
  }

  .shelf-hero h1 {
    font-size: var(--fs-xl);
  }

  /* タブレット幅では段組みが1列に落ちる。1列なら丈を揃える意味がないので、
     それぞれのカードを中身なりの高さにする。 */
  .shelf-section {
    padding-top: var(--sp-5);
  }

  .series-grid {
    grid-auto-rows: auto;
  }

  .series-grid {
    padding: var(--sp-3) 0 var(--sp-2);
  }

  .series-card {
    padding: var(--sp-4);
    padding-left: calc(var(--sp-4) + 4px);
  }

}

@media (max-width: 480px) {
  /* スマホでは題号とリード1行だけの薄い帯にする。
     背表紙も画面幅に合わせて細くし、書棚らしい本の粒度を保つ。 */
  .shelf-hero {
    padding: var(--sp-4) 0 var(--sp-3);
  }

  .shelf-hero::before {
    background-size: auto, 104px 4px, 104px 100%;
  }

  .shelf-hero h1 {
    font-size: var(--fs-lg);
  }

  .shelf-hero .hero-tagline {
    font-size: var(--fs-xs);
    letter-spacing: 0.12em;
    text-indent: 0.12em;
    margin-top: var(--sp-1);
  }

  /* スマホでは段をアコーディオンにする(既定で開くのは小説だけ。開閉は
     reader.js が localStorage に覚える)。リードを1行に削って全段を詰め込むより、
     読まない段を畳んで「開いている段のリードは最後まで読める」ほうが選びやすい。 */
  .shelf-section {
    padding-top: var(--sp-3);
  }

  .shelf-details > summary {
    cursor: pointer;
    pointer-events: auto;
    -webkit-tap-highlight-color: transparent;
  }

  /* 開いている段の見出しは画面上端に貼り付けて、スクロール中も
     「いまどの段を見ているか」を残す。 */
  .shelf-details[open] > .shelf-section-head {
    position: sticky;
    top: 0;
    z-index: 5;
    background: var(--bg);
  }

  /* 1行目に「段の名前 — 点数 — 山形」、畳んでいるときだけ2行目に説明。
     自動配置に任せると点数が説明の下へ回るので、行と列を明示する。 */
  .shelf-section-head {
    grid-template-columns: 1fr auto auto;
    padding-top: var(--sp-2);
    padding-bottom: var(--sp-2);
  }

  .shelf-section-head h2 {
    grid-area: 1 / 1;
    font-size: var(--fs-md);
  }

  .shelf-section-count {
    grid-area: 1 / 2;
  }

  .shelf-section-head::after {
    grid-area: 1 / 3;
    display: block;
    align-self: center;
  }

  .shelf-details[open] > .shelf-section-head::after {
    transform: rotate(225deg);
  }

  /* 段の説明は、畳んでいるときだけ出す。開いた段では下にカードが続くので
     不要になり、貼り付いた見出しを薄くできる。 */
  .shelf-section-note {
    grid-area: 2 / 1 / auto / -1;
  }

  .shelf-details[open] > .shelf-section-head .shelf-section-note {
    display: none;
  }

  .series-grid {
    gap: var(--sp-3);
    padding: var(--sp-3) 0 var(--sp-2);
    grid-auto-rows: auto;
  }

  .series-card {
    padding: var(--sp-4) var(--sp-3);
    padding-left: calc(var(--sp-3) + 3px);
  }

  .series-card::before {
    width: 3px;
  }

  /* 種別は段見出しが常に示しているので、カード側のラベルは畳む。 */
  .series-kind {
    display: none;
  }

  .series-card h3 {
    font-size: var(--fs-lg);
    margin-bottom: var(--sp-2);
  }

  .series-card .meta {
    gap: var(--sp-1) var(--sp-3);
  }

  /* スマホ版は「前の巻・目次・表示設定・次の巻」の4列に組み直し、
     両端と中央で指の届く位置に固定する。.prevnext / .reader-tools は
     display:contents で外し、中のボタンをツールバーの直接のグリッド項目
     として扱う。 */
  .reader-toolbar {
    display: grid;
    grid-template-columns: auto 1fr 1fr auto;
    align-items: center;
    font-size: var(--fs-xs);
    gap: var(--sp-2);
  }

  .reader-toolbar .prevnext,
  .reader-toolbar .reader-tools {
    display: contents;
  }

  .reader-toolbar .prevnext > :first-child {
    order: 1;
    justify-self: start;
  }

  .reader-toolbar .toc-open-button {
    order: 2;
    justify-self: center;
  }

  .reader-toolbar .prevnext > :last-child {
    order: 4;
    justify-self: end;
  }

  /* パネルはツールバーの幅いっぱいに開く (画面外へはみ出させない)。
     基準をボタンからツールバーに移すため .reader-menu の relative を外す。 */
  .reader-menu {
    order: 3;
    justify-self: center;
    position: static;
  }

  .menu-panel {
    left: 0;
    right: 0;
    min-width: 0;
  }

  /* ツールバーは常時スクロール追従する(sticky)ため、文字ラベルを出したままだと
     スマホでは上部がずっと窮屈になる。ラベルを隠してアイコンだけの正方形
     ボタンに切り替え、意味は aria-label(前の巻/次の巻/表示設定)で伝える。 */
  .nav-link-label {
    display: none;
  }

  .nav-link,
  .menu-button {
    justify-content: center;
    min-width: 40px;
    padding-left: 0;
    padding-right: 0;
  }

  .nav-link-placeholder {
    min-width: 40px;
  }

  /* スマホでは「紙」とツールバーを画面の端まで広げる。カードの左右の罫と
     角丸、そして器の左右の余白は、そのぶん一行の字数を削るだけで得るものが
     ない (390pxの画面では、端まで届く紙のほうが2〜3字ぶん長く組める)。
     上下の罫だけは本文の始まりと終わりの目印として残す。 */
  .reader-layout {
    padding-inline: 0;
  }

  .page-paper {
    border-inline: none;
    border-radius: 0;
    padding: var(--sp-4);
  }

  /* ヘッダー・ツールバー・紙は、画面上端から1つの帯として続ける。あいだに
     余白を残すと、中身の無い隙間が2本挟まって見えるだけなので
     (ホーム画面から開いたときにいちばん目立つ)、上下とも落として、
     ツールバーをヘッダーの罫に直に載せ、紙をその罫に直に載せる。
     本文の息継ぎは紙自身の padding が持っている。 */
  .reader-layout {
    padding-block-start: 0;
  }

  .reader-toolbar {
    top: var(--header-h, 0px);
    border-inline: none;
    border-block-start: none;
    border-radius: 0;
    margin-bottom: 0;
  }

  /* 指で押す的は 44px 四方を下限にする (Apple/Google のどちらの目安も44dp) */
  .reader-toolbar button,
  .reader-toolbar a.button-like {
    min-height: 44px;
  }

  .nav-link,
  .menu-button,
  .toc-open-button {
    min-width: 44px;
  }

  .nav-link-placeholder {
    min-width: 44px;
  }

  /* ホームバーのある端末で、最終行が下端の帯に隠れないようにする */
  .reader-layout {
    padding-bottom: calc(var(--sp-7) + env(safe-area-inset-bottom));
  }
}

/* ----------------------------------------------------------------
   夜面 (表示設定の「テーマ」で「暗い」を選んだとき)

   配色そのものは tokens.css の [data-theme="night"] が持っている。
   reader.js は「端末に合わせる / 明るい / 暗い」の選択を解決して、夜面の
   ときだけ <html data-theme="night"> を立てる(初期表示のちらつきを防ぐため、
   判定はテンプレート側 <head> のインラインスクリプトで先に済ませる)。
   ここに書くのは、明面を前提にしていた箇所の手当てだけ。

   ・コードのシンタックスハイライト(highlight.js のCDN配布CSS)は
     reader.js が github / github-dark を差し替える。
   ・Mermaid図は reader.js が theme: neutral / dark で描き直す。
   ---------------------------------------------------------------- */
[data-theme="night"] {
  /* スクロールバー・フォーム部品・入力欄のキャレットまで夜面に合わせる */
  color-scheme: dark;
}

/* 夜面では、紙(--surface)より暗いコード地は沈みがちなので少し持ち上げる */
[data-theme="night"] .markdown-body code,
[data-theme="night"] .markdown-body pre {
  background: color-mix(in srgb, var(--geppaku) 6%, var(--surface));
}

/* ----------------------------------------------------------------
   印刷 (PDF書き出し) — 表紙スタイル「classic (白妙)」
   画面には表示せず、@media print でのみ出現する。
   ---------------------------------------------------------------- */
.print-only {
  display: none;
}

@media print {
  /* 夜面で読んでいても紙は白く刷る。配色を個別に打ち消すのではなく、
     tokens.css のセマンティックトークンだけを明面の解決値へ戻す
     (これでカード・罫・引用の囲みまで一度に明面に揃う)。 */
  [data-theme="night"] {
    color-scheme: light;
    --bg: var(--gekko);
    --surface: #FFFFFF;
    --text: var(--yoizumi);
    --text-muted: var(--hakubo);
    --line: var(--tangetsu);
    --link: var(--hagane);
  }

  /* 読み進みの細線は紙に出さない */
  .reading-progress {
    display: none;
  }

  /* 縦書きで読んでいても、ブラウザの印刷は横組みに戻す
     (縦組みのままだと器の横スクロール分が紙に出ない)。 */
  html[data-vertical="1"] .page-paper {
    writing-mode: horizontal-tb;
    height: auto;
    max-width: none;
    overflow: visible;
  }

  @page {
    size: A4;
    margin: 22mm 18mm;
  }

  .skip-link,
  .site-header,
  .reader-toolbar,
  .resume-banner,
  .toc-sidebar,
  .diagram-bar,
  .export-dialog,
  .site-footer {
    display: none !important;
  }

  /* 表の列幅も画面の器に合わせて配ったものなので、紙ではブラウザの自動列幅に
     戻す (reader.js の layoutTableColumns が入れたインラインの寸法を打ち消す)。 */
  .markdown-body table.sized-table {
    table-layout: auto;
    inline-size: 100% !important;
  }

  .markdown-body table.sized-table th,
  .markdown-body table.sized-table td {
    inline-size: auto !important;
  }

  /* 図は縮小して紙幅に収める (画面用の実寸指定を打ち消す) */
  .diagram {
    border: none;
  }

  .diagram-body {
    max-height: none;
    overflow: visible;
    padding: 0;
  }

  .diagram-body svg {
    width: auto !important;
    height: auto !important;
    max-width: 100% !important;
  }

  .reader-layout {
    display: block;
    padding: 0;
  }

  .page-paper {
    border: none;
    padding: 0;
    background: none;
  }

  body {
    background: #fff;
    color: #000;
  }

  .print-only {
    display: block;
  }

  .print-cover {
    height: 240mm;
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    text-align: center;
    break-after: page;
    border-top: 1pt solid #0B1220;
    border-bottom: 1pt solid #0B1220;
    padding: 24mm 10mm;
  }

  .print-cover .eyebrow {
    font-family: var(--font-data);
    letter-spacing: 0.2em;
    font-size: 10pt;
    color: #46608C;
    margin-bottom: 14mm;
  }

  .print-cover h1 {
    font-family: var(--font-display);
    font-size: 26pt;
    line-height: 1.5;
    margin: 0 0 8mm;
  }

  .print-cover .subtitle {
    font-family: var(--font-display);
    font-size: 13pt;
    color: #3A4160;
    margin-bottom: 14mm;
  }

  .print-cover .meta {
    font-family: var(--font-data);
    font-size: 9pt;
    color: #5A6478;
  }

  .print-toc {
    break-after: page;
  }

  .print-toc h2 {
    font-family: var(--font-display);
    font-size: 14pt;
    border-bottom: 1pt solid #DDE3EE;
    padding-bottom: 3mm;
  }

  .print-toc ol {
    list-style: none;
    padding: 0;
    font-size: 10pt;
    line-height: 2;
  }

  .print-toc li.depth-3 {
    padding-left: 6mm;
    font-size: 9pt;
  }

  .markdown-body h1 {
    break-before: page;
  }

  .markdown-body h1:first-child {
    break-before: avoid;
  }

  .markdown-body pre,
  .markdown-body table,
  .markdown-body pre.mermaid {
    break-inside: avoid;
  }
}

/* ----------------------------------------------------------------
   404
   ---------------------------------------------------------------- */
.not-found {
  padding: var(--sp-8) 0;
}

/* ----------------------------------------------------------------
   フッター
   ---------------------------------------------------------------- */
/* フッターは静かに閉じる。ブランド(左)と著作権表示(右)を細い罫線の下に
   置くだけで、リンクは増やさない — 書架の底板にあたる部分。 */
.site-footer {
  margin-top: var(--sp-7);
  border-top: var(--hairline);
  padding: var(--sp-5) 0;
  color: var(--text-muted);
  font-size: var(--fs-xs);
}

.site-footer .container {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-3);
  flex-wrap: wrap;
}

.footer-brand {
  display: flex;
  align-items: baseline;
  gap: var(--sp-2);
  text-decoration: none;
  color: var(--text);
}

.footer-brand img {
  width: 20px;
  height: 20px;
  flex: none;
  align-self: center;
  opacity: 0.9;
}

.footer-brand-word {
  font-family: var(--font-logotype);
  font-size: var(--fs-md);
  letter-spacing: var(--tracking-brand);
}

.footer-brand-sub {
  font-family: var(--font-data);
  letter-spacing: var(--tracking-wide);
  color: var(--text-muted);
}

.footer-copy {
  margin: 0;
  font-family: var(--font-data);
  letter-spacing: 0.04em;
}

/* スマホでは横並びだと折り返して読みにくいので、縦に積む。
   このブロックは、上書きする .site-footer の規則より後ろに置くこと
   (画面幅ごとのまとまり(@media (max-width: 480px))は、ファイル上では
   フッターの定義より前にあり、そこに書くと後勝ちで打ち消される)。 */
@media (max-width: 480px) {
  .site-footer {
    margin-top: var(--sp-5);
  }

  .site-footer .container {
    flex-direction: column;
    align-items: flex-start;
    gap: var(--sp-2);
  }
}
