/* ═══════════════════════════════════════════════════════════════
   Night Murmur Letters · 森林入口場景樣式 (forest.css) · v0.10.0
   來源：forest v73 prototype，重新作用域到 .nm-forest
   變數 / 深淺色 / .nl-* 表單樣式 / 語言顯示 由 night-letters.css 提供
   本檔只負責：場景動畫、三入口、view 切換、mini-nav、coming-soon、閱讀面板
═══════════════════════════════════════════════════════════════ */
.nm-forest { --ease: cubic-bezier(.22,1,.36,1); --plum-glow: rgba(156,140,188,.45); }
.nm-forest[data-theme="light"] { --plum-glow: rgba(107,92,138,.35); }
.nm-forest a { color: inherit; text-decoration: none; }
.nm-forest button { font: inherit; cursor: pointer; background: none; border: 0; color: inherit; }

.nm-forest a { color: inherit; text-decoration: none; }
.nm-forest button { font: inherit; cursor: pointer; background: none; border: 0; color: inherit; }
.nm-forest .mini-nav { position: fixed; top: 0; left: 0; right: 0; z-index: 50; padding: 22px 40px; display: flex; justify-content: space-between; align-items: center; background: linear-gradient(180deg, var(--bone) 0%, transparent 100%); }
.nm-forest .logo { display: flex; flex-direction: column; font-family: var(--ff-d); font-style: italic; font-weight: 300; line-height: 1.1; color: var(--twilight); letter-spacing: -.01em; transition: color .25s var(--ease); }
.nm-forest .logo:hover { color: var(--plum); }
.nm-forest .logo-main { font-size: 18px; }
.nm-forest .logo-sub { font-size: 11px; color: var(--bronze); letter-spacing: .02em; margin-top: 2px; }
.nm-forest .toggles { display: flex; gap: 18px; align-items: center; }
.nm-forest .theme-tog { width: 32px; height: 32px; display: grid; place-items: center; color: var(--mist); transition: color .25s var(--ease); }
.nm-forest .theme-tog:hover { color: var(--twilight); }
.nm-forest .theme-tog svg { width: 18px; height: 18px; }
.nm-forest .theme-tog .sun-i { display: none; }
.nm-forest[data-theme="light"] .theme-tog .moon-i { display: none; }
.nm-forest[data-theme="light"] .theme-tog .sun-i { display: block; }
.nm-forest .lang-tog { font-family: var(--ff-m); font-size: 11px; letter-spacing: .18em; color: var(--mist); display: flex; gap: 6px; align-items: center; }
.nm-forest .lbtn { padding: 4px 6px; transition: color .25s var(--ease); }
.nm-forest .lbtn.active, .nm-forest .lbtn:hover { color: var(--twilight); }
.nm-forest main { position: relative; z-index: 1; }
.nm-forest .view { display: none; }
.nm-forest .view[data-active="true"] { display: block; animation: fadeUp .6s var(--ease); }
@keyframes fadeUp { from { opacity: 0; transform: translateY(8px); } to { opacity: 1; transform: translateY(0); } }
.nm-forest .hub { min-height: auto; padding: 0; position: relative; }
.nm-forest .hub-hero { text-align: center; padding: 20px 24px 32px; max-width: 720px; margin: 0 auto; position: relative; z-index: 2; }
.nm-forest .hub-eyebrow { font-family: var(--ff-m); font-size: 11px; letter-spacing: .28em; color: var(--bronze); text-transform: uppercase; margin-bottom: 22px; }
.nm-forest .hub-title { font-family: var(--ff-d); font-style: italic; font-weight: 300; font-size: clamp(36px, 4.8vw, 56px); line-height: 1.15; letter-spacing: -.02em; color: var(--twilight); margin-bottom: 22px; }
.nm-forest .hub-sub { font-family: var(--ff-d); font-size: 16px; line-height: 1.85; color: var(--mist); font-weight: 300; font-style: italic; }
.nm-forest .forest-title {
  position: absolute;
  top: 5%;
  left: 50%;
  transform: translateX(-50%);
  z-index: 10;
  text-align: center;
  font-family: var(--ff-d);
  font-style: italic;
  font-weight: 400;
  font-size: clamp(28px, 4.5vw, 56px);
  line-height: 1.2;
  color: var(--twilight);
  margin: 0;
  padding: 0;
  pointer-events: none;
  white-space: nowrap;
  text-shadow: 0 2px 18px rgba(15, 11, 26, .7), 0 1px 3px rgba(0, 0, 0, .4);
  letter-spacing: .015em;
}
.nm-forest .forest-title br { display: inline; }
/* 森林圖永遠是深色夜景 → 淺色版大標強制用與深色版相同的淺色，確保可讀 */
.nm-forest[data-theme="light"] .forest-title { color: #E8EBF0; }
/* 滑動提示元素：桌機隱藏，只在手機/iPad 顯示 */
.nm-forest .forest-fade-right, .nm-forest .forest-mobile-hint { display: none; }
@media (max-width: 880px) {
  .nm-forest .forest-title {
    font-size: clamp(28px, 7.5vw, 44px);
    top: 14%;   /* v0.13.1：下移，避開「滑動探索」提示 pill */
    white-space: normal;
  }
  .nm-forest .forest-title br { display: block; }
}
.nm-forest .forest-scroll {
  width: 100vw;
  margin-left: calc(50% - 50vw);
  /* 高度 = min(圖片自然高度, header 以下可視高度)
     → 圖片放得下時：貼齊 header、完整顯示、下方留深色；放不下時：裁掉上方（天空）*/
  height: min(calc(100vw * 857 / 1500), calc(100vh - var(--nm-top, 80px)));
  overflow: hidden;
  display: flex;
  align-items: flex-end;                         /* 底部對齊：高度不夠時切掉上面（天空）*/
  justify-content: center;
  background: #11121c;                           /* 周圍空白用深色填補，與底圖深色邊緣融合 */
}
.nm-forest .forest {
  position: relative;
  width: 100vw;
  flex: none;                                    /* 保持依寬度算出的自然高度，超出的上方被裁掉 */
  margin: 0;
  aspect-ratio: 1500 / 857;
  overflow: hidden;
  container-type: inline-size;
  background: #11121c;
}
.nm-forest .forest {
  transition: transform 800ms cubic-bezier(0.6, 0, 0.3, 1), opacity 800ms ease;
}
.nm-forest .forest.is-zooming-owl {
  transform: scale(3.5);
  transform-origin: 65% 37%;
  opacity: 0;
}
.nm-forest .forest.is-zooming-hole {
  transform: scale(5);
  transform-origin: 50% 70%;
  opacity: 0;
}
.nm-forest .forest.is-zooming-letters {
  transform: scale(3.5);
  transform-origin: 29% 48%;
  opacity: 0;
}
.nm-forest .forest.is-zooming-owl .forest-title, .nm-forest .forest.is-zooming-hole .forest-title, .nm-forest .forest.is-zooming-letters .forest-title, .nm-forest .forest.is-zooming-owl .hs-label, .nm-forest .forest.is-zooming-hole .hs-label, .nm-forest .forest.is-zooming-letters .hs-label {
  transition: opacity 400ms ease;
  opacity: 0;
}
.nm-forest .layer {
  position: absolute;
  display: block;
  pointer-events: none;
}
.nm-forest .layer-bg {
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.nm-forest .twinkling-stars {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
  z-index: 1;       
}
.nm-forest .star {
  fill: #F0EAE0;    
  filter: drop-shadow(0 0 .05px #F0EAE0);
}
.nm-forest .star-0 { animation: twinkle 3.1s ease-in-out infinite -2.6s; }
.nm-forest .star-1 { animation: twinkle 2.7s ease-in-out infinite -1.7s; }
.nm-forest .star-2 { animation: twinkle 4.0s ease-in-out infinite -1.3s; }
.nm-forest .star-3 { animation: twinkle 3.1s ease-in-out infinite -1.2s; }
.nm-forest .star-4 { animation: twinkle 4.2s ease-in-out infinite -2.0s; }
.nm-forest .star-5 { animation: twinkle 2.8s ease-in-out infinite -1.9s; }
.nm-forest .star-6 { animation: twinkle 4.5s ease-in-out infinite -0.8s; }
.nm-forest .star-7 { animation: twinkle 2.7s ease-in-out infinite -2.1s; }
.nm-forest .star-8 { animation: twinkle 3.9s ease-in-out infinite -0.9s; }
.nm-forest .star-9 { animation: twinkle 5.0s ease-in-out infinite -0.4s; }
.nm-forest .star-10 { animation: twinkle 4.1s ease-in-out infinite -1.9s; }
.nm-forest .star-11 { animation: twinkle 4.3s ease-in-out infinite -0.9s; }
.nm-forest .star-12 { animation: twinkle 4.3s ease-in-out infinite -2.5s; }
.nm-forest .star-13 { animation: twinkle 3.0s ease-in-out infinite -2.0s; }
.nm-forest .star-14 { animation: twinkle 4.5s ease-in-out infinite -1.8s; }
.nm-forest .star-15 { animation: twinkle 4.7s ease-in-out infinite -2.1s; }
.nm-forest .star-16 { animation: twinkle 2.9s ease-in-out infinite -2.6s; }
.nm-forest .star-17 { animation: twinkle 3.6s ease-in-out infinite -1.2s; }
.nm-forest .star-18 { animation: twinkle 3.8s ease-in-out infinite -2.7s; }
.nm-forest .star-19 { animation: twinkle 4.5s ease-in-out infinite -1.7s; }
.nm-forest .star-20 { animation: twinkle 3.8s ease-in-out infinite -0.1s; }
.nm-forest .star-21 { animation: twinkle 4.2s ease-in-out infinite -1.4s; }
.nm-forest .star-22 { animation: twinkle 4.0s ease-in-out infinite -0.1s; }
.nm-forest .star-23 { animation: twinkle 4.9s ease-in-out infinite -1.0s; }
.nm-forest .star-24 { animation: twinkle 2.6s ease-in-out infinite -2.9s; }
.nm-forest .star-25 { animation: twinkle 3.7s ease-in-out infinite -0.5s; }
.nm-forest .star-26 { animation: twinkle 2.7s ease-in-out infinite -1.7s; }
.nm-forest .star-27 { animation: twinkle 2.7s ease-in-out infinite -2.1s; }
.nm-forest .star-28 { animation: twinkle 2.5s ease-in-out infinite -2.0s; }
.nm-forest .star-29 { animation: twinkle 3.8s ease-in-out infinite -2.4s; }
.nm-forest .star-30 { animation: twinkle 4.5s ease-in-out infinite -2.8s; }
.nm-forest .star-31 { animation: twinkle 3.0s ease-in-out infinite -2.2s; }
.nm-forest .star-32 { animation: twinkle 3.5s ease-in-out infinite -0.7s; }
.nm-forest .star-33 { animation: twinkle 3.4s ease-in-out infinite -0.9s; }
.nm-forest .star-34 { animation: twinkle 4.8s ease-in-out infinite -2.6s; }
.nm-forest .star-35 { animation: twinkle 4.7s ease-in-out infinite -1.2s; }
.nm-forest .star-36 { animation: twinkle 4.4s ease-in-out infinite -1.2s; }
.nm-forest .star-37 { animation: twinkle 5.2s ease-in-out infinite -0.5s; }
.nm-forest .star-38 { animation: twinkle 4.0s ease-in-out infinite -1.7s; }
.nm-forest .star-39 { animation: twinkle 4.5s ease-in-out infinite -0.9s; }
.nm-forest .star-40 { animation: twinkle 4.0s ease-in-out infinite -0.3s; }
.nm-forest .star-41 { animation: twinkle 5.0s ease-in-out infinite -1.8s; }
.nm-forest .star-42 { animation: twinkle 5.1s ease-in-out infinite -1.5s; }
.nm-forest .star-43 { animation: twinkle 4.0s ease-in-out infinite -1.6s; }
.nm-forest .star-44 { animation: twinkle 2.9s ease-in-out infinite -2.8s; }
.nm-forest .star-45 { animation: twinkle 3.4s ease-in-out infinite -2.1s; }
.nm-forest .star-46 { animation: twinkle 3.0s ease-in-out infinite -1.3s; }
.nm-forest .star-47 { animation: twinkle 3.8s ease-in-out infinite -2.5s; }
.nm-forest .star-48 { animation: twinkle 3.9s ease-in-out infinite -0.7s; }
.nm-forest .star-49 { animation: twinkle 3.5s ease-in-out infinite -1.8s; }
.nm-forest .star-50 { animation: twinkle 4.5s ease-in-out infinite -0.8s; }
.nm-forest .star-51 { animation: twinkle 4.3s ease-in-out infinite -1.1s; }
.nm-forest .star-52 { animation: twinkle 2.8s ease-in-out infinite -2.1s; }
.nm-forest .star-53 { animation: twinkle 4.5s ease-in-out infinite -1.7s; }
.nm-forest .star-54 { animation: twinkle 4.5s ease-in-out infinite -0.6s; }
.nm-forest .star-55 { animation: twinkle 2.6s ease-in-out infinite -2.4s; }
.nm-forest .star-56 { animation: twinkle 3.5s ease-in-out infinite -0.4s; }
.nm-forest .star-57 { animation: twinkle 3.8s ease-in-out infinite -0.8s; }
.nm-forest .star-58 { animation: twinkle 4.8s ease-in-out infinite -1.0s; }
.nm-forest .star-59 { animation: twinkle 2.7s ease-in-out infinite -0.1s; }
.nm-forest .star-60 { animation: twinkle 3.7s ease-in-out infinite -2.2s; }
.nm-forest .star-61 { animation: twinkle 3.5s ease-in-out infinite -1.1s; }
.nm-forest .star-62 { animation: twinkle 4.6s ease-in-out infinite -1.4s; }
.nm-forest .star-63 { animation: twinkle 2.9s ease-in-out infinite -0.4s; }
.nm-forest .star-64 { animation: twinkle 4.9s ease-in-out infinite -0.2s; }
.nm-forest .star-65 { animation: twinkle 3.0s ease-in-out infinite -1.3s; }
.nm-forest .star-66 { animation: twinkle 5.3s ease-in-out infinite -2.1s; }
.nm-forest .star-67 { animation: twinkle 5.2s ease-in-out infinite -0.4s; }
.nm-forest .star-68 { animation: twinkle 3.4s ease-in-out infinite -1.1s; }
.nm-forest .star-69 { animation: twinkle 4.3s ease-in-out infinite -2.5s; }
.nm-forest .star-70 { animation: twinkle 4.8s ease-in-out infinite -1.4s; }
.nm-forest .star-71 { animation: twinkle 4.8s ease-in-out infinite -1.4s; }
.nm-forest .star-72 { animation: twinkle 2.5s ease-in-out infinite -2.0s; }
.nm-forest .star-73 { animation: twinkle 2.6s ease-in-out infinite -0.2s; }
.nm-forest .star-74 { animation: twinkle 5.1s ease-in-out infinite -0.5s; }
.nm-forest .star-75 { animation: twinkle 3.4s ease-in-out infinite -2.8s; }
.nm-forest .star-76 { animation: twinkle 5.1s ease-in-out infinite -0.2s; }
.nm-forest .star-77 { animation: twinkle 2.8s ease-in-out infinite -1.5s; }
.nm-forest .star-78 { animation: twinkle 2.7s ease-in-out infinite -0.7s; }
.nm-forest .star-79 { animation: twinkle 4.8s ease-in-out infinite -2.6s; }
.nm-forest .star-80 { animation: twinkle 3.9s ease-in-out infinite -1.4s; }
.nm-forest .star-81 { animation: twinkle 3.3s ease-in-out infinite -0.4s; }
.nm-forest .star-82 { animation: twinkle 3.8s ease-in-out infinite -2.4s; }
.nm-forest .star-83 { animation: twinkle 4.1s ease-in-out infinite -0.8s; }
.nm-forest .star-84 { animation: twinkle 3.1s ease-in-out infinite -2.1s; }
.nm-forest .star-85 { animation: twinkle 5.5s ease-in-out infinite -1.1s; }
.nm-forest .star-86 { animation: twinkle 3.8s ease-in-out infinite -1.4s; }
.nm-forest .star-87 { animation: twinkle 2.9s ease-in-out infinite -2.3s; }
.nm-forest .star-88 { animation: twinkle 3.5s ease-in-out infinite -1.2s; }
.nm-forest .star-89 { animation: twinkle 3.2s ease-in-out infinite -2.3s; }
.nm-forest .star-90 { animation: twinkle 2.7s ease-in-out infinite -1.1s; }
.nm-forest .star-91 { animation: twinkle 3.2s ease-in-out infinite -0.3s; }
.nm-forest .star-92 { animation: twinkle 5.1s ease-in-out infinite -2.8s; }
.nm-forest .star-93 { animation: twinkle 3.2s ease-in-out infinite -1.0s; }
.nm-forest .star-94 { animation: twinkle 3.1s ease-in-out infinite -2.6s; }
.nm-forest .star-95 { animation: twinkle 5.3s ease-in-out infinite -1.3s; }
.nm-forest .star-96 { animation: twinkle 3.9s ease-in-out infinite -0.6s; }
.nm-forest .star-97 { animation: twinkle 4.9s ease-in-out infinite -2.4s; }
.nm-forest .star-98 { animation: twinkle 2.8s ease-in-out infinite -1.7s; }
.nm-forest .star-99 { animation: twinkle 3.8s ease-in-out infinite -1.6s; }
.nm-forest .star-100 { animation: twinkle 4.7s ease-in-out infinite -1.0s; }
.nm-forest .star-101 { animation: twinkle 5.5s ease-in-out infinite -2.7s; }
.nm-forest .star-102 { animation: twinkle 3.7s ease-in-out infinite -2.0s; }
.nm-forest .star-103 { animation: twinkle 5.1s ease-in-out infinite -2.3s; }
.nm-forest .star-104 { animation: twinkle 3.1s ease-in-out infinite -1.7s; }
@keyframes twinkle {
  0%, 100% { opacity: .2; transform: scale(.85); transform-box: fill-box; transform-origin: center; }
  50%      { opacity: 1;  transform: scale(1.3);  transform-box: fill-box; transform-origin: center; }
}
/* Clouds — each sways at its own pace (different duration + phase)
   動畫數值照原型 v73；v0.13.4：雲包進 <g>、動畫掛在 <g> 上——
   iOS Safari 在橫向捲動容器內，對 svg <image> 直接做 CSS transform 動畫會失效，
   對 <g> 做則正常（WebKit 已知問題的標準解法）。 */
.nm-forest g.nm-cloud {
  transform-box: fill-box;
  transform-origin: 50% 50%;
  will-change: transform;
}
.nm-forest .nm-cloud-1 { animation: nm-cloud-a 8.2s ease-in-out infinite; }
.nm-forest .nm-cloud-2 { animation: nm-cloud-b 6.5s ease-in-out infinite -1.4s; }
.nm-forest .nm-cloud-3 { animation: nm-cloud-c 9.4s ease-in-out infinite -3.1s; }
.nm-forest .nm-cloud-4 { animation: nm-cloud-d 7.1s ease-in-out infinite -2s; }
.nm-forest .nm-cloud-5 { animation: nm-cloud-e 5.8s ease-in-out infinite -.8s; }
@keyframes nm-cloud-a {
  0%, 100% { transform: translateX(-3px) rotate(-0.15deg); }
  50%      { transform: translateX(3px) rotate(0.15deg); }
}
@keyframes nm-cloud-b {
  0%, 100% { transform: translateX(2.5px) rotate(0.13deg); }
  50%      { transform: translateX(-2.5px) rotate(-0.13deg); }
}
@keyframes nm-cloud-c {
  0%, 100% { transform: translateX(-4.5px) rotate(-0.22deg); }
  50%      { transform: translateX(4.5px) rotate(0.22deg); }
}
@keyframes nm-cloud-d {
  0%, 100% { transform: translateX(3.5px) rotate(0.18deg); }
  50%      { transform: translateX(-3.5px) rotate(-0.18deg); }
}
@keyframes nm-cloud-e {
  0%, 100% { transform: translateX(-2.2px) rotate(-0.12deg); }
  50%      { transform: translateX(2.2px) rotate(0.12deg); }
}
.nm-forest .layer-envelope {
  height: auto;
  transform-origin: 50% 0%;
  animation: envelope-sway 3s ease-in-out infinite;
  will-change: transform;
}
@keyframes envelope-sway {
  0%, 100% { transform: rotate(-7deg); }
  50%      { transform: rotate(7deg); }
}
.nm-forest .letter {
  height: auto;
  transform-origin: 50% 0%;
  will-change: transform;
}
.nm-forest .letter-1 { animation: letter-sway-a 4.2s ease-in-out infinite; }
.nm-forest .letter-2 { animation: letter-sway-b 5.1s ease-in-out infinite -1.3s; }
.nm-forest .letter-3 { animation: letter-sway-c 4.6s ease-in-out infinite -2.4s; }
.nm-forest .letter-4 { animation: letter-sway-d 5.4s ease-in-out infinite -.7s; }
@keyframes letter-sway-a {
  0%, 100% { transform: rotate(-5deg); }
  50%      { transform: rotate(4deg); }
}
@keyframes letter-sway-b {
  0%, 100% { transform: rotate(4deg); }
  50%      { transform: rotate(-6deg); }
}
@keyframes letter-sway-c {
  0%, 100% { transform: rotate(-6deg); }
  50%      { transform: rotate(5deg); }
}
@keyframes letter-sway-d {
  0%, 100% { transform: rotate(5deg); }
  50%      { transform: rotate(-5deg); }
}
@media (prefers-reduced-motion: reduce) {
  .nm-forest .nm-cloud, .nm-forest .layer-envelope, .nm-forest .letter { animation: none; }
}
.nm-forest .hotspot {
  position: absolute;
  background: transparent;
  border: 0;
  padding: 0;
  cursor: pointer;
  z-index: 5;
  border-radius: 50%;
  transform: translate(-50%, -50%);
}
.nm-forest .hotspot-owl { left: 65%; top: 37%; width: 12%; aspect-ratio: 1; }
.nm-forest .hotspot-hole { left: 50%; top: 70%; width: 9%;  aspect-ratio: 1; }
.nm-forest .hotspot-letters { left: 29%; top: 48%; width: 16%; aspect-ratio: 1; }
.nm-forest .hotspot::before {
  content: '';
  position: absolute;
  inset: -15%;
  border-radius: 50%;
  background: radial-gradient(
    circle at 50% 50%,
    rgba(190, 170, 235, .4) 0%,
    rgba(174, 156, 218, .14) 40%,
    transparent 70%
  );
  pointer-events: none;
  transition: background .35s ease;
  animation: rest-pulse 5s ease-in-out infinite;
}
.nm-forest .hotspot-owl::before { animation-delay: 0s; }
.nm-forest .hotspot-hole::before { animation-delay: 1.3s; }
.nm-forest .hotspot-letters::before { animation-delay: 2.6s; }
.nm-forest .hotspot-hole::before {
  inset: -25%;   
  background: radial-gradient(
    circle at 50% 50%,
    rgba(220, 200, 250, .8) 0%,
    rgba(190, 170, 235, .4) 30%,
    rgba(174, 156, 218, .15) 55%,
    transparent 75%
  );
  animation: hole-breath 4.5s ease-in-out infinite;
}
@keyframes hole-breath {
  0%, 100% { opacity: 0.15; transform: scale(.85); }   
  50%      { opacity: 1;    transform: scale(1.3); }    
}
.nm-forest .hotspot-hole:hover::before, .nm-forest .hotspot-hole.is-active::before {
  background: radial-gradient(
    circle at 50% 50%,
    rgba(220, 200, 250, .65) 0%,
    rgba(200, 180, 240, .25) 35%,
    transparent 65%
  );
  animation: hole-breath 3s ease-in-out infinite;
}
@keyframes rest-pulse {
  0%, 100% { opacity: .25; transform: scale(.92); }
  50%      { opacity: .7;  transform: scale(1.12); }
}
.nm-forest .hotspot:hover::before, .nm-forest .hotspot.is-active::before {
  background: radial-gradient(
    circle at 50% 50%,
    rgba(200, 180, 240, .4) 0%,
    rgba(174, 156, 218, .18) 40%,
    transparent 70%
  );
  animation: hover-pulse 2s ease-in-out infinite;
}
@keyframes hover-pulse {
  0%, 100% { opacity: .75; transform: scale(1); }
  50%      { opacity: 1;   transform: scale(1.15); }
}
.nm-forest .hotspot:hover, .nm-forest .hotspot.is-active { z-index: 7; }
.nm-forest .forest-lines {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
  z-index: 4;
  overflow: visible;
}
.nm-forest .g-line {
  stroke: rgba(174, 156, 218, .35);
  stroke-width: 1;
  stroke-dasharray: 1 0;
  vector-effect: non-scaling-stroke;
  transition: stroke .35s ease, stroke-width .35s ease;
}
.nm-forest .g-line.is-active {
  stroke: rgba(220, 200, 255, .8);
  stroke-width: 1.5;
}
.nm-forest .g-dot {
  fill: rgba(174, 156, 218, .65);
  transition: fill .35s ease, r .35s ease;
}
.nm-forest .g-dot.is-active {
  fill: rgba(230, 215, 255, .95);
}
.nm-forest .hs-label {
  position: absolute;
  background: rgba(15, 11, 26, .78);
  backdrop-filter: blur(8px) saturate(1.2);
  -webkit-backdrop-filter: blur(8px) saturate(1.2);
  border: 1px solid rgba(174, 156, 218, .18);
  padding: 0.85cqw 1.25cqw;
  text-align: center;
  color: inherit;
  font: inherit;
  cursor: pointer;
  transform: translate(-50%, -50%);
  z-index: 6;
  transition: all .35s var(--ease);
  width: 14.5cqw;
  box-shadow: 0 4px 24px rgba(0, 0, 0, .35);
}
.nm-forest .label-owl { left: 82%; top: 83%; }
.nm-forest .label-hole { left: 50%; top: 88%; }
.nm-forest .label-letters { left: 14%; top: 75%; }
.nm-forest[data-theme="light"] .hs-label {
  background: rgba(247, 244, 237, .85);
  border-color: rgba(107, 92, 138, .25);
}
.nm-forest .hs-label:hover, .nm-forest .hs-label.is-active {
  border-color: rgba(174, 156, 218, .55);
  background: rgba(20, 15, 35, .88);
  box-shadow: 0 4px 28px rgba(174, 156, 218, .3);
  z-index: 7;
}
.nm-forest[data-theme="light"] .hs-label:hover, .nm-forest[data-theme="light"] .hs-label.is-active {
  background: rgba(255, 253, 248, .95);
  box-shadow: 0 4px 28px rgba(107, 92, 138, .25);
}
.nm-forest .lbl-eyebrow {
  display: block;
  font-family: var(--ff-m);
  font-size: 0.66cqw;
  letter-spacing: .26em;
  color: var(--bronze);
  text-transform: uppercase;
  margin-bottom: 0.34cqw;
  transition: color .35s var(--ease);
}
.nm-forest .hs-label:hover .lbl-eyebrow, .nm-forest .hs-label.is-active .lbl-eyebrow { color: var(--plum); }
.nm-forest .lbl-name {
  display: block;
  font-family: var(--ff-d);
  font-style: italic;
  font-weight: 400;
  font-size: 1.16cqw;
  line-height: 1.2;
  color: var(--twilight);
  letter-spacing: -.01em;
  margin-bottom: 0.34cqw;
  transition: color .35s var(--ease);
}
.nm-forest .hs-label:hover .lbl-name, .nm-forest .hs-label.is-active .lbl-name { color: var(--plum-hi); }
.nm-forest .lbl-desc {
  display: block;
  font-family: var(--ff-d);
  font-style: italic;
  font-size: 0.82cqw;
  line-height: 1.5;
  color: var(--mist);
}
.nm-forest .hub-foot { text-align: center; font-family: var(--ff-d); font-style: italic; font-size: 14px; color: var(--mist); opacity: .6; margin-top: 32px; padding: 0 24px; }
.nm-forest .form-wrap { max-width: 640px; margin: 0 auto; padding: 48px 40px 80px; }
.nm-forest .back-link { display: inline-flex; align-items: center; gap: 8px; font-family: var(--ff-m); font-size: 11px; letter-spacing: .22em; color: var(--mist); text-transform: uppercase; margin-bottom: 30px; transition: color .25s var(--ease); }
.nm-forest[data-theme="light"] .form-side-link {
  background: rgba(107, 92, 138, .06);
  border-color: rgba(107, 92, 138, .2);
  color: rgba(80, 70, 110, .85);
}
.nm-forest[data-theme="light"] .form-side-link:hover {
  background: rgba(107, 92, 138, .12);
  border-color: rgba(107, 92, 138, .35);
  color: rgba(40, 30, 70, 1);
}
@media (max-width: 880px) {

}
.nm-forest .back-link:hover { color: var(--twilight); }
.nm-forest .back-link svg { width: 14px; height: 14px; }
.nm-forest .form-eyebrow { font-family: var(--ff-m); font-size: 11px; letter-spacing: .28em; color: var(--bronze); text-transform: uppercase; margin-bottom: 20px; }
.nm-forest .form-title { font-family: var(--ff-d); font-style: italic; font-weight: 300; font-size: clamp(34px, 4.5vw, 50px); line-height: 1.18; letter-spacing: -.02em; color: var(--twilight); margin-bottom: 22px; }
.nm-forest .form-sub { font-family: var(--ff-d); font-size: 16px; line-height: 1.85; color: var(--mist); font-weight: 300; font-style: italic; margin-bottom: 56px; max-width: 520px; }
.nm-forest .delivery-grid { display: grid; grid-template-columns: repeat(4, 1fr); gap: 10px; margin-bottom: 24px; }
.nm-forest .delivery-num { font-family: var(--ff-d); font-style: italic; font-size: 24px; font-weight: 400; color: var(--twilight); line-height: 1; margin-bottom: 6px; }
.nm-forest .delivery-unit { font-family: var(--ff-m); font-size: 10px; letter-spacing: .18em; color: var(--mist); text-transform: uppercase; }
.nm-forest[data-theme="light"] .submit-btn { color: #FFF; }
@media (max-width: 880px) {
  .nm-forest .mini-nav { padding: 18px 22px; }
  .nm-forest .logo-main { font-size: 16px; }
  .nm-forest .logo-sub { font-size: 10px; }
  .nm-forest .hub { padding: 0 0 20px; }
  .nm-forest .hub-hero { padding: 16px 22px 24px; }
  .nm-forest .hotspot-owl { width: 20%; }
  .nm-forest .hotspot-hole { width: 14%; }
  .nm-forest .hotspot-letters { width: 26%; }
  .nm-forest .hs-label {
    padding: 1.3cqw 1.7cqw;
    width: 20cqw;
  }
  .nm-forest .lbl-eyebrow { font-size: 1.05cqw; letter-spacing: .22em; margin-bottom: 0.5cqw; }
  .nm-forest .lbl-name { font-size: 1.7cqw; margin-bottom: 0.5cqw; }
  .nm-forest .lbl-desc { font-size: 1.3cqw; line-height: 1.5; }
  .nm-forest .form-wrap { padding: 40px 22px 60px; }
  .nm-forest .delivery-grid { grid-template-columns: repeat(2, 1fr); }
}

/* 觸控裝置（手機 + iPad，含 iPad 橫向）：森林橫向滑動，像前一版 */
/* 手機 + iPad（含 iPad 橫向）、或視窗縮到 ≤880px（header 已變漢堡）：
   圖片高度 = 螢幕高度，寬度等比放大後橫向滑動，貼齊 header */
@media (max-width: 880px), (hover: none) and (pointer: coarse) {
  .nm-forest .forest-scroll {
    width: 100vw;
    margin-left: calc(50% - 50vw);
    height: calc(100vh - var(--nm-top, 56px));     /* 後備 */
    height: calc(100dvh - var(--nm-top, 56px));    /* 手機可視高度（扣掉瀏覽器列）*/
    overflow-x: auto;
    overflow-y: hidden;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
    scroll-snap-type: x proximity;
    display: block;            /* 取消桌機的 flex 底部對齊 */
    align-items: initial;
  }
  .nm-forest .forest-scroll::-webkit-scrollbar { display: none; }
  .nm-forest .forest {
    height: 100%;              /* 圖片高度 = 螢幕高度 */
    width: calc((100vh - var(--nm-top, 56px)) * 1500 / 857);    /* 後備 */
    width: calc((100dvh - var(--nm-top, 56px)) * 1500 / 857);   /* = 高度 × 1.75，比螢幕寬 → 橫向滑動 */
    min-width: 0;
    max-width: none;
    flex: initial;
    margin: 0;
    scroll-snap-align: center;
  }

  /* 右緣漸層：暗示「右邊還有」*/
  .nm-forest .forest-fade-right {
    display: block;
    position: absolute;
    top: 0; right: 0;
    width: 56px;
    height: calc(100vh - var(--nm-top, 56px));
    height: calc(100dvh - var(--nm-top, 56px));
    background: linear-gradient(to right, rgba(17,18,28,0), #11121c 88%);
    pointer-events: none;
    z-index: 9;
  }
  /* 滑動提示 pill（使用者一觸碰就淡出，由 forest.js 控制）*/
  .nm-forest .forest-mobile-hint {
    display: flex;
    align-items: center;
    gap: 7px;
    position: absolute;
    top: 14px;
    left: 50%;
    transform: translateX(-50%);
    z-index: 11;
    padding: 7px 14px;
    border-radius: 999px;
    background: rgba(15, 11, 26, .72);
    backdrop-filter: blur(8px) saturate(1.2);
    -webkit-backdrop-filter: blur(8px) saturate(1.2);
    border: 1px solid rgba(168, 181, 201, .2);
    font-family: var(--ff-m);
    font-size: 11px;
    letter-spacing: .14em;
    color: #E8EBF0;
    white-space: nowrap;
    pointer-events: none;
    animation: fmh-pulse 2.6s ease-in-out infinite;
    transition: opacity .5s ease;
  }
  .nm-forest .forest-mobile-hint.is-hidden { opacity: 0; }
  .nm-forest .fmh-arrows { display: inline-block; opacity: .7; animation: fmh-swipe 1.6s ease-in-out infinite; }
  .nm-forest .fmh-arrows:last-child { animation-direction: reverse; }
}
@keyframes fmh-pulse { 0%, 100% { opacity: .92; } 50% { opacity: .6; } }
@keyframes fmh-swipe { 0%, 100% { transform: translateX(0); } 50% { transform: translateX(3px); } }
.nm-forest .forest-svg { position: absolute; inset: 0; width: 100%; height: 100%; display: block; z-index: 0; pointer-events: none; }
.nm-forest svg.forest-svg image { transform-box: fill-box; will-change: transform; }
.nm-forest svg.forest-svg image.letter, .nm-forest svg.forest-svg image.layer-envelope { transform-origin: 50% 0%; }
.nm-forest svg.forest-svg image.owl-body { transform-origin: 50% 50%; }

/* ═══════════════════════════════════════════════════════════════
   v0.10.0 新增元件（v73 沒有）：閱讀面板 / coming-soon / 樹上切換
═══════════════════════════════════════════════════════════════ */

/* 樹上 view：寫信面板 ⇄ 閱讀面板（A 方案 in-place 切換）*/
.nm-forest .view[data-view="tree"] .nl-tree-pane-read { display: none; }
.nm-forest .view[data-view="tree"][data-tree-mode="read"] .nl-tree-pane-write { display: none; }
.nm-forest .view[data-view="tree"][data-tree-mode="read"] .nl-tree-pane-read { display: block; }

/* 「讀讀別人的信」按鈕 */
.nm-forest .nl-read-toggle {
    display: inline-flex; align-items: center; gap: 8px;
    margin: 4px auto 30px; padding: 11px 20px;
    border: 1px solid var(--linen-2); border-radius: 100px;
    font-family: var(--ff-m); font-size: 12px; letter-spacing: .04em;
    color: var(--mist); background: rgba(255,255,255,.02);
    transition: color .25s var(--ease), border-color .25s var(--ease), background .25s var(--ease);
}
.nm-forest .nl-read-toggle:hover { color: var(--twilight); border-color: var(--plum); background: rgba(174,156,218,.08); }
.nm-forest .nl-read-toggle svg { width: 16px; height: 16px; }

/* 精選信卡片列 */
.nm-forest .nl-read-list { display: flex; flex-direction: column; gap: 18px; margin: 8px 0 28px; }
.nm-forest .nl-read-card {
    display: block; text-decoration: none;
    border: 1px solid var(--linen); border-radius: 14px;
    padding: 24px 26px; background: rgba(255,255,255,.02);
    transition: border-color .25s ease, background .25s ease, transform .25s ease;
}
a.nl-read-card:hover { border-color: var(--plum, #8A7AAA); background: rgba(138,122,170,.06); transform: translateY(-2px); }
.nm-forest .nl-read-body {
    font-family: var(--ff-d); font-size: 17px; line-height: 1.85;
    color: var(--twilight-2, var(--twilight)); font-style: italic; white-space: pre-wrap;
}
.nm-forest .nl-read-sig {
    margin-top: 14px; text-align: right;
    font-family: var(--ff-m); font-size: 12px; letter-spacing: .05em; color: var(--bronze);
}

/* 閱讀面板底部動作 */
.nm-forest .nl-read-actions {
    display: flex; flex-direction: column; align-items: center; gap: 16px; margin-top: 8px;
}
.nm-forest .nl-read-back {
    font-family: var(--ff-m); font-size: 12px; letter-spacing: .04em;
    color: var(--mist); transition: color .25s var(--ease);
    text-decoration: none; display: inline-block;
}
.nm-forest button.back-link { padding: 0; text-align: left; }
.nm-forest .nl-read-back:hover { color: var(--twilight); }

/* 樹上 podcast + 變聲告知 */
.nm-forest .nl-tree-consent {
    margin: 22px 0 8px; padding: 18px 20px;
    border: 1px solid var(--linen); border-left: 2px solid var(--plum);
    border-radius: 10px; background: rgba(174,156,218,.05);
}
.nm-forest .nl-tree-consent p {
    font-size: 13.5px; line-height: 1.75; color: var(--mist); margin: 0 0 10px;
}
.nm-forest .nl-tree-consent p:last-child { margin-bottom: 0; }
.nm-forest .nl-tree-consent strong { color: var(--twilight); font-weight: 500; }

/* 🦉 貓頭鷹 coming soon overlay */
.nm-coming-soon {
    position: fixed; inset: 0; z-index: 120;
    display: none; place-items: center; padding: 24px;
    background: rgba(10,8,18,.72); backdrop-filter: blur(6px);
    animation: fadeUp .4s var(--ease);
}
.nm-coming-soon[data-show="true"] { display: grid; }
.nm-night-letters-page[data-theme="light"] .nm-coming-soon { background: rgba(247,244,237,.8); }
.nm-coming-soon-card {
    max-width: 420px; width: 100%; text-align: center;
    padding: 44px 36px; border-radius: 20px;
    border: 1px solid var(--linen-2); background: var(--bone-2);
}
.nm-coming-soon-owl { margin-bottom: 16px; }
.nm-coming-soon-owl img { width: 120px; height: auto; display: block; margin: 0 auto; border-radius: 16px; box-shadow: 0 10px 30px rgba(0,0,0,.45); }
.nm-coming-soon-eyebrow {
    font-family: var(--ff-m); font-size: 11px; letter-spacing: .22em; text-transform: uppercase;
    color: var(--bronze); margin-bottom: 12px;
}
.nm-coming-soon-title {
    font-family: var(--ff-d); font-style: italic; font-weight: 300;
    font-size: 26px; color: var(--twilight); margin-bottom: 14px;
}
.nm-coming-soon-sub {
    font-size: 14.5px; line-height: 1.8; color: var(--mist); margin-bottom: 26px;
}
