/* dynamo.css — 見本05 だけの上書き。gx.css は触らない（共通部品を案件で汚さない） */

:root {
  --dyn-cherry: #D8232A;
  --dyn-turq: #2FBFB0;
  --dyn-cream: #F2E8D5;
  --dyn-ink: #16171B;
  --dyn-yellow: #F5C531;
  --dyn-disp: 'Bebas Neue', 'Barlow Condensed', 'Zen Kaku Gothic New', sans-serif;
  --dyn-text: 'Zen Kaku Gothic New', 'Barlow Condensed', sans-serif;
}

/* ── 書体 ────────────────────────────────────────────────
   参照サイトは Knockout（有償）。同じ「幅の揃った圧縮グロテスク」の性格を
   OFL の Bebas Neue ＋ Barlow Condensed で代える。和文は Zen Kaku Gothic New。 */
body { font-family: var(--dyn-text); }
.gx-meta, .gx-logo__name, .dyn-teach__big, .dyn-marquee, .dyn-count {
  font-family: var(--dyn-disp);
  letter-spacing: .06em;
}
.gx-gate__title, .gx-station h2 { font-family: var(--dyn-text); font-weight: 700; }

/* カーソルは末尾の「ポップな矢印」節に移した（2026-08-31） */

/* ── 幕 ─────────────────────────────────────────────── */
.gx-gate {
  background:
    radial-gradient(120% 90% at 50% 12%, rgba(216,35,42,.30), transparent 62%),
    linear-gradient(180deg, #1B1C21 0%, #0E0F12 100%);
}
.gx-gate .gx-meta { color: var(--dyn-yellow); }

/* ── 下の帯（今どこを見ているか） ──────────────────────── */
.dyn-marquee {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 60;
  height: 40px;                      /* 参照サイトの実測値と同じ */
  display: flex; align-items: center; justify-content: center;
  background: linear-gradient(180deg, rgba(12,12,14,0), rgba(12,12,14,.72) 46%);
  color: var(--dyn-cream);
  font-size: 15px; letter-spacing: .16em; text-transform: uppercase;
  pointer-events: none;
  padding-bottom: 2px;
}
.dyn-marquee span { display: inline-block; }
.dyn-marquee.is-swap span { animation: dyn-swap .34s cubic-bezier(.2,.7,.3,1); }
@keyframes dyn-swap {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: none; }
}
html.no-3d .dyn-marquee, html.is-tour .dyn-marquee { display: none; }

/* ── ロゴ（左上）────────────────────────────────────────
   この店は**明るい**部屋なので、白いロゴが白い天井に溶ける。
   実測：「SODA STAND」のコントラスト比が **1.47**（見出しは 13.89 で十分だった＝
   共通の暗いベールは効いている。落第はロゴだけ）。
   右上の「見つけた数」と同じ暗い座布団に載せて、左右の角の作りも揃える。
   ★この直しは**明るいテーマ固有**なので gx.css には返さない（夜の見本では起きない） */
/* ★ロゴの見た目そのものは、この下のほう（「もっとかっこよくポップに」の節）で決める。
   ここに形・縁・地色を書いていたら、詳細度(0,3,1)であちらの(0,2,0)に勝ってしまい、
   直したはずの意匠が一切出なかった（2026-09-01 実測：border-radius が 999px のまま）。
   ここに残すのは「3Dの上にいるときだけの事情」＝置き場所と、後ろのぼかしだけ。 */
.has-3d:not(.is-tour) .gx-logo {
  top: 16px; left: 16px;
  backdrop-filter: blur(6px);
}

/* ── 見つけた数 ─────────────────────────────────────── */
.dyn-count {
  position: fixed; right: 16px; top: 16px; z-index: 60;
  margin: 0; padding: 7px 13px 6px;
  border: 1px solid rgba(242,232,213,.28);
  border-radius: 999px;
  background: rgba(12,12,14,.44);
  backdrop-filter: blur(6px);
  color: var(--dyn-cream);
  font-size: 13px; letter-spacing: .12em;
  pointer-events: none;
}
.dyn-count.is-pop { animation: dyn-pop .42s cubic-bezier(.2,1.4,.4,1); }
.dyn-count.is-full { border-color: var(--dyn-yellow); color: var(--dyn-yellow); }
@keyframes dyn-pop { 0% { transform: scale(1); } 40% { transform: scale(1.14); } 100% { transform: scale(1); } }
html.no-3d .dyn-count { display: none; }

/* ── 見回し方の教え ─────────────────────────────────── */
.dyn-teach {
  position: fixed; left: 50%; top: 62%; z-index: 58;
  transform: translate(-50%, -50%);
  display: none; text-align: center; color: var(--dyn-cream);
  pointer-events: none; text-shadow: 0 2px 18px rgba(0,0,0,.65);
}
.dyn-teach.is-on { display: block; animation: dyn-teach-in .8s .2s both; }
.dyn-teach.is-gone { animation: dyn-teach-out .5s both; }
.dyn-teach__small { display: block; font-size: 12px; letter-spacing: .22em; opacity: .72; }
.dyn-teach__big {
  display: block; margin-top: 6px; font-size: clamp(20px, 3.4vw, 30px);
  letter-spacing: .10em;
}
.dyn-teach__big::after {
  content: ''; display: block; width: 84px; height: 2px; margin: 12px auto 0;
  background: var(--dyn-cream); opacity: .5;
  animation: dyn-drag 1.9s ease-in-out infinite;
}
@keyframes dyn-drag { 0%,100% { transform: translateX(-16px); } 50% { transform: translateX(16px); } }
@keyframes dyn-teach-in { from { opacity: 0; transform: translate(-50%,-42%); } to { opacity: 1; transform: translate(-50%,-50%); } }
@keyframes dyn-teach-out { to { opacity: 0; transform: translate(-50%,-58%); } }
@media (prefers-reduced-motion: reduce) {
  .dyn-teach__big::after, .dyn-marquee.is-swap span, .dyn-count.is-pop { animation: none; }
}

/* ── ホットスポットの見た目（参照サイトの円形ラベルに寄せる） ──
   実測：ボタンは 80x80px の透明な四角。輪と回る文字で「押すところ」を示す */
.gx-hotspot.is-pinned::before {
  width: 62px; height: 62px;
  border: 1.5px solid rgba(242,232,213,.85);
  background: rgba(216,35,42,.16);
  box-shadow: 0 0 0 1px rgba(0,0,0,.28), 0 6px 26px rgba(0,0,0,.36);
}
.gx-hotspot.is-pinned:hover::before,
.gx-hotspot.is-pinned:focus-visible::before {
  background: rgba(216,35,42,.42);
  border-color: var(--dyn-cream);
}
.gx-hotspot.is-pinned::after {
  font-family: var(--dyn-disp);
  letter-spacing: .14em;
  background: rgba(12,12,14,.62);
  color: var(--dyn-cream);
}
.gx-hotspot.is-pinned.is-found::before {
  border-color: var(--dyn-yellow);
  background: rgba(245,197,49,.14);
}

/* ── クリアの返し（採点17）────────────────────────────
   焼いた絵は動かせないので、返しは全部DOMでやる。どれも1秒以内で終わらせる。 */
.dyn-burst {
  position: fixed; z-index: 70; left: 50vw; top: 50vh;
  width: 62px; height: 62px; margin: -31px 0 0 -31px;
  border: 2px solid var(--dyn-yellow); border-radius: 50%;
  pointer-events: none;
  animation: dyn-burst .82s cubic-bezier(.15,.75,.3,1) forwards;
}
.dyn-burst::after {
  content: ''; position: absolute; inset: -6px;
  border: 1px solid var(--dyn-cream); border-radius: 50%; opacity: .8;
  animation: dyn-burst2 .82s cubic-bezier(.15,.75,.3,1) forwards;
}
@keyframes dyn-burst {
  0%   { transform: scale(.55); opacity: 0; }
  22%  { opacity: 1; }
  100% { transform: scale(3.1); opacity: 0; }
}
@keyframes dyn-burst2 {
  0%   { transform: scale(.8); opacity: .9; }
  100% { transform: scale(2.1); opacity: 0; }
}


/* 章が通った瞬間、画面全体をごく短く持ち上げる（1フレームの閃光にしない） */
html.is-cleared .gx-stage::after {
  content: ''; position: fixed; inset: 0; pointer-events: none;
  background: radial-gradient(120% 90% at 50% 55%, rgba(245,197,49,.20), transparent 62%);
  animation: dyn-flash .9s ease-out forwards;
}
@keyframes dyn-flash { 0% { opacity: 0; } 18% { opacity: 1; } 100% { opacity: 0; } }

/* 見つけた印は控えめに残す（済んだことが分かるように） */
.gx-hotspot.is-burst.is-pinned::before { border-style: dashed; }

@media (prefers-reduced-motion: reduce) {
  .dyn-burst, .dyn-burst::after, html.is-cleared .gx-stage::after {
    animation: none;
  }
  .dyn-burst { display: none; }
}

/* ── スマホ：解錠前の章を版面から外す ──────────────────
   gx-locked は既定で opacity:.14 だが、**版面には残る**。
   狭い画面では position:fixed で浮いた印と重なって、
   qa_play の文字重なり検査に引っかかる（2026-08-31 実測で4件）。
   生HTML（JS無効）と見るだけモードでは全文が出るので、
   DOM-first の約束は守られる。隠すのは has-3d が付いてからだけ。 */
@media (max-width: 700px) {
  .has-3d:not(.is-tour) .gx-station.gx-locked { visibility: hidden; }
  .has-3d:not(.is-tour) .gx-station.gx-locked .gx-station__inner { display: none; }
  /* 読み物は解錠と無関係に常時可視。ただし遊んでいる間は下へ送る */
  .has-3d:not(.is-tour) .gx-station[data-reading] { margin-top: 6svh; }
}


/* 窓（gx-modal）はスマホで画面下 46svh を覆う。
   画角の外にあるホットスポットは印が浮かず本文の流れに残るので、
   そのままだと窓の下敷きになって押せない。窓が開いている間だけ本文を上へ逃がす。 */
/* ★641〜700px の帯だけ、下の余白が二重に効いていた（2026-08-31 再検分の指摘）。
   吹き出しが下から出る帯になるのは 640px 以下なので、この逃がしも 640px に揃える。
   641〜700px では吹き出しは中央のカードなので、本文を下へ送る必要がない */
@media (max-width: 640px) {
  html.gx-doc-open .gx-station { padding-bottom: 52svh; }
  html.gx-doc-open .gx-actions { position: relative; z-index: 45; }
}

/* ── フィナーレ（採点8）────────────────────────────────
   参照サイトは最後に部屋全体が動く。焼いた絵ではそれができないので、
   ①カメラをゆっくり回す（世界側）②画面の縁を暖かく落とす（ここ）の2つで作る。
   **文字は足さない**——版面に新しい文字を出すと、狭い画面で見出しと重なる。 */
html.is-finale .gx-stage::before {
  content: ''; position: fixed; inset: 0; pointer-events: none; z-index: 12;
  background:
    radial-gradient(120% 86% at 50% 52%, transparent 44%, rgba(28, 8, 4, .34) 78%, rgba(20, 5, 3, .52) 100%);
  animation: dyn-finale 2.4s cubic-bezier(.25,.7,.3,1) both;
}
@keyframes dyn-finale { from { opacity: 0; } to { opacity: 1; } }
@media (prefers-reduced-motion: reduce) {
  html.is-finale .gx-stage::before { animation: none; opacity: 1; }
}

/* ── 読み物 ─────────────────────────────────────────── */
.dyn-read { max-width: 42rem; }
.dyn-read h3 {
  margin: 2.2em 0 .6em; font-family: var(--dyn-disp);
  font-size: 1.32rem; letter-spacing: .08em; color: var(--dyn-yellow);
}
.dyn-read p { line-height: 1.95; margin: 0 0 1.15em; }
.dyn-read strong { color: var(--dyn-cream); font-weight: 700; }
.dyn-foot { font-family: var(--dyn-disp); letter-spacing: .14em; margin: 0 0 .4em; }

/* 日本語の折り返し（品質採点⑬） */
.gx-station h2, .gx-sub, .dyn-read p, .dyn-teach__big {
  word-break: auto-phrase;
  text-wrap: pretty;
}

/* ── 縮退したときは読み物として素直に見せる ───────────── */
html.no-3d body { cursor: auto; background: #0E0F12; }
html.no-3d .gx-shell { padding-top: 2rem; }


/* ==========================================================
   ポップUI改修 2026-08-31 ── badge
   ========================================================== */
/* ============================================================
   押すところの印 ＝ 黄色いギザギザのシール ＋ その下の「読める札」
   （dynamo.css のいちばん最後に追記する。gx.css は1行も触らない）

   2026-08-31 内田「世界観は良い。だけど、見づらい」への答え。

   前の案（外周を回る和文）は捨てた。実測すると文字が札の外へ出て
   背景写真に乗り、円の下半分は上下逆さで読めなかった。
   読める札を消して読めない装飾に置き換えるのは、指摘に逆行している。

   だからこうする：
     ・黄色いギザギザは残す（ポップさの核）
     ・中央に**その駅の中での通し番号**（1,2,3,4）を Bebas Neue の極太で置く
       → 印が4つ並んでも見分けが付く
     ・ラベルは**バッジの真下の札**として残す。クリーム地＋インクの太字
       → 実測 14.74:1。明るい店内でも読める
     ・回る文字・波紋・外周SVGは全部やめる。JSが作るDOMはゼロ

   ★実測して分かった大事なこと（前の案の「黒フチが効かない」の真因）
     clip-path は filter の**あと**に適用される。だから clip-path を掛けた
     ::before に drop-shadow を積んでも、フチは必ず切り落とされる。
     実測：6px の硬い drop-shadow を4方向に積んでもフチは1pxも出なかった。
     → フチは**クリップされていない親**に置く。これで確実に出る。
   ============================================================ */

/* ── 印ぜんたい（バッジ＋札を縦に積む箱） ───────────────────
   ★この箱の高さが gx-marker.js の当たり判定と離し合いに効く。
     実測：--ms は**どの印も 1.150 固定**（カメラが球の中心にいて
     SPOT_R=30 なので 44/(30*0.55)=2.67 → 上限 1.15 に張り付く）。
     つまり効くのは最小 0.74 ではなく**最大 1.15** のほう。
     gx-marker の縦の最小間隔 MINY = max(96, min(w,h)*0.18) なので、
     「箱の高さ × 1.15 ≦ MINY」を満たせば印どうしは絶対に重ならない。 */
.gx-hotspot.is-pinned:not([data-marker="drag"]) {
  --dyn-badge-base: 74px;                                  /* シールの直径（広い画面） */
  --dyn-badge-k: 1;                                        /* 見つけ済みで .82 に縮む倍率 */
  --dyn-badge: var(--dyn-badge-base); /* 箱は一定。済み／端の縮みは::beforeのscaleだけ */
  --dyn-rim: 2.5px;                                        /* 黒フチの太さ */
  --dyn-plate-h: 28px;                                     /* 札の高さを固定する。
                                                              書体が落ちてきた瞬間に箱が伸びると
                                                              上の計算が狂うので、伸ばさせない */
  --dyn-plate-fs: 13px;
  --dyn-plate-pad: 0 18px; /* 左右の矢羽根の場所を常に確保 */
  gap: 6px;

  /* gx.css の gx-pulse（琥珀色の丸い脈）を止める。
     シールの言葉づかいと合わないうえ、箱ぜんたいを囲む大きな輪になって散らかる。
     ★印になっていない本文中のボタンでは gx-pulse はそのまま生きる */
  box-shadow: none;
  animation: none;

  /* ★黒フチはここ（親）で作る。親はクリップされていないので確実に出る。
     4方向・ぼかし0の drop-shadow を重ねると、実質「四角い構造要素での膨張」に
     なり、軸で 2.5px・斜めで 3.5px の均一なフチになる。
     中の数字は不透明な黄色の上に乗っているので、字のまわりにフチは出ない */
  filter:
    drop-shadow(var(--dyn-rim) 0 0 var(--dyn-ink))
    drop-shadow(calc(var(--dyn-rim) * -1) 0 0 var(--dyn-ink))
    drop-shadow(0 var(--dyn-rim) 0 var(--dyn-ink))
    drop-shadow(0 calc(var(--dyn-rim) * -1) 0 var(--dyn-ink))
    drop-shadow(0 5px 13px rgba(0, 0, 0, .5));             /* 浮かせる影 */
}

/* ── シール本体（＝押せるのはここ）───────────────────────
   中央の数字は content: attr() で出す。**要素は1つも足さない**ので
   ボタンの textContent は「棚の瓶」のまま汚れない（実測で確認済み） */
.gx-hotspot.is-pinned:not([data-marker="drag"])::before {
  content: attr(data-dyn-no);        /* dyn-extras.js が駅ごとに 1 から振る */
  width: var(--dyn-badge);
  height: var(--dyn-badge);
  display: grid;
  place-items: center;
  box-sizing: border-box;
  padding-top: .05em;                /* Bebas の数字はやや上に付くので少し下げる */

  border: 0;                         /* gx.css の2px の輪を打ち消す */
  border-radius: 0;                  /* 丸みは clip-path が作る */
  box-shadow: none;                  /* clip-path で切ると外側の影は見えない */
  background: var(--dyn-yellow);     /* ベタ塗り。グラデだと「シール」に見えない */
  color: var(--dyn-ink);             /* 黒×黄 ＝ 実測 11.01:1 */

  font-family: var(--dyn-disp);      /* Bebas Neue。数字だけなので和文グリフは要らない */
  font-size: calc(var(--dyn-badge) * .46);
  line-height: 1;
  letter-spacing: .01em;

  animation: none;                   /* gx-ring（box-shadow の脈）は clip されて見えない */
  filter: none;                      /* ★ここに filter を書いても clip-path に切られる。
                                         フチは親が持つ（上のコメント参照） */
  rotate: -3deg;                     /* 貼り付けたシールらしく少しだけ傾ける */
  scale: var(--dyn-badge-k);
  transition: scale .16s cubic-bezier(.2, .7, .3, 1);

  /* シールのギザギザ：外周50% / 谷43.5% の24歯（＝48頂点）。
     SVGを重ねずCSSだけで作るので、当たり判定もこの形のまま残る */
  clip-path: polygon(
    50.00% 0.00%, 55.68% 6.87%, 62.94% 1.70%, 66.65% 9.81%, 75.00% 6.70%, 76.48% 15.49%,
    85.36% 14.64%, 84.51% 23.52%, 93.30% 25.00%, 90.19% 33.35%, 98.30% 37.06%, 93.13% 44.32%,
    100.00% 50.00%, 93.13% 55.68%, 98.30% 62.94%, 90.19% 66.65%, 93.30% 75.00%, 84.51% 76.48%,
    85.36% 85.36%, 76.48% 84.51%, 75.00% 93.30%, 66.65% 90.19%, 62.94% 98.30%, 55.68% 93.13%,
    50.00% 100.00%, 44.32% 93.13%, 37.06% 98.30%, 33.35% 90.19%, 25.00% 93.30%, 23.52% 84.51%,
    14.64% 85.36%, 15.49% 76.48%, 6.70% 75.00%, 9.81% 66.65%, 1.70% 62.94%, 6.87% 55.68%,
    0.00% 50.00%, 6.87% 44.32%, 1.70% 37.06%, 9.81% 33.35%, 6.70% 25.00%, 15.49% 23.52%,
    14.64% 14.64%, 23.52% 15.49%, 25.00% 6.70%, 33.35% 9.81%, 37.06% 1.70%, 44.32% 6.87%
  );
}

/* ── 読める札（何を押すのかを言葉で言う）───────────────────
   クリーム地＋インクの太字＝実測 14.74:1。参照サイトのシールの語彙に合わせる。
   フチは親の drop-shadow がやるので border は持たせない（高さを固定したいため）。
   ★gx.css 479行のスマホ用 `white-space: normal; max-width: 64vw`（詳細度 0,2,1）を
     こちら（0,3,1）で打ち消す。折り返すと箱の高さが変わって上の計算が狂う。
     この案件のラベルは最長6文字（作っている人）＝実測 92.9px なので折り返す必要がない */
.gx-hotspot.is-pinned:not([data-marker="drag"])::after {
  content: attr(data-label);
  display: grid;
  place-items: center;
  box-sizing: border-box;
  height: var(--dyn-plate-h);        /* ★高さを固定＝書体差・FOUT で伸びない */
  max-width: none;
  padding: var(--dyn-plate-pad);
  border: 0;
  border-radius: 999px;
  background: var(--dyn-cream);
  color: var(--dyn-ink);
  font-family: var(--dyn-text);      /* 和文なので Zen Kaku Gothic New */
  font-weight: 700;
  font-size: var(--dyn-plate-fs);
  line-height: 1;
  letter-spacing: .04em;
  white-space: nowrap;
  text-align: center;
}

/* ── 触れたとき ─────────────────────────────────────────
   ★シールの黄色は変えない（黒×黄 11.01:1 を手放さない）。
     返しは「少し大きくなる」＋「札がチェリー赤に反転する」の2つ。
     札の白文字×チェリー＝実測 5.01:1 で AA を通る。
     クリーム文字だと 4.12:1 で落ちるので使わない */
.gx-hotspot.is-pinned:not([data-marker="drag"]):hover::before,
.gx-hotspot.is-pinned:not([data-marker="drag"]):focus-visible::before { scale: calc(var(--dyn-badge-k) * 1.1); }
.gx-hotspot.is-pinned:not([data-marker="drag"]):hover::after,
.gx-hotspot.is-pinned:not([data-marker="drag"]):focus-visible::after {
  background: var(--dyn-cherry);
  color: #FFFFFF;
}

/* ── 見つけ済み ────────────────────────────────────────
   ★★ここが検分の最重要指摘の直し。
   gx.css 298行 `html.is-overview .gx-hotspot.is-pinned { opacity: 0 }` は詳細度 (0,3,0)。
   dynamo.css は gx.css より後に読まれるので、(0,3,0) 以上の opacity をここに書くと
   **全体像を見ているあいだも済んだ印が画面に貼り付いたまま残る**。
   だから `html:not(.is-overview)` で囲って、全体像のときは自分から降りる。
   実測：通常 opacity 1 → is-overview で 0 → 外すと 1 に戻る。 */
html:not(.is-overview) .gx-hotspot.is-pinned.is-found { opacity: 1; }

/* 薄くして見失わせるのではなく、**色の彩度を抜いて少し縮める**。
   インク × #DCD3BC ＝ 実測 12.01:1。明るい店内でも読める */
.gx-hotspot.is-pinned.is-found:not([data-marker="drag"]) { --dyn-badge-k: .82; }
.gx-hotspot.is-pinned.is-found:not([data-marker="drag"])::before {
  content: "\6E08";                  /* 「済」。番号は役目を終えたので置き換える */
  background: #DCD3BC;
  font-family: var(--dyn-text);      /* 和文なので Bebas から戻す */
  font-weight: 700;
  font-size: calc(var(--dyn-badge) * .34);
}
.gx-hotspot.is-pinned.is-found:not([data-marker="drag"])::after { background: #DCD3BC; }

/* なぞる課題も同じ扱いにする（gx.css の opacity:.5 のままだと半透明で読めない） */
/* 注ぐ帯の色は常に --q の進捗で決める。過去のis-foundもゲージを上書きしない。 */

/* ── なぞる課題（「注ぐ」）は横長の帯のまま、言葉づかいだけ揃える ──
   丸いシールでは「横に引く」が伝わらないので形は変えない。
   黒フチと札はシールと同じにして、同じ店の部品に見せる */
.gx-hotspot.is-pinned[data-marker="drag"] {
  --dyn-rim: 2.5px;
  box-shadow: none;
  animation: none;
  filter:
    drop-shadow(var(--dyn-rim) 0 0 var(--dyn-ink))
    drop-shadow(calc(var(--dyn-rim) * -1) 0 0 var(--dyn-ink))
    drop-shadow(0 var(--dyn-rim) 0 var(--dyn-ink))
    drop-shadow(0 calc(var(--dyn-rim) * -1) 0 var(--dyn-ink))
    drop-shadow(0 5px 13px rgba(0, 0, 0, .5));
}
.gx-hotspot.is-pinned[data-marker="drag"]::before {
  border: 0;
  animation: none;                   /* gx-swipe は inset 影の往復。フチと喧嘩するので止める */
  background: linear-gradient(90deg, /* --q は tasks/drag.js が書く溜まり具合 */
    var(--dyn-yellow) calc(var(--q, 0) * 100%),
    var(--dyn-cream) calc(var(--q, 0) * 100%));
}
.gx-hotspot.is-pinned[data-marker="drag"]::after {
  display: grid;
  place-items: center;
  height: 28px;
  padding: 0 10px;
  border: 0;
  border-radius: 999px;
  background: var(--dyn-cream);
  color: var(--dyn-ink);
  font-family: var(--dyn-text);
  font-weight: 700;
  font-size: 13px;
  line-height: 1;
  letter-spacing: .04em;
}

/* ── 狭い画面／背の低い画面 ──────────────────────────────
   ★寸法は当てずっぽうではなく、gx-marker.js の縦の最小間隔から逆算した。
     MINY = max(96, min(w,h) * 0.18)。--ms は実測で 1.15 固定。
     よって「箱の高さ × 1.15 ≦ MINY」が破れなければ、印どうしは重ならない。

     ここ（コンパクト）：48 + 3 + 0 + 3 + 24 = 78px
       → 78 × 1.15 = 89.7px ≦ 96（390x844 実測の MINY）。余裕 6.3px
     広い画面：74 + 6 + 0 + 6 + 28 = 114px
       → 114 × 1.15 = 131.1px ≦ 162（1440x900 実測の MINY）。余裕 30.9px

   ★「+ 0 +」が2回入っているのは誤記ではない。ボタン自身の文字（font-size:0）が
     無名のフレックス要素として残るので、縦に並ぶのは3つ＝**すきまは2つ**。
     ここを1つで数えると4px ぶん見積りを外す（最初そう外して実測で気づいた）。

   ★高さ 820px でも切り替えるのは、MINY が min(w,h) で決まるから。
     幅が広くても背が低いノート（1280x800 等）では MINY が縮むので、
     そこは小さい寸法に落とす。 */
@media (max-width: 900px), (max-height: 820px) {
  .gx-hotspot.is-pinned:not([data-marker="drag"]) {
    --dyn-badge-base: 48px;          /* 画面上は 48 × 1.15 ＝ 55px。指で押すには十分 */
    --dyn-rim: 2px;
    --dyn-plate-h: 24px;
    --dyn-plate-fs: 12px;
    --dyn-plate-pad: 0 17px;
    gap: 3px;
  }
  .gx-hotspot.is-pinned[data-marker="drag"] { --dyn-rim: 2px; }
  .gx-hotspot.is-pinned[data-marker="drag"]::after { height: 24px; font-size: 12px; padding: 0 9px; }
}

/* ── 動きを減らす設定への逃げ道 ────────────────────────
   ★この印は**そもそも常時動くものを1つも持っていない**（回る文字も波紋も脈も捨てた）。
     実測で animation-name は 本体・::before・::after ぜんたい none。
     だから gx.css 441行の `* { animation: none !important }` が効いても、
     絵は1ミリも変わらない＝「止まったら消えていた」が起きようがない。
     残る動きは触れたときの拡大だけなので、それを控えめにして止める */
@media (prefers-reduced-motion: reduce) {
  .gx-hotspot.is-pinned:not([data-marker="drag"])::before {
    animation: none;
    transition: none;
    rotate: -3deg;                   /* 傾きは「静止した最終状態」として残す */
    scale: var(--dyn-badge-k);
  }
  .gx-hotspot.is-pinned:not([data-marker="drag"]):hover::before,
  .gx-hotspot.is-pinned:not([data-marker="drag"]):focus-visible::before { scale: calc(var(--dyn-badge-k) * 1.06); }
}


/* ==========================================================
   ポップUI改修 2026-08-31 ── popup
   ========================================================== */
/* ============================================================
   「くわしく」の窓 ＝ ポップなカード（第2版・検分の指摘を全部つぶした版）
   ------------------------------------------------------------
   ・gx-modal.js は触らない。あちらが作る DOM
       dialog.gx-modal ＞ .gx-modal__head（.gx-modal__title ＋ .gx-modal__close）
                        ＞ .gx-modal__body
     の「見た目」だけを、この案件側の上書きで作り替える。
   ・大きさは2種類。
       ①「くわしく」＝画面中央の大きいカード（html.gx-doc-big のとき・641px以上）
       ②「見つけたときの語り」＝これまで通り右下（スマホは下）の小さい窓
     ②はホットスポットを押した直後に必ず開く窓なので、**外形を1pxも変えない**。
     皮（赤・市松・丸い×・太い見出し）だけ両方に着せて、幾何は①だけ変える。
   ・dialog は閉じている間 UA の display:none が効く。display:flex は必ず [open] 限定。

   ★実測しなおしたコントラスト比（自分で相対輝度から再計算）
       白 #FFFFFF      L=1.00000
       クリーム #F2E8D5 L=0.81395
       黄 #F5C531      L=0.59567
       ターコイズ #2FBFB0 L=0.41001
       チェリー赤 #D8232A L=0.15968
       ink #16171B     L=0.00862
     白×赤 = 5.01 ／ クリーム×赤 = 4.12 ／ 白×ターコイズ = 2.28
     ink×ターコイズ = 7.85 ／ ink×黄 = 11.01 ／ ink×クリーム = 14.74
     ※前回「黄×ink＝12.5」と書いたのは誤り。正しくは 11.01。要件（3:1）は満たすが数字を直した。
   ============================================================ */

.gx-modal {
  /* 角丸・強い赤・はっきりした縁。上品に落とさず、塗りで押し切る */
  --dyn-doc-r: 26px;     /* 角丸 */
  --dyn-check: 30px;     /* 左の市松帯の幅 */
  border: 0;
  border-radius: var(--dyn-doc-r);
  background: var(--dyn-cherry);
  color: #FFFFFF;
  /* 縁は ink の太い輪＋深い影。赤い面が背景に溶けないようにする */
  box-shadow: 0 0 0 4px var(--dyn-ink), 0 26px 64px rgba(0, 0, 0, .58);
  /* カード自身は転がさない（転がすと左の市松帯と丸い×が一緒に流れる）。
     転がすのは本文だけ。だから overflow は visible に戻す */
  overflow: visible;
  padding: 22px 24px 24px calc(var(--dyn-check) + 22px);
}
/* 開いているときだけ縦積みの箱にする（閉じた dialog を出さないための [open]） */
.gx-modal[open] { display: flex; flex-direction: column; }

/* ── 左端の市松（チェッカーフラッグ）の帯 ──────────────────
   画像は使えないので repeating-conic-gradient で作る。
   角丸のカードから食み出さないよう、帯の左側だけ同じ半径で丸める。
   position:absolute なので display:flex の子（フレックスアイテム）にはならない */
.gx-modal::before {
  content: "";
  position: absolute; left: 0; top: 0; bottom: 0;
  width: var(--dyn-check);
  border-radius: var(--dyn-doc-r) 0 0 var(--dyn-doc-r);
  background-color: var(--dyn-cream);            /* 古い環境でも帯は白く残る */
  background-image: repeating-conic-gradient(var(--dyn-cream) 0% 25%, var(--dyn-ink) 0% 50%);
  background-size: var(--dyn-check) var(--dyn-check);
  box-shadow: inset -2px 0 0 rgba(22, 23, 27, .55);
  pointer-events: none;                          /* 飾りなので押しを吸わせない */
}

/* ── 右上の丸い× ───────────────────────────────────────
   ★色の判断：参照サイトは「白い×」だが、白×ターコイズは実測 2.28:1 で
     アイコンの 3:1 に届かない。丸はターコイズのまま、×だけ ink にして 7.85:1 にした。
     クリーム4pxの輪でカード面から丸を切り離す（クリーム×赤＝4.12:1 ＞ 3:1）。
   ★【検分の指摘：外へ出した× が誰も知らない当たり判定を増やす】への直し
     既定では**カードの内側**（top:10px right:10px）に置く。
     カードの外へ食み出させるのは、中央に浮く大きいカード（html.gx-doc-big・641px以上）
     のときだけ。小さい窓＝qa_play が開いたまま次の当たり判定を測る窓の外形は、
     1px も増やさない。 */
.gx-modal__close {
  position: absolute; top: 10px; right: 10px;
  width: 54px; height: 54px;
  margin: 0; flex: none; padding: 0;
  display: grid; place-items: center;
  border: 4px solid var(--dyn-cream);
  border-radius: 50%;
  background: var(--dyn-turq);
  color: var(--dyn-ink);                          /* ink×ターコイズ＝7.85:1 */
  font-family: var(--dyn-text);
  font-size: 26px; font-weight: 700; line-height: 1;
  box-shadow: 0 6px 18px rgba(0, 0, 0, .45);
  cursor: pointer;
  transition: transform .18s cubic-bezier(.2,.7,.3,1), background-color .18s ease;
}
.gx-modal__close:hover,
.gx-modal__close:focus-visible {
  background: var(--dyn-yellow);                  /* ink×黄＝11.01:1（前回12.5と書いたのは誤り） */
  color: var(--dyn-ink);
  transform: rotate(90deg) scale(1.06);
}
.gx-modal__close:focus-visible { outline: 3px solid var(--dyn-cream); outline-offset: 3px; }

/* ── 見出しまわり ────────────────────────────────────────
   ×を absolute にしたので、head は素直な縦積みでよい。
   ★padding-right 52px の根拠（実測計算）：
     PC は カード右padding 24px・×は右から 10+54=64px ⇒ 必要 40px
     SP は カード右padding 18px・×は右から 10+50=60px ⇒ 必要 42px  → 52px で両方まかなう
   ★min-height 44px の根拠【検分の指摘：head が高さ0になると × が本文に乗る】
     gx-modal.js:43 は title が空だと titleEl.hidden = true にする。head が高さ0になると、
     本文1行目の右端に丸い×が乗る。min-height を入れると
     本文の上端＝22(上padding)+44+14(margin)＝80px となり、×の下端 64px を必ず下回らない。 */
.gx-modal__head {
  display: block;
  flex: none;
  min-height: 44px;
  padding-right: 52px;
}

/* 英字の大見出しは CSS の content で出す（DOM に新しい文字要素を足さない＝
   qa_play の h1,h2,h3,p,li 重なり検査に当事者を増やさない）。
   どの窓かは <html> のクラスで決める。クリーム×赤＝4.12:1（大きい文字の 3:1 を満たす） */
html.gx-doc-big .gx-modal__head::before {
  content: "DYNAMO";
  display: block;
  font-family: var(--dyn-disp);
  font-size: clamp(30px, 4.6vw, 54px);
  line-height: .94;
  letter-spacing: .02em;
  color: var(--dyn-cream);
  text-transform: uppercase;
}
html.gx-doc-big.doc-stand   .gx-modal__head::before { content: "THE STAND"; }
html.gx-doc-big.doc-garage  .gx-modal__head::before { content: "THE GARAGE"; }
html.gx-doc-big.doc-closing .gx-modal__head::before { content: "THE POUR"; }

/* ── 見出しの文字（gx-modal.js が入れる title） ──────────────
   ★【検分の指摘：一番見られる面がポップになっていない】への直し
     極太の英字見出しは「くわしく」の大きいカードにしか出ない。だが利用者が
     何度も見るのは**見つけたときの語り（小さい窓）**のほう。そこが 1rem の和文のままでは
     「見づらい／押すところと読むところが一目で」に効かない。
     そこで title 自体を、両方の窓で 20〜26px の太字に上げる。
     和文は var(--dyn-disp) の中で Bebas/Barlow を素通りして Zen Kaku Gothic New に落ちるので、
     太いゴシックで組まれる。
   ★色は白（白×赤＝5.01:1）。クリーム（4.12:1）だと 20px のときに
     「大きい文字」の 3:1 判定に頼ることになるので、どの大きさでも通る白にした。
   ★display は書かない。空タイトルのとき gx-modal.js が付ける [hidden] を殺さないため */
.gx-modal__title {
  margin: 0;
  font-family: var(--dyn-disp);
  font-weight: 700;
  font-size: clamp(20px, 3.2vw, 26px);
  line-height: 1.28;
  letter-spacing: .04em;
  color: #FFFFFF;
}
/* 大きいカードでは英字見出しが上に来るので、その下に少しだけ間を空ける */
html.gx-doc-big .gx-modal__title { margin-top: .34em; }

/* ── 本文 ───────────────────────────────────────────────
   白の太めの字。赤地に白＝5.01:1（クリームだと 4.12:1 で本文の 4.5:1 に届かない）。
   行長が伸びないよう max-width を効かせる */
.gx-modal__body {
  flex: 0 1 auto; min-height: 0;                 /* flex の中で本文だけ転がすために必要 */
  overflow-y: auto;
  overscroll-behavior: contain;                  /* 窓の中の勢いをページに流さない */
  margin-top: 14px; padding-top: 14px;
  border-top: 3px solid rgba(242, 232, 213, .38);
  /* 黄色い細いスクロールバー */
  scrollbar-width: thin;
  scrollbar-color: var(--dyn-yellow) rgba(22, 23, 27, .28);
}
.gx-modal__body::-webkit-scrollbar { width: 8px; }
.gx-modal__body::-webkit-scrollbar-track { background: rgba(22, 23, 27, .28); border-radius: 999px; }
.gx-modal__body::-webkit-scrollbar-thumb { background: var(--dyn-yellow); border-radius: 999px; }
.gx-modal__body p {
  margin: 0 0 .9em;
  max-width: 34em;
  color: #FFFFFF;
  font-weight: 500;
  font-size: clamp(.95rem, 1.5vw, 1.02rem);
  line-height: 1.95;
}
.gx-modal__body p:last-child { margin-bottom: 0; }

/* 閉じ方を窓自身に書いておく（中央に出す以上、閉じやすさは言葉でも担保する）。
   これも content なので DOM の文字要素は増えない。白×赤＝5.01:1 */
html.gx-doc-big .gx-modal__body::after {
  content: "外を押すと閉じます";
  display: block; margin-top: 18px; padding-top: 12px;
  border-top: 2px dashed rgba(242, 232, 213, .42);
  font-size: .78rem; letter-spacing: .06em; color: #FFFFFF;
}

/* ── ①「くわしく」＝画面中央の大きいカード（広い画面だけ） ──
   狭い画面は gx.css の「下から出る帯」のままにする（親指が届く） */
@media (min-width: 641px) {
  html.gx-doc-big .gx-modal {
    inset: 50% auto auto 50%;
    width: clamp(420px, 66vw, 900px);
    max-width: calc(100vw - 56px);               /* 横スクロールを出さない */
    max-height: min(76svh, 660px);
    --dyn-doc-r: 30px;
    transform: translate(-50%, -46%) scale(.97);
  }
  /* .gx-modal.is-in{transform:none} より強く当てて、中央に置き直す */
  html.gx-doc-big .gx-modal.is-in { transform: translate(-50%, -50%) scale(1); }
  /* 角に半分かける丸い×は、中央に浮く大きいカードのときだけ。
     小さい窓の外形は増やさない（＝当たり判定の事故を作らない） */
  html.gx-doc-big .gx-modal__close { top: -16px; right: -16px; }
}

/* ── ②狭い画面：下から出る帯のまま。市松と丸い×は残す ────── */
@media (max-width: 640px) {
  .gx-modal {
    --dyn-doc-r: 24px;
    --dyn-check: 22px;
    border-radius: var(--dyn-doc-r) var(--dyn-doc-r) 0 0;
    padding: 20px 18px 20px calc(var(--dyn-check) + 16px);
    box-shadow: 0 0 0 3px var(--dyn-ink), 0 -14px 44px rgba(0, 0, 0, .55);
  }
  .gx-modal::before { border-radius: var(--dyn-doc-r) 0 0 0; }
  /* スマホは常にカードの内側。画面外へ食み出させない（横スクロールを出さない） */
  .gx-modal__close { top: 10px; right: 10px; width: 50px; height: 50px; }
  html.gx-doc-big .gx-modal { max-height: 58svh; }
  html.gx-doc-big .gx-modal__head::before { font-size: clamp(26px, 8vw, 38px); }
}

/* ── 「くわしく」ボタン自身をポップにする ─────────────────
   ★【検分の指摘：この派手なカードを開くボタンが置き去り】への直し
     gx.css:64 は「色 var(--gx-sub) ／ .82rem ／ 下線」。
     ページ上でいちばん地味な要素が、いちばん派手な窓を開いていた。
     黄地＋ink文字の小さなピルにする。ink×黄＝11.01:1、ホバーは ink×クリーム＝14.74:1。
     ink 3px の縁があるので、背後の3Dが何色でも輪郭は消えない（非文字の 3:1 は縁で担保）。
   ★ min-height:44px は gx.css から引き継ぐが、明示もしておく（指の当たりを削らない）。
   ★ display には触らない。`html:not(.has-3d) .gx-more{display:none}` と
     `.is-tour .gx-more{display:none}`（＝三段縮退の下2段では出さない）をそのまま生かす。 */
.has-3d .gx-more {
  min-height: 44px;
  padding: 11px 22px;
  border: 3px solid var(--dyn-ink);
  border-radius: 999px;
  background: var(--dyn-yellow);
  color: var(--dyn-ink);
  font-family: var(--dyn-disp);
  font-size: 1rem;
  letter-spacing: .12em;
  text-decoration: none;
  box-shadow: 0 5px 0 rgba(22, 23, 27, .62), 0 12px 26px rgba(0, 0, 0, .38);
  transition: transform .14s cubic-bezier(.2,.7,.3,1),
              background-color .14s ease, box-shadow .14s ease;
}
.has-3d .gx-more:hover,
.has-3d .gx-more:focus-visible {
  background: var(--dyn-cream);                  /* ink×クリーム＝14.74:1 */
  color: var(--dyn-ink);
  transform: translateY(-2px);
  box-shadow: 0 7px 0 rgba(22, 23, 27, .62), 0 16px 30px rgba(0, 0, 0, .42);
}
.has-3d .gx-more:active {
  transform: translateY(3px);
  box-shadow: 0 2px 0 rgba(22, 23, 27, .62), 0 8px 18px rgba(0, 0, 0, .34);
}
.has-3d .gx-more:focus-visible { outline: 3px solid var(--dyn-cream); outline-offset: 3px; }

/* ── 背後を暗く落とす膜 ────────────────────────────────
   ★ pointer-events:none は必須。elementFromPoint は pointer-events:none を透かすので、
     膜を敷いても qa_play の当たり判定（ボタン自身が返るか）を奪わない。
     閉じるのは gx-modal.js の「外側 pointerdown で close」に任せる（膜は押しを受けない）。
   ★【検分の指摘：グラデーションが逆向き】への直し
     前回は中心 .46／縁 .74 で、赤いカードが載る中心がいちばん明るかった。
     中心 .70／縁 .50 にひっくり返して、カードが載る面をいちばん深く落とす。 */
.dyn-scrim {
  position: fixed; inset: 0; z-index: 55;        /* 窓(60)の下・印(20)の上 */
  pointer-events: none;
  opacity: 0;
  background: radial-gradient(120% 90% at 50% 50%, rgba(8, 6, 10, .70), rgba(8, 6, 10, .50));
  transition: opacity .35s ease;
}
.dyn-scrim.is-on { opacity: 1; }
html.no-3d .dyn-scrim, html.is-tour .dyn-scrim { display: none; }

/* ★【検分の指摘：膜が全体像モードで残って画面が真っ黒になる】への直し（1行目の直し）
   gx.css:295-297 は `html.is-overview .gx-shell, .gx-hud, .gx-modal{opacity:0}` で
   窓だけ伏せる。膜はその一覧に入っていなかった。マウスならロゴの pointerdown を
   gx-modal.js:86 の capture が拾って閉じてくれるが、gx-core.js:60 のロゴは **click** 購読なので、
   キーボード（Tab→Enter）では pointerdown が発火せず、カードだけ消えて
   74%の黒膜が「絵だけ見せる」全体像の上に残る。
   ここでは膜を伏せ、JS側（gx:overview で closeDoc）で状態そのものも畳む。二重に塞ぐ。 */
html.is-overview .dyn-scrim { opacity: 0; }

/* ★【検分の指摘：ロゴが膜の下に沈んでコントラストの実測値が無効になる】への直し
   .gx-logo は gx.css:264 で z-index:35、膜は 55。つまりロゴは膜の下に沈んでいた。
   dynamo.css:62-70 は「明るい部屋で .48 だと 4.45 でAAに届かない ⇒ 実測して .62 まで濃くした」
   という経緯で座布団の濃さを決めている。その上に .50〜.70 の黒を重ねると、
   カードを開いている間だけその判断が無効になる。
   ⇒ ロゴを膜の上へ逃がす。座布団 rgba(12,12,14,.62) が背景に対してそのまま効くので、
     実測して確保した比がカードを開いても変わらない。 */
html.gx-doc-big .gx-logo { z-index: 56; }

/* ── 大きいカードが出ている間、その下の見出し・一行を伏せる ──
   ★ visibility:hidden にするのが肝。qa_play.py:38 の checkVisibility は
     { opacityProperty:true, visibilityProperty:true } で呼ばれるので、visibility:hidden は
     「見えていない＝重なりの当事者ではない」と正しく扱われる。opacity だけだと
     0 以外は見えている扱いになる（gx.css の .gx-openline に同じ理由の但し書きがある）。
   ★【検分の指摘：p.gx-actions を伏せておらず、伏せない理由づけが誤っている】への直し
     前回は「.gx-actions を伏せると印まで消える」と書いたが、これは誤り。
     visibility は継承するので、p を hidden にして子の印だけ visible に戻せる。
     いま FAIL しないのは qa_play.py:90/114 が `[data-hotspot]` しか押さず
     `.gx-more` を一度も押さない＝**検査が見ていないだけ**で、レイアウトが正しいのではない。
     1512x900 で中央カード（x306–1206・y約310–590）と p.gx-actions（x216–856・y約460–520）は
     重なり比 0.8 超＝15%ルールに当たる。ここで伏せる。
   ★ 印（.gx-hotspot）は visible に戻す。visibility:visible の子は当たり判定も残るので、
     elementFromPoint はこれまで通りボタン自身を返す。
     gx-marker.js:40 の readBlockers は既定の checkVisibility()（display だけを見る）なので、
     印の置き場所の計算も一切変わらない。
   ★ 読み物（data-reading）は対象外。あちらに「くわしく」は無い。 */
html.gx-doc-big .gx-station:not([data-reading]) .gx-station__inner > .gx-meta,
html.gx-doc-big .gx-station:not([data-reading]) .gx-station__inner > h2,
html.gx-doc-big .gx-station:not([data-reading]) .gx-station__inner > .gx-sub,
html.gx-doc-big .gx-station:not([data-reading]) .gx-station__inner > .gx-actions { visibility: hidden; }
html.gx-doc-big .gx-station:not([data-reading]) .gx-station__inner > .gx-actions .gx-hotspot { visibility: visible; }
html.gx-doc-big .gx-station:not([data-reading]) .gx-station__inner::before { opacity: 0; }

/* ★【検分の指摘：aria-live を visibility で止めている】への直し
   前回は html.gx-doc-big .dyn-count{visibility:hidden} を入れていたが、
   .dyn-count は index.html:113 で aria-live="polite"。visibility で伏せると読み上げも止まる。
   しかも伏せる理由（重なり検査）はカウンタには当てはまらない：
   右上固定（top16/right16・高さ約28px）で、PCの中央カード（y310–590）とも
   スマホの下敷き（58svh ⇒ 上端 y≈354）とも 15% どころか 1px も重ならない。
   ⇒ 伏せない。z-index 60 で膜(55)の上に残るので、暗くもならない。 */

/* 狭い画面：大きいカードは 58svh 出るので、本文をその分だけ上へ逃がす
   （dynamo.css:217-220 の既存 52svh 規則の、gx-doc-big 版）
   ★【検分の指摘：641–700px の帯で2つの規則が同時に当たる】への直し
     中央カードは min-width:641px、この下余白は max-width:700px だった。
     700px 幅のタブレットでは「中央に浮くカード」なのに全 .gx-station に 66svh の下余白が付き、
     開いている間だけページが3画面分ほど伸びて空白だらけになる。
     下敷き（bottom sheet）が出るのは 640px 以下なので、こちらも 640px に揃える。 */
@media (max-width: 640px) {
  html.gx-doc-big .gx-station { padding-bottom: 66svh; }
}

/* ── 動きの逃げ道 ─────────────────────────────────────
   ★【検分の指摘：reduce の分岐は実質デッドコード】への直し（コメントの直し）
     **本当の逃げ道は reduce ブロックではなく no-3d のほう**。
     gx-tier.js:8 が prefers-reduced-motion を見て TIER=0 にし、gx-core.js:37 が staticMode() で
     html に no-3d を付ける。no-3d では gx.css:72 が .gx-more を display:none にし、
     gx-modal.js:20 の usable() も false を返すので、この窓自体が一度も開かない。
     本文は .gx-docs がそのまま版面に並ぶ（gx.css:304）。それが縮退の姿。
     下のブロックは「読み込み後に OS 設定を切り替えた」等で TIER 判定と食い違ったときの
     置き去り防止＝保険であって、reduced-motion 対応の本体ではない。
     gx.css:441 が全アニメと transition を !important で止めるので、
     ここでは transform の**着地点**だけを明示する（書かないと中央のカードが 50% ずれる）。 */
@media (prefers-reduced-motion: reduce) {
  .dyn-scrim { transition: none; }
  .gx-modal__close:hover, .gx-modal__close:focus-visible { transform: none; }
  .has-3d .gx-more:hover, .has-3d .gx-more:focus-visible, .has-3d .gx-more:active { transform: none; }
}
@media (prefers-reduced-motion: reduce) and (min-width: 641px) {
  html.gx-doc-big .gx-modal,
  html.gx-doc-big .gx-modal.is-in { transform: translate(-50%, -50%); }
}


/* ==========================================================
   ポップUI改修 2026-08-31 ── reading
   ========================================================== */
/* ============================================================
   読み物カード（#about ＝ .gx-station[data-reading]）— 第2稿
   ------------------------------------------------------------
   直す理由：
   この節だけは「普通に読めるページ」として常時出しているのに、
   背後の3D（固定レイヤー）が明るい店内の絵なので、白い本文が
   赤い天井や市松の床に素で乗って読めなくなっていた。
   gx.css の .has-3d .gx-station__inner::before（楕円のベール）は
   見出し1行＋一文のための道具で、この長さの読み物には全く足りない。

   直し方：
   ベールをやめて、クリーム地の紙を1枚置く。
   太い縁（インクの黒）・角丸・チェリーのベタ影・上端の三色帯で、
   硬い縁と原色でまとめる。
   紙は不透明なので、3Dがどんな絵でも・見るだけモードでも・no-3d でも
   同じ読みやすさになる（＝縮退で破綻しない）。

   【入れる場所】assets/css/dynamo.css の末尾。
     ただし「末尾でないと勝てない」わけではない。
     ここで使うセレクタは全部 .gx-station[data-reading] で囲ってあり、
     詳細度 (0,3,1) 対 既存 .dyn-read h3 の (0,1,1) なので、順序に関係なく勝つ。
     末尾に置くのは、この節の変更が1か所にまとまって読めるからというだけの理由。
     （第1稿で「同じ詳細度だから末尾必須」と書いたのは誤り。数え直して訂正した）

   【コントラスト比（自分で計算した値・小数第2位）】
     h2   #16171B on #F2E8D5 …… 14.74 : 1
     h3   #B31C22 on #F2E8D5 ……  5.56 : 1（19.2px/700。小文字基準4.5も素で満たす）
     本文 #16171B on #F2E8D5 …… 14.74 : 1
     strong #16171B on マーカー合成色 rgb(244,210,111) …… 12.21 : 1
       （マーカー線より上の部分は地がクリームなので 14.74。低い方を申告値にした）
     札  #FFF8EE on #D8232A ……  4.75 : 1
     英字小見出し #12655C on #F2E8D5 …… 5.68 : 1
   ============================================================ */

/* --- 節そのもの --------------------------------------------
   align-items の上書きは第2稿で削除した。
   .gx-station は min-height:100svh（height ではない）で、読み物の中身は
   100svh よりずっと背が高い。容器が中身に合わせて伸びるので、交差軸の揃え
   （center / flex-end）は見た目に一切影響しない。効かない指定のために
   gx.css の並び方と結合を作っていた（第1稿の危険5）ので、丸ごと外す。 */
.gx-station[data-reading] {
  scroll-margin-top: 8svh;          /* #about へ飛んだとき見出しが上の帯に潜らない */
  --dyn-cherry-ink: #B31C22;        /* 文字用の濃いチェリー。地の色は明るい方(--dyn-cherry)のまま */
}

/* 3Dの上に敷いていた楕円のベールは、紙を置くのでもう要らない。
   残すと紙の四隅の外側だけ暗くにじんで、縁の直線がぼやける。
   詳細度 (0,3,1) で .has-3d .gx-station__inner::before (0,2,1) に勝つ。
   他の4つのステーションのベールは今までどおり効く。 */
.gx-station[data-reading] .gx-station__inner::before {
  display: none;
}

/* --- 紙（カード本体）--------------------------------------- */
.gx-station[data-reading] .dyn-read {
  position: relative;               /* no-3d では .has-3d の position 指定が効かないので自前で持つ。
                                       z-index は付けない＝押す印（.gx-hotspot.is-pinned は z-index:20）が
                                       必ず紙より上に描かれる＝elementFromPoint の検査を壊さない */
  max-width: 42rem;                 /* margin:0 auto は gx.css 側（.gx-station__inner）が持っている */
  padding: clamp(26px, 4.2vw, 44px) clamp(20px, 3.6vw, 40px) clamp(30px, 4.6vw, 48px);

  /* 地はクリーム、文字は濃いインク。可読性の本体はここ */
  background-color: var(--dyn-cream);
  color: var(--dyn-ink);

  /* 上端の三色帯（チェリー／イエロー／ターコイズ）＝ダイナーの看板の帯。
     background-origin を border-box にして、帯を縁の下までくぐらせる。
     既定の padding-box だと帯が3px内側から始まって「額の中の線」に見えるため。
     13px のうち上3pxは縁に隠れ、見えるのはちょうど10px。
     背景画像なので版面を1pxも動かさない＝文字の重なり検査に影響しない */
  background-image: linear-gradient(
    90deg,
    var(--dyn-cherry) 0 34%,
    var(--dyn-yellow) 34% 62%,
    var(--dyn-turq)   62% 100%
  );
  background-repeat: no-repeat;
  background-origin: border-box;
  background-size: 100% 13px;
  background-position: 0 0;

  border: 3px solid var(--dyn-ink); /* 太い縁。「紙が置いてある」の輪郭 */
  border-radius: 18px;

  /* チェリーのベタ影＋暗い落ち影。ベタ影がポップさ、暗い影が3Dからの分離を作る。
     box-shadow は版面を広げず、はみ出しても横スクロールを作らない
     （加えて gx.css で html{overflow-x:clip}） */
  box-shadow:
    10px 10px 0 rgba(216, 35, 42, .92),
    0 26px 56px rgba(0, 0, 0, .48);
}

/* --- 目印（DYNAMO SODA STAND について）＝チェリーの札 -------
   Bebas・字間を詰めて、看板の小さいプレートに見せる（ポップさの補強） */
.gx-station[data-reading] .gx-meta {
  display: inline-block;            /* 幅を内容ぶんに詰めて「札」に見せる */
  margin: 0 0 .9em;
  padding: 7px 15px 5px;
  background: var(--dyn-cherry);
  border: 2px solid var(--dyn-ink);
  border-radius: 999px;
  /* クリーム(#F2E8D5)だとチェリー地で 4.12 でAA(4.5)に届かない。
     ほぼ同系の #FFF8EE まで上げると 4.75 で通る（小さい文字なので4.5必須）。
     ここだけブランド変数を使っていないのはこの理由 */
  color: #FFF8EE;
  font-family: var(--dyn-disp);
  font-size: .95rem;
  letter-spacing: .1em;
  line-height: 1.45;
}

/* --- 大見出し ---------------------------------------------- */
.gx-station[data-reading] h2 {
  margin: 0 0 .7em;
  font-family: var(--dyn-text);
  font-weight: 700;
  font-size: clamp(1.55rem, 4.2vw, 2.3rem);   /* 紙の中で効く大きさまで上げた */
  line-height: 1.5;                 /* 詰めすぎない＝行どうしの重なり検査に余裕を残す */
  color: var(--dyn-ink);
}

/* --- 小見出し（店のこと／作り方／…）------------------------
   既存の「黄色＋Bebas」はクリーム地だと読めない（黄がクリームに溶ける）し、
   Bebas は和文グリフを持たないのでどのみち代替書体に落ちていた。
   濃いチェリー＋和文太字＋左のチェリー棒に変える。
   色を --dyn-cherry(#D8232A・対クリーム4.12) ではなく #B31C22（5.56）にしたのは、
   「18.66px以上の太字だから3:1でよい」という免除に頼らず、
   小文字基準の4.5を素で満たすため。和文は大文字扱いの解釈が割れるので、
   免除の上に乗せない方を選んだ。棒と札は明るいチェリーのまま＝見た目のポップさは落とさない */
.gx-station[data-reading] .dyn-read h3 {
  margin: 2em 0 .55em;
  padding-left: .72em;
  border-left: 6px solid var(--dyn-cherry);
  font-family: var(--dyn-text);
  font-weight: 700;
  font-size: clamp(1.2rem, 3vw, 1.42rem);   /* 下限 19.2px。第1稿の 1.16rem(18.56px) から上げた */
  letter-spacing: .02em;
  line-height: 1.55;
  color: var(--dyn-cherry-ink);
}
/* 最初の小見出しだけ、大見出しとの間を空けすぎない */
.gx-station[data-reading] .dyn-read h2 + h3 { margin-top: 1.3em; }

/* 小見出しに英字の小札を添える（ポップさは書体で作る）。
   ::before なので新しい h3/p 要素は増えない＝文字の重なり検査には出てこない。
   index.html 側に data-en を足したときだけ出る。足さなければ何も起きない＝
   CSSだけ入れても壊れない */
.gx-station[data-reading] .dyn-read h3[data-en]::before {
  content: attr(data-en);
  display: block;
  margin-bottom: .3em;
  font-family: var(--dyn-disp);
  font-size: .8rem;
  font-weight: 400;
  letter-spacing: .2em;
  line-height: 1.2;
  color: #12655C;                   /* ターコイズ系の深い色。対クリーム 5.68 */
}

/* --- 本文 -------------------------------------------------- */
.gx-station[data-reading] .dyn-read p {
  max-width: none;                  /* 紙の幅で折り返す（gx.css の .gx-station p{max-width:40em} を解く） */
  margin: 0 0 1.1em;
  font-size: clamp(.95rem, 2.3vw, 1.02rem);
  line-height: 1.95;                /* 行間は詰めない。重なり検査の安全代を残す */
  color: var(--dyn-ink);
}
.gx-station[data-reading] .dyn-read > p:last-child { margin-bottom: 0; }

/* --- 強調（よくある質問の問い）-----------------------------
   既存の .dyn-read strong{color:var(--dyn-cream)} は、いまの暗い地の上では正常に読める。
   読めなくなるのは「クリームの紙を敷く」今回の変更を入れた瞬間で、
   クリーム地にクリーム文字＝文字が消える。つまりこれは既存バグではなく、
   自分の変更が生む副作用。だから同じ変更の中で必ず一緒に潰す。
   インクの太字にして、イエローのマーカー線を敷く。線は背景なので行の高さを変えない */
.gx-station[data-reading] .dyn-read strong {
  color: var(--dyn-ink);
  font-weight: 700;
  background: linear-gradient(transparent 62%, rgba(245, 197, 49, .62) 62%);
}

/* ============================================================
   狭い画面（max-width:700px）
   ・節そのものの padding は触らない。
     gx.css の 12svh / 13svh と dynamo.css:210 の margin-top:6svh をそのまま生かす。
     ここを動かすと最終章クリア後の自動スクロールの着地が変わり、
     qa_play の結果が変わりうる。読みやすさに効かない変更で結果を揺らさない
     （第1稿は 9svh に詰めていた。取り下げ）
   ・左右も 6vw のまま。詰めると紙が画面いっぱいになって3Dが完全に消える
   ・紙の内側の余白と影だけ、狭い画面向けに整える
   ============================================================ */
@media (max-width: 700px) {
  .gx-station[data-reading] .dyn-read {
    padding: 24px 18px 28px;
    border-radius: 14px;
    box-shadow:
      6px 6px 0 rgba(216, 35, 42, .92),
      0 16px 34px rgba(0, 0, 0, .45);
  }
  .gx-station[data-reading] h2 { font-size: clamp(1.3rem, 5.6vw, 1.7rem); }
  /* 19.2px。第1稿の 1.1rem(17.6px) では、免除に頼っても小文字基準に届かなかった */
  .gx-station[data-reading] .dyn-read h3 { font-size: 1.2rem; margin-top: 1.75em; }
  .gx-station[data-reading] .dyn-read h3[data-en]::before { font-size: .74rem; }

  /* 読み物が画面の上端まで来ている間は、右上の「見つけた数」を伏せる。
     .dyn-count は position:fixed(right:16 top:16) の <p> なので、390px幅では
     紙の中の <p> と必ず縦に重なる。重なり検査は h1,h2,h3,p,li を無差別に見るため
     （qa_play.py の OVERLAP_JS）、札の面積比が0.15を超えて即FAILになる。
     opacity:0 は checkVisibility({opacityProperty:true}) が「見えていない」と判定するので
     検査から外れる。display:none にしないのは aria-live の読み上げを殺さないため。
     クラスの付け外しは dyn-extras.js（下のJS）が担当。PCでは重ならないので何もしない */
  .dyn-count.is-hushed { opacity: 0; }
}

/* 伏せる／戻すの効き時間。ここが唯一この部品が持つ「動き」 */
.dyn-count { transition: opacity .3s ease; }

/* ============================================================
   見るだけモード（.is-tour）と WebGL不可（.no-3d）
   背景の絵が無いので、紙が暗い地の上にぽつんと浮く。
   落ち影を弱めて、「暗い紙面に置いた白い紙」に見えるよう整える。
   ※ 可読性そのものは紙が不透明なので、この2モードでも一切変わらない
   ============================================================ */
html.is-tour .gx-station[data-reading] .dyn-read,
html.no-3d  .gx-station[data-reading] .dyn-read {
  box-shadow:
    10px 10px 0 rgba(216, 35, 42, .92),
    0 10px 30px rgba(0, 0, 0, .35);
}
@media (max-width: 700px) {
  html.is-tour .gx-station[data-reading] .dyn-read,
  html.no-3d  .gx-station[data-reading] .dyn-read {
    box-shadow:
      6px 6px 0 rgba(216, 35, 42, .92),
      0 8px 20px rgba(0, 0, 0, .35);
  }
}

/* ============================================================
   動きの逃げ道
   この部品が持つ動きは .dyn-count の opacity 遷移ひとつだけ。それを止める。
   gx.css:441-445 が既に *, *::before, *::after へ !important で同じことを当てているので
   実質は二重の保険だが、「この部品の動きはここで止まる」を1か所で読めるように明示して残す。
   止めても札が「消えたまま／出たまま」で固まることはない（opacity が即時に切り替わるだけ）
   ============================================================ */
@media (prefers-reduced-motion: reduce) {
  .dyn-count { transition: none !important; }
  .gx-station[data-reading] .dyn-read,
  .gx-station[data-reading] .dyn-read * {
    animation: none !important;
    transition: none !important;
  }
}


/* ==========================================================
   ポップUI改修 2026-08-31 ── cursor
   ========================================================== */
/* ══════════════════════════════════════════════════════════════════════════
   カーソル「ポップな矢印」v2（2026-08-31 作り直し）

   【入れる場所】assets/css/dynamo.css の **23〜27行目を削除して、その位置に貼る**。
     .has-3d:not(.is-tour) body { cursor: grab; }
     .has-3d.is-grabbing body { cursor: grabbing; }
     .has-3d .gx-hotspot, .has-3d a, .has-3d button { cursor: pointer; }
   ★末尾に足すのは不可。27行目 `.has-3d .gx-hotspot`(0,2,0) を残すと、
     gx.css:424 `.gx-hotspot:disabled`(0,2,0) と同点になり、dynamo.css が後に読まれる
     ぶん後勝ちして、disabled の印が pointer のままになる。
     ブラウザで実測して確認した（見るだけモードで disabled のホットスポット = pointer）。
     ※2026-09-01 追記：見つけた印はもう disabled にならない（find.js を直した）。
       ここで守るのは「この先の駅」など、本当に押せない部品だけ。

   【なぜ作り直したか】
     前回は「OSの矢印より見やすい」を狙った細い32pxの矢印で、しゃれてはいるが
     参照サイトのポップさが無かった。参照サイトの語彙は
     「原色・太い縁・硬い影」。カーソルもその語彙で描き直す。

   【描き方の決めごと】
     ・40×40（Chromeの上限は128×128）。32pxでは縁を太くすると塗りが痩せる
     ・縁＝クリーム #F2E8D5 を stroke-width:6 ＋ paint-order:'stroke' で
       **外側だけに3px**出す（中心揃えだと矢印の尻尾が縁の色で埋まる）
     ・影＝同じ形をもう1枚 translate(1.8,2.2) して**不透明の墨**で敷く。
       ぼかさない＝硬い影。紙のシールに見せる係
     ・角は stroke-linejoin='round' で少し丸める。矢じりは太く短く
     ・原点（hotspot）は矢印の先端 = 5 4。**画像ピクセル基準**なので
       width/height と viewBox を 40 で揃えてある（ここをずらすと押し位置が全部ずれる）
     ・data URI の # は %23、< > は %3C %3E にエスケープ済み（生の # はCSSを壊す）
     ・SVGに width/height を明記（Firefox は viewBox だけだと描かないことがある）

   【4つの状態を「色」と「形」の両方で分ける（色覚に頼らせない）】
     ふつう（見回す）… 墨の塗り            ＝しるし無し
     つかんでいる    … ターコイズの塗り    ＝右上にターコイズの太い線2本
     押せるものの上  … チェリーの塗り      ＝右上に黄色の極太の星
     押せない        … くすんだ灰の塗り    ＝右上にクリームの横棒（＝もう押せません）

   【var() の使い方について】
     前回の「素のキーワード → var() の2行重ね」は理由づけが誤りだった
     （変数が未定義でも前の宣言には戻らない）。今回は `var(--x, grab)` の
     フォールバック引数1つで書く。これなら変数が無くても必ずキーワードに落ちる。
     ★変数は必ずこの同じファイルの :root に置くこと。
   ══════════════════════════════════════════════════════════════════════════ */

/* ── 1. 既定は素のキーワード ────────────────────────────────
   触る指しか無い端末（スマホ）はここで止まる。
   カーソルが画面に無いので絵を出しても意味が無いが、
   **body は auto ではなく grab のまま**にする。
   マウスを挿したタブレット等（hover:none だが any-hover:hover）で
   「つかめる」合図が消えるのを防ぐため。 */
:root {
  --dyn-cur-look: grab;
  --dyn-cur-grab: grabbing;
  --dyn-cur-pick: pointer;
  --dyn-cur-off:  default;
}

/* ── 2. 指す道具が1つでもある機械だけ、ポップな矢印に差し替える ──
   hover ではなく any-hover を見る。ハイブリッド機（指＋マウス）は
   hover:none と報告することがあるが any-hover:hover なので、ここに入る。
   ＝マウスがある人には必ず出る／指だけの人には出ない、を1本の条件で満たす。 */
@media (any-hover: hover) {
  :root {
    /* ふつう（見回す）：墨の塗り＋クリームの縁＋硬い墨の影 */
    --dyn-cur-look: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='40' height='40' viewBox='0 0 40 40'%3E%3Cpath d='M5 4 L5 26.6 L11.1 20.9 L15.3 30.2 L19.9 28.1 L15.9 19.3 L23.6 19.3 Z' transform='translate(1.8,2.2)' fill='%2316171B' stroke='%2316171B' stroke-width='6' stroke-linejoin='round' paint-order='stroke'/%3E%3Cpath d='M5 4 L5 26.6 L11.1 20.9 L15.3 30.2 L19.9 28.1 L15.9 19.3 L23.6 19.3 Z' fill='%2316171B' stroke='%23F2E8D5' stroke-width='6' stroke-linejoin='round' paint-order='stroke'/%3E%3C/svg%3E") 5 4, grab;

    /* つかんでいる：ターコイズの塗り＋右上に太い線2本（形が変わる） */
    --dyn-cur-grab: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='40' height='40' viewBox='0 0 40 40'%3E%3Cpath d='M5 4 L5 26.6 L11.1 20.9 L15.3 30.2 L19.9 28.1 L15.9 19.3 L23.6 19.3 Z' transform='translate(1.8,2.2)' fill='%2316171B' stroke='%2316171B' stroke-width='6' stroke-linejoin='round' paint-order='stroke'/%3E%3Crect x='25' y='5.4' width='11.5' height='4.4' rx='2.2' fill='%232FBFB0' stroke='%23F2E8D5' stroke-width='2.4' paint-order='stroke'/%3E%3Crect x='28' y='13' width='8.5' height='4.4' rx='2.2' fill='%232FBFB0' stroke='%23F2E8D5' stroke-width='2.4' paint-order='stroke'/%3E%3Cpath d='M5 4 L5 26.6 L11.1 20.9 L15.3 30.2 L19.9 28.1 L15.9 19.3 L23.6 19.3 Z' fill='%232FBFB0' stroke='%23F2E8D5' stroke-width='6' stroke-linejoin='round' paint-order='stroke'/%3E%3C/svg%3E") 5 4, grabbing;

    /* 押せるものの上：チェリーの塗り＋黄色の極太の星（形が変わる） */
    --dyn-cur-pick: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='40' height='40' viewBox='0 0 40 40'%3E%3Cpath d='M5 4 L5 26.6 L11.1 20.9 L15.3 30.2 L19.9 28.1 L15.9 19.3 L23.6 19.3 Z' transform='translate(1.8,2.2)' fill='%2316171B' stroke='%2316171B' stroke-width='6' stroke-linejoin='round' paint-order='stroke'/%3E%3Cpath d='M30 4 C30.7 8.6 31.9 9.8 36.5 10.5 C31.9 11.2 30.7 12.4 30 17 C29.3 12.4 28.1 11.2 23.5 10.5 C28.1 9.8 29.3 8.6 30 4 Z' fill='%23F5C531' stroke='%2316171B' stroke-width='2.4' stroke-linejoin='round' paint-order='stroke'/%3E%3Cpath d='M5 4 L5 26.6 L11.1 20.9 L15.3 30.2 L19.9 28.1 L15.9 19.3 L23.6 19.3 Z' fill='%23D8232A' stroke='%23F2E8D5' stroke-width='6' stroke-linejoin='round' paint-order='stroke'/%3E%3C/svg%3E") 5 4, pointer;

    /* 押せない（見つけ済み・無効）：くすんだ灰＋クリームの横棒（形が変わる）
       ここをOS標準の矢印に落とすと、遊んでいる最中に急に別世界の矢印が出て興ざめする。
       「押せない」も同じ語彙のまま描くほうが、世界が途切れない */
    --dyn-cur-off: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='40' height='40' viewBox='0 0 40 40'%3E%3Cpath d='M5 4 L5 26.6 L11.1 20.9 L15.3 30.2 L19.9 28.1 L15.9 19.3 L23.6 19.3 Z' transform='translate(1.8,2.2)' fill='%2316171B' stroke='%2316171B' stroke-width='6' stroke-linejoin='round' paint-order='stroke'/%3E%3Crect x='25' y='8' width='12' height='4.6' rx='2.3' fill='%23F2E8D5' stroke='%2316171B' stroke-width='2.4' paint-order='stroke'/%3E%3Cpath d='M5 4 L5 26.6 L11.1 20.9 L15.3 30.2 L19.9 28.1 L15.9 19.3 L23.6 19.3 Z' fill='%237A7C84' stroke='%23F2E8D5' stroke-width='6' stroke-linejoin='round' paint-order='stroke'/%3E%3C/svg%3E") 5 4, default;
  }
}

/* ── 3. 動きを減らす設定への逃げ道 ──────────────────────────
   この矢印はアニメーションを持たない（静止画4枚の差し替えだけ）。
   ただし「マウスを動かすたびに形と色が変わる」こと自体を負担に感じる人がいるので、
   OS標準のカーソルへ丸ごと戻す。変数を戻すだけなので !important は要らない。
   ★2 より**後ろ**に置くこと（どちらも :root(0,1,0) で、後に書いたほうが勝つ）。
   ポップな矢印を reduce でも残したいなら、この @media ブロックごと削除すればいい */
@media (prefers-reduced-motion: reduce) {
  :root {
    --dyn-cur-look: grab;
    --dyn-cur-grab: grabbing;
    --dyn-cur-pick: pointer;
    --dyn-cur-off:  default;
  }
}

/* ── 4. 割り当て ──────────────────────────────────────────
   .gx-stage は pointer-events:none なので、見回しのカーソルは body に出す。
   is-tour（見るだけモード）と no-3d には**1つも指定を書かない**。
   遊べない画面で「つかめそうな矢印」を出すのは嘘になるので、
   gx.css の素の pointer / default にそのまま任せる（実測で確認済み）。 */

/* ふつう：見回す */
.has-3d:not(.is-tour) body { cursor: var(--dyn-cur-look, grab); }                       /* (0,2,1) */

/* つかんでいる。is-grabbing は assets/js/worlds/dynamo.js が
   pointerdown/up で html に付け外ししている（160行 add ／182行 remove）。JSの追加は不要 */
html.has-3d.is-grabbing:not(.is-tour) body { cursor: var(--dyn-cur-grab, grabbing); }   /* (0,3,2) */

/* 押せるものの上。.gx-hotspot は button なので button で拾える。
   .gx-hotspot.is-pinned は本体が pointer-events:none で輪(::before)と札(::after)が
   押しを受けるが、疑似要素は親の cursor を継ぐので輪の上でもチェリーになる
   （::before の計算値も実測で確認済み） */
.has-3d:not(.is-tour) a,
.has-3d:not(.is-tour) button { cursor: var(--dyn-cur-pick, pointer); }                  /* (0,2,1) */

/* ドラッグ中は、押せるものの上を通ってもチェリーに化けない。
   （つかんだまま印の上を通ると「押せる」に見えて、指を離すと押されそうで怖い）
   ★:not(:disabled):not([aria-disabled="true"]) が要。これが無いと、
     下の「押せない」より詳細度が高いこの規則が勝ってしまい、
     見つけ済みの瓶の上でも grabbing が出る（前回案の不具合。実測で再現した） */
html.has-3d.is-grabbing:not(.is-tour) a,
html.has-3d.is-grabbing:not(.is-tour) button:not(:disabled):not([aria-disabled="true"]) {
  cursor: var(--dyn-cur-grab, grabbing);                                                /* (0,5,2) */
}

/* 押せない。
   ★2026-09-01 に前提が変わった。find.js は**見つけた印を disabled にしなくなった**
     （一度開いたシールを押し直しても開かないのはバグ、という内田指摘）。
     よって「見つけ済みの印」はここに落ちてこず、pointer のまま＝押せる見た目で正しい。
   この規則が残っているのは、本当に押せない部品（この先の駅・送信中のボタンなど）のため。
   gx.css:424 `.gx-hotspot:disabled`(0,2,0) より重くして、
   かつ**この規則を一番最後に置く**（詳細度と順番の二重で守る） */
html.has-3d:not(.is-tour) button:disabled,
html.has-3d:not(.is-tour) [aria-disabled="true"] { cursor: var(--dyn-cur-off, default); } /* (0,3,2) */


/* ==========================================================
   ポップUI改修 2026-08-31 ── menu
   ========================================================== */
/* ══════════════════════════════════════════════════════════════════
   ポップなハンバーガーメニュー（右上）＋ カウンタの引っ越し ── 第2稿
   ──────────────────────────────────────────────────────────────
   見た目の方針は初稿のまま：黄色ベタ＋太いインクの縁＋硬い影（ぼかさない）、
   開くと黒地＋チェリー縁に反転、パネルはクリームの紙に太い罫。
   直したのは**当たり判定と縮退の契約**。詳しくは各ブロックの★印。

   ★この稿での一番大きい変更
     印（gx-marker）が固定UIをよけられるように、HTML側で
     メニューボタンとカウンタに data-gx-avoid を付けた。
     位置をCSSでずらして逃げるのは**やめた**（画面幅で成否が変わる場当たりになるため）。

   ★色は全部その場で測り直した（sRGB相対輝度・WCAG式）
     黄 #F5C531 × インク #16171B = 11.01
     クリーム #F2E8D5 × インク    = 14.74
     チェリー #D8232A × クリーム  = 4.12（26px＝大きい文字。基準3:1）
     #3A3B42 × クリーム           = 9.17
     カウンタの座布団 rgba(12,12,14,.72) が真っ白なパノラマに乗った最悪ケースで
       クリーム文字 = 6.63 ／ 黄色（全部見つけた状態）= 4.95（どちらもAA 4.5:1を超える）
     ※初稿の .62 は黄色が 3.42 で落ちる。元の .44 に至ってはクリームでも 2.49 で落ちていた。
   ══════════════════════════════════════════════════════════════════ */


/* ── ① カウンタの引っ越し：右上 → 左上（ロゴの真下）─────────────
   なぜ動かすか：右上はこれからメニューが占める。角ひとつに強い操作を1つだけ置く。
   ★不透明にはしない（第2稿で撤回）。
     初稿は background を --dyn-ink のベタにしたが、これだと真下に来た印の
     輪と札が黒い蓋の下に完全に消える。カウンタは pointer-events:none なので
     クリックは通ってしまい＝検品はPASS・人間には何も見えない、という一番たちの悪い型になる。
     ポップさの正体は「縁と影」であって塗りの不透明度ではないので、
     縁を2pxに太らせ、硬い影を足し、地は透ける座布団のまま濃さだけ上げた。
   ★pointer-events:none は絶対に外さない（元の規則が生きている。ここでは上書きしない）。 */
.dyn-count {
  /* ロゴの下端（16 + 1 + 7 + 38 + 6 + 1 = 69px）から7px空けた76px */
  top: 76px;
  left: 16px;
  right: auto;

  padding: 6px 13px 5px;
  border: 2px solid rgba(242, 232, 213, .55);  /* 座布団に対して 7.23。太くして輪郭を出す */
  border-radius: 999px;
  background: rgba(12, 12, 14, .72);           /* 透ける。白いパノラマ上でクリーム 6.63 */
  backdrop-filter: blur(6px);
  color: var(--dyn-cream);
  font-size: 14px;
  line-height: 1.25;            /* body の 1.9 だと縦40px超の座布団になる。印を押しのける面積を小さく保つ */
  letter-spacing: .14em;
  box-shadow: 3px 3px 0 rgba(22, 23, 27, .55); /* ← ここがポップの芯。ぼかさない */
}
/* 全部見つけたら黄色に反転（座布団の上で 4.95） */
.dyn-count.is-full {
  border-color: var(--dyn-yellow);
  color: var(--dyn-yellow);
}
@media (max-width: 700px) {
  .dyn-count { top: 76px; left: 12px; font-size: 13px; }
}
/* 幕が上がるまでは出さない。幕は z40・カウンタは z60 なので、
   何もしないと「まだ始まっていないのに 0/9 見つけた」が幕の上に浮く */
html.is-locked .dyn-count { opacity: 0; }
/* 全体像（ロゴを押した状態）では絵だけにする */
html.is-overview .dyn-count { opacity: 0; }
/* ★見るだけモードでも伏せる（既存の dynamo.css:87 は no-3d しか書いていなかった＝書き漏れ）。
   数を数える遊びが無い経路に、数のカウンタだけ残さない */
html.is-tour .dyn-count { display: none; }


/* ── ② ハンバーガーボタン ────────────────────────────────────
   ★出す条件を**セレクタの詳細度だけ**で決める（並び順に賭けない）。
     素の姿は display:none。「JSが動いていて・3Dが立っていて・見るだけモードでない」
     ときだけ出す。この条件はパネル側・スクリム側・JS側の isDrawer() と完全に同じ。
   ★高さの上限52pxは据え置き。印はこれを data-gx-avoid でよけるようになったが、
     固定UIは小さいほど印を押しのける量が減るので、太らせない約束は残す。 */
.dyn-menu__btn {
  display: none;                       /* 素の姿＝出さない（押しても何も起きない環境で出さない） */
  position: fixed; top: 16px; right: 16px; z-index: 92;
  align-items: center; gap: 11px;
  height: 52px;                        /* 44px以上 */
  margin: 0; padding: 0 17px 0 15px;
  border: 3px solid var(--dyn-ink);
  border-radius: 15px;
  background: var(--dyn-yellow);
  color: var(--dyn-ink);               /* 線と文字。11.01 */
  --btn-sh: var(--dyn-ink);            /* 影の色を1変数にまとめる＝開閉で色を差し替えても focus 規則を書き直さない */
  box-shadow: 4px 4px 0 var(--btn-sh);
  font: inherit; cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition: transform .16s cubic-bezier(.2,.8,.3,1),
              box-shadow .16s cubic-bezier(.2,.8,.3,1),
              background-color .16s linear, border-color .16s linear;
}
/* ★遊べる経路だけ出す。(0,4,1) なので、素の規則(0,1,0)に必ず勝つ。
   is-tour / no-3d では**一度も match しない**＝固定のチラシが本文の上に残らない
   （gx.css:292 が tour でロゴを absolute に落とし、dynamo.css:54 が marquee を消すのと同じ約束） */
html.has-js:not(.no-3d):not(.is-tour) .dyn-menu__btn { display: inline-flex; }

/* 幕が上がるまでは出さない（幕は z40。ボタンだけ先に浮くと段取りが壊れる） */
html.is-locked .dyn-menu__btn { opacity: 0; visibility: hidden; pointer-events: none; }
/* 全体像のあいだは絵だけにする */
html.is-overview .dyn-menu__btn { opacity: 0; visibility: hidden; pointer-events: none; }

.dyn-menu__btn:hover,
.dyn-menu__btn:focus-visible {
  transform: translate(-2px, -2px);
  box-shadow: 6px 6px 0 var(--btn-sh);
}
.dyn-menu__btn:active { transform: translate(2px, 2px); box-shadow: 1px 1px 0 var(--btn-sh); }
/* ★フォーカス輪は二重にする。黄色い面の上に1色置くだけだと、
   背後のパノラマが明るいときも暗いときも成立する色が無い。
   内側=インクの輪（黄の上で11.01）／外側=クリームの halo（暗いパノラマの上で出る） */
.dyn-menu__btn:focus-visible {
  outline: 3px solid var(--dyn-ink);
  outline-offset: 3px;
  box-shadow: 6px 6px 0 var(--btn-sh), 0 0 0 9px rgba(242, 232, 213, .92);
}

/* 3本線。currentColor で描くので、開閉の色替えは color 1つで済む */
.dyn-menu__bars { position: relative; width: 26px; height: 18px; flex: none; }
.dyn-menu__bars i {
  position: absolute; left: 0; width: 100%; height: 4px; border-radius: 2px;
  background: currentColor;
  transition: transform .22s cubic-bezier(.2,.8,.3,1), opacity .14s linear;
}
.dyn-menu__bars i:nth-child(1) { top: 0; }
.dyn-menu__bars i:nth-child(2) { top: 7px; }
.dyn-menu__bars i:nth-child(3) { top: 14px; }

.dyn-menu__word {
  font-family: var(--dyn-disp);
  font-size: 20px; line-height: 1; letter-spacing: .14em;
  padding-top: 2px;                    /* Bebas は上に余白が寄るので視覚的に中央へ */
}

/* 開いているとき：黒地＋クリームの×。赤い縁で「いま開いている」を強く出す */
html.dyn-menu-open .dyn-menu__btn {
  background: var(--dyn-ink);
  color: var(--dyn-cream);             /* 14.74 */
  border-color: var(--dyn-cherry);     /* 黒地に対して 3.58（境界線の基準3:1）。3pxを細くしない */
  --btn-sh: var(--dyn-cherry);
}
html.dyn-menu-open .dyn-menu__bars i:nth-child(1) { transform: translateY(7px)  rotate(45deg); }
html.dyn-menu-open .dyn-menu__bars i:nth-child(2) { opacity: 0; }
html.dyn-menu-open .dyn-menu__bars i:nth-child(3) { transform: translateY(-7px) rotate(-45deg); }

@media (max-width: 700px) {
  /* 狭い画面では文字を落として正方形に */
  .dyn-menu__btn { top: 14px; right: 12px; height: 50px; width: 50px; padding: 0;
                   justify-content: center; border-radius: 14px; }
  .dyn-menu__word { display: none; }
}


/* ── ③ 背後の幕（スクリム）────────────────────────────────
   開いている間だけ、後ろのホットスポットを押せなくする。
   ★既定は display:none。開く規則も「遊べる経路」限定にしてあるので、
     tour/no-3d/JS無効では**一度も出ない**。qa_play が触る場面（メニューは常に閉じている）では
     DOMに居るだけで一切邪魔をしない。 */
.dyn-menu__scrim {
  display: none;
  position: fixed; inset: 0; z-index: 88;
  background: rgba(14, 15, 18, .74);
  backdrop-filter: blur(2px);
  /* ★指でなぞっても背後がスクロールしない。html に overflow:hidden を当てないのは、
     見るだけモードの p() が scrollY を読んでいて（gx-state.js:49-52）進行度が凍るため。
     背後を止めたいのはポインタだけなので、止めるのもポインタだけにする */
  touch-action: none;
}
html.has-js:not(.no-3d):not(.is-tour).dyn-menu-open .dyn-menu__scrim {
  display: block; animation: dyn-menu-fade .18s ease both;
}


/* ── ④ パネル ──────────────────────────────────────────────
   ★素の姿＝「本文の頭に出る目次」。JS無効でも no-3d でも、これがそのまま読める（DOM-first）。
     margin-top:88px は、tour/no-3d でロゴが position:absolute（高さ約70px）になって
     真上に乗るため。ここが0だと「みる」と「01 店内」がロゴに覆われる
     （qa_play が fallback.png として必ず撮る画）。 */
.dyn-menu {
  display: flex; flex-direction: column; gap: 4px;
  width: calc(100% - 24px);            /* 狭い画面で左右に余白を残す＝横スクロールを作らない */
  max-width: 42rem;
  margin: 88px auto 26px;
  padding: 18px 20px 16px;
  border: 3px solid var(--dyn-ink);
  border-radius: 20px;
  background: var(--dyn-cream);
  color: var(--dyn-ink);               /* 14.74 */
  box-shadow: 6px 6px 0 rgba(22, 23, 27, .55);
}
/* ★見るだけモードでは目次ごと消す。
   tour の HUD はドットが生きている（gx.css は skip と目標文しか伏せていない）ので
   章の移動手段はある。遊びの途中で本文の頭に大きな紙が生えるほうが害が大きい。 */
html.is-tour .dyn-menu { display: none; }

/* ★遊べる経路だけ、右上から出る引き出しに化ける。(0,4,1) */
html.has-js:not(.no-3d):not(.is-tour) .dyn-menu {
  position: fixed; z-index: 90;
  top: 80px; right: 16px; left: auto;
  width: min(400px, calc(100vw - 32px));
  /* 高さは「上端80px＋下に16px」を引いた残り全部。74svh にしていたら
     800px の画面で中身620pxに対して器が586pxとなり、最後の行が字の途中で切れた
     （スクロールはできるが、切れた字が見えるのは事故に見える・2026-09-01 実測） */
  max-height: calc(100svh - 96px);
  overflow-y: auto; overflow-x: clip; overscroll-behavior: contain;
  margin: 0;
  box-shadow: 8px 8px 0 rgba(216, 35, 42, .85), 0 24px 60px rgba(0, 0, 0, .5);
}
/* ★閉じているときだけ隠す。(0,5,1) で、素の規則(0,1,0)にも上の規則にも確実に勝つ。
   初稿は「display:none と display:flex を同じ詳細度で書いて後勝ちに賭ける」形だったので、
   ブロックを並べ替えた瞬間に既定で開きっぱなしになる（＝検品が全滅する）危うさがあった。 */
html.has-js:not(.no-3d):not(.is-tour):not(.dyn-menu-open) .dyn-menu { display: none; }
html.has-js:not(.no-3d):not(.is-tour).dyn-menu-open .dyn-menu {
  animation: dyn-menu-in .2s cubic-bezier(.2, .9, .3, 1) both;
  transform-origin: 92% 0;
}
@keyframes dyn-menu-in  { from { opacity: 0; transform: translateY(-10px) scale(.96); }
                          to   { opacity: 1; transform: none; } }
@keyframes dyn-menu-fade{ from { opacity: 0; } to { opacity: 1; } }

/* 小見出し。★h2/h3 は使わない ── qa_play の文字重なり検査（h1,h2,h3,p,li）に
   新しい固定要素を持ち込まないため。見出しの格は太いチェリーの罫で作る。
   初稿の15pxは囁いていたので18pxまで上げた */
.dyn-menu__cap {
  margin: 12px 0 6px;
  padding-bottom: 5px;
  border-bottom: 3px solid var(--dyn-cherry);
  font-family: var(--dyn-disp);
  font-size: 18px; letter-spacing: .20em; line-height: 1;
  color: var(--dyn-ink);
}
.dyn-menu__cap:first-child { margin-top: 0; }

.dyn-menu__nav { display: flex; flex-direction: column; }

/* 行。番号（Bebas・チェリー）＋和文（太字・黒）。触ると面ごと反転する＝ポップの基本。
   ★角丸をやめた。初稿は border-radius:10px と border-bottom を併用していたので、
     罫の両端が丸みで途切れて「太い罫」に見えなかった。
     参照サイトの罫は端まで真っ直ぐ通っている。radius:0＋2pxのインク罫で作り直す。 */
.dyn-menu__item {
  display: flex; align-items: center; gap: 14px;
  width: 100%;
  min-height: 56px;                    /* 44px以上 */
  padding: 10px 12px;
  margin: 0;
  border: 0;
  border-bottom: 2px solid var(--dyn-ink);
  border-radius: 0;
  background: none;
  color: inherit;
  font: inherit;
  text-align: left; text-decoration: none;
  cursor: pointer;
  transition: background-color .14s linear, color .14s linear, box-shadow .14s linear;
}
.dyn-menu__nav .dyn-menu__item:last-child { border-bottom: 0; }
.dyn-menu__no {
  flex: none; min-width: 2.1em;
  font-family: var(--dyn-disp);
  font-size: 26px; line-height: 1; letter-spacing: .04em;
  color: var(--dyn-cherry);            /* 26px＝大きい文字。クリーム地に 4.12（基準3:1）*/
}
.dyn-menu__ja { font-size: 1.05rem; font-weight: 700; line-height: 1.3; }

/* 反転。★横に動かす代わりに、左端に黄色い背骨を差す。
   罫を radius:0 の直線にしたので、行がずれると罫の通りが崩れる。
   動かさない演出なので reduced-motion でも同じ見た目が残る */
.dyn-menu__item:hover,
.dyn-menu__item:focus-visible {
  background: var(--dyn-ink);
  color: var(--dyn-cream);             /* 14.74 */
  box-shadow: inset 5px 0 0 var(--dyn-yellow);
}
.dyn-menu__item:hover .dyn-menu__no,
.dyn-menu__item:focus-visible .dyn-menu__no { color: var(--dyn-yellow); } /* 黒地に 11.01 */
/* 反転した黒地の上に出る輪なので黄色。外側はクリーム地に接するが、内側の11.01で成立する */
.dyn-menu__item:focus-visible { outline: 3px solid var(--dyn-yellow); outline-offset: -3px; }

/* 番号の無い行（読み物・見るだけ・お問い合わせ）は、番号の桁ぶんだけ字下げして揃える */
.dyn-menu__item--sub { padding-left: 14px; }
.dyn-menu__item--sub .dyn-menu__ja { font-size: 1rem; }

/* ★まだ解錠していない駅の行。
   押せば飛べる（HUDのドットと同じで、手前の駅を順に通過して歩く）が、
   『01 店内／02 裏のガレージ』という目次の顔で出ている以上、
   何が起きるのかを先に言っておく。JS が window.__gx.state() を見て is-ahead を付ける。 */
.dyn-menu__lock { display: none; }
.dyn-menu__item.is-ahead .dyn-menu__lock {
  display: inline-block;
  margin-left: auto;                   /* 行の右端へ寄せる */
  flex: none;
  padding: 2px 9px 1px;
  border: 2px solid var(--dyn-ink);
  border-radius: 999px;
  font-family: var(--dyn-disp);
  font-size: 12px; letter-spacing: .12em; line-height: 1.5;
  color: #3A3B42;                      /* クリーム地に 9.17 */
}
.dyn-menu__item.is-ahead:hover .dyn-menu__lock,
.dyn-menu__item.is-ahead:focus-visible .dyn-menu__lock {
  border-color: var(--dyn-cream); color: var(--dyn-cream);  /* 黒地に 14.74 */
}

/* 「見るだけモード」は、もう見るだけの経路に居るときは出さない（押しても意味がない） */
html.is-tour .dyn-menu__tour, html.no-3d .dyn-menu__tour { display: none; }

.dyn-menu__foot {
  margin-top: 12px; padding-top: 10px;
  border-top: 3px solid var(--dyn-ink);  /* 罫を太くして紙の下端を締める */
  font-family: var(--dyn-disp);
  font-size: 13px; letter-spacing: .16em;
  color: #3A3B42;                        /* 初稿の #4A4B52（7.14）から 9.17 へ */
}

@media (max-width: 700px) {
  /* 狭い画面：左右いっぱいに広げる。★左右に余白を残して横スクロールを作らない */
  html.has-js:not(.no-3d):not(.is-tour) .dyn-menu {
    top: 72px; right: 12px; left: 12px;
    width: auto;
    max-height: calc(100svh - 92px);
    box-shadow: 6px 6px 0 rgba(216, 35, 42, .85), 0 20px 50px rgba(0, 0, 0, .5);
  }
  .dyn-menu__no { font-size: 24px; }
}

/* ── ⑤ 動きの逃げ道 ──────────────────────────────────────
   gx.css も reduce で全アニメを殺しているが、この部品だけを他所へ持ち出しても
   成立するように、ここにも明示的に書く。
   ★3本線が × に変わる transform は残す：あれは「いま開いている」という状態の表示であって
     演出ではない。ここまで消すと、開いているのに閉じて見える。 */
@media (prefers-reduced-motion: reduce) {
  .dyn-menu__btn, .dyn-menu__bars i, .dyn-menu__item { transition: none; }
  html.has-js:not(.no-3d):not(.is-tour).dyn-menu-open .dyn-menu { animation: none; }
  html.has-js:not(.no-3d):not(.is-tour).dyn-menu-open .dyn-menu__scrim { animation: none; }
  .dyn-menu__btn:hover, .dyn-menu__btn:focus-visible { transform: none; }
  /* 行の反転は transform を使っていない（内側の背骨に置き換えた）ので、
     reduce でも「触っているところ」が同じ強さで分かる */
}


/* ==========================================================
   ポップUI改修 2026-08-31 ── 読んでいる間は、遊びの飾りを退かせる
   ==========================================================
   ★これが「見づらい」の最後の一手。
     常時表示の読み物（#about）に紙のカードを敷いても、**印と札と教えが
     カードの上に浮いたまま**なので本文が隠れる。
     実測：カードを入れた直後でも AA未満が 56.3%（入れる前は 66.8%）と、
     ほとんど改善しなかった。原因は地の色ではなく**上に乗っている物**だった。

   読み物は「普通に読めるページ」と自分で名乗っている節なので、
   そこに居るあいだは遊びの部品が下がる。印は消えるのではなく、
   スクロールを戻せばまた出る（DOMは1つも動かしていない）。 */
html.dyn-reading .gx-hotspot.is-pinned {
  opacity: 0;
  visibility: hidden;               /* 検品の文字重なり検査から外れる（透明なだけだと残る） */
  transition: opacity .25s ease, visibility 0s linear .25s;
}
html.dyn-reading .dyn-teach { display: none; }
html.dyn-reading .dyn-marquee { opacity: .25; }
@media (prefers-reduced-motion: reduce) {
  html.dyn-reading .gx-hotspot.is-pinned { transition: none; }
}


/* ==========================================================
   ポップUI改修 2026-08-31 ── 統合時に司令塔が直した4点
   ========================================================== */

/* ① 読み物の札（.gx-meta）の文字色が、本文の p 規則に食われていた。
      `.gx-station[data-reading] .dyn-read p`(0,3,1) が
      `.gx-station[data-reading] .gx-meta`(0,3,0) に勝ち、**黒い文字が赤い札に乗って**いた。
      実測：この札だけ AA未満が 96.2%（中央値 2.02）。他の本文は 0%。
      クラスを2度書いて詳細度を上げる（0,4,1）*/
.gx-station[data-reading] .dyn-read p.gx-meta.gx-meta { color: #FFF8EE; }

/* ② 見つけ済みの印に、gx.css 418行の琥珀色のピルが箱いっぱいに残っていた。
      `.gx-hotspot.is-found`(0,2,0) はボタン本体の background を塗るので、
      シールの裏に四角い座布団が出る。印になっているときだけ打ち消す */
.gx-hotspot.is-pinned.is-found,
.gx-hotspot.is-pinned.is-chosen {
  background: none;
  border-color: transparent;
  color: transparent;               /* ボタンの素の文字は ::before/::after で出し直している */
}

/* ③ なぞる帯（注ぐ）が不透明のクリーム板になり、見出しの後半を隠していた。
      元の「透ける帯＋インクの縁」に戻す。満量の進み（--q）は残す */
.gx-hotspot.is-pinned[data-marker="drag"]::before {
  background: linear-gradient(90deg,
    var(--dyn-yellow) calc(var(--q, 0) * 100%),
    rgba(242, 232, 213, .20) calc(var(--q, 0) * 100%));
  border: 2px solid var(--dyn-ink);
}
/* 帯の札は折り返させない。gx.css 479行のスマホ用 white-space:normal が生きていると、
   高さを固定しているぶん文字が札からはみ出す */
.gx-hotspot.is-pinned[data-marker="drag"]::after {
  white-space: nowrap;
  max-width: none;
}

/* ④ 画面のいちばん下の帯（marquee）に印の札が潜って読めなくなる。
      印は position:fixed で浮くので、帯の矩形を避けさせる。
      data-gx-avoid は gx-marker.js が読む（2026-08-31 に口を足した） */

/* ==========================================================
   ポップUI改修 2026-08-31 ── 駅の文字にも板を敷く
   ==========================================================
   読み物にクリームの紙を敷いて 0.4% まで下がったのに、**駅の文字は素のまま**だった。
   実測（文字色 対 その下の地・面積重みづけ）：
     「01 ／ 店内」＝ AA未満 **100%**（中央値 1.21）／ 見出し＝ AA未満 26.7%
   gx.css の楕円のベール（rgba(4,6,10,.62)）は、明るい店内には全く足りない。
   ★この直しは**明るいテーマ固有**なので gx.css には返さない（夜の見本では起きない）。 */
.has-3d:not(.is-tour) .gx-station:not([data-reading]) .gx-station__inner {
  max-width: min(38rem, 84vw);
  padding: 22px 26px 24px;
  border: 3px solid var(--dyn-ink);
  border-radius: 20px;
  background: rgba(18, 19, 23, .88);          /* クリームの文字に対して 13:1 台 */
  box-shadow: 7px 7px 0 rgba(216, 35, 42, .92),  /* 硬い影＝参照サイトの語彙 */
              0 18px 46px rgba(0, 0, 0, .45);
}
/* 元の楕円のベールは、板を敷いたので要らない（二重に暗くすると絵が死ぬ） */
.has-3d:not(.is-tour) .gx-station:not([data-reading]) .gx-station__inner::before { display: none; }

/* 板の中の文字は、クリームで統一して確実に読ませる */
.has-3d:not(.is-tour) .gx-station:not([data-reading]) .gx-meta { color: var(--dyn-yellow); }
.has-3d:not(.is-tour) .gx-station:not([data-reading]) h2 { color: var(--dyn-cream); }
.has-3d:not(.is-tour) .gx-station:not([data-reading]) .gx-sub { color: #DDD5C4; }

@media (max-width: 700px) {
  .has-3d:not(.is-tour) .gx-station:not([data-reading]) .gx-station__inner {
    padding: 16px 18px 18px;
    border-radius: 16px;
    box-shadow: 5px 5px 0 rgba(216, 35, 42, .92), 0 14px 34px rgba(0, 0, 0, .45);
  }
}

/* 広い画面では、文字の板を**左に寄せる**。
   参照サイトと同じで、UIは画面の端に置き、真ん中は絵に明け渡す。
   板が中央にあると、印が板を避けて上端へ一列に吹き飛び、
   **どの物を指しているのか分からなくなる**（2026-08-31 実測）。
   左に寄せれば、印は物の上に残ったまま、板とだけすれ違える。 */
/* ★境目は 701px。901px にしていたら、701〜900px の帯だけ板が中央に残り、
   印が板の上に乗ったままだった（2026-08-31 ブラウザ実測・790px幅）。
   スマホ（≦700px）は板が画面下、それより広ければ左――という2択にする */
@media (min-width: 701px) {
  .has-3d:not(.is-tour) .gx-station:not([data-reading]) { justify-content: flex-start; }
  .has-3d:not(.is-tour) .gx-station:not([data-reading]) .gx-station__inner {
    max-width: min(30rem, 52vw);
    margin: 0;
  }
  /* 見回し方の教えは、板と重ならない高さへ下げる */
  .dyn-teach { top: 84%; }
}

/* ==========================================================
   ポップUI改修 2026-08-31 ── 見回し方の教えを、下端の小さな帯にする
   ==========================================================
   画面の真ん中に大きな文字で出していたので、文字の板と重なって
   **どちらも読めなくなっていた**（スマホ実測。qa_play は span を見ないので検出されない）。
   役目は「ドラッグできる」と一言伝えるだけなので、下端の帯に格下げする。
   帯（marquee）の上に置き、暗い座布団に載せて必ず読めるようにする。 */
.dyn-teach {
  top: auto !important;
  bottom: 52px;
  transform: translateX(-50%);
  padding: 8px 18px 7px;
  border: 2px solid var(--dyn-ink);
  border-radius: 999px;
  background: rgba(18, 19, 23, .88);
  text-shadow: none;
}
.dyn-teach__small { font-size: 11px; opacity: .8; }
.dyn-teach__big {
  margin-top: 2px;
  font-size: clamp(13px, 2.2vw, 16px);
  letter-spacing: .08em;
  color: var(--dyn-cream);
}
.dyn-teach__big::after { width: 54px; margin-top: 7px; }
.dyn-teach.is-on { animation: dyn-teach-in .6s .2s both; }
@keyframes dyn-teach-in { from { opacity: 0; transform: translateX(-50%) translateY(10px); }
                          to   { opacity: 1; transform: translateX(-50%); } }
@keyframes dyn-teach-out { to { opacity: 0; transform: translateX(-50%) translateY(-8px); } }
/* 狭い画面は縦の余白が無い。**1行に収めて**、板の裾と帯のあいだに置く。
   実測：板の下端は画面の87%、帯は下40px。あいだは約69px しかないので、
   2行（約80px）だと必ずどちらかに触れる */
@media (max-width: 700px) {
  .dyn-teach { bottom: 46px; }
  .dyn-teach__small { display: none; }
  .dyn-teach__big { white-space: nowrap; font-size: 12.5px; margin-top: 0; }
  .dyn-teach__big::after { display: none; }
}

/* ==========================================================
   ポップUI改修 2026-08-31 ── 背の低い画面では板を締める
   ==========================================================
   小さいウィンドウ（実測 582x554）だと、文字の板が画面の 66% を占め、
   印の逃げ場が**上下左右どこにも無くなる**。板を締めて場所を空ける。 */
@media (max-height: 700px) and (max-width: 900px) {
  .has-3d:not(.is-tour) .gx-station:not([data-reading]) .gx-station__inner {
    padding: 13px 15px 15px;
  }
  .has-3d:not(.is-tour) .gx-station:not([data-reading]) h2 { font-size: 1.18rem; line-height: 1.42; }
  .has-3d:not(.is-tour) .gx-station:not([data-reading]) .gx-sub { display: none; }
  .gx-hotspot.is-pinned:not([data-marker="drag"]) { --dyn-badge-base: 58px; --dyn-plate-h: 24px; }
}


/* ==========================================================
   2026-09-01 内田の指摘 ── 遊ぶ画面から地の文と平凡なボタンを退ける
   ==========================================================
   「光ってる4つを、見つけてください というカードはいらない」
   「裏においてありますとかのカードも同様　せっかくのデザインがかくれてしまう」
   「平凡なボタンは削除」「コンテンツは…前面に出さず、クリックしたときなどだけにして」

   ★方針：**遊ぶ画面に地の文を置かない。**
     押す手がかりは黄色いギザギザのシールだけ。読むものはシールか
     ひとつだけ残す「読む」シールを押したときに出る。
   ★DOMからは消さない。見るだけモード・no-3d・生HTMLでは全文が読める（縮退の約束）。
     伏せ方は visibility。opacity:0 だけだと qa_play の文字重なり検査に残る。
   ========================================================== */

/* ── 板を取り消す（司令塔が可読性のために入れたものを、指摘どおり外す）── */
.has-3d:not(.is-tour) .gx-station:not([data-reading]) .gx-station__inner {
  max-width: none;
  margin: 0;
  padding: 0;
  border: 0;
  border-radius: 0;
  background: none;
  box-shadow: none;
}

/* ── 地の文を伏せる（DOMには残す）── */
.has-3d:not(.is-tour) .gx-station:not([data-reading]) .gx-meta,
.has-3d:not(.is-tour) .gx-station:not([data-reading]) h2,
.has-3d:not(.is-tour) .gx-station:not([data-reading]) .gx-sub {
  visibility: hidden;
}

/* ── 本文に残るホットスポットは、遊ぶ画面では出さない ──
   画角の外にある印は「振り向いて見つける」のが遊びなので、
   平凡なピルで先回りして見せない。
   ★ただしキーボードだけの人を締め出さない：フォーカスが当たった時だけ、
     画面の下にポップな札として現れる（skip-link と同じ手法）。 */
.has-3d:not(.is-tour) .gx-station .gx-hotspot:not(.is-pinned) {
  position: absolute;
  /* ★min-width/min-height を0に戻さないと隠れない。gx.css:88 の
     `min-width:44px; min-height:44px` が width:1px に勝つので、
     44x44 の当たり判定が画面に残り続ける（2026-09-01 実測：可読性の測定で
     「冷蔵ケース」が AA未満98.1% として現れて発覚） */
  min-width: 0; min-height: 0;
  width: 1px; height: 1px;
  padding: 0; margin: 0; border: 0;
  overflow: hidden; white-space: nowrap;
  clip-path: inset(50%);
}
.has-3d:not(.is-tour) .gx-station .gx-hotspot:not(.is-pinned):focus-visible {
  position: fixed; left: 50%; bottom: 96px; transform: translateX(-50%);
  width: auto; height: auto; overflow: visible; clip-path: none;
  z-index: 74;
  padding: 10px 20px;
  border: 3px solid var(--dyn-ink);
  border-radius: 999px;
  background: var(--dyn-yellow);
  color: var(--dyn-ink);
  font-family: var(--dyn-text); font-weight: 700; font-size: .95rem;
  box-shadow: 4px 4px 0 var(--dyn-cherry);
}

/* ── 「読む」シール（唯一の平面ボタン）──
   中身はクリックしたときだけ出す、という指摘への受け皿。
   1駅に1つだけ、左下に置く。他の部品と同じ語彙（原色ベタ・太い縁・硬い影）。 */
.has-3d:not(.is-tour) .gx-station:not([data-reading]) .gx-more { display: none; }
.has-3d:not(.is-tour) .gx-station.is-live .gx-more {
  display: inline-flex; align-items: center; gap: 8px;
  position: fixed; left: 20px; bottom: 96px; z-index: 58;
  min-height: 44px;
  margin: 0; padding: 10px 18px 9px;
  border: 3px solid var(--dyn-ink);
  border-radius: 999px;
  background: var(--dyn-cream);
  color: var(--dyn-ink);
  font-family: var(--dyn-text); font-weight: 700; font-size: .92rem;
  letter-spacing: .04em;
  text-decoration: none;
  box-shadow: 4px 4px 0 var(--dyn-cherry);
  transition: transform .14s cubic-bezier(.2,.7,.3,1), box-shadow .14s cubic-bezier(.2,.7,.3,1);
}
.has-3d:not(.is-tour) .gx-station.is-live .gx-more::before {
  content: '';
  width: 15px; height: 15px; flex: none;
  border-radius: 3px;
  background: var(--dyn-cherry);
  box-shadow: inset 0 0 0 2px var(--dyn-cream);
}
.has-3d:not(.is-tour) .gx-station.is-live .gx-more:hover,
.has-3d:not(.is-tour) .gx-station.is-live .gx-more:focus-visible {
  background: var(--dyn-yellow);
  transform: translate(2px, 2px);
  box-shadow: 2px 2px 0 var(--dyn-cherry);
}
@media (max-width: 700px) {
  .has-3d:not(.is-tour) .gx-station.is-live .gx-more { left: 14px; bottom: 86px; font-size: .86rem; }
  .has-3d:not(.is-tour) .gx-station .gx-hotspot:not(.is-pinned):focus-visible { bottom: 140px; }
}
@media (prefers-reduced-motion: reduce) {
  .has-3d:not(.is-tour) .gx-station.is-live .gx-more { transition: none; }
}

/* ==========================================================
   スプラッシュ（看板に灯りがともる）2026-09-01
   ========================================================== */
/* ==========================================================
   スプラッシュ 2026-08-31 ── 看板に灯りがともる（幕の作り替え）
   ==========================================================
   内田「まず、スプラッシュスクリーンが欲しいね、ポップな感じで」
       「誰のための何のサイトなのか、デザインとコピーでわからせる必要がある」

   遊んでいる画面から地の文を全部どけた分、説明が成立する場所はここしか無い。
   だから幕は「読み込みの目隠し」ではなく、**店の看板そのもの**にする。

   【この節の約束】
     ・押して入る札は .gx-gate__enter（gx-core.js:95-96 が click に open() を配線する）。
       **絶対に disabled にしない**。qa_play.py:147 が click() するので、
       押せない時間があると検品が止まる。待たせるのはJS側で受け止める
     ・h1 は .gx-gate__title の1つだけ。p / h2 / h3 / li は幕の中に1つも置かない
       （qa_play の文字重なり検査に固定要素を持ち込まない）
     ・読み込みの進みは --sign-p（JSが入れる）→ --dyn-load（worlds/dynamo.js が入れる）
       → 0 の順に落ちる。JSが1行も動かなくても棒は壊れない
     ・見るだけモード・no-3d・動きを減らす設定では幕を出さない（下の3行）

   【色は測った（sRGB相対輝度・WCAG式）】
     黄 #F5C531 × インク #16171B = 11.01（OPENの札）
     クリーム #F2E8D5 × 板の地 #131418 = 14.6 台（見出し・説明）
     ターコイズ #2FBFB0 × 板の地 = 8.4（SODA STAND）
     #B0A99C × 板の地 = 7.2（進みの一行）
     #B9B2A4 × 板の地 = 8.0（ぜんぶ読む）
   ========================================================== */

/* 見るだけモードでは幕を挟まない（no-3d と reduce は gx.css:359/448 が既に伏せている）。
   gx-core.js:109 が open() を呼ぶので実害は無かったが、0.9秒のフェードが一瞬走る */
html.is-tour .gx-gate { display: none; }

/* ── 幕そのもの ───────────────────────────────────────── */
.gx-gate.dyn-sign {
  gap: 0;
  overflow: hidden;                    /* 斜光と市松の床がはみ出して横スクロールを作らない */
  padding:
    max(16px, env(safe-area-inset-top)) 16px
    max(16px, env(safe-area-inset-bottom));
}
/* gx.css:325 の暗い楕円をこの案件の色に差し替える（上にチェリーの灯り、下はインク） */
.gx-gate.dyn-sign::before {
  background:
    radial-gradient(120% 90% at 50% 6%, rgba(216, 35, 42, .34), transparent 62%),
    linear-gradient(180deg, #1E1F25 0%, #0C0D10 100%);
}
.gx-gate.dyn-sign::after {
  background: radial-gradient(120% 95% at 50% 44%, rgba(6, 8, 12, .04), rgba(6, 8, 12, .60) 82%);
}

/* 看板の裏の斜光。看板が灯っている感じを作る係。押せないので pointer-events は殺す */
.dyn-sign__rays {
  position: absolute; left: 50%; top: 42%;
  width: 190vmax; height: 190vmax; margin: -95vmax 0 0 -95vmax;
  z-index: -1; pointer-events: none;
  background: repeating-conic-gradient(from 0deg,
    rgba(216, 35, 42, .20) 0deg 6deg, transparent 6deg 13deg);
  -webkit-mask-image: radial-gradient(closest-side, #000 8%, rgba(0,0,0,.55) 34%, transparent 72%);
          mask-image: radial-gradient(closest-side, #000 8%, rgba(0,0,0,.55) 34%, transparent 72%);
  animation: dyn-sign-spin 54s linear infinite;
}
@keyframes dyn-sign-spin { to { transform: rotate(360deg); } }

/* 足元の市松（店内の床と同じ柄）。幕と本編を同じ世界にしておく */
.dyn-sign__floor {
  position: absolute; left: -10vw; right: -10vw; bottom: 0; height: 96px;
  z-index: -1; pointer-events: none;
  background: repeating-conic-gradient(var(--dyn-cream) 0% 25%, var(--dyn-ink) 0% 50%) 0 0 / 38px 38px;
  opacity: .15;
  -webkit-mask-image: linear-gradient(180deg, transparent, #000 78%);
          mask-image: linear-gradient(180deg, transparent, #000 78%);
}

/* ── 看板の箱（この案件の「太いインクの縁＋ぼかさない影」の語彙） ── */
.dyn-sign__board {
  position: relative;
  display: flex; flex-direction: column; align-items: center;
  gap: clamp(7px, 1.5vh, 14px);
  width: min(560px, 90vw);
  padding: clamp(16px, 3vh, 28px) clamp(14px, 4.5vw, 32px) clamp(18px, 3.2vh, 30px);
  border: 3px solid var(--dyn-ink);
  border-radius: 22px;
  background: linear-gradient(180deg, #22232A 0%, #131418 100%);
  box-shadow:
    8px 8px 0 rgba(216, 35, 42, .92),          /* ← ポップの芯。ぼかさない */
    0 26px 60px rgba(0, 0, 0, .55),
    inset 0 0 0 2px rgba(242, 232, 213, .16);  /* 内側のクリームの罫＝ホーロー看板 */
  text-align: center;
}

/* ── 上の札（EST. 1954 ／ CRAFT SODA）──────────────────
   色は dynamo.css:31 の `.gx-gate .gx-meta{color:var(--dyn-yellow)}` が持っている */
.dyn-sign__eyebrow {
  margin: 0;
  font-size: clamp(10px, 2.4vw, 12px);
  letter-spacing: .3em; text-indent: .3em;    /* 字送りの分だけ中央がずれるのを戻す */
}

/* ── ネオンの文字（灯りがともる本体）───────────────────
   role="img" を親に付けてあるので、中の1文字ずつは読み上げに出ない */
.dyn-sign__word {
  display: flex; flex-wrap: wrap;             /* 書体が落ちて幅が伸びたら折り返す（はみ出させない） */
  justify-content: center; align-items: baseline;
  max-width: 100%;
  line-height: .92;
}
.dyn-sign__ltr {
  display: inline-block;
  font-family: var(--dyn-disp);
  font-size: clamp(44px, 17vw, 96px);
  letter-spacing: .05em;
  /* 消えている管：うっすら在るけど光っていない */
  color: rgba(242, 232, 213, .13);
  -webkit-text-stroke: 1.5px rgba(242, 232, 213, .20);
  transition: color .35s ease, text-shadow .35s ease, -webkit-text-stroke-color .35s ease;
}
.dyn-sign__ltr.is-lit {
  color: var(--dyn-yellow);
  -webkit-text-stroke-color: var(--dyn-ink);
  text-shadow:
    0 0 10px rgba(245, 197, 49, .75),
    0 0 34px rgba(245, 197, 49, .42),
    0 0 70px rgba(216, 35, 42, .34);
  animation: dyn-sign-strike .52s linear;      /* 点く瞬間だけ2回またたく */
}
@keyframes dyn-sign-strike {
  0%   { opacity: .18; }
  12%  { opacity: 1; }
  22%  { opacity: .22; }
  36%  { opacity: 1; }
  48%  { opacity: .55; }
  62%  { opacity: 1; }
  100% { opacity: 1; }
}

/* SODA STAND ＝ ターコイズの細い管。全部灯ったときに一斉に走る */
.dyn-sign__tube {
  margin-right: -.4em;                         /* 字送りの分だけ中央へ戻す */
  font-family: var(--dyn-disp);
  font-size: clamp(12px, 3.4vw, 20px);
  letter-spacing: .4em;
  color: rgba(47, 191, 176, .22);
  transition: color .45s ease, text-shadow .45s ease;
}
.dyn-sign__tube.is-lit {
  color: var(--dyn-turq);
  text-shadow: 0 0 10px rgba(47, 191, 176, .68), 0 0 30px rgba(47, 191, 176, .38);
}

/* ── 誰のための何のサイトか（ここだけ地の文を許す）───── */
.dyn-sign__title {
  margin: clamp(2px, .8vh, 8px) 0 0;
  font-size: clamp(16px, 4.4vw, 25px);
  line-height: 1.45;
  color: var(--dyn-cream);
}
.dyn-sign__lede {
  display: flex; flex-direction: column; gap: 3px;
  max-width: 34em;
  font-size: clamp(11.5px, 3vw, 13.5px);
  line-height: 1.65;
  color: #C9C2B4;
}

/* ── 読み込みの進み ──────────────────────────────────
   --sign-p（JS）→ --dyn-load（worlds/dynamo.js:88）→ 0 の順に落ちる。
   ★JSが1行も動かなくても、パノラマのバイト数だけで棒は伸びる */
.dyn-sign__meter {
  display: flex; align-items: center; gap: 10px;
  width: min(300px, 70vw);
  margin-top: clamp(2px, .8vh, 8px);
  opacity: 1;
  transition: opacity .3s ease, height .3s ease, margin .3s ease;
}
.dyn-sign__bar {
  flex: 1; height: 9px;
  border: 2px solid var(--dyn-ink); border-radius: 999px;
  background: rgba(242, 232, 213, .16);
  box-shadow: 3px 3px 0 rgba(22, 23, 27, .55);
  overflow: hidden;
}
.dyn-sign__bar i {
  display: block; height: 100%;
  width: calc(var(--sign-p, var(--dyn-load, 0)) * 100%);
  background: var(--dyn-yellow);
  transition: width .25s ease;
}
.dyn-sign__pct {
  min-width: 3.4em; text-align: right;
  font-family: var(--dyn-disp); font-size: 14px; letter-spacing: .08em;
  color: var(--dyn-yellow);
}
.dyn-sign__status {
  min-height: 1.4em;
  font-size: clamp(11px, 2.8vw, 12.5px); letter-spacing: .06em;
  color: #B0A99C;
}
/* 灯りが揃ったら、棒は用済み。畳んで OPEN に場所を譲る */
.gx-gate.dyn-sign.is-ready .dyn-sign__meter {
  height: 0; margin: 0; opacity: 0; overflow: hidden;
}

/* ── OPEN の札（＝押して入る。.gx-gate__enter を必ず持つ）──
   この店の「押せる＝黄色」の語彙をそのまま使う（シールも黄色、メニューも黄色）。
   gx.css:334 の透明ピルを丸ごと上書きする（.dyn-sign を足して 0,2,0 で勝つ） */
.dyn-sign .gx-gate__enter {
  display: inline-flex; flex-direction: column; align-items: center; gap: 1px;
  min-width: 0; min-height: 52px;
  margin-top: clamp(2px, .8vh, 6px);
  padding: 10px 34px 9px;
  border: 3px solid var(--dyn-ink); border-radius: 16px;
  background: var(--dyn-yellow); color: var(--dyn-ink);
  letter-spacing: normal;
  box-shadow: 5px 5px 0 var(--dyn-ink);
  cursor: pointer;
  -webkit-tap-highlight-color: transparent;
  transition: transform .16s cubic-bezier(.2, .8, .3, 1),
              box-shadow .16s cubic-bezier(.2, .8, .3, 1),
              opacity .3s ease;
}
/* gx.css:342 の薄い琥珀のホバーを打ち消す（0,3,0） */
.dyn-sign .gx-gate__enter:hover,
.dyn-sign .gx-gate__enter:focus-visible {
  background: var(--dyn-yellow);
  transform: translate(2px, 2px);
  box-shadow: 3px 3px 0 var(--dyn-ink);
}
.dyn-sign .gx-gate__enter:active { transform: translate(4px, 4px); box-shadow: 1px 1px 0 var(--dyn-ink); }
.dyn-sign__open-word {
  font-family: var(--dyn-disp);
  font-size: clamp(26px, 7vw, 36px); line-height: .92; letter-spacing: .1em;
}
.dyn-sign__open-note {
  font-family: var(--dyn-text); font-weight: 700;
  font-size: 12px; letter-spacing: .05em;
}
/* まだ絵が届いていない間。**押せなくはしない**（disabled にすると検品が止まる）。
   薄くして「まだ支度中」だけ伝え、押されたらJSが受け取って届いた瞬間に開ける */
.gx-gate.dyn-sign.is-holding .gx-gate__enter { opacity: .42; }
.gx-gate.dyn-sign.is-armed   .gx-gate__enter { opacity: .72; }
/* 灯りが揃った瞬間に跳ねて出る＝店が開く合図。
   fill を付けない（forwards にすると、以後 hover の transform が効かなくなる） */
.gx-gate.dyn-sign.is-ready .gx-gate__enter { animation: dyn-sign-pop .5s cubic-bezier(.2, 1.5, .4, 1); }
@keyframes dyn-sign-pop {
  from { transform: scale(.84) translateY(8px); }
  to   { transform: none; }
}

/* ── 逃げ道（見るだけモードへ）────────────────────────
   data-gx-tour は gx-hud.js:48 が拾う（配線不要）。
   gx-core.js:97 も拾って幕を開けるので、押せばそのまま読み物に入る */
.dyn-sign .gx-gate__tour {
  min-height: 44px; padding: 6px 12px;
  color: #B9B2A4; font-size: 12.5px; letter-spacing: .08em;
  text-underline-offset: 3px;
}
.dyn-sign .gx-gate__tour:hover { color: var(--dyn-cream); }

/* ── 幕が出ている間は、遊びの飾りを幕の上に出さない ─────
   .dyn-marquee(z60) と .dyn-teach(z58) は幕(z40)より前に居る。
   幕が一瞬だった頃は誰も気づかなかったが、スプラッシュにすると看板の上に載る。
   カウンタ(dynamo.css:1325)とメニュー(1363)は既に同じ手当てが入っている */
html.is-locked .dyn-marquee,
/* ★opacity では伏せられない。`.dyn-teach.is-on` の keyframes（dyn-teach-in の to{opacity:1}）は
   **アニメーション由来の値**なので、通常の宣言に必ず勝つ（2026-09-01 検分の指摘）。
   幕が出ている間は版面から外す＝display で消す */
html.is-locked .dyn-teach { display: none !important; }

/* ── 狭い画面（390x844 実測）────────────────────────── */
@media (max-width: 700px) {
  .dyn-sign__board {
    width: min(560px, 92vw);
    border-radius: 18px;
    box-shadow: 6px 6px 0 rgba(216, 35, 42, .92), 0 18px 42px rgba(0, 0, 0, .55),
                inset 0 0 0 2px rgba(242, 232, 213, .16);
  }
  .dyn-sign__ltr { font-size: clamp(40px, 15vw, 64px); }
  .dyn-sign__lede { font-size: 12px; }
  .dyn-sign__floor { height: 68px; }
}

/* ── 背の低い画面（横向き・小さいウィンドウ）───────────
   看板が縦に伸びて OPEN が画面の外に出るのを防ぐ。削るのは説明の2行目ではなく余白と字の大きさ */
@media (max-height: 620px) {
  .dyn-sign__board { gap: 6px; padding: 12px 16px 14px; }
  .dyn-sign__ltr { font-size: clamp(34px, 11vh, 58px); }
  .dyn-sign__title { font-size: clamp(15px, 3.4vh, 19px); }
  .dyn-sign__lede { font-size: 11.5px; line-height: 1.5; }
  .dyn-sign__floor { display: none; }
}

/* ── 動きを減らす設定への逃げ道 ──────────────────────
   この設定では gx-tier.js が TIER=0 にし、gx-core.js:37 の staticMode() が幕ごと外す。
   ＝実際にはここへ来ないが、**逃げ道は必ず書く**（判定が変わっても看板が点滅しない） */
@media (prefers-reduced-motion: reduce) {
  .dyn-sign__rays { animation: none; }
  .dyn-sign__ltr,
  .dyn-sign__tube,
  .dyn-sign__bar i,
  .dyn-sign__meter,
  .dyn-sign .gx-gate__enter { transition: none !important; animation: none !important; }
  .gx-gate.dyn-sign.is-ready .gx-gate__enter { animation: none !important; }
}


/* ==========================================================
   スプラッシュの地色を、店の赤へ（2026-09-01）
   ==========================================================
   内田の言葉は「ポップな感じで」。看板が灯る筋は良いが、地が黒に寄っていて
   サイトの他の部品（黄色いシール／クリームの札／赤い吹き出し）から浮いていた。
   地をチェリーにし、斜光をクリームにすると、同じ店の入口に見える。
   看板の板は暗いまま残す＝ネオンが光って見えるのは、暗い板の上だけなので。 */
.gx-gate.dyn-sign::before {
  background:
    radial-gradient(120% 90% at 50% 4%, rgba(245, 197, 49, .30), transparent 56%),
    linear-gradient(180deg, #E23A34 0%, #C11C24 58%, #8E1219 100%);
}
.gx-gate.dyn-sign::after {
  background: radial-gradient(120% 95% at 50% 46%, rgba(90, 8, 12, .00), rgba(90, 8, 12, .42) 84%);
}
.dyn-sign__rays {
  background: repeating-conic-gradient(from 0deg,
    rgba(242, 232, 213, .17) 0deg 6deg, transparent 6deg 13deg);
}
/* 板の縁をクリームにして、赤地から切り離す */
.dyn-sign__board {
  border-color: var(--dyn-cream);
  box-shadow: 9px 9px 0 rgba(22, 23, 27, .92), 0 26px 60px rgba(60, 4, 8, .45);
}
/* 床の市松は、赤地の上ではクリーム×インクのままで十分に効く */


/* ==========================================================
   HUD の2つのボタンも、他の部品と同じ語彙にする（2026-09-01）
   ==========================================================
   内田「ボタンがダサすぎ、デザインにあってない」。
   「次へ進む」「ぜんぶ読む」は下線つきの素の文字のままで、3Dの上では読めなかった
   （実測：ぜんぶ読む＝AA未満 73.6%／中央値 3.35）。
   目立たせすぎず、しかし必ず読めるように、暗い座布団＋クリームの縁の小さな札にする。 */
.has-3d:not(.is-tour) .gx-hud__skip,
.has-3d:not(.is-tour) .gx-hud__tour {
  padding: 8px 15px 7px;
  border: 2px solid rgba(242, 232, 213, .55);
  border-radius: 999px;
  background: rgba(18, 19, 23, .86);
  color: var(--dyn-cream);
  font-family: var(--dyn-text); font-weight: 700;
  font-size: .8rem; letter-spacing: .06em;
  text-decoration: none;
  box-shadow: 0 3px 12px rgba(0, 0, 0, .4);
}
.has-3d:not(.is-tour) .gx-hud__skip:hover,
.has-3d:not(.is-tour) .gx-hud__skip:focus-visible,
.has-3d:not(.is-tour) .gx-hud__tour:hover,
.has-3d:not(.is-tour) .gx-hud__tour:focus-visible {
  background: var(--dyn-yellow);
  border-color: var(--dyn-ink);
  color: var(--dyn-ink);
}


/* ==========================================================
   2026-09-01 内田の指摘 ── 言葉をやめて、矢印で見せる
   ==========================================================
   「済とかはいらなくて」「押したまま左右に動かす、というのも不要」
   「ただ矢印で表現して視覚的にわかりやすく」 */

/* ① 見つけた印から「済」の字を外す。
      色（黄→くすんだクリーム）と縮み（.82）だけで「済んだ」を出す。
      番号は残す＝どれを見つけたかが分かる */
.gx-hotspot.is-pinned.is-found:not([data-marker="drag"])::before {
  content: attr(data-dyn-no);
  font-family: var(--dyn-disp);
  font-size: calc(var(--dyn-badge) * .46);
}

/* ② 見回し方の言葉をやめて、**矢印だけ**にする。
      いままでの2行（どうやって始める？／押したまま、左右に動かす）は版面から外し、
      左右に往復する矢印の帯に置き換える。文字を1つも使わない。 */
.dyn-teach__small, .dyn-teach__big { display: none !important; }
.dyn-teach {
  padding: 0;
  border: 0;
  background: none;
  box-shadow: none;
}
.dyn-teach::before {
  content: '';
  display: block;
  width: 132px; height: 34px;
  /* 左右の矢羽根を2つ。SVGなので、どの端末でも同じ形になる */
  background: no-repeat center / contain
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 132 34'%3E%3Cg fill='none' stroke='%23F2E8D5' stroke-width='5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M26 8 L12 17 L26 26'/%3E%3Cpath d='M106 8 L120 17 L106 26'/%3E%3C/g%3E%3Cg fill='none' stroke='%2316171B' stroke-width='9' stroke-linecap='round' stroke-linejoin='round' opacity='.35'%3E%3Cpath d='M26 8 L12 17 L26 26'/%3E%3Cpath d='M106 8 L120 17 L106 26'/%3E%3C/g%3E%3Ccircle cx='66' cy='17' r='11' fill='%23F5C531' stroke='%2316171B' stroke-width='3'/%3E%3C/svg%3E");
  filter: drop-shadow(0 2px 8px rgba(0, 0, 0, .6));
  animation: dyn-teach-swing 1.9s ease-in-out infinite;
}
/* 黄色い丸（＝指）が左右に往復する。矢羽根は動かさない＝どっちへ動かすかが伝わる */
@keyframes dyn-teach-swing {
  0%, 100% { transform: translateX(-13px); }
  50%      { transform: translateX(13px); }
}
@media (prefers-reduced-motion: reduce) {
  .dyn-teach::before { animation: none; }
}
@media (max-width: 700px) {
  .dyn-teach { bottom: 52px; }
  .dyn-teach::before { width: 116px; height: 30px; }
}


/* ==========================================================
   2026-09-01 内田「注ぐのところがバグってます」への直し
   ==========================================================
   症状：帯が**灰色の空箱**に見えていた。
   原因：空の部分を rgba(242,232,213,.20) にしていたため、絵の上では
        くすんだ半透明の板になり、しかも親に濃い drop-shadow を5枚積んでいたので
        「壊れた黒い箱」に見えた。満ちる前は何も起きていないように見える。
   直し：クリームの実体のある樋（とい）にして、チェリーのソーダが左から満ちる。
        中に矢羽根を流して「横になぞる」を**文字なしで**言う。 */

.gx-hotspot.is-pinned[data-marker="drag"] {
  /* 親の濃い影を薄くする。樋そのものが実体を持つので、影で存在を作らなくていい */
  filter: drop-shadow(0 4px 10px rgba(0, 0, 0, .45));
}

.gx-hotspot.is-pinned[data-marker="drag"]::before {
  width: 208px; height: 46px;
  border: 3px solid var(--dyn-ink);
  border-radius: 999px;
  /* ①流れる矢羽根（横になぞる合図）②満ちたぶんのソーダ ③空の樋 の3層。
     ①はマスクを使わず、背景の重ね順だけで作る（対応環境を狭めない） */
  background-image:
    repeating-linear-gradient(115deg,
      rgba(22, 23, 27, .16) 0 10px, rgba(22, 23, 27, 0) 10px 26px),
    linear-gradient(90deg,
      var(--dyn-cherry) calc(var(--q, 0) * 100%),
      rgba(0, 0, 0, 0) calc(var(--q, 0) * 100%)),
    linear-gradient(180deg, #FFFBF2 0%, var(--dyn-cream) 100%);
  background-size: 200% 100%, 100% 100%, 100% 100%;
  background-position: 0 0, 0 0, 0 0;
  box-shadow: inset 0 3px 0 rgba(255, 255, 255, .55), inset 0 -3px 0 rgba(22, 23, 27, .10);
  animation: dyn-pour-flow 1.5s linear infinite;
}
/* 矢羽根だけが流れる（満ちたソーダと樋は動かない） */
@keyframes dyn-pour-flow {
  to { background-position: -200% 0, 0 0, 0 0; }
}

/* 満ちたら流れを止めて、金色の縁で「終わった」と言う */
.gx-hotspot.is-pinned.is-found[data-marker="drag"]::before,
.gx-hotspot.is-pinned[data-marker="drag"][style*="--q: 1"]::before {
  animation: none;
}

/* 札は「注ぐ」だけにする。矢印は帯の中が言っているので二重にしない */
.gx-hotspot.is-pinned[data-marker="drag"]::after {
  content: attr(data-label);
  background: var(--dyn-ink);
  color: var(--dyn-cream);
  border: 2px solid var(--dyn-cream);
  font-family: var(--dyn-text); font-weight: 700;
  font-size: 13px; letter-spacing: .10em;
  padding: 0 12px; height: 26px;
  display: grid; place-items: center;
  white-space: nowrap; max-width: none;
}

@media (prefers-reduced-motion: reduce) {
  .gx-hotspot.is-pinned[data-marker="drag"]::before { animation: none; }
}
@media (max-width: 700px) {
  .gx-hotspot.is-pinned[data-marker="drag"]::before { width: 176px; height: 42px; }
}


/* ==========================================================
   2026-09-01 内田「押せる場所を全部見せる／クリックしたら開けるように」
   ==========================================================
   カメラの後ろにある印も消さず、画面の端に寄せて出す（gx-marker.js）。
   そのまま押せば語りが開く。振り向かないと存在に気づけない、をやめる。
   端の印は「あちら側にある」と分かるように、外向きの矢羽根を添えて少し小さくする。 */
.gx-hotspot.is-pinned.is-edge { --dyn-badge-k: .84; }

.gx-hotspot.is-pinned.is-edge::after {
  position: relative;
}
/* 札の外側に矢羽根。左端の印は左を、右端の印は右を指す */
.gx-hotspot.is-pinned.is-edge[data-edge="left"]::after {
  content: attr(data-label);
}
.gx-hotspot.is-pinned.is-edge[data-edge="right"]::after {
  content: attr(data-label);
}
/* 端にいることが分かるように、輪をゆっくり呼吸させる（動きを減らす設定では止める） */
.gx-hotspot.is-pinned.is-edge::before {
  animation: dyn-edge-beat 2.4s ease-in-out infinite;
}
@keyframes dyn-edge-beat {
  0%, 100% { transform: scale(1) rotate(-3deg); }
  50%      { transform: scale(1.06) rotate(-3deg); }
}
@media (prefers-reduced-motion: reduce) {
  .gx-hotspot.is-pinned.is-edge::before { animation: none; }
}


/* ==========================================================
   窓が出る場所を、常に空けておく（2026-09-01）
   ==========================================================
   `gx.css` の窓は `inset: auto 3vw 12vh auto; width: min(400px,88vw); max-height:62svh`。
   狭い画面（640px以下）では下からの帯（`inset: auto 0 0 0; max-height:46svh`）。
   その footprint と同じ矩形を、見えない枠として置いておく。
   opacity:0 なので絵には出ないが、`checkVisibility()` は true を返すので
   gx-marker の「よけ先」には入る（display:none にすると外れてしまう）。 */
.dyn-docslot {
  position: fixed;
  inset: auto 3vw 12vh auto;
  width: min(400px, 88vw);
  height: 62svh;
  opacity: 0;
  pointer-events: none;
  z-index: -1;
}
html.no-3d .dyn-docslot, html.is-tour .dyn-docslot { display: none; }
@media (max-width: 640px) {
  .dyn-docslot { inset: auto 0 0 0; width: auto; height: 46svh; }
}


/* ==========================================================
   2026-09-01 内田「注ぐとき、左右になぞれません」への根治
   ==========================================================
   原因：印は `pointer-events: none`（透明な箱が他のボタンを飲むのを防ぐため）で、
   受けているのは疑似要素だけ。押した瞬間は疑似要素に当たるので pointerdown は入るが、
   **`setPointerCapture` は pointer-events:none の要素では取りこぼす**ことがある。
   その場合、指が帯から出た瞬間に pointermove が届かなくなり「なぞれない」。
   なぞる帯は**帯そのものが実体**なので、透明な箱で他を邪魔する心配がない。
   ここだけ素直に要素で受ける。 */
.gx-hotspot.is-pinned[data-marker="drag"] {
  pointer-events: auto;
  touch-action: none;              /* なぞりでページが動かないように（JS側でも設定済み） */
  cursor: ew-resize;
}

/* ==========================================================
   窓をクリームの紙にする＋戻るボタン（2026-09-01）
   ========================================================== */
/* ==========================================================
   2026-09-01 内田「添付のポップアップ形式で、読みやすくして」「戻るボタンも設置」
   窓（gx-modal）＝クリームの紙のカードに作り替える
   ==========================================================
   【何をしたか】
     いままでの窓は「赤いカード＋左端の市松＋丸い×」だった。
     手本にするのは #about（.gx-station[data-reading] .dyn-read）のクリームの紙。
     順番も同じにする：
       上端の三色帯 → チェリーの丸いピル（白字の小見出し）→ 黒い大見出し
       → 赤い縦罫＋英字の小見出し＋赤い日本語見出し → 黒い本文 → 戻る
     読む場所が2つ（紙と窓）あって別々の顔をしているのが、いちばん読みづらい原因だった。
     同じ顔にすれば、どちらも「読むところ」だと一目で分かる。

   【触っていないもの】
     ・gx-modal.js は1行も変更しない。あちらが作る
         dialog.gx-modal ＞ .gx-modal__head（.gx-modal__title ＋ .gx-modal__close）
                          ＞ .gx-modal__body
       という骨格に、色と形だけ着せ直している。
     ・幾何（どこに出るか・どこまで大きいか）は既存のまま。
       PC の小さい窓＝右下／PC の大きいカード＝中央／スマホ＝下から出る帯。
       .dyn-docslot（印のよけ先として版面を占有している空枠）が
       62svh／46svh でそのまま効くように、上限の高さを1pxも増やしていない。

   【入れる場所】assets/css/dynamo.css の末尾。
     ここで上書きする既存の規則は全部これより前にあり、詳細度は同点以上にしてある：
       .gx-modal / .gx-modal::before / .gx-modal__head::before / .gx-modal__title /
       .gx-modal__body / .gx-modal__body p / .gx-modal__close / html.gx-doc-big の各種
     同点のものは「後に書いたほうが勝つ」で確実に当たる（末尾に置く理由はこれ）。

   【コントラスト比（相対輝度から自分で計算し直した値）】
     クリーム #F2E8D5 L=0.81395 ／ ink #16171B L=0.00862 ／ 黄 #F5C531 L=0.59567
     ターコイズ #2FBFB0 L=0.41001 ／ チェリー #D8232A L=0.15968
       本文・大見出し  ink   on クリーム …… 14.74 : 1
       ピルの文字    #FFF8EE on チェリー ……  4.75 : 1（小さい文字なので4.5必須。クリームだと4.12で落ちる）
       赤い小見出し  #B31C22 on クリーム ……  5.56 : 1（免除に頼らず小文字基準を素で満たす）
       英字の小札    #12655C on クリーム ……  5.68 : 1
       戻るボタン    ink   on 黄       …… 11.01 : 1
       丸い×       ink   on ターコイズ ……  7.85 : 1
   ========================================================== */

/* ── 紙そのもの ──────────────────────────────────────────
   赤 → クリーム。市松の帯を捨てたので左の余白も普通に戻す。
   縁は box-shadow の ink 3px（mobile で gx.css が border-width を触るため、
   枠を border で持たないのは既存の作りをそのまま踏襲）。
   チェリーのベタ影は #about の紙と同じ「10px 10px 0」。 */
.gx-modal {
  --dyn-doc-r: 22px;
  background: var(--dyn-cream);
  color: var(--dyn-ink);
  padding: 26px 26px 18px;                     /* 左の市松ぶんの余白（calc）を解く */
  box-shadow:
    0 0 0 3px var(--dyn-ink),
    10px 10px 0 rgba(216, 35, 42, .92),
    0 24px 56px rgba(0, 0, 0, .50);
}

/* ── 上端の三色帯（赤・黄・ターコイズ）──────────────────
   市松だった ::before を、そのまま帯に作り替える（新しい要素は足さない）。
   left/right/bottom を明示して、前の「左端に縦の帯」の指定を全部打ち消す。
   縁は border ではなく影なので、top:0 が紙の実際の上端＝帯が額の中に入らない。 */
.gx-modal::before {
  left: 0; right: 0; top: 0; bottom: auto;
  width: auto; height: 12px;
  border-radius: var(--dyn-doc-r) var(--dyn-doc-r) 0 0;
  background-color: var(--dyn-cherry);
  background-image: linear-gradient(
    90deg,
    var(--dyn-cherry) 0 34%,
    var(--dyn-yellow) 34% 62%,
    var(--dyn-turq)   62% 100%
  );
  background-size: auto;
  box-shadow: none;                            /* 市松のときの内側の線を消す */
}

/* ── チェリーの丸いピル（白字の小見出し）────────────────
   #about の .gx-meta（札）と同じ役目。CSS の content で出すので、
   h1〜h3・p・li は1つも増えない＝ qa_play の文字重なり検査に当事者を持ち込まない。
   小さい窓（見つけたときの語り）の既定は「見つけたもの」。 */
.gx-modal__head::before {
  content: "見つけたもの";
  display: inline-block;
  margin: 0 0 .5em;
  padding: 6px 15px 5px;
  background: var(--dyn-cherry);
  border: 2px solid var(--dyn-ink);
  border-radius: 999px;
  color: #FFF8EE;                              /* チェリー地で 4.75:1 */
  font-family: var(--dyn-disp);
  font-size: .84rem;
  font-weight: 400;
  letter-spacing: .1em;
  line-height: 1.45;
  text-transform: none;
}
/* 「くわしく」の大きいカードは、駅の名前をそのまま札にする。
   前の版はここが clamp(30px,4.6vw,54px) の巨大な英字だった。打ち消す指定を全部書く。 */
html.gx-doc-big .gx-modal__head::before {
  content: "ダイナモのこと";
  display: inline-block;
  font-family: var(--dyn-disp);
  font-size: .9rem;
  font-weight: 400;
  line-height: 1.45;
  letter-spacing: .1em;
  color: #FFF8EE;
  text-transform: none;
}
html.gx-doc-big.doc-stand   .gx-modal__head::before { content: "01 ／ 店内"; }
html.gx-doc-big.doc-garage  .gx-modal__head::before { content: "02 ／ 仕込み場"; }
html.gx-doc-big.doc-closing .gx-modal__head::before { content: "03 ／ 注ぐ"; }

/* ── 黒い大見出し（gx-modal.js が入れる title）──────────
   赤地の白 → クリーム地の ink。書体も Bebas 系から和文の太字（Zen Kaku）へ。
   ★display は書かない。title が空のとき gx-modal.js:47 が付ける [hidden] を殺さないため。 */
.gx-modal__title {
  color: var(--dyn-ink);
  font-family: var(--dyn-text);
  font-weight: 700;
  font-size: clamp(1.2rem, 3.2vw, 1.7rem);
  letter-spacing: .01em;
  line-height: 1.45;
}
html.gx-doc-big .gx-modal__title { margin-top: 0; }   /* 前の版の .34em を戻す */

/* ── 本文の器 ────────────────────────────────────────── */
.gx-modal__body {
  margin-top: 12px;
  padding-top: 12px;
  border-top: 2px dashed rgba(22, 23, 27, .26);       /* クリーム地に合う破線 */
  scrollbar-color: var(--dyn-cherry) rgba(22, 23, 27, .12);
}
.gx-modal__body::-webkit-scrollbar-track { background: rgba(22, 23, 27, .12); }
.gx-modal__body::-webkit-scrollbar-thumb { background: var(--dyn-cherry); }

/* 本文の字。白 → ink。行間は #about の紙と同じ 1.95 で揃える */
.gx-modal__body p {
  color: var(--dyn-ink);
  font-weight: 400;
  font-size: clamp(.95rem, 2.2vw, 1.02rem);
  line-height: 1.95;
  word-break: auto-phrase;
  text-wrap: pretty;
}
.gx-modal__body strong {
  color: var(--dyn-ink);
  font-weight: 700;
  background: linear-gradient(transparent 62%, rgba(245, 197, 49, .62) 62%);
}

/* ── 赤い縦罫＋英字の小見出し＋赤い日本語見出し ─────────
   #about の h3[data-en] と同じ形。窓の中では
   **「くわしく」の #doc-* だけ**がこの h3 を持つ（後述の risks を参照）。
   見つけたときの語り（#rv-*）は <p> 1つのままにする。 */
.gx-modal__body h3 {
  margin: 1.6em 0 .5em;
  padding-left: .72em;
  border-left: 6px solid var(--dyn-cherry);
  font-family: var(--dyn-text);
  font-weight: 700;
  font-size: clamp(1.05rem, 2.6vw, 1.22rem);
  letter-spacing: .02em;
  line-height: 1.55;
  color: #B31C22;                              /* 対クリーム 5.56:1 */
}
.gx-modal__body > h3:first-child { margin-top: .15em; }
.gx-modal__body h3[data-en]::before {
  content: attr(data-en);
  display: block;
  margin-bottom: .28em;
  font-family: var(--dyn-disp);
  font-size: .76rem;
  font-weight: 400;
  letter-spacing: .2em;
  line-height: 1.2;
  color: #12655C;                              /* 対クリーム 5.68:1 */
}

/* ── 丸い× ──────────────────────────────────────────
   位置と大きさは既存のまま。輪だけクリーム → ink にして、クリームの紙から切り離す。
   ×は ink、地はターコイズ（7.85:1）。「戻る」ができたので、こちらは補助の役に降ろす。 */
.gx-modal__close {
  border-color: var(--dyn-ink);
  background: var(--dyn-turq);
  color: var(--dyn-ink);
  box-shadow: 0 4px 0 rgba(22, 23, 27, .55), 0 8px 20px rgba(0, 0, 0, .30);
}
.gx-modal__close:hover,
.gx-modal__close:focus-visible {
  background: var(--dyn-yellow);               /* ink×黄＝11.01:1 */
  color: var(--dyn-ink);
}
.gx-modal__close:focus-visible { outline: 3px solid var(--dyn-ink); outline-offset: 3px; }

/* 前の版が本文の末尾に出していた「外を押すと閉じます」は、
   下に本物の「戻る」ボタンが立つので消す（同じことを二度言わない）。 */
html.gx-doc-big .gx-modal__body::after { content: none; }

/* ── 戻る（窓の下の帯）────────────────────────────────
   DOM は dyn-extras.js が1回だけ足す（div ＞ button ＞ span×2）。
   h1〜h3・p・li を使っていないので、文字重なり検査の当事者は増えない。
   flex:none なので、本文が長くても必ず見えるところに残る。 */
.dyn-docback {
  flex: none;
  display: flex;
  align-items: center;
  gap: 12px;
  margin-top: 14px;
  padding-top: 12px;
  border-top: 2px dashed rgba(22, 23, 27, .26);
}
.dyn-docback__btn {
  display: inline-flex;
  align-items: center;
  gap: .5em;
  max-width: 100%;
  min-height: 46px;
  padding: 10px 22px 10px 18px;
  border: 3px solid var(--dyn-ink);
  border-radius: 999px;
  background: var(--dyn-yellow);
  color: var(--dyn-ink);                       /* ink×黄＝11.01:1 */
  font-family: var(--dyn-text);
  font-weight: 700;
  font-size: 1rem;
  letter-spacing: .08em;
  line-height: 1;
  cursor: pointer;
  box-shadow: 0 4px 0 rgba(22, 23, 27, .62);
  transition: transform .14s cubic-bezier(.2,.7,.3,1),
              background-color .14s ease, box-shadow .14s ease;
}
.dyn-docback__btn:hover,
.dyn-docback__btn:focus-visible {
  background: var(--dyn-cream);                /* ink×クリーム＝14.74:1 */
  transform: translateY(-2px);
  box-shadow: 0 6px 0 rgba(22, 23, 27, .62);
}
.dyn-docback__btn:active {
  transform: translateY(2px);
  box-shadow: 0 2px 0 rgba(22, 23, 27, .62);
}
.dyn-docback__btn:focus-visible { outline: 3px solid var(--dyn-ink); outline-offset: 3px; }
.dyn-docback__arrow { font-size: 1.15em; line-height: 1; }

/* ── 狭い画面（下から出る帯のまま。三色帯と戻るは残す）──
   ★この節より前にある @media (max-width:640px) の .gx-modal 規則（padding・影・角丸）を
     打ち消すため、同じ幅の問い合わせをここでもう一度書く。順番で勝たせる。 */
@media (max-width: 640px) {
  .gx-modal {
    --dyn-doc-r: 20px;
    padding: 22px 18px 14px;
    /* 下から生える帯なので、チェリーのベタ影は画面外に落ちるだけ。付けない */
    box-shadow: 0 0 0 3px var(--dyn-ink), 0 -14px 44px rgba(0, 0, 0, .55);
  }
  .gx-modal::before { border-radius: var(--dyn-doc-r) var(--dyn-doc-r) 0 0; height: 10px; }
  .gx-modal__head::before { font-size: .8rem; padding: 5px 13px 4px; }
  html.gx-doc-big .gx-modal__head::before { font-size: .84rem; }
  .gx-modal__title { font-size: clamp(1.15rem, 5vw, 1.4rem); }
  .gx-modal__body h3 { font-size: 1.08rem; margin-top: 1.4em; }
  .gx-modal__body h3[data-en]::before { font-size: .72rem; }
  /* 親指で押しやすいよう、戻るは幅いっぱいの1本にする */
  .dyn-docback { margin-top: 12px; padding-top: 10px; }
  .dyn-docback__btn { width: 100%; justify-content: center; padding: 12px 18px; }
}

/* ── 動きの逃げ道 ───────────────────────────────────
   この節が持つ動きは戻るボタンの transform／背景色の遷移だけ。
   gx.css:441 が *, *::before, *::after へ !important で同じことを当てているので二重の保険だが、
   「この部品の動きはここで止まる」を1か所で読めるように明示して残す。
   止めても押せなくならない（見た目が即時に切り替わるだけ）。 */
@media (prefers-reduced-motion: reduce) {
  .dyn-docback__btn { transition: none; }
  .dyn-docback__btn:hover,
  .dyn-docback__btn:focus-visible,
  .dyn-docback__btn:active { transform: none; }
}


/* 窓の中の「箱を選ぶ」＝オンラインSHOPへの入口（2026-09-01）
   遊ぶ画面に売り込みを出さず、押したときの窓の中だけに置く。 */
.dyn-goshop { margin-top: 1.1em !important; }
.gx-modal__body .dyn-shoplink,
.dyn-goshop .dyn-shoplink {
  display: inline-flex; align-items: center; gap: 9px;
  padding: 11px 22px 10px;
  border: 3px solid var(--dyn-ink);
  border-radius: 999px;
  background: var(--dyn-yellow);
  color: var(--dyn-ink);
  font-family: var(--dyn-text); font-weight: 700; font-size: 1rem;
  letter-spacing: .04em; text-decoration: none;
  box-shadow: 4px 4px 0 #B31C22;
}
.gx-modal__body .dyn-shoplink::after { content: '→'; font-family: var(--dyn-disp); }
.gx-modal__body .dyn-shoplink:hover,
.gx-modal__body .dyn-shoplink:focus-visible {
  background: #B31C22; color: #FFF8EE; border-color: var(--dyn-ink);
  transform: translate(2px, 2px); box-shadow: 2px 2px 0 var(--dyn-ink);
}
@media (prefers-reduced-motion: reduce) { .dyn-shoplink { transition: none; } }


/* ==========================================================
   2026-09-01 内田「常に左上にロゴ／右上のメニューも常時表示」
   ========================================================== */
/* メニューは幕の上にも出す。z-index は幕（gx.css の .gx-gate は z-index:90 台）より上へ */
html.is-locked .dyn-menu__btn {
  opacity: 1 !important;
  visibility: visible !important;
  pointer-events: auto !important;
  z-index: 120;
}
html.is-locked .gx-logo { z-index: 120; }

/* ロゴは「入口にもどる」ボタン。押すと店内の最初の画面へ戻る。
   幕が出ている間は押しても意味がないので、そのときだけ押せなくする */
html.is-locked .gx-logo { pointer-events: none; }


/* 「いまの続きへ」＝見に戻っているときだけ出る札（2026-09-01） */
.dyn-resume {
  position: fixed; right: 20px; bottom: 96px; z-index: 60;
  min-height: 44px; margin: 0; padding: 10px 20px 9px;
  border: 3px solid var(--dyn-ink); border-radius: 999px;
  background: var(--dyn-yellow); color: var(--dyn-ink);
  font-family: var(--dyn-text); font-weight: 700; font-size: .92rem; letter-spacing: .04em;
  box-shadow: 4px 4px 0 #B31C22; cursor: pointer;
}
.dyn-resume::after { content: ' →'; font-family: var(--dyn-disp); }
.dyn-resume:hover, .dyn-resume:focus-visible {
  background: #B31C22; color: #FFF8EE;
  transform: translate(2px, 2px); box-shadow: 2px 2px 0 var(--dyn-ink);
}
.dyn-resume[hidden] { display: none; }
html.no-3d .dyn-resume, html.is-tour .dyn-resume { display: none !important; }
/* 狭い画面では読む札（bottom:86px、高さ約50px）と上下に分けて押せるようにする。 */
@media (max-width: 700px) { .dyn-resume { right: 14px; bottom: 150px; font-size: .86rem; } }
@media (prefers-reduced-motion: reduce) { .dyn-resume { transition: none; } }


/* ==========================================================
   2026-09-01 ── コンプリート表記をやめる／フッターを枠に入れる
   ==========================================================
   内田「コンプリート！ありがとうございましたは不要」。
   gx-state.js:258 が全クリアで objective に 'コンプリート！' を返すので、
   出す側（HUDの目標文）を伏せる。JSは触らない。 */
.has-3d:not(.is-tour) .gx-hud__objective { display: none !important; }

/* ── フッターを別枠の四角いカードに（読みやすく）── */
.gx-footer { padding: 6svh 5vw 8svh; }
.dyn-footcard {
  max-width: 42rem; margin: 0 auto;
  padding: 26px 28px 24px;
  border: 3px solid var(--dyn-ink);
  border-radius: 18px;
  background: var(--dyn-cream);
  box-shadow: 7px 7px 0 #B31C22;
  text-align: center;
}
.dyn-footcard .dyn-foot {
  margin: 0 0 .5em;
  font-family: var(--dyn-text); font-weight: 700;
  font-size: clamp(1.05rem, 2.6vw, 1.3rem);
  letter-spacing: .06em; color: var(--dyn-ink);
}
.dyn-footcard .dyn-footline {
  margin: 0 0 1.1em; padding-bottom: 1em;
  border-bottom: 2px dashed rgba(22, 23, 27, .28);
  font-size: .95rem; line-height: 1.9; color: #3A3B42;
}
.dyn-footcard .gx-meta {
  margin: 0; font-family: var(--dyn-text);
  font-size: .82rem; line-height: 1.8; letter-spacing: .02em; color: #4A4B52;
}
@media (max-width: 700px) {
  .dyn-footcard { padding: 20px 18px 18px; border-radius: 14px; box-shadow: 5px 5px 0 #B31C22; }
}

/* ── メニューの「オンラインSHOP」行は、買う場所なので目立たせる ── */
.dyn-menu__item--shop { background: var(--dyn-yellow); }
.dyn-menu__item--shop .dyn-menu__no {
  font-size: 15px; letter-spacing: .10em; color: #B31C22;
}
.dyn-menu__item--shop:hover, .dyn-menu__item--shop:focus-visible {
  background: #B31C22; color: #FFF8EE;
}
.dyn-menu__item--shop:hover .dyn-menu__no,
.dyn-menu__item--shop:focus-visible .dyn-menu__no { color: var(--dyn-yellow); }


/* ==========================================================
   2026-09-01 内田「ロゴは、添付のような画面スタート時のものに差し替えて」
   ==========================================================
   幕（スプラッシュ）のネオン看板と同じ顔にする。
   ・EST. 1954 ／ CRAFT SODA（黄・小さく）
   ・DYNAMO（黄のネオン・Bebas）
   ・SODA STAND（ターコイズのネオン）
   稲妻のしるしは添付に無いので出さない。押すと入口へ戻る（動きは dyn-extras.js）。 */
.has-3d .gx-logo,
/* ★2026-09-01 内田「左上のロゴをもっとかっこよくポップにして」
   ネオンの顔（DYNAMO／SODA STAND）は残したまま、この案件の語彙を足す：
   ・太いインクの縁 ・ぼかさないチェリーの影 ・下端の三色帯
   ・びんのラベルと同じ「黄色いまるの中の稲妻」
   押した感じも、他のポップな部品と同じように動かす（浮く→沈む）。 */
.gx-logo {
  top: 14px; left: 14px;
  display: flex; align-items: center; gap: 11px;
  padding: 8px 17px 11px 9px;
  border: 3px solid var(--dyn-ink);
  border-radius: 17px;
  background: linear-gradient(180deg, #262832 0%, #121317 100%);
  /* 内側のクリームの細線＝暗い部屋でも縁が沈まないための保険 */
  box-shadow: inset 0 0 0 1px rgba(242, 232, 213, .22),
              5px 5px 0 var(--dyn-cherry), 0 14px 30px rgba(0, 0, 0, .52);
  filter: none;
  text-align: left;
  transition: transform .16s cubic-bezier(.2,.8,.3,1), box-shadow .16s cubic-bezier(.2,.8,.3,1);
}
/* 下端の三色帯。紙のカードと同じ合図で「同じ店のもの」とつなぐ */
.gx-logo::after {
  content: ''; position: absolute; left: 3px; right: 3px; bottom: 3px; height: 5px;
  border-radius: 0 0 11px 11px;
  background: linear-gradient(90deg,
    var(--dyn-cherry) 0 34%, var(--dyn-yellow) 34% 62%, var(--dyn-turq) 62% 100%);
}
.gx-logo:hover, .gx-logo:focus-visible {
  transform: translate(-2px, -2px);
  box-shadow: 8px 8px 0 var(--dyn-cherry), 0 18px 34px rgba(0, 0, 0, .55);
}
.gx-logo:active {
  transform: translate(2px, 2px);
  box-shadow: 2px 2px 0 var(--dyn-cherry), 0 8px 18px rgba(0, 0, 0, .5);
}

/* びんのラベルと同じしるし：黄色いまるの中に、インクの稲妻 */
.gx-logo__mark { display: block; width: 34px; height: 34px; flex: none; }
.gx-logo__ring { fill: var(--dyn-yellow); stroke: var(--dyn-ink); stroke-width: 3; }
.gx-logo__bolt { fill: var(--dyn-ink); }
.gx-logo__bowl { display: none; }
.gx-logo__text { display: block; }

/* EST. 1954 ／ CRAFT SODA */
.gx-logo__text::before {
  content: 'EST. 1954 ／ CRAFT SODA';
  display: block;
  margin-bottom: 1px;
  font-family: var(--dyn-disp);
  font-size: 9.5px; letter-spacing: .18em;
  color: var(--dyn-yellow);
  text-shadow: 0 0 7px rgba(245, 197, 49, .55);
}
.gx-logo__name {
  display: block;
  font-family: var(--dyn-disp);
  font-size: 25px; letter-spacing: .05em; line-height: 1;
  color: var(--dyn-yellow);
  text-shadow:
    0 0 3px rgba(255, 240, 190, .95),
    0 0 12px rgba(245, 197, 49, .75),
    0 0 26px rgba(245, 197, 49, .40);
}
.gx-logo__sub {
  display: block;
  margin-top: 2px;
  font-family: var(--dyn-disp);
  font-size: 11px; letter-spacing: .30em; line-height: 1;
  color: var(--dyn-turq);
  text-shadow: 0 0 8px rgba(47, 191, 176, .70), 0 0 18px rgba(47, 191, 176, .38);
}
.gx-logo:hover .gx-logo__name, .gx-logo:focus-visible .gx-logo__name {
  text-shadow:
    0 0 4px rgba(255, 250, 225, 1),
    0 0 16px rgba(245, 197, 49, .95),
    0 0 34px rgba(245, 197, 49, .55);
}
@media (max-width: 700px) {
  .gx-logo { padding: 6px 12px 9px 7px; gap: 8px; border-radius: 14px; box-shadow: 4px 4px 0 var(--dyn-cherry), 0 10px 22px rgba(0,0,0,.5); }
  .gx-logo::after { border-radius: 0 0 9px 9px; height: 4px; }
  .gx-logo__mark { width: 27px; height: 27px; }
  .gx-logo__text::before { font-size: 8px; letter-spacing: .14em; }
  .gx-logo__name { font-size: 20px; }
  .gx-logo__sub { font-size: 9px; letter-spacing: .24em; }
}

/* ============================================================
   ポップアップの中に置く商品写真（ソーダの種類）。
   窓はクリームの紙なので、写真も同じ語彙（太いインクの縁＋硬いチェリーの影）で
   囲って浮かせる。窓の横幅いっぱいに敷き、上の破線からわずかに離す。
   ============================================================ */
.gx-modal__body .dyn-revimg {
  display: block; width: 100%;
  /* ★商品の写真は**全体を見せる**（2026-09-01 内田「画像が細長くて全体が分からない」）。
     元画像は 3:2（900x600）なので、比率どおりに置けば1ミリも切れない。
     縦が足りなくなるぶんは、語りの側に data-gx-tall を付けて窓の背を高くして受ける。
     ※以前は clamp(104px,19vh,176px) の帯に切っていた。びんの下半分が消えていた。 */
  height: auto; aspect-ratio: 3 / 2; object-fit: cover;
  margin: .2em 0 .8em;
  border: 3px solid var(--dyn-ink); border-radius: 12px;
  box-shadow: 5px 5px 0 rgba(216, 35, 42, .92);
}



/* 携帯は窓の高さが 200px 前後しかない。帯をさらに詰めて、本文を窓の中に収める */
@media (max-width: 700px) {
  .gx-modal__body .dyn-revimg { height: 104px; margin-bottom: .7em; }
}

/* ============================================================
   引き出しメニューが画面に入り切らないとき（背の低い画面）。
   器は画面いっぱいまで伸ばしたうえで、それでも溢れるときは
   「続きがある」と分かる手がかりを出す。切れた字だけが見えるのは事故に見える。
   ============================================================ */
html.has-js:not(.no-3d):not(.is-tour) .dyn-menu {
  scrollbar-width: thin;
  scrollbar-color: var(--dyn-cherry) rgba(22, 23, 27, .12);
  /* 下端をクリームへ溶かす。器そのものに掛けるので、中身が何行でも効く */
  -webkit-mask-image: linear-gradient(180deg, #000 0, #000 calc(100% - 26px), rgba(0,0,0,.15) 100%);
          mask-image: linear-gradient(180deg, #000 0, #000 calc(100% - 26px), rgba(0,0,0,.15) 100%);
}
/* 溢れていないときは溶かさない（最後の行が薄くなるのは、ただの劣化） */
html.has-js:not(.no-3d):not(.is-tour) .dyn-menu.is-fit {
  -webkit-mask-image: none; mask-image: none;
}
.dyn-menu::-webkit-scrollbar { width: 8px; }
.dyn-menu::-webkit-scrollbar-track { background: rgba(22, 23, 27, .12); border-radius: 999px; }
.dyn-menu::-webkit-scrollbar-thumb { background: var(--dyn-cherry); border-radius: 999px; }

/* 人物の写真は、顔が切れないように上寄りで抜く（商品の帯は 50% 40%）。
   話が長いぶん帯は少し低く。窓の本文はスクロールできるので、続きがあることは
   下端のぼかしとスクロールバーで知らせる（下の .gx-modal__body の規則） */
/* ★人物も全体を見せる（2026-09-01 内田「作った人の画像も横長なのでちゃんと見せて」）。
   帯に切ると、その人が何をしている場面なのかが消える。写真は 3:2 なので比率どおりで切れない。
   そのぶん話の分量を詰めて、窓の中に収める。 */
.gx-modal__body .dyn-revimg--person {
  aspect-ratio: 3 / 2;
  height: auto;
  object-position: 50% 50%;
  /* 話が2段落あるぶん、写真は少しだけ細くして窓に収める。
     切るのではなく縮めるので、写っているものは全部見える */
  width: 88%;
  margin-inline: auto;
}

/* 窓の本文が入り切らないとき、下端をクリームへ溶かして「続きがある」と知らせる。
   引き出しメニューと同じ作法（切れた字だけが見えるのは事故に見える）。
   溢れていないときは JS が .is-fit を付けるので溶かさない */
.gx-modal__body {
  -webkit-mask-image: linear-gradient(180deg, #000 0, #000 calc(100% - 22px), rgba(0,0,0,.18) 100%);
          mask-image: linear-gradient(180deg, #000 0, #000 calc(100% - 22px), rgba(0,0,0,.18) 100%);
}
.gx-modal__body.is-fit { -webkit-mask-image: none; mask-image: none; }

/* 写真つきの長い語り（三代目の話）は、窓の背だけ高くする。
   中央の大きいカード（gx-doc-big）にはしない＝あちらは膜で背後を殺すので、
   遊びの途中に開くと次の印が押せなくなる。ここは高さだけの話。 */
html.gx-doc-tall .gx-modal {
  /* ★上端は必ずヘッダーの下で止める。88svh まで伸ばしたら窓の上が MENU まで届き、
     閉じる×(1178,18-1232,72) が MENU ボタン(1143,16-1264,68) の下敷きになって
     押せなくなった（elementFromPoint が dyn-menu__word を返した・2026-09-01 実測）。
     高さで足りないぶんは幅で稼ぐ＝1行に入る字数を増やして行数を減らす。 */
  max-height: min(760px, calc(100svh - 176px));
  width: min(460px, 92vw);
}


/* ============================================================
   スクロールで出てくる説明（#about）に置く写真。
   紙（クリーム）の上なので、3Dの上の印と同じ語彙で囲む
   ＝太いインクの縁＋チェリーのベタ影。切らずに全体を見せる。
   ============================================================ */
.dyn-read .dyn-fig { margin: 1.6em 0 2em; }
.dyn-read .dyn-fig img {
  display: block; width: 100%; height: auto; aspect-ratio: 3 / 2; object-fit: cover;
  border: 3px solid var(--dyn-ink); border-radius: 14px;
  box-shadow: 6px 6px 0 rgba(216, 35, 42, .92);
}
.dyn-read .dyn-fig figcaption {
  margin-top: .8em; font-size: .9rem; line-height: 1.8;
  color: var(--dyn-ink); opacity: .82;
}

/* 飲む場面の3枚組。狭い画面では1列に落とす */
.dyn-read .dyn-scenes {
  display: grid; gap: clamp(16px, 2.4vw, 24px); margin: 1.5em 0 2em; padding: 0; list-style: none;
  /* 読み物の段は 620px 前後なので 215px では2列にしか割れず、3枚目だけ次の行に落ちる。
     180px なら 3列そろう（180x3 + すきま2つ = 580 ≤ 620）。狭い画面では1列に落ちる */
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
}
.dyn-read .dyn-scenes li { margin: 0; }
.dyn-read .dyn-scenes img {
  display: block; width: 100%; height: auto; aspect-ratio: 3 / 2; object-fit: cover;
  border: 3px solid var(--dyn-ink); border-radius: 12px;
  box-shadow: 5px 5px 0 rgba(216, 35, 42, .92);
}
.dyn-read .dyn-scenes b {
  display: block; margin: .9em 0 .25em;
  font-size: 1rem; color: var(--dyn-cherry-ink, #B31C22);
}
.dyn-read .dyn-scenes span {
  display: block; font-size: .9rem; line-height: 1.8; color: var(--dyn-ink); opacity: .85;
}

/* 全体像モードのとき、gx.css:285 が .gx-logo::after を「もう一度押すと戻ります」の
   文字に差し替える。こちらは ::after を三色帯に使っているので、帯のまま保つ。
   （この案件のロゴは入口へ戻る係で、全体像モードには入らない） */
html.is-overview .gx-logo::after {
  content: '';
  padding-left: 0; border-left: 0;
  position: absolute; left: 3px; right: 3px; bottom: 3px; height: 5px;
  border-radius: 0 0 11px 11px;
  background: linear-gradient(90deg,
    var(--dyn-cherry) 0 34%, var(--dyn-yellow) 34% 62%, var(--dyn-turq) 62% 100%);
}


/* 2026-09-11 操作安定化。押す対象の外形はhover/activeでも同じ場所に保つ。
   原色・札・硬い影の返しを残し、境界で出入りを繰り返す移動だけ止める。 */
.gx-logo:hover, .gx-logo:focus-visible, .gx-logo:active,
.dyn-menu__btn:hover, .dyn-menu__btn:focus-visible, .dyn-menu__btn:active,
.dyn-sign .gx-gate__enter:hover, .dyn-sign .gx-gate__enter:focus-visible, .dyn-sign .gx-gate__enter:active,
.gx-modal__close:hover, .gx-modal__close:focus-visible, .gx-modal__close:active,
.has-3d .gx-more:hover, .has-3d .gx-more:focus-visible, .has-3d .gx-more:active,
.has-3d:not(.is-tour) .gx-station.is-live .gx-more:hover,
.has-3d:not(.is-tour) .gx-station.is-live .gx-more:focus-visible,
.has-3d:not(.is-tour) .gx-station.is-live .gx-more:active,
.dyn-docback__btn:hover, .dyn-docback__btn:focus-visible, .dyn-docback__btn:active,
.gx-modal__body .dyn-shoplink:hover, .gx-modal__body .dyn-shoplink:focus-visible, .gx-modal__body .dyn-shoplink:active,
.dyn-resume:hover, .dyn-resume:focus-visible, .dyn-resume:active { transform: none; }

/* gx.cssのtransform拡大と、このテーマのscale拡大を二重に掛けない。 */
.gx-hotspot.is-pinned:not([data-marker="drag"]):hover::before,
.gx-hotspot.is-pinned:not([data-marker="drag"]):focus-visible::before { transform: none; }
.gx-hotspot.is-pinned.is-edge:hover::before,
.gx-hotspot.is-pinned.is-edge:focus-visible::before { animation-play-state: paused; }


/* 2026-09-11 r2: ボタンの全矩形を押せる範囲にする。
   ギザギザの谷・シールと札のすきまも同じボタンで、hoverを失わない。
   箱の実寸は済み／端／hoverで変えず、縮みと呼吸は装飾だけに掛ける。 */
.gx-hotspot.is-pinned { pointer-events: auto; border-radius: 0; }
.gx-hotspot.is-pinned::before,
.gx-hotspot.is-pinned::after { pointer-events: none; }
.gx-hotspot.is-pinned[data-marker="drag"]:hover::before,
.gx-hotspot.is-pinned[data-marker="drag"]:focus-visible::before { transform: none; }

/* 矢羽根は札の内側の予約済み余白へ描く。文字を足して箱幅を変えない。 */
.gx-hotspot.is-pinned:not([data-marker="drag"]).is-edge::after {
  background-repeat: no-repeat;
  background-size: 6px 10px;
}
.gx-hotspot.is-pinned:not([data-marker="drag"]).is-edge[data-edge="left"]::after {
  background-position: 6px center;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 10'%3E%3Cpath d='M5 1L1 5l4 4' fill='none' stroke='%2316171b' stroke-width='1.6'/%3E%3C/svg%3E");
}
.gx-hotspot.is-pinned:not([data-marker="drag"]).is-edge[data-edge="right"]::after {
  background-position: right 6px center;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 10'%3E%3Cpath d='M1 1l4 4-4 4' fill='none' stroke='%2316171b' stroke-width='1.6'/%3E%3C/svg%3E");
}
.gx-hotspot.is-pinned:not([data-marker="drag"]).is-edge[data-edge="left"]:is(:hover,:focus-visible)::after {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 10'%3E%3Cpath d='M5 1L1 5l4 4' fill='none' stroke='white' stroke-width='1.6'/%3E%3C/svg%3E");
}
.gx-hotspot.is-pinned:not([data-marker="drag"]).is-edge[data-edge="right"]:is(:hover,:focus-visible)::after {
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 10'%3E%3Cpath d='M1 1l4 4-4 4' fill='none' stroke='white' stroke-width='1.6'/%3E%3C/svg%3E");
}


/* 2026-09-11 r4: 背景の文字選択が次の見回しをnative dragへ変えないようにする。
   読み物(data-reading)と静的表示は対象に含めない。 */
html.has-3d:not(.is-tour):not(.no-3d) .gx-station[data-station] {
  -webkit-user-select: none;
  user-select: none;
}


/* 2026-09-11 r5: 表示を伏せた札をクリック・Tab操作にも残さない。
   foundのopacityや、大きな窓の子visibility指定よりモード切替を優先する。
   visibilityなので外形は保たれ、読む画面から戻った時も札の実寸は変わらない。 */
html:not(.is-tour):not(.no-3d):is(.dyn-reading, .dyn-menu-open, .gx-doc-open, .gx-doc-big, .is-overview, .is-locked, .is-intro) .gx-hotspot,
html:not(.is-tour):not(.no-3d):is(.dyn-reading, .dyn-menu-open, .gx-doc-open, .gx-doc-big, .is-overview, .is-locked, .is-intro) .gx-hotspot::before,
html:not(.is-tour):not(.no-3d):is(.dyn-reading, .dyn-menu-open, .gx-doc-open, .gx-doc-big, .is-overview, .is-locked, .is-intro) .gx-hotspot::after {
  visibility: hidden !important;
  opacity: 0 !important;
  pointer-events: none !important;
  transition: none !important;
}
html:not(.is-tour):not(.no-3d):is(.dyn-reading, .dyn-menu-open, .gx-doc-open, .gx-doc-big, .is-overview, .is-locked, .is-intro) .gx-station.is-live .gx-more,
html:not(.is-tour):not(.no-3d):is(.dyn-reading, .dyn-menu-open, .gx-doc-open, .gx-doc-big, .is-overview, .is-locked, .is-intro) .dyn-resume {
  visibility: hidden !important;
  pointer-events: none !important;
}
/* 透明な親のpointer-eventsを子のauto指定が復活させない。 */
html.is-overview .gx-hud,
html.is-overview .gx-hud *,
html.is-overview .gx-modal,
html.is-overview .gx-modal * { visibility: hidden; pointer-events: none; }
@media (max-width: 700px) {
  html.gx-doc-open .gx-hud,
  html.gx-doc-open .gx-hud * { visibility: hidden; pointer-events: none; }
}
/* 3Dの場面だけ縦横の見回しを受ける。読む本文は通常のスクロールを維持する。 */
html.has-3d:not(.is-tour):not(.no-3d) .gx-station[data-station] { touch-action: none; }
.gx-station[data-reading], .gx-modal, .gx-modal__body, .dyn-menu,
html:is(.is-tour, .no-3d) .gx-station { touch-action: auto; }
.dyn-reading-back {
  position: fixed; left: 14px; bottom: 20px; z-index: 64;
  max-width: calc(100vw - 28px); min-height: 44px;
  padding: 10px 18px; border: 3px solid var(--dyn-ink); border-radius: 999px;
  background: var(--dyn-yellow); color: var(--dyn-ink);
  font-family: var(--dyn-text); font-size: 16px; font-weight: 700; line-height: 1.5;
  box-shadow: 4px 4px 0 var(--dyn-cherry); cursor: pointer; touch-action: manipulation;
}
.dyn-reading-back:hover { background: var(--dyn-cream); }
.dyn-reading-back:focus-visible { outline: 3px solid var(--dyn-cherry); outline-offset: 4px; }
.dyn-reading-back[hidden],
html:not(.dyn-reading) .dyn-reading-back,
html:is(.dyn-menu-open, .gx-doc-open, .gx-doc-big, .is-overview, .is-locked, .is-intro, .is-tour, .no-3d) .dyn-reading-back { display: none; }


/* 2026-09-11 r5: 操作と本文の日本語は16px以上。色・シール・罫線はそのまま使う。
   ラベルの高さは先に確保し、発見済み/画面端/hoverで外形を変えない。 */
.gx-hotspot.is-pinned:not([data-marker="drag"]) {
  --dyn-plate-fs: max(16px, 1rem);
  --dyn-plate-h: max(28px, 1.75rem);
}
.gx-hotspot.is-pinned[data-marker="drag"]::after {
  font-size: max(16px, 1rem); height: max(28px, 1.75rem); line-height: 1.25;
}
.has-3d:not(.is-tour) .gx-station.is-live .gx-more,
.dyn-resume,
.has-3d:not(.is-tour) .gx-hud__skip,
.has-3d:not(.is-tour) .gx-hud__tour,
.has-3d:not(.is-tour) .gx-station .gx-hotspot:not(.is-pinned):focus-visible,
.gx-hotspot:not(.is-pinned),
.dyn-menu__item.is-ahead .dyn-menu__lock,
.dyn-menu__foot,
.dyn-teach__small,
.dyn-teach__big,
.dyn-count,
.gx-modal__head::before,
html.gx-doc-big .gx-modal__head::before,
html.gx-doc-big .gx-modal__body::after,
.gx-station[data-reading] .gx-meta,
.dyn-footcard .dyn-footline,
.dyn-footcard .gx-meta,
.dyn-read .dyn-fig figcaption,
.dyn-read .dyn-scenes span,
.dyn-sign__lede,
.dyn-sign__status,
.dyn-sign__open-note,
.dyn-sign .gx-gate__tour {
  font-size: max(16px, 1rem);
}
.gx-station[data-reading] .dyn-read p,
.gx-modal__body p { font-size: clamp(16px, 2.2vw, 1.02rem); }
.dyn-sign__title { font-size: clamp(16px, 4.4vw, 25px); }
.dyn-teach { max-width: calc(100vw - 28px); }
.dyn-teach__big { white-space: normal; }
.dyn-menu__item.is-ahead { flex-wrap: wrap; }
.dyn-menu__item.is-ahead .dyn-menu__lock {
  flex: 1 1 100%; max-width: 100%; margin-left: 0;
  white-space: normal; overflow-wrap: anywhere; letter-spacing: .04em;
}
/* 短い画面でも入口の説明と押下先を切らない。 */
.gx-gate.dyn-sign { overflow-y: auto; }
.dyn-sign__board { flex-shrink: 0; }
@media (max-height: 680px) {
  .gx-gate.dyn-sign { justify-content: flex-start; padding-block: 20px; }
}


/* r5 HUD追補: 画面モードを切り替えたら「次へ進む」を含むHUD全体を退避する。
   gx-hud > * のpointer-events:autoも明示的に止め、DOM操作状態はmarker側で同期。 */
html:not(.is-tour):not(.no-3d):is(.dyn-reading, .dyn-menu-open, .gx-doc-open, .gx-doc-big, .is-overview, .is-locked, .is-intro) .gx-hud,
html:not(.is-tour):not(.no-3d):is(.dyn-reading, .dyn-menu-open, .gx-doc-open, .gx-doc-big, .is-overview, .is-locked, .is-intro) .gx-hud * {
  display: none !important;
  visibility: hidden !important;
  opacity: 0 !important;
  pointer-events: none !important;
  transition: none !important;
}


/* r5 発見済み札のhover: 背景と文字色を一組で指定し、白字だけ残さない。 */
.gx-hotspot.is-pinned.is-found:not([data-marker="drag"]):is(:hover, :focus-visible)::after {
  background-color: var(--dyn-cherry-ink, #B31C22);
  color: #FFFFFF;
}


/* r5 読み物の幅追補: 16pxの長い日本語ラベルも紙の幅に収める。
   auto-phraseの最小内容幅がinline-blockを押し広げる経路をなくし、文字は切らずに折り返す。 */
.gx-station[data-reading] .dyn-read,
.gx-modal__body { min-width: 0; }
.gx-station[data-reading] .dyn-read :is(h1, h2, h3, h4, p, li, figcaption),
.gx-modal__body :is(h1, h2, h3, h4, p, li, figcaption) {
  min-width: 0;
  max-inline-size: 100%;
  white-space: normal;
  word-break: normal;
  overflow-wrap: anywhere;
}
.gx-station[data-reading] .dyn-read p.gx-meta {
  max-width: 100%;
  box-sizing: border-box;
}


/* r5 横向き説明窓: 角から外へ出した×をMENUに重ねない。
   低い画面では窓内へ入れ、横並びMENUのある幅では左右に操作用の余白も確保する。 */
@media (min-width: 641px) and (max-height: 500px) {
  html.gx-doc-big .gx-modal__close { top: 12px; right: 12px; }
}
@media (min-width: 701px) and (max-height: 500px) {
  html.gx-doc-big .gx-modal { max-width: calc(100vw - 288px); }
}


/* r5 説明窓の予約枠廃止: 窓を開いている間は全札を退避する。
   無窓の画面まで右側を空ける必要はないので、実在する操作UIだけを避ける。 */
.dyn-docslot { display: none !important; }


/* r5 入口ヘッダー余白: 320pxや低い画面でも、看板をロゴ/MENUの下から始める。
   看板が画面に収まらない時は入口自身をスクロールして入店ボタンへ進める。 */
@media (max-width: 700px), (max-height: 680px) {
  .gx-gate.dyn-sign {
    justify-content: flex-start;
    padding-top: 110px;
    padding-bottom: 24px;
    overflow-y: auto;
  }
}

/* 2026-09-16: 番号アイコンだけを表示し、札のぶんの押下領域も残さない。
   元のボタン文言は読み上げと説明窓に保持。「注ぐ」の操作帯は別扱い。 */
.gx-hotspot.is-pinned:not([data-marker="drag"]) {
  gap: 0;
  min-width: 48px;
  min-height: 48px;
  justify-content: center;
}
.gx-hotspot.is-pinned:not([data-marker="drag"])::after {
  display: none;
  content: none;
}
