/* base.css — 固定版型結構
   所有國家主題共用；顏色/字體/圖騰一律吃 theme-*.css 的 CSS variables。
   設計概念：「旅行海報 × 登機規劃單」。
   左側是隨國家切換的海報面板（品牌記憶點），右側是步驟式的規劃表單。 */

:root {
  /* 中性文字色。這個專案的 --color-secondary 是「品牌第二色」（例如中南半島主題是磚紅
     #C1443A），不是灰色——之前 UI 的次要文字全綁在它身上，整片內文就變成飽和紅字。
     所有「安靜的文字」（說明、表頭、提示、次要標籤）一律用這裡的中性色，
     --color-secondary 只留給真正要強調的地方。 */
  --color-muted: #7C746A;
  --color-muted-soft: #A29A8E;
  /* 錯誤／危險動作。--color-secondary 是各地區主題的「品牌第二色」（有些主題是青綠、有些是磚紅），
     不能拿來當錯誤色。 */
  --color-danger: #B3261E;

  --radius: 16px;
  --radius-sm: 10px;
  /* 編輯模式裡「一個獨立小方塊」語意的元件（欄位、座標鈕、列操作按鈕）共用的
     圓角跟高度——跟 --radius-sm 分開，避免像座標鈕曾經不小心借用容器層級的
     圓角變數，讓小按鈕看起來跟整張卡片同一個尺度。 */
  --field-radius: 6px;
  --field-h: 32px;
  --shadow-sm: 0 1px 3px rgba(0, 0, 0, 0.05);
  --shadow: 0 10px 40px rgba(0, 0, 0, 0.07), 0 2px 6px rgba(0, 0, 0, 0.04);
  --shadow-hover: 0 14px 44px rgba(0, 0, 0, 0.1), 0 3px 8px rgba(0, 0, 0, 0.05);
  --sp-1: 4px;
  --sp-2: 8px;
  --sp-3: 16px;
  --sp-4: 24px;
  --sp-5: 40px;
  --sp-6: 64px;
  --transition: 220ms cubic-bezier(0.4, 0, 0.2, 1);
}

* { box-sizing: border-box; }

html {
  /* 跟 body 一起設。touch-action 不繼承，瀏覽器是沿著祖先鏈取交集來決定行為，
     而「交集要走到哪個祖先」跟捲動容器是誰有關。兩層都設就不用去推敲那條規則。 */
  touch-action: manipulation;
  -webkit-font-smoothing: antialiased;
  /* 避免 combo-map 的 full-bleed（100vw）技巧在桌面版因捲軸寬度計算差異，
     多出幾個像素而出現不必要的水平捲軸。
     **用 clip 不要用 hidden**：overflow-x 只要不是 visible，瀏覽器就會把
     overflow-y 也一起算成 auto（CSS Overflow 規則），等於讓 html 變成一個
     「捲動容器」——這會讓全站所有 position: sticky 的元素直接失效（沒有任何
     視覺線索、也不會噴錯誤，非常難查）。clip 純粹裁切、不建立捲動容器，
     不會踩到這個副作用，視覺效果（擋住不要的水平捲軸）完全一樣。 */
  overflow-x: clip;
  /* 手機瀏覽器在頁面最頂端往下拉會觸發「下拉重新整理」的原生手勢，
     顯示自己的半透明轉圈圖示，剛好疊在貼頂固定的操作按鈕上面——那不是這個站
     畫出來的東西，是瀏覽器自己的 UI，擋不掉顏色也擋不掉位置，只能整個關掉。
     這個站沒有任何畫面需要靠這個手勢刷新，關掉不影響一般捲動。 */
  overscroll-behavior-y: contain;
}

body {
  margin: 0;
  /* 關掉「連點兩下放大」。
     這個站的按鈕與 chip 很密集，手指連點兩下常常被當成放大手勢，
     畫面就整個跳掉。manipulation 只拿掉雙擊縮放，**捏合縮放仍然保留**——
     所以需要放大看字的人不受影響。
     不用 viewport 的 user-scalable=no：那會把捏合縮放一起關掉，
     等於剝奪視力不佳者的放大能力，而且 iOS Safari 本來就會忽略它。
     順帶好處：也去掉了行動瀏覽器等待雙擊的 300ms 點擊延遲。 */
  touch-action: manipulation;
  font-family: var(--font-body, sans-serif);
  background-color: var(--color-bg, #fafafa);
  /* 細緻的點陣紙紋，取代純色平面背景，讓整體帶有紙本/護照的手感，
     不管切換到哪個地區主題都有一致的簽名質地 */
  background-image: radial-gradient(circle at 1px 1px, rgba(0, 0, 0, 0.05) 1px, transparent 0);
  background-size: 18px 18px;
  color: var(--color-text, #222);
  line-height: 1.7;
  letter-spacing: 0.01em;
  transition: background-color var(--transition);
  overflow-x: clip; /* 理由跟 html 那條一樣，見上面的註解——用 clip 才不會讓 sticky 失效 */
  overscroll-behavior-y: contain; /* 理由同上：關掉下拉重新整理，不要蓋住貼頂的按鈕 */
}

.container {
  max-width: 960px;
  margin: 0 auto;
  padding: var(--sp-5) var(--sp-3);
}

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    transition-duration: 0.01ms !important;
  }
}

/* =========================================================
   規劃畫面：海報 + 表單 分割版面
   ========================================================= */

.planner-split {
  display: grid;
  grid-template-columns: 340px 1fr;
  background: var(--color-surface, #fff);
  border-radius: var(--radius);
  overflow: hidden;
  box-shadow: var(--shadow);
  border: 1px solid var(--color-border, #eee);
}

/* ---- 左：3D 地球面板 ---- */
/* 地球 canvas 鋪滿整個面板，國名/地區文字浮在上層。
   函式庫或地圖資料載不到時 canvas 會被隱藏，自動退回純色海報版面。 */
.globe-panel {
  position: relative;
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  padding: var(--sp-4);
  min-height: 560px;
  overflow: hidden;
  transition: background-color var(--transition);
}

.poster-pattern {
  position: absolute;
  inset: 0;
  background-image: var(--pattern-bg, none);
  background-repeat: repeat;
  opacity: 0.8;
  pointer-events: none;
  /* 讓花紋以柔和方式疊在主色上：overlay 比 soft-light 在深色底上更明顯 */
  mix-blend-mode: overlay;
}

.globe-stage {
  position: absolute;
  inset: 0;
  z-index: 1;
}

.globe-stage.globe-unavailable { display: none; }

.globe-canvas {
  display: block;
  width: 100%;
  height: 100%;
  cursor: grab;
  /* pan-y：手機上直向滑動照樣捲頁面，橫向拖曳才轉地球 */
  touch-action: pan-y;
  opacity: 0;
  transition: opacity 600ms ease;
}

.globe-stage.globe-ready .globe-canvas { opacity: 1; }
.globe-canvas.is-dragging { cursor: grabbing; }

/* 游標停在有支援的國家上：換成手指，配合畫面上那層淡的預選色，
   讓「這顆球可以點」這件事在滑過去時就看得出來，不用先讀提示文字 */
.globe-canvas.is-pickable { cursor: pointer; }
.globe-canvas.is-pickable.is-dragging { cursor: grabbing; }

/* 文字層：不吃指標事件，才不會擋住地球的拖曳 */
.globe-head,
.globe-bottom {
  position: relative;
  z-index: 2;
  pointer-events: none;
}

.globe-head {
  text-shadow: 0 1px 14px color-mix(in srgb, var(--color-primary, #333) 80%, #000);
}

.globe-eyebrow {
  margin: 0 0 var(--sp-2);
  font-size: 0.66rem;
  letter-spacing: 0.35em;
  opacity: 0.72;
  font-weight: 600;
}

.poster-title {
  margin: 0;
  font-family: var(--font-heading, serif);
  font-size: 2.9rem;
  line-height: 1.12;
  letter-spacing: 0.06em;
  font-weight: 700;
}

.poster-sub {
  margin: var(--sp-2) 0 0;
  font-size: 0.9rem;
  opacity: 0.9;
  max-width: 230px;
  line-height: 1.75;
}

.globe-hint {
  margin: 0 0 var(--sp-2);
  font-size: 0.68rem;
  letter-spacing: 0.16em;
  opacity: 0;
  transition: opacity 400ms ease;
}

.globe-panel:has(.globe-stage.globe-ready) .globe-hint { opacity: 0.55; }

/* 點到沒支援的國家時，這行提示會暫時變成說明訊息 */
.globe-panel:has(.globe-stage.globe-ready) .globe-hint.is-alert {
  opacity: 1;
  color: var(--color-accent, #D9A441);
  letter-spacing: 0.08em;
}

.globe-foot {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: var(--sp-3);
}

.poster-foot {
  flex: 1;
  font-size: 0.68rem;
  letter-spacing: 0.3em;
  opacity: 0.7;
  border-top: 1px solid color-mix(in srgb, var(--color-on-primary, #fff) 30%, transparent);
  padding-top: var(--sp-3);
  font-weight: 600;
}

.globe-recenter {
  pointer-events: auto;
  flex: 0 0 auto;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  border: 1px solid color-mix(in srgb, var(--color-on-primary, #fff) 35%, transparent);
  background: color-mix(in srgb, var(--color-on-primary, #fff) 10%, transparent);
  color: var(--color-on-primary, #fff);
  font-size: 1rem;
  line-height: 1;
  cursor: pointer;
  transition: all var(--transition);
}

.globe-recenter:hover {
  background: color-mix(in srgb, var(--color-on-primary, #fff) 24%, transparent);
}

.globe-panel:has(.globe-stage.globe-unavailable) .globe-recenter { display: none; }

/* ---- 右：步驟式表單 ---- */
.planner-form {
  padding: var(--sp-5) var(--sp-5);
  display: flex;
  flex-direction: column;
  gap: var(--sp-4);
}

.form-step { }

.step-head {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  margin-bottom: var(--sp-3);
}

.step-no {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  border-radius: 50%;
  border: 1.5px solid var(--color-primary, #333);
  color: var(--color-primary, #333);
  font-size: 0.72rem;
  font-weight: 700;
  flex: 0 0 auto;
}

.step-head label {
  font-weight: 700;
  color: var(--color-text, #222);
  font-size: 0.95rem;
  letter-spacing: 0.04em;
}

.step-hint {
  font-weight: 400;
  font-size: 0.78rem;
  color: var(--color-muted);
  margin-left: var(--sp-2);
}

/* ---- 目的地搜尋（取代樹狀選單） ---- */
.dest-search-wrap { position: relative; }

.dest-search-input {
  width: 100%;
  padding: 14px 18px;
  border-radius: var(--radius-sm);
  border: 1.5px solid var(--color-border, #ccc);
  font-size: 1rem;
  font-family: inherit;
  background: var(--color-bg, #fafafa);
  color: var(--color-text, #222);
}

.dest-search-input:focus {
  outline: none;
  border-color: var(--color-primary, #333);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary, #333) 12%, transparent);
}

.dest-search-results {
  position: absolute;
  top: calc(100% + 6px);
  left: 0;
  right: 0;
  z-index: 20;
  background: var(--color-surface, #fff);
  border: 1.5px solid var(--color-border, #ddd);
  border-radius: var(--radius-sm);
  box-shadow: var(--shadow);
  max-height: 280px;
  overflow-y: auto;
}

.dest-search-item {
  width: 100%;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: var(--sp-2);
  padding: 11px var(--sp-3);
  border: none;
  border-bottom: 1px solid var(--color-border, #f0f0f0);
  background: transparent;
  cursor: pointer;
  font-family: inherit;
  text-align: left;
  transition: background var(--transition);
}

.dest-search-item:last-child { border-bottom: none; }
.dest-search-item:hover { background: color-mix(in srgb, var(--color-primary, #333) 5%, transparent); }

.dest-search-item-name { font-weight: 700; color: var(--color-text, #222); }
.dest-search-item-region {
  font-size: 0.76rem;
  color: var(--color-muted);
  background: var(--color-bg, #f0f0f0);
  padding: 2px 10px;
  border-radius: 999px;
}

.dest-search-empty {
  padding: var(--sp-3);
  font-size: 0.85rem;
  color: var(--color-muted);
}

/* ---- 熱門捷徑 chip ---- */
.dest-popular {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-2);
  margin-top: var(--sp-3);
}

.popular-chip {
  padding: 7px 18px;
  border-radius: 999px;
  border: 1.5px solid var(--color-border, #ddd);
  background: transparent;
  cursor: pointer;
  font-family: inherit;
  font-size: 0.85rem;
  color: var(--color-muted);
  transition: all var(--transition);
}

.popular-chip:hover {
  border-color: var(--color-primary, #333);
  color: var(--color-primary, #333);
}

/* ---- 已選定目的地徽章 ---- */
.dest-selected-pill {
  display: none;
  align-items: center;
  gap: var(--sp-2);
  width: 100%;
  padding: 12px var(--sp-3);
  border-radius: var(--radius-sm);
  border: 1.5px solid var(--color-primary, #333);
  background: color-mix(in srgb, var(--color-primary, #333) 6%, transparent);
  cursor: pointer;
  font-family: inherit;
  text-align: left;
  transition: all var(--transition);
}

.dest-selected-pill:hover { background: color-mix(in srgb, var(--color-primary, #333) 10%, transparent); }

.dest-city-panel {
  margin-top: var(--sp-4);
}

.dest-pill-region {
  font-size: 0.72rem;
  color: var(--color-muted);
  background: var(--color-surface, #fff);
  padding: 3px 10px;
  border-radius: 999px;
  border: 1px solid var(--color-border, #ddd);
}

.dest-pill-name {
  flex: 1;
  font-family: var(--font-heading, serif);
  font-weight: 700;
  font-size: 1.05rem;
  color: var(--color-primary, #333);
}

.dest-pill-change {
  font-size: 0.78rem;
  color: var(--color-muted);
}

/* ---- 城市 chip ---- */
.city-chip-row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-2);
}

.city-chip {
  padding: 7px 18px;
  border-radius: 999px;
  border: 1.5px solid var(--color-border, #ddd);
  background: transparent;
  cursor: pointer;
  font-family: inherit;
  font-size: 0.92rem;
  color: var(--color-text, #333);
  transition: all var(--transition);
}

.city-chip:hover { border-color: var(--color-primary, #333); }

/* 「更多城市」建議 chip 用虛線框跟精準模式的資料庫城市做區隔（提醒是 AI 知識模式） */
.city-chip.suggestion-chip { border-style: dashed; }

.city-chip.selected {
  background: var(--color-primary, #333);
  border-color: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
}

/* ---- 自由輸入提示（已合併進搜尋框，這裡只剩提示文字樣式） ---- */
.free-dest-note {
  margin: var(--sp-2) 0 0;
  padding: var(--sp-2) var(--sp-3);
  font-size: 0.78rem;
  color: var(--color-muted);
  line-height: 1.6;
  background: color-mix(in srgb, var(--color-accent, #d4a574) 10%, transparent);
  border-radius: var(--radius-sm);
}

/* 使用者在「我有想去的地方」自己指定、非資料庫候選清單的景點 */
.stop-userpick {
  display: inline-block;
  padding: 1px 7px;
  border-radius: 999px;
  font-size: 0.64rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  vertical-align: middle;
  color: color-mix(in srgb, var(--color-primary, #333) 75%, #000);
  background: color-mix(in srgb, var(--color-accent, #d4a574) 22%, transparent);
}

.stop-marker { background: none; border: none; }

/* 地圖上的編號圖釘（顏色由 JS 依天數帶進來） */
.stop-pin {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
  border-radius: 50%;
  border: 2px solid #fff;
  box-shadow: 0 2px 6px rgba(0, 0, 0, 0.35);
  color: #fff;
  font-size: 0.72rem;
  font-weight: 700;
  line-height: 1;
}

.stop-popup { font-size: 0.85rem; line-height: 1.7; }
.stop-popup-time { color: #666; font-size: 0.78rem; }
.stop-popup-intro { margin-top: 4px; }

.stop-marker-pin {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  border-radius: 50%;
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  font-weight: 700;
  font-size: 0.85rem;
  border: 2.5px solid #fff;
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.35);
  font-family: var(--font-heading, sans-serif);
}

.leaflet-popup-content { margin: 12px 14px; line-height: 1.5; }

.stop-popup { font-family: var(--font-body, sans-serif); font-size: 0.85rem; min-width: 160px; }
.stop-popup strong { color: var(--color-primary, #333); font-size: 0.95rem; }
.stop-popup-time { color: var(--color-muted); font-size: 0.78rem; margin-top: 2px; }
.stop-popup-intro { margin-top: 4px; }
.stop-popup-note { margin-top: 4px; color: var(--color-muted); font-size: 0.8rem; }
.stop-popup-links { margin-top: 6px; }
.stop-popup-links a { color: var(--color-primary, #333); font-weight: 600; text-decoration: none; }
.stop-popup-links a:hover { text-decoration: underline; }

/* 景點順序徽章（對應地圖上的編號） */
.stop-order {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  font-size: 0.7rem;
  font-weight: 700;
  margin-right: 6px;
  vertical-align: middle;
}

.stop-distance {
  margin: -6px 0 6px 30px;
  font-size: 0.76rem;
  color: var(--color-muted);
}

.skeleton-map { height: 200px; border-radius: 0; }

/* ---- 景點動作列（地圖 + 影片） ---- */
.stop-actions {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  margin-top: 10px;
  flex-wrap: wrap;
}

.yt-link {
  display: inline-block;
  border: 1px solid var(--color-border, #ddd);
  color: var(--color-muted);
  padding: 5px 16px;
  border-radius: 999px;
  font-size: 0.78rem;
  text-decoration: none;
  transition: all var(--transition);
}

.yt-link:hover {
  border-color: #c4302b;
  color: #c4302b;
}

.reco-name .yt-link {
  margin-left: var(--sp-2);
  padding: 2px 12px;
  font-size: 0.72rem;
}

/* ---- 天數 stepper ---- */
.stepper {
  display: inline-flex;
  align-items: center;
  gap: var(--sp-2);
}

.stepper-btn {
  width: 40px;
  height: 40px;
  border: 1.5px solid var(--color-border, #ccc);
  border-radius: 50%;
  background: transparent;
  color: var(--color-primary, #333);
  font-size: 1.2rem;
  cursor: pointer;
  transition: all var(--transition);
  line-height: 1;
}

.stepper-btn:hover {
  border-color: var(--color-primary, #333);
  background: color-mix(in srgb, var(--color-primary, #333) 6%, transparent);
}

.stepper input#days {
  width: 52px;
  text-align: center;
  border: none;
  background: transparent;
  font-size: 1.6rem;
  font-family: var(--font-heading, inherit);
  font-weight: 700;
  color: var(--color-text, #222);
  padding: 0;
}

.stepper input#days:focus { outline: none; }

.stepper-unit {
  font-size: 0.9rem;
  color: var(--color-muted);
}

/* ---- 興趣複選 ---- */
.checkbox-group {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-2);
}

.checkbox-group label {
  display: inline-flex;
  align-items: center;
  font-weight: 400;
  font-family: inherit;
  padding: 8px 20px;
  border-radius: 999px;
  border: 1.5px solid var(--color-border, #ddd);
  cursor: pointer;
  font-size: 0.9rem;
  color: var(--color-text, #333);
  transition: all var(--transition);
  user-select: none;
}

.checkbox-group label:hover { border-color: var(--color-primary, #333); }

.checkbox-group label:has(input:checked) {
  background: var(--color-primary, #333);
  border-color: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
}

.checkbox-group input {
  /* 隱藏原生勾選框，chip 本身的選取態就是狀態指示 */
  position: absolute;
  opacity: 0;
  pointer-events: none;
}

/* ---- 規劃方式：交給 AI vs. 自己有想去的地方 ---- */
.plan-mode-group {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: var(--sp-2);
}

.plan-mode-card {
  position: relative;
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 6px;
  padding: var(--sp-3);
  padding-right: 36px;
  border-radius: var(--radius-sm);
  border: 1.5px solid var(--color-border, #ddd);
  background: transparent;
  font-family: inherit;
  text-align: left;
  cursor: pointer;
  transition: all var(--transition);
}

.plan-mode-card:hover { border-color: var(--color-primary, #333); }

.plan-mode-card.selected {
  border-color: var(--color-primary, #333);
  background: color-mix(in srgb, var(--color-primary, #333) 10%, transparent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary, #333) 15%, transparent);
}

/* 選中的卡片右上角打勾，兩張卡的差異一眼就看得出來 */
.plan-mode-card.selected::after {
  content: "✓";
  position: absolute;
  top: 10px;
  right: 10px;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 19px;
  height: 19px;
  border-radius: 50%;
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  font-size: 0.66rem;
  font-weight: 700;
  line-height: 1;
}

.plan-mode-title {
  font-weight: 700;
  font-size: 0.95rem;
  color: var(--color-text, #222);
}

.plan-mode-card.selected .plan-mode-title { color: var(--color-primary, #333); }

.plan-mode-desc {
  font-size: 0.78rem;
  line-height: 1.6;
  color: var(--color-muted);
}

/* ---- 每晚住宿預算 ---- */
.budget-row {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
}

.budget-prefix,
.budget-suffix {
  font-size: 0.85rem;
  color: var(--color-muted);
}

.budget-input {
  width: 130px;
  padding: 9px 12px;
  border: 1.5px solid var(--color-border, #ccc);
  border-radius: var(--radius-sm);
  background: var(--color-surface, #fff);
  color: var(--color-text, #222);
  font-family: inherit;
  font-size: 0.95rem;
  font-variant-numeric: tabular-nums;
}

.budget-input:focus {
  outline: none;
  border-color: var(--color-primary, #333);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary, #333) 12%, transparent);
}

.budget-quick {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-top: var(--sp-2);
}

/* ---- 每一站的外部連結：表格獨立的「資源」欄（只有檢視模式看得到） ---- */
/* 連結直排，欄寬就是最寬那一顆的寬度：一般站只有一個 YouTube 圖示，
   住宿多一顆「房價」。 */
.sched-table .col-res { width: 62px; text-align: center; }
/* 手機上表頭允許換行（見 .sched-table thead th 的媒體查詢），但「資源」欄只有兩個字，
   換行會變成一字一行直排，所以這一欄固定不換行 */
.sched-table thead th.col-res { white-space: nowrap; }
.sched-res {
  padding: 6px 4px;
  vertical-align: top;
  text-align: center;
}
.sched-links {
  display: flex;
  flex-direction: column;
  align-items: stretch;   /* 每顆按鈕同寬，排成整齊的一直排 */
  gap: 3px;               /* 間距要小，不然住宿那一列會變得很高 */
}
.stop-link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  text-decoration: none;
  white-space: nowrap;
}
/* 全部只有圖示，各自放在一顆有外框的小按鈕裡：外框讓人一眼看出「這是可以按的」，
   而且三種圖示大小、顏色差很多，同樣的外框把它們整理成同一種東西。
   圖示維持各家原本的顏色與形狀，不調色、不降飽和——改變商標的顏色違反品牌規範。
   高度 26px 是手指點得到的下限，再矮就難點了。 */
.stop-link {
  box-sizing: border-box;
  min-height: 26px;
  padding: 3px 5px;
  line-height: 0;
  border: 1px solid var(--color-border, #ddd);
  border-radius: 8px;
  background: var(--color-surface, #fff);
  transition: background var(--transition), border-color var(--transition);
}
.stop-link:hover, .stop-link:focus-visible {
  background: color-mix(in srgb, var(--color-primary, #333) 7%, var(--color-surface, #fff));
  border-color: color-mix(in srgb, var(--color-primary, #333) 40%, transparent);
}

/* ---- 必訪清單 / 特別要求（自由輸入） ---- */
.must-visit-panel {
  margin-top: var(--sp-3);
  padding: var(--sp-3);
  border-radius: var(--radius-sm);
  border: 1px solid var(--color-border, #ddd);
  background: color-mix(in srgb, var(--color-primary, #333) 4%, transparent);
  animation: must-visit-in 240ms ease;
}

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

@keyframes must-visit-in {
  from { opacity: 0; transform: translateY(-4px); }
  to { opacity: 1; transform: none; }
}

.must-visit-label {
  display: block;
  font-size: 0.85rem;
  font-weight: 700;
  color: var(--color-text, #222);
  margin-bottom: var(--sp-2);
}

.must-visit-optional {
  font-weight: 400;
  font-size: 0.75rem;
  color: var(--color-muted);
}

/* 之前只在 HTML 用了這個 class，沒有對應樣式，「必填」跟旁邊的文字一樣灰、
   完全不顯眼——使用者很容易漏看，送出時才被擋下來才發現。
   用跟「可留空」相反的暖色調，才有「這個要注意」的視覺重量。 */
.must-visit-required {
  font-weight: 700;
  font-size: 0.95rem;
  line-height: 1;
  color: var(--color-secondary, #b3261e);
}

/* 視覺上藏起來、螢幕報讀器讀得到——星號本身對螢幕報讀器不夠明確，
   要留一份「（必填）」文字給輔助工具用。標準的 sr-only 寫法：
   不能用 display:none（報讀器也讀不到），要用裁切＋壓成 1px。 */
.sr-only {
  position: absolute;
  width: 1px;
  height: 1px;
  padding: 0;
  margin: -1px;
  overflow: hidden;
  clip: rect(0, 0, 0, 0);
  white-space: nowrap;
  border: 0;
}

/* 「三選一」規則的提示，放在整個面板最後一段，顏色跟必填標記呼應，
   但不用整段紅色——那是提示不是錯誤，錯誤要等使用者真的送出才報。 */
.must-visit-required-note { color: var(--color-secondary, #b3261e); }

.must-visit-input {
  width: 100%;
  padding: 12px 14px;
  border-radius: var(--radius-sm);
  border: 1.5px solid var(--color-border, #ccc);
  background: var(--color-surface, #fff);
  color: var(--color-text, #222);
  font-family: inherit;
  font-size: 0.92rem;
  line-height: 1.8;
  resize: vertical;
}

.must-visit-input:focus {
  outline: none;
  border-color: var(--color-primary, #333);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary, #333) 12%, transparent);
}

.must-visit-foot {
  display: flex;
  justify-content: flex-end;
  margin-top: 4px;
}

.must-visit-count {
  font-size: 0.72rem;
  color: var(--color-muted);
}

.must-visit-quick {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-top: var(--sp-2);
}

.quick-pref {
  padding: 5px 12px;
  border-radius: 999px;
  border: 1px dashed var(--color-border, #ddd);
  background: transparent;
  font-family: inherit;
  font-size: 0.78rem;
  color: var(--color-muted);
  cursor: pointer;
  transition: all var(--transition);
}

.quick-pref:hover {
  border-color: var(--color-primary, #333);
  color: var(--color-primary, #333);
}

.quick-pref.selected {
  border-style: solid;
  border-color: var(--color-primary, #333);
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
}

.must-visit-note {
  margin: var(--sp-2) 0 0;
  font-size: 0.75rem;
  line-height: 1.6;
  color: var(--color-muted);
}

/* 抵達／離開時刻：兩個並排的時間輸入，跟出發日期同一組視覺語言 */
.flight-time-row {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-3);
  margin-top: var(--sp-2);
}
/* 「我想要去的行程」欄位與它的快速偏好標籤後面緊接著就是出發日期那一排，
   多留一點距離，才看得出是兩組不同的東西 */
.must-visit-quick + .flight-time-row { margin-top: var(--sp-4); }
@media (max-width: 720px) {
  /* iOS Safari 對焦到字級小於 16px 的欄位時會自動放大整個頁面，讓使用者以為
     自己不小心縮放了、要手動調整才能繼續打字。這裡刻意用 !important：
     某些欄位在窄螢幕會因為排版理由被調得比 16px 小（例如表格欄位擠壓），
     但「不要觸發自動放大」的優先權必須贏過那些理由，所以直接蓋過去，
     不逐一去找每個欄位個別調整、以後新增欄位也不用記得加這條。 */
  input, textarea, select,
  [contenteditable="true"] {
    font-size: 16px !important;
  }
}

@media (max-width: 720px) {
  /* 原生 date/time 控制項在手機瀏覽器常有平台內建的最小寬度，
     跟 flex-wrap 的局部寬度算法搭不起來，會破版成「標籤跟輸入框各跑各的」。
     手機直接讓三個欄位各佔一整列，不用再跟原生控制項的寬度打游擊戰。 */
  .flight-time-row { flex-direction: column; }
  .flight-time-field, .flight-time-row > .start-date-field { min-width: 0; }
}
.flight-time-field {
  flex: 1;
  min-width: 120px;
  font-size: 0.8rem;
  color: var(--color-muted);
}
.flight-time-field > span { display: block; margin-bottom: 4px; }
.flight-time-field small {
  display: block;
  color: var(--color-muted-soft);
  font-size: 0.7rem;
}
/* 機場/車站名稱也套同一組樣式——文字輸入框沒有 date/time 那種原生渲染
   溢出的問題，跟其他兩種輸入框放進同一排在視覺上仍然是安全、一致的。 */
.flight-time-field input[type="time"],
.flight-time-field input[type="text"] {
  width: 100%;
  max-width: 100%;
  min-width: 0;
  box-sizing: border-box;
  /* 上一版用 min-width:0 沒解決，因為問題根本不是 flex 擠壓。
     真正原因：Safari 對 date/time 輸入框用完整的原生渲染（圖示＋分段文字都是
     WebKit 自己算版面），我們加的 padding 是疊加在它自己的內部間距之上，
     不是取代——所以就算容器寬度算對了，控制項本身畫出來還是比宣告的寬。
     拿掉原生外觀，讓它改用純 CSS 控制的版面，行為才會跟其他輸入框一致。
     代價：Safari 的行事曆/時鐘小圖示可能變得不明顯，但點擊整個欄位
     仍然會開啟原生的選擇器，功能不受影響。 */
  -webkit-appearance: none;
  appearance: none;
  /* iOS 已知問題：appearance:none 會連同瀏覽器原本幫控制項算的高度一起清掉。
     line-height 對這種原生分段控制項（年月日/時分各自是獨立的內部欄位）不夠可靠，
     Safari 不一定會照它算——實測拿掉外觀後變成細長一條，就是這個原因。
     改用明確的 min-height，並對齊同一個表單裡其他輸入框（.budget-input 一類）
     的實際高度，兩者才會是一致的設計語言，不是這裡特別矮或特別高。
     display: block 也一併設定：Safari 的原生時間/日期輸入框預設是
     inline-flex，跟 appearance:none 疊在一起時高度計算更不可預期。 */
  display: block;
  min-height: 38px;
  line-height: 1.4;
  padding: 8px 10px;
  border: 1px solid var(--color-border, #ddd);
  border-radius: var(--radius-sm);
  background: var(--color-surface, #fff);
  color: var(--color-text, #222);
  font-family: inherit;
  font-size: 0.85rem;
}

/* 登入按鈕下方的信任說明：只有確定沒登入才顯示（auth-checked 由 auth.js 在問完登入狀態後加上） */
.login-trust {
  display: none;
  margin: var(--sp-2) 0 0;
  text-align: center;
  font-size: 0.72rem;
  line-height: 1.6;
  color: var(--color-muted);
}
body.auth-checked:not(.signed-in) .login-trust { display: block; }

/* 「先看看範例」：安靜的文字連結，不跟主按鈕搶注意力 */
.sample-links {
  margin: var(--sp-3) 0 0;
  text-align: center;
  font-size: 0.8rem;
  line-height: 1.8;
  color: var(--color-muted);
  white-space: nowrap;   /* 手機上不可以斷成兩行 */
}
.sample-links a {
  color: var(--color-primary, #333);
  text-decoration: underline;
  text-underline-offset: 3px;
  white-space: nowrap;
}

/* 給陌生訪客的「開始規劃」入口（app.js 的 renderVisitorCta）：行程最下面一顆按鈕。
   不貼頂、不彈窗，只是把「下一步」放在看完之後。 */
.visitor-cta {
  display: flex;
  justify-content: center;
  margin: var(--sp-5) 0 var(--sp-3);
}
.visitor-cta-btn {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-height: 40px;
  padding: 0 var(--sp-4);
  border-radius: 999px;
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  font-size: 0.86rem;
  font-weight: 600;
  text-decoration: none;
  white-space: nowrap;
}
.visitor-cta-btn:hover, .visitor-cta-btn:focus-visible { filter: brightness(1.08); }
@media (max-width: 720px) {
  .visitor-cta-btn { width: 100%; }
}

/* ---- 送出按鈕 ---- */
.submit-btn {
  margin-top: var(--sp-2);
  padding: 16px;
  border: none;
  border-radius: var(--radius-sm);
  background-color: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  font-size: 1rem;
  font-weight: 700;
  cursor: pointer;
  font-family: var(--font-heading, inherit);
  letter-spacing: 0.15em;
  transition: all var(--transition);
}

.submit-btn:disabled { opacity: 0.6; cursor: not-allowed; }

.submit-btn:hover:not(:disabled) {
  filter: brightness(1.06);
  box-shadow: 0 8px 24px color-mix(in srgb, var(--color-primary, #333) 40%, transparent);
  transform: translateY(-1px);
}

/* ---- 狀態訊息 ---- */
.status-message {
  text-align: center;
  padding: var(--sp-3);
  color: var(--color-muted);
  font-size: 0.92rem;
}

/* 等待中的訊息會每秒改一次數字。用 tabular-nums 讓數字等寬，
   不然秒數從 9 跳到 10 時整行字會左右抖一下。 */
.status-message.waiting {
  font-variant-numeric: tabular-nums;
  color: var(--color-primary, #333);
}

.status-message.error { color: #b3261e; }

/* =========================================================
   行程結果
   ========================================================= */

#itinerary-section { animation: fade-in-up 400ms ease; }

@keyframes fade-in-up {
  from { opacity: 0; transform: translateY(10px); }
  to { opacity: 1; transform: translateY(0); }
}

/* ---- Hero Banner ---- */
.hero-banner {
  position: relative;
  height: 260px;
  border-radius: var(--radius);
  background-size: cover;
  background-position: center;
  margin-bottom: var(--sp-4);
  display: flex;
  flex-direction: column;
  justify-content: flex-end;
  padding: var(--sp-4);
  overflow: hidden;
  box-shadow: var(--shadow);
}

.hero-city {
  font-family: var(--font-heading, serif);
  color: #fff;
  font-size: 2.4rem;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-shadow: 0 2px 12px rgba(0, 0, 0, 0.45);
}

.hero-credit {
  color: rgba(255, 255, 255, 0.7);
  font-size: 0.68rem;
  margin-top: 4px;
  text-decoration: none;
}

.hero-credit:hover { text-decoration: underline; }

/* ---- 工具列：行程摘要徽章 ---- */
.itinerary-toolbar {
  margin-bottom: var(--sp-2);
}

.trip-summary {
  display: flex;
  gap: var(--sp-2);
  flex-wrap: wrap;
}

.trip-summary:empty { display: none; }

.cache-badge {
  display: inline-block;
  font-size: 0.75rem;
  color: var(--color-muted);
  background: var(--color-surface, #f0f0f0);
  padding: 3px 12px;
  border-radius: 999px;
  border: 1px solid var(--color-border, #eee);
}

/* ---- 操作按鈕：收合／編輯／地圖／匯出／複製連結 ----
   貼頂固定，捲到行程再深也按得到。跟編輯工具列同一招（見下方編輯模式表格
   那段的說明）：overflow 用 clip 才不會讓 sticky 失效，這裡不重複解釋。
   寬度不夠放五顆按鈕時**不換行**——換行會變成不平均的「3+2」兩排，
   任何寬度都一樣醜。改成單行、放不下就整條橫向捲動（捲軸自己藏起來），
   不管視窗多寬都是同一種排法，這樣才算「自適應」而不是「看寬度賭運氣」。 */
.toolbar-actions {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--sp-2);
  flex-wrap: nowrap;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
  scrollbar-width: none;
  /* 平常沒有底色、框線、陰影，按鈕直接坐在頁面上。
     捲到貼頂、壓在行程內容上面時，JS 會加上 .is-stuck（見 itinerary-renderer.js
     的 bindToolbarStuck），這時才長出半透明底＋模糊，讓按鈕不會跟底下的文字混在一起。
     框線先留成透明色而不是拿掉，出現時才不會多出 2px 造成版面跳動。 */
  background: transparent;
  border: 1px solid transparent;
  border-radius: var(--radius-sm);
  transition: background var(--transition), border-color var(--transition), box-shadow var(--transition);
  padding: 5px var(--sp-2);
  margin-bottom: var(--sp-3);
  position: sticky;
  /* 手機瀏覽器在畫面最頂端常有自己的一層東西（狀態列、Safari 的半透明
     工具列、下拉手勢的殘影）蓋住太貼齊頂端的內容——稍微往下留一點距離，
     不要卡在正好 0 的位置。 */
  top: var(--sp-4, 24px);
  z-index: 50;
}

.toolbar-actions.is-stuck {
  background: color-mix(in srgb, var(--color-surface, #fff) 75%, transparent);
  backdrop-filter: blur(10px) saturate(1.3);
  -webkit-backdrop-filter: blur(10px) saturate(1.3);
  border-color: var(--color-border, #eee);
  box-shadow: var(--shadow-sm);
}

.toolbar-sentinel { height: 0; margin: 0; padding: 0; pointer-events: none; }
.toolbar-actions::-webkit-scrollbar { display: none; }

/* 不支援 backdrop-filter 的瀏覽器：半透明但沒有模糊，捲動內容穿透
   會很花，退回原本的不透明白底比較安全 */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .toolbar-actions.is-stuck { background: var(--color-surface, #fff); }
}

/* 圖示按鈕：編輯／複製連結／重新規劃／規劃我自己的行程 共用樣式 */
.icon-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  flex: 0 0 auto;
  border-radius: 50%;
  border: 1.5px solid var(--color-primary, #333);
  background: transparent;
  color: var(--color-primary, #333);
  cursor: pointer;
  font-size: 1.05rem;
  text-decoration: none;
  transition: all var(--transition);
}

.icon-btn:hover {
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  transform: translateY(-1px);
}

/* 返回總覽：文字按鈕（跟其他圖示按鈕放在同一排，但需要文字說明用途） */
.map-back-btn {
  display: inline-flex;
  align-items: center;
  height: 40px;
  padding: 0 18px;
  border-radius: 999px;
  border: 1.5px solid var(--color-primary, #333);
  background: transparent;
  color: var(--color-primary, #333);
  cursor: pointer;
  font-size: 0.85rem;
  font-family: inherit;
  font-weight: 600;
  white-space: nowrap;
  flex: 0 0 auto;
  transition: all var(--transition);
}

.map-back-btn:hover {
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  transform: translateY(-1px);
}

/* ---- 行程／匯率／實用資訊 分頁：一整排滿版的頁籤，不是個別按鈕 ----
   外層淺底＋圓角當「軌道」，每個分頁等寬平分、貼著彼此，中選的那個
   浮起來變成主色實心——這是很多 app 常見的分段式頁籤（segmented control）
   長相，比原本一顆顆分開的圓角按鈕更像「這是同一組、互斥的檢視選項」。 */
.day-tabs {
  display: flex;
  width: 100%;
  gap: 4px;
  background: var(--color-surface, #f0f0f0);
  border: 1px solid var(--color-border, #eee);
  border-radius: var(--radius-sm);
  padding: 4px;
  margin-bottom: var(--sp-3);
}

.day-tab {
  flex: 1;
  text-align: center;
  white-space: nowrap;
  padding: 10px 12px;
  border-radius: calc(var(--radius-sm) - 3px);
  border: none;
  background: transparent;
  color: var(--color-muted);
  font-family: var(--font-heading, inherit);
  font-weight: 700;
  cursor: pointer;
  font-size: 0.88rem;
  transition: all var(--transition);
  letter-spacing: 0.03em;
}

.day-tab:hover { color: var(--color-text, #333); }

.day-tab.active {
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  box-shadow: var(--shadow-sm);
}

/* ---- 每日面板：顯示切換 + 卡片外觀 ---- */
.day-panel { display: none; }

.day-panel.active {
  display: block;
  animation: fade-in-up 300ms ease;
}

.day-panel {
  background: var(--color-surface, #fff);
  /* 跟上面 .day-tabs／.toolbar-actions 統一用同一個圓角（radius-sm），
     原本這裡用比較大的 --radius，行程表卡片的圓角明顯比頁籤、功能列更圓，
     三個疊在一起看起來像不同套元件。 */
  border-radius: var(--radius-sm);
  box-shadow: var(--shadow);
  margin-bottom: var(--sp-3);
  overflow: hidden;
  border: 1px solid var(--color-border, #eee);
}

.day-header {
  background: var(--day-color, var(--color-primary, #555));
  color: var(--color-on-primary, #fff);
  padding: var(--sp-3) var(--sp-4);
  display: flex;
  align-items: baseline;
  gap: var(--sp-2);
  position: relative;
  overflow: hidden;
}

.day-header::after {
  /* 讓每日標頭也帶一點國家花紋，延續海報語言 */
  content: "";
  position: absolute;
  inset: 0;
  background-image: var(--pattern-bg, none);
  background-repeat: repeat;
  opacity: 0.35;
  mix-blend-mode: soft-light;
  pointer-events: none;
}

.day-number {
  font-family: var(--font-heading, serif);
  font-size: 1.1rem;
  font-weight: 700;
  white-space: nowrap;
  letter-spacing: 0.06em;
  position: relative;
}

.day-theme {
  margin: 0;
  font-size: 0.95rem;
  font-weight: 400;
  opacity: 0.95;
  position: relative;
}

/* ---- 時間軸 ---- */
.timeline { padding: var(--sp-4); }

.stop {
  display: grid;
  grid-template-columns: 92px 1fr;
  gap: var(--sp-3);
  padding: var(--sp-3) 0;
  border-left: 2px solid var(--color-accent, #ccc);
  padding-left: var(--sp-3);
  margin-left: 4px;
  position: relative;
}

.stop::before {
  content: "";
  position: absolute;
  left: -7px;
  top: 22px;
  width: 12px;
  height: 12px;
  border-radius: 50%;
  background-color: var(--color-accent, #ccc);
  border: 2.5px solid var(--color-surface, #fff);
}

.stop-time {
  font-family: var(--font-heading, serif);
  font-size: 0.82rem;
  color: var(--color-muted);
  white-space: nowrap;
  padding-top: 3px;
  font-weight: 600;
}

.stop-content h4 {
  margin: 0 0 4px;
  color: var(--color-primary, #333);
  font-size: 1.08rem;
}

.stop-name-en {
  display: inline-block;
  margin-left: 6px;
  font-size: 0.78rem;
  font-weight: 400;
  font-style: italic;
  color: var(--color-muted);
}

.stop-popup-name-en {
  font-size: 0.78rem;
  font-style: italic;
  color: var(--color-muted);
  margin-top: -2px;
}

.stop-icon { margin-right: 4px; }

.stop-intro {
  margin: 2px 0 6px;
  font-size: 0.87rem;
  color: var(--color-text, #444);
  opacity: 0.85;
  line-height: 1.6;
}

.stop-transport, .stop-note {
  margin: 3px 0;
  font-size: 0.87rem;
  color: var(--color-text, #444);
}

.stop-transport { opacity: 0.7; }

/* ---- 🗺️ 行程地圖＋當天行程（合一分頁） ---- */
.combo-panel {
  overflow: visible;
  background: none;
  border: none;
  box-shadow: none;
  border-radius: 0;
  margin-bottom: 0;
}

.combo-map {
  /* full-bleed：讓地圖撐滿整個瀏覽器寬度，不受 .container 最大寬度與留白限制 */
  width: 100vw;
  position: relative;
  left: 50%;
  right: 50%;
  margin-left: -50vw;
  margin-right: -50vw;
  /* 高度改用 JS 量測工具列位置後算出的剩餘可視高度，精準貼齊視窗底部，
     不會再有桌面版多一條捲軸、手機版留白的問題；var 找不到時退回 62vh */
  height: var(--dynamic-panel-height, 62vh);
  min-height: 480px;
  z-index: 0;
}

.combo-schedule {
  border-top: 1px solid var(--color-border, #eee);
}

.combo-schedule:empty { border-top: none; }

/* 天數群組標記（總覽狀態，一天一顆，點了才展開成個別景點） */
.day-cluster-marker { background: none; border: none; }

.day-cluster-pin {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 58px;
  height: 58px;
  border-radius: 50%;
  background: var(--color-surface, #fffdf8);
  color: var(--pin-color, var(--color-primary, #333));
  font-weight: 700;
  font-size: 0.8rem;
  letter-spacing: 0.03em;
  text-transform: uppercase;
  /* 雙圈虛線邊框 + 隨機微旋轉，模擬護照戳章手蓋的隨性感，
     跟一般旅遊 App 常見的純色圓點/水滴標記做出區隔 */
  border: 2px dashed var(--pin-color, var(--color-primary, #333));
  outline: 1px solid var(--pin-color, var(--color-primary, #333));
  outline-offset: 3px;
  box-shadow: 0 3px 10px rgba(0, 0, 0, 0.25);
  font-family: var(--font-heading, sans-serif);
  cursor: pointer;
  transform: rotate(var(--pin-rotate, -4deg));
  line-height: 1.2;
}

/* 移除 Leaflet 內建的 +/- 縮放按鈕 */
.leaflet-control-zoom { display: none !important; }

/* ---- 當天行程彈跳視窗 ---- */
body.modal-open { overflow: hidden; }

.day-modal-overlay {
  position: fixed;
  inset: 0;
  z-index: 3000;
  background: rgba(20, 16, 12, 0.55);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: var(--sp-3);
}

.day-modal-overlay.hidden { display: none; }

.day-modal-card {
  position: relative;
  background: var(--color-surface, #fff);
  border-radius: var(--radius);
  width: 100%;
  max-width: 640px;
  max-height: 85vh;
  /* 卡片本身不捲動，改由 .day-modal-body 捲動——
     Safari 對「捲動容器裡的絕對定位子元素」常有合成層 bug，導致關閉按鈕
     捲動後消失；讓關閉按鈕留在不捲動的卡片層，才能確保它一直看得到 */
  overflow: hidden;
  box-shadow: var(--shadow-hover);
  animation: fade-in-up 220ms ease;
  display: flex;
  flex-direction: column;
}

.day-modal-close {
  position: absolute;
  top: var(--sp-2);
  right: var(--sp-2);
  width: 34px;
  height: 34px;
  border-radius: 50%;
  border: none;
  background: rgba(0, 0, 0, 0.45);
  color: #fff;
  font-size: 0.9rem;
  cursor: pointer;
  z-index: 10;
  transition: background var(--transition);
  /* 強制建立獨立的合成層，避開 Safari 在 overflow 容器內對絕對定位元素的渲染問題 */
  transform: translateZ(0);
  -webkit-transform: translateZ(0);
}

.day-modal-close:hover { background: rgba(0, 0, 0, 0.7); }

.day-modal-body .day-header {
  padding-right: calc(var(--sp-4) + 42px);
}

.day-modal-body {
  overflow-y: auto;
  -webkit-overflow-scrolling: touch;
  flex: 1;
}

@media (max-width: 720px) {
  .day-modal-card { max-height: 90vh; }
}

/* ---- 每日 Leaflet 地圖 ---- */
.day-map {
  height: 300px;
  border-bottom: 1px solid var(--color-border, #eee);
  z-index: 0;
}

.map-empty {
  padding: var(--sp-4);
  text-align: center;
  color: var(--color-muted);
  font-size: 0.85rem;
  margin: 0;
}






/* ---- 住宿 / 餐廳推薦 ---- */
.reco-section { padding: 0 var(--sp-4) var(--sp-4); }

.reco-heading {
  margin: 0 0 var(--sp-2);
  font-family: var(--font-heading, serif);
  color: var(--color-primary, #333);
  font-size: 0.95rem;
  letter-spacing: 0.04em;
}

.reco-card {
  border: 1px solid var(--color-border, #eee);
  border-left: 3px solid var(--color-accent, #ccc);
  border-radius: var(--radius-sm);
  padding: var(--sp-2) var(--sp-3);
  margin-bottom: var(--sp-2);
  background: color-mix(in srgb, var(--color-bg, #f7f7f7) 55%, var(--color-surface, #fff));
}

.reco-name { margin: 0 0 2px; font-weight: 700; color: var(--color-text, #222); font-size: 0.92rem; }
.reco-meta { margin: 0 0 3px; font-size: 0.8rem; color: var(--color-muted); }
.reco-desc { margin: 0; font-size: 0.83rem; color: var(--color-text, #444); opacity: 0.85; }

.booking-btn {
  display: inline-block;
  margin-top: var(--sp-2);
  padding: 7px 18px;
  border-radius: 999px;
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  font-size: 0.78rem;
  font-weight: 600;
  text-decoration: none;
  transition: all var(--transition);
}

.booking-btn:hover { filter: brightness(1.1); transform: translateY(-1px); }

.booking-btn.secondary {
  background: transparent;
  border: 1px solid var(--color-border, #ccc);
  color: var(--color-muted);
}

.booking-btn.secondary:hover { border-color: var(--color-primary, #333); color: var(--color-primary, #333); }

.transport-card { border-left-color: var(--color-muted); }

.reco-caveat {
  margin: 6px 0 0;
  font-size: 0.72rem;
  color: var(--color-muted);
}

/* ---- 匯率換算分頁 ---- */
.currency-body { padding: var(--sp-4); }

.currency-rate {
  margin: 0 0 var(--sp-3);
  font-family: var(--font-heading, serif);
  font-size: 1.05rem;
  color: var(--color-primary, #333);
}

.currency-inputs {
  display: flex;
  align-items: flex-end;
  gap: var(--sp-2);
  flex-wrap: wrap;
  margin-bottom: var(--sp-3);
}

.currency-field {
  display: flex;
  flex-direction: column;
  gap: 4px;
  flex: 1;
  min-width: 140px;
}

.currency-field span {
  font-size: 0.78rem;
  color: var(--color-muted);
  font-weight: 600;
}

.currency-field input {
  padding: 12px 14px;
  border-radius: var(--radius-sm);
  border: 1.5px solid var(--color-border, #ccc);
  font-size: 1.2rem;
  font-family: var(--font-heading, inherit);
  font-weight: 700;
  color: var(--color-text, #222);
  background: var(--color-bg, #fafafa);
  width: 100%;
}

.currency-field input:focus {
  outline: none;
  border-color: var(--color-primary, #333);
}

.currency-swap {
  font-size: 1.2rem;
  color: var(--color-muted);
  padding-bottom: 12px;
}

.currency-quick {
  display: flex;
  gap: var(--sp-2);
  flex-wrap: wrap;
  margin-bottom: var(--sp-2);
}

/* ---- 編輯模式 ---- */
/* 編輯／儲存合併成 .toolbar-actions 裡同一顆按鈕的兩個狀態，貼頂固定的樣式
   定義在上面「操作按鈕」那段，這裡不用再重複一份。 */


.stop-delete {
  display: none;
  position: absolute;
  top: 8px;
  right: 0;
  width: 26px;
  height: 26px;
  border-radius: 50%;
  border: 1.5px solid #c0392b;
  background: transparent;
  color: #c0392b;
  cursor: pointer;
  font-size: 0.8rem;
  line-height: 1;
  transition: all var(--transition);
}

.stop-delete:hover { background: #c0392b; color: #fff; }

/* ---- 實用資訊 ---- */
.practical-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));
  gap: var(--sp-3);
  padding: var(--sp-4);
}

.practical-card h4 {
  margin: 0 0 var(--sp-2);
  font-family: var(--font-heading, serif);
  color: var(--color-primary, #333);
  font-size: 0.92rem;
}

.practical-card ul { margin: 0; padding-left: 1.1em; }

.practical-card li {
  font-size: 0.83rem;
  color: var(--color-text, #444);
  margin-bottom: 6px;
  line-height: 1.55;
}

.practical-disclaimer {
  margin: 0 var(--sp-4) var(--sp-4);
  font-size: 0.75rem;
  color: var(--color-muted);
  border-top: 1px solid var(--color-border, #eee);
  padding-top: var(--sp-2);
}

/* ---- 行李 ----
   打包清單的結構參考百岳地圖的登山準備清單：分類卡片 + 勾選 + 每項重量 + 總重統計。
   顏色全部走主題變數，不寫死。 */
.lug-body { padding: var(--sp-4); display: flex; flex-direction: column; gap: var(--sp-4); }

/* 可收合區塊（推薦卡與每個分類）：用原生 <details>，鍵盤與螢幕閱讀器免費支援。 */
.lug-fold > summary { list-style: none; cursor: pointer; }
.lug-fold > summary::-webkit-details-marker { display: none; }
.lug-fold-head { display: flex; align-items: center; gap: 8px; }
.lug-fold-head:focus-visible { outline: 2px solid var(--color-primary, #333); outline-offset: 3px; border-radius: 4px; }
.lug-chev {
  flex: 0 0 auto;
  width: 8px; height: 8px;
  border-right: 2px solid var(--color-muted);
  border-bottom: 2px solid var(--color-muted);
  transform: rotate(-45deg);
  transition: transform var(--transition);
  margin: 0 2px;
}
.lug-fold[open] > .lug-fold-head .lug-chev { transform: rotate(45deg); }

.lug-reco {
  padding: var(--sp-3) var(--sp-4);
  border: 1px solid var(--color-border, #eee);
  border-radius: var(--radius-sm);
  background: color-mix(in srgb, var(--color-primary, #333) 5%, var(--color-surface, #fff));
}
.lug-reco-title {
  flex: 1 1 auto;
  font-family: var(--font-heading, serif);
  font-size: 1.05rem;
  font-weight: 700;
  color: var(--color-primary, #333);
}
.lug-reco-list {
  margin: var(--sp-2) 0 0;
  padding: 0 0 0 1.3em;
  display: grid;
  gap: 6px;
  list-style: disc;
}
.lug-reco-list li { font-size: 0.83rem; line-height: 1.6; color: var(--color-text, #444); padding-left: 2px; }
.lug-reco-list li::marker { color: var(--color-primary, #333); }
.lug-reco-list b { color: var(--color-muted); font-weight: 600; }

.lug-meter { display: grid; gap: 6px; }
.lug-meter-head { display: flex; justify-content: space-between; gap: var(--sp-2); flex-wrap: wrap; font-size: 0.82rem; }
.lug-weight { font-weight: 700; color: var(--color-text, #333); }
.lug-progress { color: var(--color-muted); font-variant-numeric: tabular-nums; }
.lug-bar { height: 8px; border-radius: 99px; background: color-mix(in srgb, var(--color-text, #222) 8%, transparent); overflow: hidden; }
.lug-bar-fill { height: 100%; border-radius: 99px; transition: width var(--transition), background var(--transition); }
.lug-bar-fill.is-ok { background: #3f9b6b; }
.lug-bar-fill.is-near { background: #d99a2b; }
.lug-bar-fill.is-over { background: #c0392b; }
.lug-meter-hint { margin: 0; font-size: 0.76rem; color: var(--color-muted); }
.lug-sync { margin: 0; font-size: 0.72rem; color: var(--color-muted); }
.lug-sync[hidden] { display: none; }

.lug-cats { display: grid; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); gap: var(--sp-3); align-items: start; }
.lug-cat {
  border: 1px solid var(--color-border, #eee);
  border-radius: var(--radius-sm);
  padding: var(--sp-3);
  background: var(--color-surface, #fff);
}
.lug-cat-title { flex: 1 1 auto; min-width: 0; font-family: var(--font-heading, serif); font-size: 0.92rem; font-weight: 700; color: var(--color-primary, #333); }
.lug-cat-count { flex: 0 0 auto; font-size: 0.74rem; color: var(--color-muted); font-variant-numeric: tabular-nums; }
.lug-toggle-all {
  flex: 0 0 auto;
  padding: 3px 10px;
  border: 1px solid var(--color-border, #ddd);
  border-radius: 999px;
  background: transparent;
  color: var(--color-muted);
  font-family: inherit;
  font-size: 0.72rem;
  cursor: pointer;
  white-space: nowrap;
  transition: all var(--transition);
}
.lug-toggle-all:hover:not(:disabled) { border-color: var(--color-primary, #333); color: var(--color-primary, #333); }
.lug-toggle-all:disabled { opacity: 0.4; cursor: default; }
.lug-cat .lug-list { margin-top: var(--sp-2); }
.lug-list { list-style: none; margin: 0; padding: 0; }
.lug-item { display: flex; align-items: flex-start; gap: 6px; padding: 7px 0; border-top: 1px solid var(--color-border, #f0f0f0); }
.lug-item:first-child { border-top: none; }
.lug-check { flex: 1; min-width: 0; display: flex; gap: 8px; align-items: flex-start; cursor: pointer; }
.lug-check input { margin-top: 3px; width: 17px; height: 17px; flex: 0 0 auto; accent-color: var(--color-primary, #333); }
.lug-name { font-size: 0.85rem; line-height: 1.45; color: var(--color-text, #333); }
.lug-name small { display: block; margin-top: 1px; font-size: 0.72rem; color: var(--color-muted); }
.lug-check input:checked + .lug-name { color: var(--color-muted); text-decoration: line-through; }
.lug-w { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 2px; }
.lug-w em { font-style: normal; font-size: 0.7rem; color: var(--color-muted); }
.lug-w-input {
  width: 58px; padding: 3px 4px; text-align: right;
  border: 1px solid var(--color-border, #ddd); border-radius: var(--field-radius, 6px);
  background: var(--color-surface, #fff); color: var(--color-text, #222);
  font-family: inherit; font-size: 0.78rem; font-variant-numeric: tabular-nums;
}
.lug-w-input:focus { outline: none; border-color: var(--color-primary, #333); }
.lug-del { flex: 0 0 auto; width: 24px; height: 24px; border: none; border-radius: 50%; background: transparent; color: var(--color-muted-soft); font-size: 0.72rem; cursor: pointer; }
.lug-del:hover { background: rgba(0, 0, 0, 0.06); color: var(--color-text, #222); }

.lug-add { display: flex; flex-wrap: wrap; gap: 6px; margin-top: var(--sp-2); padding-top: var(--sp-2); border-top: 1px dashed var(--color-border, #e5e5e5); }
.lug-add input {
  padding: 6px 10px; border: 1px solid var(--color-border, #ddd); border-radius: var(--field-radius, 6px);
  background: var(--color-surface, #fff); color: var(--color-text, #222); font-family: inherit; font-size: 0.82rem;
}
.lug-add input:focus { outline: none; border-color: var(--color-primary, #333); }
.lug-add-name { flex: 1 1 120px; min-width: 0; }
.lug-add-w { width: 84px; }
.lug-add-btn {
  padding: 6px 12px; border: none; border-radius: var(--field-radius, 6px);
  background: var(--color-primary, #333); color: var(--color-on-primary, #fff);
  font-family: inherit; font-size: 0.8rem; cursor: pointer; white-space: nowrap;
}

/* 重設清單：放在彩色標頭的右上角，所以是半透明白框、字色跟著標頭走。
   .day-header 有花紋疊層（::after），按鈕要 relative 才會浮在上面。 */
.luggage-panel .day-header { align-items: center; }
.lug-reset {
  position: relative;
  margin-left: auto;
  flex: 0 0 auto;
  padding: 5px 12px;
  border: 1px solid color-mix(in srgb, currentColor 55%, transparent);
  border-radius: 999px;
  background: transparent;
  color: inherit;
  font-family: inherit;
  font-size: 0.76rem;
  cursor: pointer;
  white-space: nowrap;
  transition: background var(--transition);
}
.lug-reset:hover { background: color-mix(in srgb, currentColor 18%, transparent); }
.lug-reset:focus-visible { outline: 2px solid currentColor; outline-offset: 2px; }

@media (max-width: 720px) {
  .lug-body { padding: var(--sp-3); }
  .lug-cats { grid-template-columns: 1fr; }
  .lug-reco { padding: var(--sp-2) var(--sp-3); }
  /* 手機版的彩色標頭原本是直排（見 .day-header 的行動版規則），行李頁要維持橫排才放得下右上角的按鈕 */
  .luggage-panel .day-header { flex-direction: row; align-items: center; gap: var(--sp-2); padding: var(--sp-2) var(--sp-3); }
}

/* 台灣山區行程才會出現的單一推薦（luggage.js）。低調、可關閉。 */
.lug-promo {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 12px;
  border: 1px dashed color-mix(in srgb, var(--color-primary, #333) 35%, transparent);
  border-radius: var(--radius-sm);
  background: color-mix(in srgb, var(--color-primary, #333) 5%, transparent);
  font-size: 0.78rem;
  line-height: 1.6;
  color: var(--color-muted);
}
.lug-promo-text { flex: 1 1 auto; min-width: 0; }
.lug-promo-text b { color: var(--color-text, #222); margin-right: 4px; }
.lug-promo-link {
  flex: 0 0 auto;
  padding: 6px 12px;
  border-radius: 999px;
  border: 1px solid var(--color-primary, #333);
  color: var(--color-primary, #333);
  font-size: 0.76rem;
  text-decoration: none;
  white-space: nowrap;
}
.lug-promo-link:hover { background: var(--color-primary, #333); color: var(--color-on-primary, #fff); }
.lug-promo-x {
  flex: 0 0 auto;
  width: 24px; height: 24px;
  border: none; border-radius: 50%;
  background: transparent; color: var(--color-muted-soft);
  font-size: 0.72rem; cursor: pointer;
}
.lug-promo-x:hover { background: rgba(0, 0, 0, 0.06); color: var(--color-text, #222); }
@media (max-width: 720px) {
  .lug-promo { flex-wrap: wrap; }
  .lug-promo-text { flex-basis: 100%; }
}

/* ---- 骨架屏 ---- */
.skeleton {
  background: linear-gradient(
    100deg,
    var(--color-border, #e0e0e0) 30%,
    color-mix(in srgb, var(--color-border, #e0e0e0) 40%, white) 50%,
    var(--color-border, #e0e0e0) 70%
  );
  background-size: 200% 100%;
  animation: skeleton-shimmer 1.4s ease-in-out infinite;
  border-radius: 6px;
}

@keyframes skeleton-shimmer {
  0% { background-position: 150% 0; }
  100% { background-position: -50% 0; }
}

.skeleton-tab { width: 76px; height: 36px; border-radius: 999px; flex: 0 0 auto; }
.skeleton-header { height: 56px; border-radius: 0; }
.skeleton-time { width: 70px; height: 14px; margin-top: 4px; }
.skeleton-title { width: 60%; height: 18px; margin-bottom: 8px; }
.skeleton-line { width: 90%; height: 12px; margin-bottom: 6px; }
.skeleton-line.short { width: 50%; }

/* =========================================================
   行程表：每天一個 Toggle List，內容是「時段 | 活動內容」兩欄表格
   ========================================================= */

.schedule-panel {
  display: none;
  flex-direction: column;
  gap: var(--sp-2);
}

.schedule-panel.active { display: flex; }

/* ---- 工具列按鈕：文字為主（五顆按鈕現在都不帶 icon），
   用字重＋陰影＋懸浮位移做出質感，而不是靠圖示辨識 ---- */
.tool-btn {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 8px 16px;
  /* 跟 .toolbar-actions／.day-tabs／.day-panel 統一用同一個圓角，原本
     這裡是完整的膠囊形（999px），跟其他方形圓角的卡片放在一起看起來
     像不同套件混搭。 */
  border-radius: var(--radius-sm);
  border: 1px solid var(--color-border, #ddd);
  background: var(--color-surface, #fff);
  color: var(--color-text, #333);
  font-family: var(--font-heading, inherit);
  font-weight: 600;
  font-size: 0.82rem;
  line-height: 1.2;
  cursor: pointer;
  text-decoration: none;
  white-space: nowrap;
  box-shadow: var(--shadow-sm);
  transition: all var(--transition);
}

.tool-btn:hover {
  border-color: color-mix(in srgb, var(--color-primary, #333) 55%, transparent);
  color: var(--color-primary, #333);
  background: color-mix(in srgb, var(--color-primary, #333) 6%, transparent);
  transform: translateY(-1px);
  box-shadow: var(--shadow);
}

.tool-btn:active { transform: translateY(0); }

.tool-btn.active,
.tool-btn[aria-pressed="true"] {
  background: var(--color-primary, #333);
  border-color: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
}


/* ---- 每日 Toggle ---- */
.day-toggle {
  border: 1px solid var(--color-border, #e5e5e5);
  border-radius: var(--radius-sm);
  background: var(--color-surface, #fff);
  overflow: hidden;
  box-shadow: var(--shadow-sm);
}

/* 收合列整條上色。以前是每天一個寫死的對比色（紅/藍綠/綠/桃紅…），一份行程排下來
   像調色盤，跟主題也搭不起來。改成統一用主題主色，只讓相鄰兩天有一點明度差，
   看得出分界又不吵。 */
.day-toggle-head {
  position: relative;
  overflow: hidden;
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  width: 100%;
  padding: 10px var(--sp-3);
  border: none;
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  font-family: inherit;
  text-align: left;
  cursor: pointer;
  transition: filter var(--transition);
}

/* 大型的半透明數字，疊在標題列底色上，用的是資料本來就有的天數（button 上
   跟 .day-toggle 同步鏡一份 data-day，attr() 只讀得到同一個元素身上的屬性），
   不是額外的裝飾圖案。字體沿用該主題自己的標題字（--font-heading，25 個主題
   各自不同的襯線/黑體），等於免費多用一次已經存在、但平常只出現在小徽章上的
   品牌資產。opacity 壓得夠低，不會跟旁邊的文字打架。 */
.day-toggle-head::before {
  content: attr(data-day);
  position: absolute;
  right: var(--sp-2);
  top: 50%;
  transform: translateY(-50%);
  font-family: var(--font-heading, serif);
  font-weight: 700;
  font-size: 2.6rem;
  line-height: 1;
  color: var(--color-on-primary, #fff);
  opacity: 0.16;
  pointer-events: none;
  z-index: 0;
}

/* 標題列裡真正的文字（天數／日期／主題／行程數）要蓋在幽靈數字上面，
   不然數字預設會蓋掉文字——position:absolute 的偽元素在同一個堆疊層級裡，
   繪製順序預設會排在一般排版內容之後（視覺上在上層），這裡明確給文字更高的
   z-index，不要依賴瀏覽器預設順序。 */
.day-toggle-head > * {
  position: relative;
  z-index: 1;
}

@media (max-width: 720px) {
  /* 手機版標題列本來就窄，主題文字常常已經頂到 ellipsis；幽靈數字縮小、
     往內收一點，避免蓋到「N 個行程」那個字數固定的小標籤 */
  .day-toggle-head::before { font-size: 1.9rem; right: 4px; opacity: 0.14; }
}

/* 三段循環的加深階梯：相鄰兩天一定看得出明度差，但整份行程還是同一個色系。
   刻意只往暗調不往亮調——最亮的主題主色（#B5652F）白字對比只有 4.31，
   再提亮就會掉到讀不清楚。往暗調則對比只會更好。 */
.day-toggle:nth-of-type(3n + 2) .day-toggle-head {
  background: color-mix(in srgb, var(--color-primary, #333) 76%, #000);
}

.day-toggle:nth-of-type(3n) .day-toggle-head {
  background: color-mix(in srgb, var(--color-primary, #333) 55%, #000);
}

/* 天數編號用強調色墊底，色階之外再多一個辨識點 */
.day-toggle-day {
  padding: 1px 8px;
  border-radius: 4px;
  background: color-mix(in srgb, var(--color-on-primary, #fff) 16%, transparent);
}

.day-toggle-head:hover { filter: brightness(1.1); }

.day-toggle-caret {
  flex: 0 0 auto;
  font-size: 0.65rem;
  opacity: 0.85;
}

.day-toggle-day {
  flex: 0 0 auto;
  font-family: var(--font-heading, serif);
  font-weight: 700;
  font-size: 0.9rem;
  letter-spacing: 0.04em;
}

.day-toggle-theme {
  flex: 1;
  font-size: 0.84rem;
  opacity: 0.92;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.day-toggle-count {
  flex: 0 0 auto;
  font-size: 0.72rem;
  opacity: 0.8;
}

.day-toggle-body { display: none; }
.day-toggle.open .day-toggle-body { display: block; }

/* ---- 時段 / 活動內容 兩欄表格 ---- */
.sched-table {
  width: 100%;
  border-collapse: collapse;
  font-size: 0.9rem;
  table-layout: fixed;
}

.sched-table thead th {
  padding: 6px var(--sp-2);
  text-align: left;
  font-size: 0.68rem;
  font-weight: 600;
  letter-spacing: 0.1em;
  color: var(--color-muted-soft);
  background: rgba(0, 0, 0, 0.02);
  border-bottom: 1px solid var(--color-border, #eee);
}

.sched-table .col-time { width: var(--time-col-width, 82px); }
.sched-table thead th { white-space: nowrap; }
/* 類型、座標、交通方式都不再是獨立欄位（類型搬進活動名稱那格變成可選的
   標籤；座標改成點小圖釘開地圖，見下面 .coord-pin；交通方式併進活動內容
   當第二行），現在整張表只剩時段／活動內容／操作三欄。操作欄只剩直式的
   上移／下移／刪除，一顆按鈕的寬度就夠，省下來的寬度全部留給活動內容。 */
.sched-table .col-tools { width: 40px; }

/* 編輯模式會多出操作那一欄，並讓類型／座標的控制項現身。
   同一個 <tr> 用欄位顯隱切換，拖曳與上下搬移就不用處理成對的列。 */
body:not(.editing) .edit-only { display: none; }
body.editing .view-only { display: none; }

.sched-tools {
  padding: 8px var(--sp-2);
  vertical-align: top;
  font-size: 0.8rem;
  line-height: 1.6;
  color: var(--color-muted);
}

/* 餐廳／住宿／交通的類型標籤。不編輯時是純文字的 .sched-kind；
   編輯時換成外觀長得一樣、appearance:none 脫掉原生外框的 <select>
   （.sched-kind-select）——使用者感覺不出「這裡換了一個完全不同的元件」，
   類型標籤不用實心色塊，改成淡底 + 深字，比較不搶戲 */
.sched-kind,
.sched-kind-select {
  flex: 0 0 auto;
  padding: 1px 7px;
  border-radius: 4px;
  font-size: 0.66rem;
  font-weight: 700;
  letter-spacing: 0.06em;
  color: var(--color-muted);
  background: color-mix(in srgb, var(--color-muted) 14%, transparent);
}

.sched-kind-select {
  appearance: none;
  -webkit-appearance: none;
  border: none;
  cursor: pointer;
  font-family: inherit;
}

.kind-meal .sched-kind,
.kind-meal .sched-kind-select {
  color: color-mix(in srgb, var(--color-accent, #c89b3c) 70%, #000);
  background: color-mix(in srgb, var(--color-accent, #c89b3c) 20%, transparent);
}

.kind-hotel .sched-kind,
.kind-hotel .sched-kind-select,
.kind-transport .sched-kind,
.kind-transport .sched-kind-select {
  color: color-mix(in srgb, var(--color-primary, #333) 80%, #000);
  background: color-mix(in srgb, var(--color-primary, #333) 12%, transparent);
}

/* 景點沒有自己的徽章色，一直沿用最上面 .sched-kind 的中性灰預設值——這個疏漏比較嚴重，
   因為景點通常佔一趟行程 50–70% 的列數，等於大多數列用的是系統裡最沒有存在感的顏色，
   只有少數餐廳/住宿/交通列有顏色。**不新增第三個主題色**：primary 已經給了住宿/交通、
   accent 已經給了餐廳，景點再借一個會跟其中一類撞色；改成把中性灰本身加深、加飽和，
   讓它讀起來像「刻意設計的中性色」而不是「忘記設計」。 */
.kind-attraction .sched-kind,
.kind-attraction .sched-kind-select {
  color: color-mix(in srgb, var(--color-muted) 78%, #000);
  background: color-mix(in srgb, var(--color-muted) 24%, transparent);
}

/* 四種類型現在都有自己的整列底色，用來取代下面那條「隔行斑馬紋」——
   斑馬紋只分得出奇偶列，看不出類型；改成「顏色代表類型」，同一份訊息量更高，
   而且順便解決了斑馬紋數值太淡（0.015）幾乎沒有視覺效果的問題，兩個底色系統
   疊在一起只會顯得雜亂，所以拿掉斑馬紋、不是兩個都留著。 */
.sched-row.kind-hotel,
.sched-row.kind-transport {
  background: color-mix(in srgb, var(--color-primary, #333) 4%, transparent);
}
.sched-row.kind-meal {
  background: color-mix(in srgb, var(--color-accent, #c89b3c) 6%, transparent);
}
.sched-row.kind-attraction {
  background: color-mix(in srgb, var(--color-muted) 5%, transparent);
}

/* 座標改成點按鈕開地圖（同一個地圖抽屜、同一套自動定位／手動貼上，
   不是另外做一個彈窗）。原本試過文字標籤版（「座標」+ 外框），但跟名稱、
   英文名放在同一橫排時，一顆有文字的按鈕比純圖示佔的寬度多快一倍，
   在短欄位排成一行的版面裡顯得笨重——改成純圖示的小按鈕，跟原本的圖釘
   emoji 想達到的效果一樣、但用 currentColor 的 SVG（見 COORD_ICON）取代
   emoji，才能跟著 .no-coord 狀態變色，不會有 emoji 自帶的紅/粉色跟其他
   欄位的中性色系衝突。沒有座標的站用主色強調外框，提醒「這個要處理」。 */
.coord-pin {
  display: grid;
  place-items: center;
  flex: 0 0 auto;
  /* 跟身分列裡的文字欄位（--field-h）用同一個高度、同一個圓角
     （--field-radius，不是容器層級的 --radius-sm）——原本借用 --radius-sm
     讓這顆按鈕的圓角跟 toolbar/day-tabs 這種大容器同一個尺度，跟旁邊的
     文字欄位放在一起會顯得「不屬於同一類東西」。 */
  width: var(--field-h);
  height: var(--field-h);
  padding: 0;
  border: 1px solid var(--color-border, #ddd);
  border-radius: var(--field-radius);
  background: var(--color-surface, #fff);
  color: var(--color-muted);
  cursor: pointer;
  transition: all var(--transition);
}

.coord-pin:hover {
  border-color: var(--color-primary, #333);
  color: var(--color-primary, #333);
}

/* 警示色不是直接套主題的 accent：25 個主題裡 accent 深淺差很大（例如
   north-europe 是偏冷的淡藍 #98C1D9），淡色系主題套用時對白底的對比度
   低於 WCAG 建議的 3:1，警示感會被稀釋。用跟 .kind-meal 標籤同一套
   「加深」手法（color-mix 到 70% 黑）保證不管哪個主題的 accent 多淡，
   最終顏色都有足夠對比度，不用另外定義新的顏色變數。
   （accent 目前身兼「餐廳類型標籤」跟「座標缺失警示」兩種語意，靠形狀
   ＋位置區分還不至於混淆；如果之後要再加第三種警示語意，不要繼續疊在
   accent 上，另外討論怎麼分色。） */
.sched-row.no-coord .coord-pin {
  border-color: color-mix(in srgb, var(--color-accent, #d4a574) 70%, #000);
  color: color-mix(in srgb, var(--color-accent, #d4a574) 70%, #000);
}

/* 上移／下移／刪除改直式堆疊——原本三顆橫排最窄也要接近 100px，
   直式只需要一顆按鈕的寬度，手機上活動內容欄才有地方伸展 */
.sched-tools {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
}

.sched-row { border-bottom: 1px solid var(--color-border, #f0f0f0); }
.sched-row:last-child { border-bottom: none; }
/* 舊的隔行斑馬紋規則移到上面 .sched-row.kind-* 那一組，改成「顏色代表類型」 */

.sched-time,
.sched-activity {
  padding: 8px var(--sp-2);
  vertical-align: top;
}

.sched-time {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 4px;
  border-right: 1px solid var(--color-border, #f2f2f2);
  color: var(--color-muted);
  font-variant-numeric: tabular-nums;
}

/* 「22:30-翌日07:00」這種長區間橫排會撐爆欄位，改成上下兩行、中間一條連接線 */
.time-lines {
  display: inline-flex;
  flex-direction: column;
  align-items: center;
  line-height: 1.25;
  font-size: 0.78rem;
  white-space: nowrap;
}

.time-bar {
  width: 1px;
  height: 9px;
  margin: 1px 0;
  background: currentColor;
  opacity: 0.35;
}

/* 只有單一時間點（沒有結束時間）時不畫連接線 */
.time-lines:has(.time-end:empty) .time-bar { display: none; }
body:not(.editing) .time-lines:has(.time-end:empty) .time-end { display: none; }

/* 活動內容與交通方式之間補上框線 */
.sched-activity { border-right: 1px solid var(--color-border, #f2f2f2); }

/* 拖曳把手：原本是貼在欄位左上角的一個字元，不明顯也不像個按鈕。
   改成獨立一顆小圓角按鈕，放在時段內容「上方」（.sched-time 是直排的
   flex 容器），有自己的底色跟 hover 效果，看起來才像「這是可以抓取的東西」。 */
.sched-grip {
  display: none;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 16px;
  padding: 0;
  border: none;
  border-radius: 5px;
  background: color-mix(in srgb, var(--color-muted) 14%, transparent);
  color: var(--color-muted);
  font-size: 0.8rem;
  line-height: 1;
  cursor: grab;
  user-select: none;
  transition: all var(--transition);
}

.sched-grip:hover {
  background: color-mix(in srgb, var(--color-primary, #333) 16%, transparent);
  color: var(--color-primary, #333);
}

.sched-grip:active { cursor: grabbing; }

/* ---- 編輯模式的時段：原生時間選擇器 ---- */
.time-edit {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 3px;
}

.time-field { display: contents; }
.time-face { display: none; }

.time-input {
  width: 100%;
  /* 原本為了放得下瀏覽器在地化格式（中文 zh-TW 會顯示「上午 09:00」，
     比西式「09:00」寬）給到 132px，但欄位太寬會把活動內容欄擠得更窄，
     兩者衝突時活動內容優先——寬度縮小後，本地化格式在極窄的情況下
     可能被裁掉一點點，可接受。跟 syncTimeColumnWidth() 設的
     --time-col-width（編輯模式 112px）要對齊：欄寬 = 這裡的 max-width
     加上 .sched-time 左右 padding。 */
  min-width: 84px;
  max-width: 96px;
  box-sizing: border-box;
  -webkit-appearance: none;
  appearance: none;
  /* 空值（新增行程、還沒填時間）在部分手機瀏覽器上原生控制項會縮得比較扁，
     跟旁邊已經有值的欄位比起來明顯矮一截、窄一截。固定 min-height／min-width
     保證不管有沒有值，看起來都是同一個大小，不會忽高忽低、忽寬忽窄。 */
  display: block;
  min-height: var(--field-h);
  padding: 3px 4px;
  border: 1px solid var(--color-border, #ddd);
  border-radius: var(--field-radius);
  background: var(--color-surface, #fff);
  color: var(--color-text, #222);
  font-family: inherit;
  font-size: 0.78rem;
}

.time-input:focus {
  outline: none;
  border-color: var(--color-primary, #333);
}

/* 瀏覽器原生會在欄位右側加一個小時鐘圖示，開啟時間選擇器其實點欄位
   任何地方都有效，這顆圖示只是多一個視覺元素，拿掉不影響功能。
   只有 WebKit／Blink 支援這個偽元素，Firefox 等其他瀏覽器沒有這顆圖示、
   規則自然無效不影響。 */
.time-input::-webkit-calendar-picker-indicator {
  display: none;
  -webkit-appearance: none;
}

.sched-title {
  display: flex;
  align-items: baseline;
  flex-wrap: wrap;
  gap: 6px;
}

.sched-icon { flex: 0 0 auto; }

/* flex-basis: 0 + flex-grow: 1 是關鍵：flex-wrap 換行是以「整個項目」為單位決定的——
   瀏覽器算這個項目的理想寬度（預設 flex-basis: auto，等於文字的完整寬度）塞不塞得進
   這一行剩下的空間，塞不下就整個項目換到下一行，手機窄螢幕上常常看到名稱一長，
   「景點／餐廳／住宿」標籤自己孤伶伶留在第一行，名稱整個擠到第二行才開始、
   英文名稱又在第二行內部被迫從單字中間斷開，變成兩三個字自己又跑到第三行。
   basis 改成 0 之後，這個項目一開始「不要求任何寬度」，必定塞得進剩下的空間，
   換行的判斷完全交給裡面的文字自己去決定要在哪裡斷行——名稱才會緊接在標籤後面
   開始顯示，超出的部分才換到下一行，不會把標籤跟名稱整個拆成兩段。 */
.sched-name {
  flex: 1 1 0%;
  min-width: 0;
  font-weight: 700;
  font-size: 0.88rem;
  color: var(--color-text, #222);
}

/* 地圖入口掛在活動名稱上（原本是獨立的「導航」欄）。
   維持內文的黑字不變成連結色——它首先是行程的標題，其次才是連結；
   hover 才長出下底線，讓「這裡可以點」在滑過時才現身，平常不干擾閱讀。 */
body:not(.editing) .sched-name-link {
  cursor: pointer;
  border-bottom: 1px solid transparent;
}

body:not(.editing) .sched-name-link:hover {
  border-bottom-color: currentColor;
}

.stop-name-en {
  font-size: 0.74rem;
  font-weight: 400;
  color: var(--color-muted);
}

/* 英文名稱只在檢視模式顯示（有值才會輸出）；編輯模式不提供編輯，由 .view-only 收起來。 */

.sched-desc,
.sched-transport {
  margin: 2px 0 0;
  font-size: 0.8rem;
  line-height: 1.55;
  color: var(--color-muted);
}

/* 簡介／交通方式各加一個極小的圖示，打破整欄純文字的觀感——不是 emoji，
   用 mask 上色的 inline SVG（跟 YT_ICON 那類既有做法同一個精神，只是這裡
   純 CSS 就能做，不用動 renderer 的 template）。mask 只認圖案的形狀，
   顏色交給 background-color: currentColor 決定，換主題、換文字顏色都不用
   另外準備一份圖。只在真的有內容時才顯示，編輯模式的空欄位（顯示 placeholder）
   不需要多一個圖示佔位。 */
.sched-desc:not(.is-empty)::before,
.sched-transport:not(.is-empty)::before {
  content: "";
  display: inline-block;
  width: 12px;
  height: 12px;
  margin-right: 5px;
  vertical-align: -1px;
  background-color: currentColor;
  opacity: 0.85;
  -webkit-mask-repeat: no-repeat;
  mask-repeat: no-repeat;
  -webkit-mask-position: center;
  mask-position: center;
  -webkit-mask-size: contain;
  mask-size: contain;
}
/* 簡介／備註：極簡的資訊圖示（圓圈＋一豎一點） */
.sched-desc:not(.is-empty)::before {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='9' stroke='white' stroke-width='2' fill='none'/%3E%3Cline x1='12' y1='11' x2='12' y2='16.5' stroke='white' stroke-width='2.2' stroke-linecap='round'/%3E%3Ccircle cx='12' cy='7.3' r='1.3' fill='white'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='12' r='9' stroke='white' stroke-width='2' fill='none'/%3E%3Cline x1='12' y1='11' x2='12' y2='16.5' stroke='white' stroke-width='2.2' stroke-linecap='round'/%3E%3Ccircle cx='12' cy='7.3' r='1.3' fill='white'/%3E%3C/svg%3E");
}
/* 交通方式：極簡的方向箭頭 */
.sched-transport:not(.is-empty)::before {
  -webkit-mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M4 12h14m0 0l-5-5m5 5l-5 5' stroke='white' stroke-width='2.6' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  mask-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='M4 12h14m0 0l-5-5m5 5l-5 5' stroke='white' stroke-width='2.6' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
}

/* 編輯模式的欄位間距曾經試過兩種極端：全部並排間距只有 2px（太近，手指
   容易點錯隔壁欄位）、跟全部直排間距都拉到 16px（不會誤觸了，但把「類型／
   名稱／英文名／座標」這種同屬一組身分資訊的短欄位拆成 4 個各佔一整行的
   區塊，一列編輯高度暴增到檢視模式的 3.5-4 倍，使用者要編完一列得一直
   往下移動，反而變成新的可用性問題）。
   兩個目標其實只在「同一種間距被拿來同時處理兩件事」時衝突：短欄位並排
   本身誤觸風險低（左右都有清楚的視覺邊界：白底/灰底/按鈕外框），不需要
   16px 的安全距離；真正容易誤觸的是簡介/交通方式這種滿版寬度、上下堆疊
   的段落。所以身分列改回橫排（跟檢視模式一致），段落維持各自成行但間距
   收窄，兩者用不同的間距值分開處理。 */
body.editing .sched-title {
  flex-direction: row;
  flex-wrap: wrap;
  align-items: center;
  row-gap: 6px;
  column-gap: 8px;
}

/* 身分列（類型/名稱/英文名/座標）→ 簡介：兩個語意群組的邊界，維持
   較大間距做出區隔。簡介 → 交通方式：兩者都是「補充資訊」，同一群組內
   收窄一點，閱讀跟編輯時的移動距離都短一些。兩個都還是原本 2px 的
   6-8 倍，防誤觸的效果沒有退步。 */
/* 間距收窄（原本 16／12px）：編輯模式的一列本來就有 6 個欄位，比檢視模式高得多，
   每一處多餘的留白都會讓「按下編輯後整個畫面被拉長」更明顯。 */
body.editing .sched-desc { margin-top: 8px; }
body.editing .sched-transport { margin-top: 6px; }

.sched-actions {
  display: flex;
  flex-wrap: wrap;
  gap: var(--sp-2);
  margin-top: var(--sp-2);
}

/* 空欄位在檢視模式收起來，編輯模式才露出來讓使用者填 */
body:not(.editing) .sched-desc.is-empty { display: none; }

/* ---- 每天底下的新增按鈕（只在編輯模式出現） ---- */
.day-add-stop {
  display: none;
  width: calc(100% - var(--sp-3) * 2);
  margin: var(--sp-2) var(--sp-3);
  padding: 7px;
  border: 1.5px dashed var(--color-border, #ccc);
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--color-muted);
  font-family: inherit;
  font-size: 0.85rem;
  cursor: pointer;
  transition: all var(--transition);
}

.day-add-stop:hover {
  border-color: var(--color-primary, #333);
  color: var(--color-primary, #333);
}

.day-extras { padding: var(--sp-2) var(--sp-3) var(--sp-3); }

/* =========================================================
   編輯模式
   ========================================================= */

body.editing .sched-grip { display: inline-flex; }
body.editing .day-add-stop { display: block; }
body.editing .sched-row { cursor: default; }

/* 拖曳排序用的是 HTML5 原生 drag-and-drop，觸控裝置完全不支援——
   留著這顆按鈕只會讓手機使用者點了沒反應、以為壞掉。手機排序請改用
   「操作」欄的上移／下移按鈕，那兩顆本來就是為了手機做的。
   **必須放在上面 `body.editing .sched-grip { display: inline-flex; }` 之後**：
   兩條選擇器的優先權完全一樣，CSS 只看誰在後面，跟在不在 media query 裡無關——
   寫反了這條規則會被上面那條蓋掉，手機還是看得到抓不動的按鈕。 */
@media (hover: none), (pointer: coarse) {
  body.editing .sched-grip { display: none; }
}

/* 可編輯的欄位在編輯模式給一個淡底，讓使用者知道哪些能改。
   新增的行程所有欄位都是空的，原本 min-width:40px、上下只留 1px
   padding，點擊範圍太小，手指容易點不中或點到隔壁欄位——加大到接近
   手機建議的最小觸控尺寸，不管有沒有內容都保證好點。
   原本淡底用目的地主題的 accent 色，不同地點深淺冷暖差很多，跟旁邊
   類型標籤、座標按鈕的顏色混在一起容易「花」；改成不隨主題變色的
   中性淡底，欄位本身不搶戲，靠下面 .sched-name 的白底＋外框做出
   「這是主要欄位、其他是補充資訊」的層次。
   高度改用 inline-flex + min-height（--field-h）決定，不再讓 padding
   疊字級自己算出高度——名稱字級較大、有 border，英文名/簡介較小、沒
   border，兩套算法並排時高度天生就會兜不齊，這正是「欄位高度、大小
   看起來不協調」的根因。改成統一的 token 之後，不管以後改字級或加
   border，同一行的欄位高度都不會再跑掉；min-height（不是 height）讓
   簡介/交通方式這種多行文字仍然可以自然長高。 */
body.editing [data-field] {
  display: inline-flex;
  align-items: center;
  min-width: 64px;
  min-height: var(--field-h);
  padding: 0 8px;
  border-radius: var(--field-radius);
  background: color-mix(in srgb, var(--color-text, #222) 6%, transparent);
  outline: none;
}

/* 空欄位在編輯模式顯示提示文字，不然只是一排沒有標示的淡色框 */
body.editing [data-field]:empty::before {
  content: attr(data-placeholder);
  color: var(--color-muted);
  opacity: 0.6;
}

body.editing [data-field]:focus {
  background: var(--color-surface, #fff);
  box-shadow: 0 0 0 2px var(--color-primary, #333);
}

/* 名稱是這一列最重要的欄位，其他（英文名、簡介/備註、交通方式）都只是
   補充資訊。用白底＋外框讓它從一片淡灰底的欄位裡跳出來，看起來才像
   「標題」而不是又一個填空格。全站預設 box-sizing:border-box，border
   會自動從 --field-h 裡扣掉，不用再手動補償高度差。 */
body.editing .sched-name[data-field] {
  background: var(--color-surface, #fff);
  border: 1.5px solid var(--color-border, #ddd);
}

body.editing .sched-name[data-field]:focus {
  border-color: var(--color-primary, #333);
}

.row-btn {
  width: var(--field-h);
  height: var(--field-h);
  border: 1px solid var(--color-border, #ddd);
  border-radius: var(--field-radius);
  background: var(--color-surface, #fff);
  color: var(--color-muted);
  font-size: 0.75rem;
  line-height: 1;
  cursor: pointer;
  transition: all var(--transition);
}

.row-btn:hover {
  border-color: var(--color-primary, #333);
  color: var(--color-primary, #333);
}

.row-del:hover {
  border-color: #b3261e;
  color: #b3261e;
}

/* ---- 拖曳排序 ---- */
.sched-row.dragging { opacity: 0.4; }

.sched-row.drop-target {
  box-shadow: inset 0 2px 0 var(--color-primary, #333);
}

.sched-row.just-moved {
  animation: row-flash 700ms ease;
}

@keyframes row-flash {
  from { background: color-mix(in srgb, var(--color-accent, #d4a574) 45%, transparent); }
  to { background: transparent; }
}

/* 刪除不是點下去立刻消失，是先標記＋淡出，給使用者幾秒鐘反悔的機會
   （見 itinerary-renderer.js 的 removeRow()）。pointer-events:none 讓
   使用者在這段等待期間不會誤觸裡面的欄位或按鈕——這一列已經不算
   「正在編輯」，是正在等著被丟掉。 */
.sched-row.pending-delete { opacity: 0.4; pointer-events: none; }
.sched-row.pending-delete .sched-name,
.sched-row.pending-delete [data-field="name"] { text-decoration: line-through; }

/* 刪除的復原提示條，浮在畫面最下方——跟系統原生 toast/snackbar 同一種
   位置慣例，使用者不用特別去找。z-index 故意比地圖抽屜（1200）跟意見
   回饋（1300）都高：復原是有時效性的動作，不該被任何浮層擋住。 */
.undo-toast {
  position: fixed;
  left: 50%;
  bottom: var(--sp-4, 24px);
  transform: translateX(-50%);
  z-index: 1400;
  display: flex;
  align-items: center;
  gap: var(--sp-3);
  padding: 10px 12px 10px 16px;
  border-radius: 999px;
  background: var(--color-text, #222);
  color: var(--color-on-primary, #fff);
  box-shadow: var(--shadow);
  font-size: 0.82rem;
  max-width: calc(100vw - 2 * var(--sp-3));
}
.undo-toast[hidden] { display: none; }

.undo-toast-text { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.undo-toast-btn {
  flex: 0 0 auto;
  padding: 5px 12px;
  border: none;
  border-radius: 999px;
  background: color-mix(in srgb, #fff 18%, transparent);
  color: inherit;
  font-family: inherit;
  font-weight: 700;
  font-size: 0.8rem;
  cursor: pointer;
  transition: background var(--transition);
}
.undo-toast-btn:hover { background: color-mix(in srgb, #fff 28%, transparent); }

/* 「繼續上次的行程」入口。
   放在表單上方而不是自動載入——使用者主動回首頁多半是想規劃新的一趟，
   硬把上一份塞回去會變成「我想開新的卻一直跳到舊的」。 */
.last-trip-slot {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  max-width: 960px;
  margin: 0 auto;
  padding: 0 var(--sp-3);
}
.last-trip-slot:empty { display: none; }

.last-trip-link {
  flex: 1;
  padding: 8px 14px;
  border: 1px dashed color-mix(in srgb, var(--color-primary, #333) 35%, transparent);
  border-radius: var(--radius-sm);
  background: color-mix(in srgb, var(--color-primary, #333) 5%, transparent);
  color: var(--color-primary, #333);
  font-size: 0.82rem;
  text-decoration: none;
  transition: all var(--transition);
}
.last-trip-link:hover {
  border-style: solid;
  background: color-mix(in srgb, var(--color-primary, #333) 10%, transparent);
}

.last-trip-clear {
  flex: 0 0 auto;
  width: 26px;
  height: 26px;
  border: none;
  border-radius: 50%;
  background: transparent;
  color: var(--color-muted-soft);
  font-size: 0.75rem;
  cursor: pointer;
}
.last-trip-clear:hover { color: var(--color-text, #222); }

/* =========================================================
   帳號：頭像 + 下拉選單
   ========================================================= */

.account-bar {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  /* 安裝按鈕是動態插進來的，沒有 gap 的話會跟頭像黏在一起 */
  gap: var(--sp-2);
  max-width: 960px;
  margin: 0 auto;
  padding: var(--sp-2) var(--sp-3) 0;
  /* iPhone 瀏海／動態島那一整條是系統的狀態列，需要 viewport meta 的
     viewport-fit=cover 搭配 env(safe-area-inset-top) 才留得出空間，不然品牌名跟頭像
     會被那一條蓋住一部分。取 max()：直式（無瀏海）裝置 env() 是 0，還是保留原本的間距，
     不會變成貼齊螢幕邊緣。不支援 env() 的瀏覽器，這行本身視為無效值直接被忽略，
     沿用上面 padding 縮寫給的 var(--sp-2)。 */
  padding-top: max(var(--sp-2), env(safe-area-inset-top));
}

@media (max-width: 720px) {
  /* 加了 env(safe-area-inset-top) 之後，回報還是有一點被蓋到——手機瀏覽器頂端那條
     半透明工具列（例如收合狀態的網址列）本身也會佔用一些高度，那一段不算在
     safe-area-inset 裡面（inset 量的是硬體瀏海/動態島，不是瀏覽器自己的介面）。
     手機版改成「保底間距 + 安全區」兩個相加，不是取其中較大者：沒有瀏海的手機
     也會多留一點（16px 基礎值，比桌機版的 8px 寬鬆），有瀏海/動態島的手機
     兩段疊加起來更寬鬆。env() 的第二個參數是不支援時的退路，等同直接是 0。 */
  .account-bar { padding-top: calc(var(--sp-3) + env(safe-area-inset-top, 0px)); }
}

#account-slot { position: relative; }

/* 品牌名＋一句話，放在帳號列左側（其餘元素靠右）。手機上一行放得下，放不下就截斷而不是換行 */
.brand {
  margin-right: auto;
  display: flex;
  flex-direction: column;
  min-width: 0;
  line-height: 1.3;
  color: inherit;
  text-decoration: none;
}
.brand-name {
  font-family: var(--font-heading, serif);
  font-size: 1.02rem;
  font-weight: 700;
  letter-spacing: 0.04em;
  color: var(--color-primary, #333);
}
.brand-tagline {
  font-size: 0.68rem;
  color: var(--color-muted);
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* 安裝 App 現在是選單裡的一個項目（#install-menu-slot，見 auth.js／pwa.js），
   長相直接沿用下面的 .menu-item，不需要自己的樣式。 */

/* 頭像用名字首字，不用 Google 的大頭照網址——那要放進 CSP 的 img-src、
   會對外洩漏使用者正在造訪這個站，而且失效時會變破圖。 */
.avatar-btn {
  width: 34px;
  height: 34px;
  display: grid;
  place-items: center;
  border-radius: 50%;
  border: 1px solid var(--color-border, #ddd);
  background: var(--color-surface, #fff);
  color: var(--color-muted);
  font-family: inherit;
  font-size: 0.9rem;
  font-weight: 700;
  cursor: pointer;
  transition: all var(--transition);
}
.avatar-btn:hover { border-color: var(--color-primary, #333); }
.avatar-btn.signed-in {
  background: var(--color-primary, #333);
  border-color: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
}
.avatar-btn.signed-in { box-shadow: 0 0 0 2px var(--color-surface, #fff), 0 0 0 3px color-mix(in srgb, var(--color-primary, #333) 45%, transparent); }
.avatar-btn[aria-expanded="true"] { border-color: var(--color-primary, #333); }
.avatar-btn:focus-visible { outline: 2px solid var(--color-primary, #333); outline-offset: 3px; }

/* 帳號選單。參考 UnderCurrent 的下拉：半透明毛玻璃面板、緊湊的圓角項目、
   hover 換成主色，並用分組線把「我的東西／其他／登出」分開。 */
.account-menu {
  position: absolute;
  top: calc(100% + 10px);
  right: 0;
  z-index: 1100;
  width: min(300px, calc(100vw - 2 * var(--sp-3)));
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 6px;
  border: 1px solid var(--color-border, #ddd);
  border-radius: 14px;
  background: color-mix(in srgb, var(--color-surface, #fff) 94%, transparent);
  -webkit-backdrop-filter: blur(14px);
  backdrop-filter: blur(14px);
  box-shadow: 0 16px 36px -10px rgba(0, 0, 0, 0.28);
  text-align: left;
  transform-origin: top right;
  animation: menu-in 0.14s ease-out;
}
.account-menu[hidden] { display: none; }
@keyframes menu-in {
  from { opacity: 0; transform: translateY(-4px) scale(0.98); }
  to   { opacity: 1; transform: none; }
}
@media (prefers-reduced-motion: reduce) { .account-menu { animation: none; } }

.menu-head {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 8px 10px;
  margin-bottom: 2px;
  border-bottom: 1px solid var(--color-border, #eee);
}
.menu-avatar {
  flex: 0 0 auto;
  width: 36px; height: 36px;
  display: grid; place-items: center;
  border-radius: 50%;
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  font-size: 0.95rem;
  font-weight: 700;
}
.menu-avatar.is-guest {
  background: transparent;
  border: 1px dashed var(--color-muted-soft, #aaa);
  color: var(--color-muted);
}
.menu-avatar svg { width: 18px; height: 18px; }
.menu-who { min-width: 0; }
.menu-name {
  font-size: 0.86rem; font-weight: 700; color: var(--color-text, #222);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.menu-sub {
  margin-top: 1px; font-size: 0.72rem; line-height: 1.5; color: var(--color-muted);
  overflow: hidden; text-overflow: ellipsis;
}
.menu-head:not(.is-guest) .menu-sub { white-space: nowrap; }

.menu-group { display: flex; flex-direction: column; gap: 1px; }
.menu-sep { height: 1px; margin: 4px 6px; background: var(--color-border, #eee); }

.menu-cta {
  margin: 6px 4px 4px;
  padding: 9px 12px;
  border: none;
  border-radius: 10px;
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  font-family: inherit;
  font-size: 0.82rem;
  text-align: center;
  text-decoration: none;
  cursor: pointer;
  transition: filter var(--transition);
}
.menu-cta:hover { filter: brightness(1.1); }

.menu-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 9px 10px;
  border: none;
  border-radius: 9px;
  background: transparent;
  color: var(--color-text, #333);
  font-family: inherit;
  font-size: 0.82rem;
  text-align: left;
  text-decoration: none;
  cursor: pointer;
  transition: background var(--transition), color var(--transition);
}
.menu-item:hover,
.menu-item:focus-visible {
  outline: none;
  background: color-mix(in srgb, var(--color-primary, #333) 9%, transparent);
  color: var(--color-primary, #333);
}
.menu-ico { flex: 0 0 auto; display: grid; place-items: center; color: var(--color-muted); transition: color var(--transition); }
.menu-ico svg { width: 17px; height: 17px; }
.menu-item:hover .menu-ico, .menu-item:focus-visible .menu-ico { color: inherit; }
.menu-label { flex: 1 1 auto; }
#logout-btn:hover, #logout-btn:focus-visible {
  background: color-mix(in srgb, var(--color-danger, #b3261e) 9%, transparent);
  color: var(--color-danger, #b3261e);
}

.menu-trip {
  display: flex;
  flex-direction: column;
  gap: 1px;
  padding: 7px var(--sp-3);
  color: var(--color-text, #222);
  text-decoration: none;
}
.menu-trip:hover { background: color-mix(in srgb, var(--color-primary, #333) 7%, transparent); }
.menu-trip-city { font-size: 0.82rem; }
.menu-trip-tag {
  margin-left: 6px;
  padding: 1px 7px;
  border-radius: 999px;
  background: color-mix(in srgb, var(--color-primary, #333) 12%, transparent);
  color: var(--color-primary, #333);
  font-size: 0.66rem;
  font-style: normal;
  vertical-align: 1px;
}
.menu-trip-meta { font-size: 0.7rem; color: var(--color-muted); font-variant-numeric: tabular-nums; }

.menu-hint {
  margin: 0;
  padding: 6px var(--sp-3) 10px;
  font-size: 0.74rem;
  line-height: 1.6;
  color: var(--color-muted-soft);
}

/* 每天標題上的日期。星期用比較清楚的顏色——那是使用者真正需要留意的資訊
   （週一很多博物館休館），日期本身只是輔助。 */
.day-toggle-date {
  margin-left: 6px;
  font-size: 0.74rem;
  color: color-mix(in srgb, currentColor 70%, transparent);
  font-variant-numeric: tabular-nums;
  white-space: nowrap;
}

.day-weather { opacity: 0.85; }

/* 出發日期欄位 */
.start-date-field {
  display: block;
  margin-top: var(--sp-2);
  font-size: 0.8rem;
  color: var(--color-muted);
}
/* 併進 .flight-time-row 之後要當一般的 flex 項目——不能再有自己的 margin-top，
   否則會跟另外兩個時間欄位不對齊；寬度也改用彈性寬度而不是固定的 max-width。 */
.flight-time-row > .start-date-field {
  flex: 1;
  min-width: 130px;
  margin-top: 0;
}
.flight-time-row > .start-date-field #start-date,
.flight-time-row > .start-date-field #return-date { max-width: none; }
.start-date-field > span { display: block; margin-bottom: 4px; }
.start-date-field small {
  display: block;
  color: var(--color-muted-soft);
  font-size: 0.7rem;
}
/* 回程日期是唯讀、算出來的，不是使用者可以直接改的欄位——
   用比較淡的底色跟游標樣式跟一般可編輯的輸入框做出區別，
   一眼就看得出「這是顯示用的，改天數才會變」。 */
#return-date:disabled {
  background: color-mix(in srgb, var(--color-surface, #fff) 55%, var(--color-bg, #fafafa));
  color: var(--color-muted, #666);
  cursor: default;
}

/* #return-date 共用這整組樣式：兩個都是「出發/回程日期」欄位，
   長相理當一致，唯一的差異是 disabled 狀態另外用 #return-date:disabled 處理。 */
#start-date,
#return-date {
  width: 100%;
  max-width: 220px;
  min-width: 0;
  box-sizing: border-box;
  /* 同上，理由見 .flight-time-field input[type="time"] 的註解 */
  -webkit-appearance: none;
  appearance: none;
  /* 理由同 .flight-time-field input[type="time"] 的註解 */
  display: block;
  min-height: 38px;
  line-height: 1.4;
  padding: 7px 10px;
  border: 1px solid var(--color-border, #ddd);
  border-radius: var(--radius-sm);
  background: var(--color-surface, #fff);
  color: var(--color-text, #222);
  font-family: inherit;
  font-size: 0.85rem;
}

/* ---- 匯出面板 ---- */
.export-panel {
  position: fixed;
  inset: 0;
  z-index: 1300;
  display: grid;
  place-items: center;
  padding: var(--sp-3);
  background: rgba(0, 0, 0, 0.4);
  -webkit-backdrop-filter: blur(3px);
  backdrop-filter: blur(3px);
}
/* display 被作者樣式設過之後，hidden 屬性就失效了，一定要補這一條 */
.export-panel[hidden] { display: none; }

.export-box {
  width: min(380px, 100%);
  padding: var(--sp-3);
  border-radius: var(--radius);
  background: var(--color-surface, #fff);
  box-shadow: 0 24px 60px -12px rgba(0, 0, 0, 0.3);
}

.export-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  margin-bottom: var(--sp-2);
}
.export-close {
  border: none;
  background: transparent;
  color: var(--color-muted);
  font-size: 0.9rem;
  cursor: pointer;
}

.export-field { display: block; margin-bottom: var(--sp-2); font-size: 0.82rem; color: var(--color-muted); }
.export-field span { display: block; margin-bottom: 4px; }
/* Safari 的原生日期欄位沒有 -webkit-appearance: none 的話，不會乖乖照 CSS
   寬度縮，會撐破 .export-box 的邊框——跟表單那邊出發日期欄位同一個成因，
   同一套修法（見 html/body 那段 overflow-x:clip 附近的完整說明）。 */
.export-date {
  width: 100%;
  max-width: 100%;
  box-sizing: border-box;
  -webkit-appearance: none;
  appearance: none;
  display: block;
  min-height: 38px;
  padding: 8px 10px;
  border: 1px solid var(--color-border, #ddd);
  border-radius: var(--radius-sm);
  background: var(--color-surface, #fff);
  color: var(--color-text, #222);
  font-family: inherit;
  font-size: 0.86rem;
}

.export-check {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  margin-bottom: var(--sp-3);
  font-size: 0.82rem;
  cursor: pointer;
}
.export-check small { display: block; color: var(--color-muted-soft); font-size: 0.72rem; }
.export-hint { margin: 0 0 var(--sp-2); font-size: 0.76rem; line-height: 1.6; color: var(--color-muted-soft); }

.export-actions { display: flex; flex-direction: column; gap: 8px; }
.export-do {
  padding: 10px 12px;
  border: none;
  border-radius: var(--radius-sm);
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  font-family: inherit;
  font-size: 0.84rem;
  cursor: pointer;
}
.export-do.secondary {
  border: 1px solid var(--color-border, #ddd);
  background: transparent;
  color: var(--color-text, #222);
}
.export-do:hover { opacity: 0.9; }

/* ---- 行程合理性檢查 ---- */
/* 預設收合。這是「第二意見」，不該搶在行程內容前面；
   有真正的警告時才用比較強的顏色，其餘一律低調。 */
.day-checks {
  margin: 0 0 var(--sp-2);
  border: 1px solid var(--color-border, #e6e6e6);
  border-radius: var(--radius-sm);
  background: color-mix(in srgb, var(--color-surface, #fff) 60%, transparent);
  font-size: 0.8rem;
}
.day-checks.has-warn {
  border-color: color-mix(in srgb, var(--color-secondary, #b3261e) 35%, transparent);
  background: color-mix(in srgb, var(--color-secondary, #b3261e) 5%, transparent);
}

.day-checks-head {
  display: flex;
  align-items: center;
  gap: 7px;
  padding: 7px var(--sp-3);
  color: var(--color-muted);
  cursor: pointer;
  list-style: none;
}
.day-checks-head::-webkit-details-marker { display: none; }
.day-checks[open] .day-checks-head { color: var(--color-text, #222); }
.day-checks.has-warn .day-checks-head { color: var(--color-secondary, #b3261e); }

.day-checks-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 16px;
  height: 16px;
  flex: none;
  border-radius: 50%;
  border: 1px solid currentColor;
  font-size: 0.62rem;
  font-weight: 700;
  line-height: 1;
}

.day-check-list {
  margin: 0;
  padding: 0 var(--sp-3) 9px calc(var(--sp-3) + 20px);
  list-style: disc;
  color: var(--color-muted);
  line-height: 1.7;
}
.day-check-item.is-warn { color: var(--color-text, #222); }

/* ---- 意見回饋 ---- */
.feedback-overlay {
  position: fixed;
  inset: 0;
  z-index: 1300;              /* 高於地圖抽屜的 1200 */
  display: grid;
  place-items: center;
  padding: var(--sp-3);
  background: rgba(0, 0, 0, 0.4);
  -webkit-backdrop-filter: blur(3px);
  backdrop-filter: blur(3px);
}
.feedback-overlay[hidden] { display: none; }

.feedback-box {
  width: min(420px, 100%);
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: var(--sp-3);
  border-radius: var(--radius);
  background: var(--color-surface, #fff);
  box-shadow: 0 24px 60px -12px rgba(0, 0, 0, 0.35);
}

.feedback-head { display: flex; align-items: center; justify-content: space-between; }
.feedback-head strong { font-family: var(--font-heading, serif); font-size: 1rem; }

.feedback-close {
  width: 26px; height: 26px;
  border: none; border-radius: 50%;
  background: transparent; color: var(--color-muted);
  font-size: 0.8rem; cursor: pointer;
}
.feedback-close:hover { background: rgba(0, 0, 0, 0.06); }

.feedback-hint { margin: 0; font-size: 0.78rem; line-height: 1.6; color: var(--color-muted); }

.feedback-cats { display: flex; flex-wrap: wrap; gap: 4px 12px; }
.feedback-cats label {
  display: inline-flex; align-items: center; gap: 4px;
  font-size: 0.78rem; color: var(--color-muted); cursor: pointer;
}

.feedback-text, .feedback-contact {
  width: 100%;
  padding: 9px 12px;
  border: 1px solid var(--color-border, #ddd);
  border-radius: var(--radius-sm);
  background: var(--color-bg, #fafafa);
  color: var(--color-text, #222);
  font-family: inherit;
  font-size: 0.85rem;
  resize: vertical;
}
.feedback-text:focus, .feedback-contact:focus {
  outline: none;
  border-color: var(--color-primary, #333);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary, #333) 14%, transparent);
}

.feedback-actions { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-2); }
.feedback-status { font-size: 0.75rem; color: var(--color-muted); }

.feedback-send {
  padding: 7px 18px;
  border: none; border-radius: 999px;
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  font-family: inherit; font-size: 0.82rem; cursor: pointer;
}
.feedback-send:disabled { opacity: 0.6; cursor: default; }

/* ---- 重複產生提醒 ----
   按「產生行程」時發現「我的行程」裡已經有同目的地、同天數的行程（app.js 的
   confirmBeforeGenerate）。沿用意見回饋的覆蓋層＋置中卡片語言。
   主要按鈕是「開啟現有行程」：這個提醒存在的目的就是把人帶回已經有的那一份，
   「仍要重新產生」是允許的出口，但不該比較搶眼。 */
.dup-overlay {
  position: fixed;
  inset: 0;
  z-index: 1300;
  display: grid;
  place-items: center;
  padding: var(--sp-3);
  background: rgba(0, 0, 0, 0.4);
  -webkit-backdrop-filter: blur(3px);
  backdrop-filter: blur(3px);
}
.dup-overlay[hidden] { display: none; }

.dup-box {
  width: min(400px, 100%);
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: var(--sp-3);
  border-radius: var(--radius);
  background: var(--color-surface, #fff);
  box-shadow: 0 24px 60px -12px rgba(0, 0, 0, 0.35);
}
.dup-title { font-family: var(--font-heading, serif); font-size: 1rem; }
/* 文字裡用 \n\n 分段，pre-line 才會換行（同時照常折行、收合多餘空白） */
.dup-text { margin: 0; font-size: 0.85rem; line-height: 1.7; color: var(--color-muted); white-space: pre-line; }

.dup-actions { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: var(--sp-2); margin-top: 2px; }
.dup-primary, .dup-secondary {
  padding: 8px 18px;
  border-radius: 999px;
  font-family: inherit;
  font-size: 0.82rem;
  cursor: pointer;
}
.dup-primary {
  border: none;
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
}
.dup-secondary {
  border: 1px solid var(--color-border, #ccc);
  background: transparent;
  color: var(--color-muted);
}
.dup-secondary:hover { border-color: var(--color-muted); color: var(--color-text, #222); }

/* ---- 我的行程對話框 ----
   跟意見回饋共用同一套覆蓋層＋置中卡片語言（.feedback-overlay/.feedback-box），
   行程列（.menu-trip 系列）沿用帳號選單原本的樣式，避免同一份資料長兩種
   不同的長相。 */
.trips-overlay {
  position: fixed;
  inset: 0;
  z-index: 1300;
  display: grid;
  place-items: center;
  padding: var(--sp-3);
  background: rgba(0, 0, 0, 0.4);
  -webkit-backdrop-filter: blur(3px);
  backdrop-filter: blur(3px);
}
.trips-overlay[hidden] { display: none; }

.trips-box {
  width: min(420px, 100%);
  max-height: min(560px, 85vh);
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: var(--sp-3);
  border-radius: var(--radius);
  background: var(--color-surface, #fff);
  box-shadow: 0 24px 60px -12px rgba(0, 0, 0, 0.35);
}

.trips-head { display: flex; align-items: center; justify-content: space-between; flex: 0 0 auto; }
.trips-head strong { font-family: var(--font-heading, serif); font-size: 1rem; }

.trips-close {
  width: 26px; height: 26px;
  border: none; border-radius: 50%;
  background: transparent; color: var(--color-muted);
  font-size: 0.8rem; cursor: pointer;
}
.trips-close:hover { background: rgba(0, 0, 0, 0.06); }

.trips-search {
  flex: 0 0 auto;
  padding: 8px 10px;
  border: 1px solid var(--color-border, #ddd);
  border-radius: var(--radius-sm);
  background: var(--color-surface, #fff);
  color: var(--color-text, #222);
  font-family: inherit;
  font-size: 0.85rem;
  box-sizing: border-box;
}
.trips-search:focus {
  outline: none;
  border-color: var(--color-primary, #333);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary, #333) 12%, transparent);
}

/* 清單本身捲動，搜尋框跟分頁列固定在上下，不會被捲走 */
.trips-list {
  flex: 1 1 auto;
  min-height: 120px;
  overflow-y: auto;
  border: 1px solid var(--color-border, #eee);
  border-radius: var(--radius-sm);
}
.trips-list .menu-trip { border-bottom: 1px solid var(--color-border, #f2f2f2); }
.trips-list .menu-trip:last-child { border-bottom: none; }

.trips-pager {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: var(--sp-3);
  flex: 0 0 auto;
}

.trips-page-btn {
  padding: 6px 12px;
  border: 1px solid var(--color-border, #ddd);
  border-radius: var(--radius-sm);
  background: var(--color-surface, #fff);
  color: var(--color-text, #333);
  font-family: inherit;
  font-size: 0.78rem;
  cursor: pointer;
  transition: all var(--transition);
}
.trips-page-btn:hover:not(:disabled) {
  border-color: var(--color-primary, #333);
  color: var(--color-primary, #333);
}
.trips-page-btn:disabled { opacity: 0.4; cursor: default; }

.trips-page-count {
  font-size: 0.76rem;
  color: var(--color-muted);
  font-variant-numeric: tabular-nums;
}

/* ---- 分享對話框（collab.js）----
   上半「檢視連結」（公開唯讀）、下半「共同編輯」（邀請制）。兩塊用同一種區塊語言，
   徽章講清楚權限差異——使用者最容易搞混的就是「傳這個連結對方能不能改」。 */
.share-overlay {
  position: fixed;
  inset: 0;
  z-index: 1300;
  display: grid;
  place-items: center;
  padding: var(--sp-3);
  background: rgba(0, 0, 0, 0.4);
  -webkit-backdrop-filter: blur(3px);
  backdrop-filter: blur(3px);
}
.share-overlay[hidden] { display: none; }

.share-box {
  width: min(460px, 100%);
  max-height: min(640px, 88vh);
  overflow-y: auto;
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: var(--sp-3);
  border-radius: var(--radius);
  background: var(--color-surface, #fff);
  box-shadow: 0 24px 60px -12px rgba(0, 0, 0, 0.35);
}
.share-box-narrow { width: min(380px, 100%); }

.share-head { display: flex; align-items: center; justify-content: space-between; }
.share-head strong { font-family: var(--font-heading, serif); font-size: 1rem; }
.share-close {
  width: 26px; height: 26px;
  border: none; border-radius: 50%;
  background: transparent; color: var(--color-muted);
  font-size: 0.8rem; cursor: pointer;
}
.share-close:hover { background: rgba(0, 0, 0, 0.06); }

.share-body { display: flex; flex-direction: column; gap: 12px; }

.share-sec {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 12px;
  border: 1px solid var(--color-border, #e5e5e5);
  border-radius: var(--radius-sm);
}
.share-sec-head { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; }
.share-sec-title { font-size: 0.86rem; font-weight: 700; color: var(--color-text, #222); }

.share-badge {
  padding: 2px 9px;
  border-radius: 999px;
  background: color-mix(in srgb, var(--color-muted, #777) 12%, transparent);
  color: var(--color-muted);
  font-size: 0.68rem;
  letter-spacing: 0.02em;
  white-space: nowrap;
}
.share-badge.is-invite {
  background: color-mix(in srgb, var(--color-primary, #333) 12%, transparent);
  color: var(--color-primary, #333);
}

.share-note { margin: 0; font-size: 0.78rem; line-height: 1.7; color: var(--color-muted); }
.share-note strong { color: var(--color-text, #222); font-weight: 600; }
.share-fine { margin: 2px 0 0; font-size: 0.7rem; color: var(--color-muted-soft); }
.share-msg { margin: 0; min-height: 1em; font-size: 0.74rem; color: var(--color-secondary, #b3261e); }
.share-msg:empty { display: none; }

.share-copy-row { display: flex; gap: 6px; }
.share-copy-row.is-highlight .share-url {
  border-color: var(--color-primary, #333);
  background: color-mix(in srgb, var(--color-primary, #333) 6%, var(--color-surface, #fff));
}
.share-url {
  flex: 1 1 auto;
  min-width: 0;
  padding: 8px 10px;
  border: 1px solid var(--color-border, #ddd);
  border-radius: var(--radius-sm);
  background: var(--color-bg, #fafafa);
  color: var(--color-text, #222);
  font-family: inherit;
  font-size: 0.78rem;
  text-overflow: ellipsis;
}
.share-url:focus {
  outline: none;
  border-color: var(--color-primary, #333);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary, #333) 14%, transparent);
}

.share-btn {
  flex: 0 0 auto;
  padding: 8px 14px;
  border: 1px solid var(--color-border, #ddd);
  border-radius: var(--radius-sm);
  background: var(--color-surface, #fff);
  color: var(--color-text, #333);
  font-family: inherit;
  font-size: 0.8rem;
  cursor: pointer;
  transition: all var(--transition);
}
.share-btn:hover:not(:disabled) { border-color: var(--color-primary, #333); color: var(--color-primary, #333); }
.share-btn:disabled { opacity: 0.55; cursor: default; }
.share-btn.primary {
  border-color: var(--color-primary, #333);
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
}
.share-btn.primary:hover:not(:disabled) { filter: brightness(1.1); color: var(--color-on-primary, #fff); }
.share-btn.danger { color: var(--color-secondary, #b3261e); border-color: color-mix(in srgb, var(--color-secondary, #b3261e) 40%, transparent); }
.share-btn.danger:hover:not(:disabled) { border-color: var(--color-secondary, #b3261e); color: var(--color-secondary, #b3261e); }
.share-actions { display: flex; justify-content: flex-end; gap: 8px; flex-wrap: wrap; }

.share-people { list-style: none; margin: 4px 0 0; padding: 0; display: flex; flex-direction: column; }
.share-person {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 0;
  border-top: 1px solid var(--color-border, #eee);
}
.share-person:first-child { border-top: none; }
.share-avatar {
  flex: 0 0 auto;
  width: 28px; height: 28px;
  display: grid; place-items: center;
  border-radius: 50%;
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  font-size: 0.78rem;
  font-weight: 700;
}
.share-avatar.is-pending {
  background: transparent;
  border: 1px dashed var(--color-muted-soft, #aaa);
  color: var(--color-muted);
}
.share-person-name {
  flex: 1 1 auto;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 0.82rem;
  color: var(--color-text, #222);
}
.share-person.is-pending .share-person-name { color: var(--color-muted); }
.share-person-name small { color: var(--color-muted-soft); font-size: 0.7rem; }
.share-empty { padding: 6px 0; font-size: 0.76rem; color: var(--color-muted-soft); }
.share-link-btn {
  flex: 0 0 auto;
  padding: 4px 8px;
  border: none;
  border-radius: 6px;
  background: transparent;
  color: var(--color-muted);
  font-family: inherit;
  font-size: 0.74rem;
  cursor: pointer;
}
.share-link-btn:hover:not(:disabled) { background: color-mix(in srgb, var(--color-secondary, #b3261e) 10%, transparent); color: var(--color-secondary, #b3261e); }

/* 贊助才能用的按鈕：不隱藏，但要看得出來是鎖著的。
   用虛線邊框而不是變灰——變灰看起來像「壞掉／不能點」，
   但這顆按鈕是可以點的，點了會告訴你需要什麼。 */
.tool-btn.locked {
  border-style: dashed;
  opacity: 0.85;
}

/* =========================================================
   天數導覽（右下角浮動）
   ========================================================= */

.day-nav {
  position: fixed;
  right: 16px;
  bottom: 16px;
  z-index: 1100;              /* 低於地圖抽屜的 1200——抽屜開著時它會被隱藏 */
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 8px;

  /* 預設不可見也不可點。
     用 opacity + pointer-events，**不要用 visibility**：
     visibility 放進 transition 之後，只要那次轉場被打斷（切到背景分頁、
     快速捲動時反覆切換 class、瀏覽器省電降頻），元素就可能卡在 hidden——
     結果是「看得到卻點不到」，而且卡住的狀態只出現在使用者那邊、很難重現。
     opacity 沒有這個問題：它是可插值的，中斷了也只是停在某個透明度，
     而能不能點由 pointer-events 獨立決定，不受轉場影響。
     也不用 display:none，那會讓進場的淡入完全沒機會播放。 */
  opacity: 0;
  pointer-events: none;
  transform: translateY(8px);
  transition: opacity var(--transition), transform var(--transition);
}

.day-nav.visible {
  opacity: 1;
  pointer-events: auto;
  transform: translateY(0);
}

/* 使用者正在按行程表自己的摺疊控制項時，浮動選單先退到後面。
   **只降透明度，絕對不碰 pointer-events。**
   舊版連點擊一起關，結果是摺疊完的 1.2 秒內☰是死的：
   看得到、按下去完全沒反應，而且用 element.click() 永遠測不出來
   ——程式呼叫的 click 會無視 pointer-events，只有真人的手指會被擋下。
   要驗證這類問題要用 document.elementFromPoint()。 */
.day-nav.yielding { opacity: 0.2; }

.day-nav-toggle {
  width: 44px;
  height: 44px;
  border-radius: 50%;
  border: 1px solid color-mix(in srgb, var(--color-border, #ddd) 70%, transparent);
  background: color-mix(in srgb, var(--color-surface, #fff) 88%, transparent);
  -webkit-backdrop-filter: blur(12px);
  backdrop-filter: blur(12px);
  color: var(--color-primary, #333);
  font-size: 1.05rem;
  cursor: pointer;
  box-shadow: 0 6px 20px -6px rgba(0, 0, 0, 0.28);
  transition: all var(--transition);
}

.day-nav-toggle:hover {
  border-color: var(--color-primary, #333);
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
}

.day-nav-list {
  display: flex;
  flex-direction: column;
  min-width: 200px;
  /* 十天的清單在小螢幕上會超出畫面，給它自己的捲動 */
  max-height: min(60vh, 420px);
  overflow-y: auto;
  padding: 6px;
  border-radius: var(--radius-sm);
  border: 1px solid color-mix(in srgb, var(--color-border, #ddd) 70%, transparent);
  background: color-mix(in srgb, var(--color-surface, #fff) 94%, transparent);
  -webkit-backdrop-filter: blur(14px);
  backdrop-filter: blur(14px);
  box-shadow: 0 12px 32px -10px rgba(0, 0, 0, 0.3);
}

/* hidden 屬性只是瀏覽器預設樣式表裡的 [hidden]{display:none}，
   **任何作者樣式的 display 都會蓋過它**。上面設了 display:flex，
   沒有這一行的話 list.hidden = true 完全不會讓清單消失：
   狀態翻得好好的，畫面一動也不動，看起來就像按鈕壞了。
   驗證這類問題不能讀 el.hidden（那只是屬性），
   要讀 offsetParent 或 getComputedStyle().display。 */
.day-nav-list[hidden] { display: none; }

.day-nav-item {
  display: flex;
  flex-direction: column;
  gap: 1px;
  padding: 8px 12px;
  border: none;
  border-radius: 6px;
  background: transparent;
  color: var(--color-text, #222);
  font-family: inherit;
  font-size: 0.82rem;
  text-align: left;
  cursor: pointer;
  transition: background var(--transition);
}

.day-nav-item:hover {
  background: color-mix(in srgb, var(--color-primary, #333) 10%, transparent);
}

.day-nav-day { font-weight: 700; }

.day-nav-theme {
  font-size: 0.72rem;
  color: var(--color-muted);
  /* 主題可能很長，一行就好 */
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  max-width: 200px;
}

/* 「回到最上方」跟天數是不同性質的動作，用一條線分開 */
.day-nav-top {
  border-bottom: 1px solid var(--color-border, #eee);
  border-radius: 6px 6px 0 0;
  margin-bottom: 4px;
  padding-bottom: 10px;
  color: var(--color-muted);
  font-size: 0.78rem;
}

@media (max-width: 720px) {
  /* 手機螢幕小，這一塊展開後會蓋掉大半個畫面。整體縮小，
     並限制高度讓它自己捲動——天數多的時候不會從上蓋到下。 */
  .day-nav { right: 10px; bottom: 10px; gap: 6px; }
  .day-nav-toggle { width: 34px; height: 34px; font-size: 0.85rem; }
  .day-nav-list {
    min-width: 132px;
    max-height: 45vh;
    overflow-y: auto;
    font-size: 0.78rem;
  }
  .day-nav-item { padding: 6px 10px; }
  .day-nav-theme { max-width: 104px; font-size: 0.68rem; }
  .day-nav-day { font-size: 0.76rem; }
}

/* =========================================================
   地圖抽屜：從右側滑出
   ========================================================= */

/* 抽屜不貼齊視窗邊緣，四邊留一點空隙——這樣它讀起來是「浮在頁面上的一張卡」，
   而不是釘在螢幕右側的一堵牆，四個角也才有理由是圓的。
   底色半透明 + backdrop-filter：地圖本身是不透明的，所以毛玻璃只會出現在
   標題列與工具列這些「外框」的位置，剛好是想要的效果。 */
.map-drawer {
  --drawer-gap: 12px;

  position: fixed;
  top: var(--drawer-gap);
  right: var(--drawer-gap);
  bottom: var(--drawer-gap);
  width: 50%;
  max-width: 720px;
  display: flex;
  flex-direction: column;
  overflow: hidden;                    /* 讓 iframe 的直角被圓角切掉 */
  border-radius: var(--radius);
  border: 1px solid color-mix(in srgb, var(--color-border, #e0e0e0) 75%, transparent);
  background: color-mix(in srgb, var(--color-surface, #fff) 80%, transparent);
  -webkit-backdrop-filter: blur(18px) saturate(1.3);
  backdrop-filter: blur(18px) saturate(1.3);
  box-shadow:
    0 24px 60px -12px rgba(0, 0, 0, 0.28),
    0 8px 20px -8px rgba(0, 0, 0, 0.16),
    0 0 0 1px rgba(255, 255, 255, 0.5) inset;
  /* 多推開一個 gap，收起時才會完全離開畫面（不然會露出右邊那 12px） */
  transform: translateX(calc(100% + var(--drawer-gap) * 2));
  transition: transform 320ms cubic-bezier(0.32, 0.72, 0, 1);
  z-index: 1200;
}

/* 沒有 backdrop-filter 的瀏覽器會直接看穿半透明底色，字會糊掉——補回不透明底 */
@supports not ((backdrop-filter: blur(1px)) or (-webkit-backdrop-filter: blur(1px))) {
  .map-drawer { background: var(--color-surface, #fff); }
}

.map-drawer.open { transform: translateX(0); }

/* 標題列以前是整條實心主色，在紅／深藍這類主題會變成一大塊色塊壓在地圖上方。
   改成薄薄一層主色暈染，識別度留著，份量收掉。 */
.map-drawer-head {
  display: flex;
  align-items: center;
  gap: var(--sp-2);
  padding: 6px 10px 6px var(--sp-3);
  border-bottom: 1px solid color-mix(in srgb, var(--color-border, #eee) 60%, transparent);
  background: linear-gradient(
    180deg,
    color-mix(in srgb, var(--color-primary, #333) 9%, transparent),
    color-mix(in srgb, var(--color-primary, #333) 4%, transparent)
  );
  color: var(--color-text, #222);
}

.map-drawer-title {
  flex: 1;
  font-family: var(--font-heading, serif);
  font-weight: 700;
  font-size: 0.88rem;
  letter-spacing: 0.08em;
  color: var(--color-primary, #333);
}

.map-drawer-close {
  display: grid;
  place-items: center;
  width: 26px;
  height: 26px;
  padding: 0;
  font-size: 0.72rem;
  border-radius: 50%;
  border: 1px solid color-mix(in srgb, var(--color-primary, #333) 22%, transparent);
  background: color-mix(in srgb, var(--color-surface, #fff) 70%, transparent);
  color: var(--color-muted);
  cursor: pointer;
  line-height: 1;
  transition: all var(--transition);
}

.map-drawer-close:hover {
  border-color: var(--color-primary, #333);
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  transform: rotate(90deg);
}

.map-drawer-canvas {
  position: relative;
  flex: 1;
  display: flex;
  /* 地圖是這個抽屜存在的理由，不能被上面的資訊擠到只剩一條縫 */
  min-height: 260px;
  background: var(--color-bg, #fafafa);
}

.map-drawer-empty {
  display: none;
  margin: auto;
  padding: var(--sp-4);
  text-align: center;
  font-size: 0.85rem;
  line-height: 1.9;
  color: var(--color-muted);
}

.map-drawer-empty code {
  display: inline-block;
  padding: 2px 6px;
  border-radius: 6px;
  background: color-mix(in srgb, var(--color-primary, #333) 8%, transparent);
  font-size: 0.8rem;
}

/* 抽屜是浮在行程表上方的（不推擠版面），所以下面的表格文字不會被重排 */
.map-drawer-bar {
  display: flex;
  flex-direction: column;
  gap: 7px;
  padding: 10px var(--sp-3) 11px;
  border-bottom: 1px solid color-mix(in srgb, var(--color-border, #eee) 60%, transparent);
  background: color-mix(in srgb, var(--color-surface, #fff) 45%, transparent);
}

.map-search { display: flex; gap: 7px; }

/* 搜尋框下面的一列：搜尋中心（📍 站名 ✕）＋一鍵分類。手機上這個抽屜只有半個螢幕高，
   所以錨點和分類擠在同一列、放不下就橫向捲動，不多佔一行。 */
.map-nearby {
  display: flex;
  align-items: center;
  gap: 6px;
  overflow-x: auto;
  scrollbar-width: none;
  padding: 1px 0;
}
.map-nearby::-webkit-scrollbar { display: none; }
.map-hint { margin: 0; font-size: 0.74rem; line-height: 1.55; color: var(--color-muted); }
.map-hint[hidden] { display: none; }
.map-anchor {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  max-width: 13em;
  padding: 2px 3px 2px 10px;
  border-radius: 999px;
  background: color-mix(in srgb, var(--color-primary, #333) 13%, transparent);
  color: var(--color-primary, #333);
  font-size: 0.76rem;
  font-weight: 600;
}
.map-anchor[hidden] { display: none; }
.map-anchor-pin { display: inline-flex; }
.map-anchor-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.map-anchor-x {
  flex: 0 0 auto;
  width: 26px;
  height: 26px;
  border: none;
  border-radius: 50%;
  background: transparent;
  color: inherit;
  font-size: 0.7rem;
  cursor: pointer;
}
.map-anchor-x:hover { background: color-mix(in srgb, var(--color-primary, #333) 16%, transparent); }
.map-chip {
  flex: 0 0 auto;
  min-height: 34px;
  padding: 4px 13px;
  border: 1px solid color-mix(in srgb, var(--color-border, #ddd) 85%, transparent);
  border-radius: 999px;
  background: color-mix(in srgb, var(--color-surface, #fff) 88%, transparent);
  color: var(--color-text, #222);
  font-family: inherit;
  font-size: 0.78rem;
  cursor: pointer;
  white-space: nowrap;
  transition: all var(--transition);
}
.map-chip:hover { border-color: var(--color-primary, #333); color: var(--color-primary, #333); }
.map-chip[hidden] { display: none; }
/* 「距上一站」路線鈕：跟分類鈕做出區別，這是查看資訊，不是搜尋 */
.map-chip.is-route {
  border-style: dashed;
  border-color: color-mix(in srgb, var(--color-primary, #333) 55%, transparent);
  color: var(--color-primary, #333);
  font-weight: 600;
}

.map-search-input {
  flex: 1;
  min-width: 0;
  padding: 7px 14px;
  border: 1px solid color-mix(in srgb, var(--color-border, #ddd) 85%, transparent);
  border-radius: 999px;
  background: color-mix(in srgb, var(--color-surface, #fff) 88%, transparent);
  color: var(--color-text, #222);
  font-family: inherit;
  font-size: 0.85rem;
  transition: border-color var(--transition), box-shadow var(--transition);
}

.map-search-input::placeholder { color: var(--color-muted-soft); }

/* 用外擴的光暈取代加粗框線：框線變粗會讓元素跳動一下，光暈不會 */
.map-search-input:focus {
  outline: none;
  border-color: var(--color-primary, #333);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary, #333) 14%, transparent);
}

.map-search-btn {
  padding: 7px 16px;
  border: 1px solid transparent;
  border-radius: 999px;
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  font-family: inherit;
  font-size: 0.8rem;
  letter-spacing: 0.04em;
  cursor: pointer;
  box-shadow: 0 2px 8px -2px color-mix(in srgb, var(--color-primary, #333) 55%, transparent);
  transition: all var(--transition);
}

.map-search-btn:hover {
  background: color-mix(in srgb, var(--color-primary, #333) 88%, #000);
  box-shadow: 0 4px 12px -2px color-mix(in srgb, var(--color-primary, #333) 65%, transparent);
}

.map-search-btn:active { transform: translateY(1px); box-shadow: none; }

.map-frame {
  width: 100%;
  height: 100%;
  border: 0;
  display: block;
  /* 載入完成時慢慢浮現。轉成 .is-loading 時用下面較短的時間，舊地圖很快退場，
     不然使用者會盯著已經過期的畫面等新的來。 */
  transition: opacity 420ms ease;
}
.map-drawer-canvas.is-loading .map-frame {
  opacity: 0;
  transition-duration: 140ms;
}

/* 載入中的小圈圈。延遲 250ms 才浮現：地圖通常很快就好，一閃即逝的圈圈只會造成閃爍，
   只有真的在等的時候才出現。 */
.map-drawer-canvas::after {
  content: "";
  position: absolute;
  left: 50%;
  top: 50%;
  width: 26px;
  height: 26px;
  margin: -13px 0 0 -13px;
  border-radius: 50%;
  border: 3px solid color-mix(in srgb, var(--color-primary, #333) 20%, transparent);
  border-top-color: var(--color-primary, #333);
  opacity: 0;
  pointer-events: none;
  transition: opacity 200ms ease;
}
.map-drawer-canvas.is-loading::after {
  opacity: 1;
  transition-delay: 250ms;
  animation: map-spin 800ms linear infinite;
}
@keyframes map-spin { to { transform: rotate(360deg); } }

@media (prefers-reduced-motion: reduce) {
  .map-frame { transition: none; }
  .map-drawer-canvas.is-loading::after { animation: none; }
}

/* =========================================================
   行動裝置
   ========================================================= */
@media (max-width: 720px) {
  .container { padding: var(--sp-3) var(--sp-2); }

  .planner-split { grid-template-columns: 1fr; }

  /* 手機版：地球面板變成上方橫幅，球縮小但保留 */
  /* 430px → 280px。海報吃掉首屏，表單第一步要滑到 y≈490 才看得到，「產生行程」在兩個螢幕以下
     （實測 375×812：按鈕在 1.47 個螢幕之下）。縮短後地球與國名都還在，只是少了多餘的留白。 */
  .globe-panel {
    min-height: 280px;
    padding: var(--sp-3) var(--sp-4);
    gap: var(--sp-2);
  }
  /* 手機版海報是「文字在左、球在右」的構圖（globe.js 的 side 版面，球的位置由它算）。
     文字欄的寬度由球決定，避免壓到球；標題字級縮一點，長國名才能在窄欄裡斷成兩行。 */
  .globe-panel.globe-side .globe-head { max-width: var(--globe-text-max, 55%); }
  .globe-panel.globe-side .poster-title { font-size: 2rem; }
  .globe-panel.globe-side .poster-sub { font-size: 0.84rem; }
  /* 「拖曳轉動地球」這行會壓在球上，手機上收起來 */
  .globe-hint { display: none; }

  .poster-title { font-size: 2.2rem; }

  .poster-sub { max-width: none; margin-top: var(--sp-1); }

  .poster-foot { padding-top: var(--sp-2); }

  .plan-mode-group { grid-template-columns: 1fr; }

  .planner-form { padding: var(--sp-4) var(--sp-3); gap: var(--sp-3); }

  .dest-tree-scroll { max-height: 260px; }


  /* margin-bottom 從 24px 降到 10px：hero 圖跟下面的分頁／功能列黏太遠，
     圖本身已經是視覺焦點，不需要那麼大的留白才看得出分隔。 */
  .hero-banner { height: 180px; padding: var(--sp-3); margin-bottom: var(--sp-2); }
  .hero-city { font-size: 1.6rem; }

  .itinerary-toolbar { flex-direction: column; align-items: flex-start; gap: var(--sp-2); margin-bottom: 4px; }

  .day-tabs { margin-bottom: var(--sp-2); }

  .day-tab { padding: 6px 14px; font-size: 0.85rem; }

  /* 桌機版地圖抽屜只佔右邊 50% 寬，左邊整張行程表一直都看得到、點得到——
     開著地圖時直接點另一個站的名稱就會換成那個站的地圖，不用先關地圖。
     手機螢幕窄，沒辦法用「留白讓桌底透出來」湊出同樣的效果：四邊留多少
     空隙，行程表就只能透出同樣窄的一條，窄到看不清字、更點不到。
     改成從螢幕底部拉起的「底部工作表」（bottom sheet）：上下各半——
     手機也能做到跟桌機一樣「開著地圖直接點別的站切換」，不用先關地圖。
     原本試過地圖佔 70%，但單手滑手機時拇指自然落在螢幕中間偏下，剛好
     整塊是地圖，會怕滑動誤觸地圖本身（平移／縮放）而不是捲動行程表；
     改成對半分，拇指活動範圍有一半落在可以正常捲動的行程表上。地圖現在
     的資訊卡已經精簡到只剩座標修正框，50% 高度看一眼圖釘位置還夠用，
     真的要仔細看地圖時使用者也可以先收合行程再操作。 */
  .map-drawer {
    /* 50% → 47%：地圖再高一點。頁面底部的留白（body.map-drawer-open）要跟著改。 */
    top: 47%;
    /* 桌機版四邊留白是為了讓抽屜讀起來「浮在頁面上」而不是「貼死螢幕的一堵
       牆」（見上面桌機版註解）。原本手機版整個貼死左右邊緣，剛好違背了
       同一套設計語言——使用者反應看到滿版無邊界的地圖會不敢在上面滑動，
       怕誤觸地圖手勢而不是捲動頁面（技術上單指滑動其實會正常傳給頁面：
       Google Maps Embed 的 iframe 預設是 cooperative 手勢模式，單指一律
       捲頁，雙指才會動地圖，這是 Google 自己為了避免使用者卡在內嵌地圖上
       設計的行為，不需要自己攔截）。8px 邊距讓陰影在左右也看得見、讀起來
       是同一張卡片，這個寬度純粹是視覺語言一致，不是要開一條給拇指滑的
       安全縫（那麼窄根本滑不到）。 */
    left: 8px;
    right: 8px;
    bottom: 0;
    width: auto;
    max-width: none;
    border-radius: var(--radius) var(--radius) 0 0;
    /* 不管 top 設成幾 %，收起時都要整個滑出畫面下緣，用一個比 100% 高度
       再多一點的固定值保證關閉時完全看不到，比沿用側邊抽屜的
       --drawer-gap 算法更直接。 */
    transform: translateY(calc(100% + 40px));
  }

  .map-drawer.open { transform: translateY(0); }

  /* 拖曳指示條（grip handle）：不用真的接拖曳事件，純視覺提示「這是一個
     可互動的浮動面板」——使用者在其他 App（分享面板、系統選單）已經學過
     這個符號，看到它會更敢在下面滑動。pointer-events:none 保證不會擋到
     標題列按鈕的點擊。 */
  /* 手機版把地圖上方的「標題列＋搜尋列＋分類鈕」全部壓薄，讓出的高度都給地圖：
     標題列、關閉鈕、搜尋框與搜尋鈕的高度、分類鈕的上下 padding、各區塊間距，
     加起來省下約 35px，再加上抽屜本身多 3% 的高度，地圖大了三成左右。 */
  .map-drawer-head { padding: 12px 10px 3px var(--sp-3); }
  .map-drawer-close { width: 22px; height: 22px; font-size: 0.66rem; }
  .map-drawer-bar { gap: 5px; padding: 5px var(--sp-3) 6px; }
  .map-search { gap: 6px; }
  .map-search-input { padding: 4px 12px; font-size: 0.82rem; }
  .map-search-btn { padding: 4px 14px; font-size: 0.78rem; }
  .map-chip { min-height: 28px; padding: 2px 11px; font-size: 0.76rem; }
  .map-anchor { padding-top: 0; padding-bottom: 0; }
  .map-anchor-x { width: 24px; height: 24px; }

  .map-drawer::before {
    content: "";
    position: absolute;
    top: 7px;
    left: 50%;
    transform: translateX(-50%);
    width: 36px;
    height: 4px;
    border-radius: 99px;
    background: color-mix(in srgb, var(--color-text, #222) 22%, transparent);
    pointer-events: none;
  }

  /* 桌機版 .map-drawer-canvas 的 min-height:260px 是為了不被上面的資訊擠到
     只剩一條縫，但手機版整個抽屜被壓縮到只有螢幕一半高，標題列＋搜尋列
     加起來已經佔掉快 100px，剩下的空間在較矮的手機（例如 iPhone SE 這類
     機型）上可能連 260px 都不到——這時 min-height 會逼 canvas 撐出
     母元素能給的空間，而 .map-drawer 本身是 overflow:hidden，撐出來的
     部分會被裁掉。canvas 裡的 iframe 撐滿 canvas，一旦 canvas 底部被裁掉，
     Google Maps 自己畫在地圖右下/左下角的縮放、切換圖層等原生控制項就會
     跟著被裁掉、點不到。手機版降到 160px，讓地圖在更多機型上都能完整
     顯示，不會被自己的容器吃掉。 */
  .map-drawer-canvas { min-height: 160px; }

  /* 地圖開著時，頁面底部多留一段跟抽屜等高的留白——沒有這段的話，使用者
     捲到頁面最底部時，最後幾筆行程會被固定在下半螢幕的地圖蓋住，而且
     已經沒有更多內容可以往下捲來把它們推到上半部，等於那幾筆行程點標題
     切換地圖的功能完全失效。留白讓任何一筆行程都能被捲到地圖上緣以上。
     由 toggleMapDrawer() 開關 body 的 class，不影響平常瀏覽時的頁面高度。 */
  body.map-drawer-open { padding-bottom: 53vh; }

  /* 六欄在窄螢幕塞不下，讓表格自己橫向捲動，不要把欄位擠爛 */
  .day-toggle-body { overflow-x: auto; }
  /* 手機上讓表格塞得進畫面，不要橫向捲動。
     實測 375px 的手機上，min-width: 680px 會讓表格寬達 680px、可見區只有 355px——
     使用者得左右拖，而在那個擠壓的視野裡，同樣的字級看起來就會「特別大」
     （字級其實跟桌機一樣，是相對比例的問題）。
     移除 min-width 之後，內容才會自己折行去適應寬度。 */
  .sched-table { font-size: 0.82rem; min-width: 0; table-layout: auto; }
  .sched-table .col-time { width: 52px; }
  /* 資源欄在手機上讓表格自己依內容縮到最窄（width: 1% + 不換行） */
  .sched-table .col-res { width: 1%; }
  .sched-res { padding: 8px 2px; white-space: nowrap; }
  /* 編輯時段：表格上只顯示 24 小時制文字（.time-face），原生 <input type="time">
     疊在上面、透明，點下去照樣開原生選擇器。原生欄位在 12 小時制的裝置上會顯示
     「上午 09:00」，多兩個字就把時段欄撐寬、擠壓活動內容。 */
  .time-field { display: block; position: relative; width: 100%; }
  .time-face {
    display: flex;
    align-items: center;
    justify-content: center;
    box-sizing: border-box;
    min-height: var(--field-h);
    min-width: 46px;
    padding: 3px 4px;
    border: 1px solid var(--color-border, #ddd);
    border-radius: var(--field-radius);
    background: var(--color-surface, #fff);
    color: var(--color-text, #222);
    font-size: 0.78rem;
    font-variant-numeric: tabular-nums;
  }
  .time-field .time-input {
    position: absolute;
    inset: 0;
    width: 100%;
    height: 100%;
    min-width: 0;
    max-width: none;
    opacity: 0;
  }
  .time-field:focus-within .time-face { border-color: var(--color-primary, #333); }
  /* 欄位標題與敘述再降一階：它們是輔助資訊，在小螢幕上不該跟活動名稱搶注意力 */
  .sched-table thead th { font-size: 0.62rem; white-space: normal; }
  .sched-desc, .sched-desc span,
  .sched-transport, .sched-transport span { font-size: 0.74rem; }
  /* 時段欄寬沿用 --time-col-width（由 syncTimeColumnWidth() 依實際文字量出來或
     編輯模式的固定寬鬆值決定）。 */
  .sched-time, .sched-activity { padding: 10px var(--sp-2); }
  .day-add-stop, .day-extras { position: sticky; left: 0; }
  .day-toggle-theme { font-size: 0.82rem; }
  /* 單行橫向捲動已經是 .toolbar-actions 的預設行為（見上面主要定義），
     這裡只需要手機上按鈕本身縮小一點 */
  .tool-btn { font-size: 0.78rem; padding: 6px 9px; flex: 0 0 auto; }

  .icon-btn { width: 34px; height: 34px; font-size: 0.95rem; }
  .map-back-btn { height: 34px; padding: 0 14px; font-size: 0.8rem; }

  .stop { grid-template-columns: 1fr; gap: var(--sp-1); }
  .stop-time { padding-top: 0; }
  .timeline { padding: var(--sp-3); }

  .day-header { padding: var(--sp-3); flex-direction: column; align-items: flex-start; gap: 2px; }

  .day-map { height: 200px; }

  .combo-map { height: var(--dynamic-panel-height, 68vh); min-height: 360px; }

  .practical-grid { grid-template-columns: 1fr; padding: var(--sp-3); }
  .reco-section { padding: 0 var(--sp-3) var(--sp-3); }
}

/* =========================================================
   列印
   ========================================================= */
@media print {
  body { background: none !important; }

  #form-section, .share-btn, .day-tabs,
  .stop-actions, .cache-badge, .hero-credit, .booking-btn {
    display: none !important;
  }

  .container { max-width: 100%; padding: 0; }
  .hero-banner { height: 120px; box-shadow: none; }

  .day-panel {
    display: block !important;
    box-shadow: none;
    border: 1px solid #ccc;
    break-inside: avoid;
    margin-bottom: var(--sp-3);
  }

  .leaflet-container { display: none !important; }
}

/* =========================================================
   看別人怎麼玩（/explore）與公開行程相關元件
   沿用既有 token（--color-*、--sp-*、--radius-sm）與 .share-btn 按鈕語言。
   設計依據：docs/design/2026-09-19-explore-page.md
   ========================================================= */

/* 頂欄的常駐入口：虛線膠囊（跟 .install-btn 同一族），看得到但不跟主按鈕爭 */
.account-bar-link {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  margin-right: auto;
  padding: 0 14px;
  border: 1px dashed color-mix(in srgb, var(--color-primary, #333) 40%, transparent);
  border-radius: 999px;
  color: var(--color-primary, #333);
  font-size: 0.82rem;
  text-decoration: none;
  transition: background var(--transition), border-color var(--transition);
}
.account-bar-link[hidden] { display: none; }
.account-bar-link:hover { border-style: solid; background: color-mix(in srgb, var(--color-primary, #333) 6%, transparent); }

.explore-hero { text-align: center; padding: var(--sp-4) 0 var(--sp-3); }
.explore-eyebrow {
  margin: 0 0 6px;
  font-size: 0.72rem;
  letter-spacing: 0.3em;
  color: var(--color-primary, #333);
}
.explore-title {
  margin: 0;
  font-family: var(--font-heading, serif);
  font-size: clamp(1.9rem, 6vw, 2.6rem);
  color: var(--color-text, #222);
}
.explore-sub { margin: var(--sp-2) auto 0; max-width: 34em; font-size: 0.9rem; line-height: 1.7; color: var(--color-muted); }

.explore-filters { display: flex; flex-direction: column; gap: var(--sp-2); margin: var(--sp-3) 0 var(--sp-2); }
.explore-search {
  width: 100%;
  min-height: 46px;
  padding: 10px 16px;
  border: 1px solid var(--color-border, #ddd);
  border-radius: 999px;
  background: var(--color-surface, #fff);
  color: var(--color-text, #222);
  font-family: inherit;
  font-size: 0.95rem;
}
.explore-search:focus { outline: none; border-color: var(--color-primary, #333); box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary, #333) 14%, transparent); }

.explore-chips { display: flex; gap: 6px; overflow-x: auto; scrollbar-width: none; padding: 2px 0; }
.explore-chips::-webkit-scrollbar { display: none; }
.explore-chip {
  flex: 0 0 auto;
  min-height: 44px;
  padding: 6px 16px;
  border: 1px solid var(--color-border, #ddd);
  border-radius: 999px;
  background: var(--color-surface, #fff);
  color: var(--color-muted);
  font-family: inherit;
  font-size: 0.82rem;
  cursor: pointer;
  white-space: nowrap;
  transition: all var(--transition);
}
.explore-chip:hover { border-color: var(--color-primary, #333); color: var(--color-primary, #333); }
.explore-chip[aria-pressed="true"] { background: var(--color-primary, #333); border-color: var(--color-primary, #333); color: var(--color-on-primary, #fff); }

.explore-status { display: flex; align-items: center; justify-content: space-between; gap: var(--sp-2); margin: 0 0 var(--sp-2); min-height: 44px; }
.explore-count { margin: 0; min-width: 0; font-size: 0.8rem; color: var(--color-text, #222); }
.explore-sort select {
  min-height: 44px;
  padding: 6px 12px;
  border: 1px solid var(--color-border, #ddd);
  border-radius: var(--radius-sm);
  background: var(--color-surface, #fff);
  color: var(--color-text, #222);
  font-family: inherit;
  font-size: 0.82rem;
}

.explore-grid { display: grid; grid-template-columns: 1fr; gap: var(--sp-3); transition: opacity var(--transition); }
.explore-grid.is-stale { opacity: 0.55; }
@media (min-width: 640px) { .explore-grid { grid-template-columns: repeat(2, 1fr); } }
@media (min-width: 960px) { .explore-grid { grid-template-columns: repeat(3, 1fr); } }

.explore-card {
  position: relative;
  display: flex;
  flex-direction: column;
  border: 1px solid var(--color-border, #eee);
  border-radius: var(--radius-sm);
  background: var(--color-surface, #fff);
  box-shadow: var(--shadow-sm);
  overflow: hidden;
  transition: box-shadow var(--transition), transform var(--transition);
}
.explore-card:hover { box-shadow: var(--shadow); transform: translateY(-2px); }
.explore-card.is-skeleton { min-height: 170px; background: linear-gradient(90deg, color-mix(in srgb, var(--color-text, #222) 4%, transparent), color-mix(in srgb, var(--color-text, #222) 9%, transparent), color-mix(in srgb, var(--color-text, #222) 4%, transparent)); background-size: 200% 100%; animation: explore-shimmer 1.4s linear infinite; box-shadow: none; }
.explore-card.is-skeleton:hover { transform: none; box-shadow: none; }
@keyframes explore-shimmer { from { background-position: 200% 0; } to { background-position: -200% 0; } }
@media (prefers-reduced-motion: reduce) { .explore-card.is-skeleton { animation: none; } .explore-card:hover { transform: none; } }

/* 只有標題是連結，::after 撐滿整張卡片：整張都點得到，但螢幕閱讀器念到的是城市名 */
.explore-card-link { color: inherit; text-decoration: none; }
.explore-card-link::after { content: ""; position: absolute; inset: 0; }
.explore-card-link:focus-visible { outline: none; }
.explore-card-link:focus-visible::after { outline: 2px solid var(--color-primary, #333); outline-offset: -2px; border-radius: var(--radius-sm); }

.explore-card-main { display: flex; flex-direction: column; gap: 8px; padding: var(--sp-3); flex: 1 1 auto; }
.explore-card-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; }
.explore-city { margin: 0; font-family: var(--font-heading, serif); font-size: 1.15rem; color: var(--color-primary, #333); overflow-wrap: anywhere; }
.explore-days { flex: 0 0 auto; padding: 2px 10px; border-radius: 999px; background: color-mix(in srgb, var(--color-primary, #333) 10%, transparent); color: var(--color-primary, #333); font-size: 0.74rem; font-weight: 600; }
.explore-blurb { margin: 0; font-size: 0.86rem; line-height: 1.65; color: var(--color-text, #333); overflow-wrap: anywhere; }
.explore-stops { display: flex; flex-wrap: wrap; gap: 6px; margin: 0; padding: 0; list-style: none; }
.explore-stops li { padding: 3px 10px; border: 1px dashed var(--color-border, #ddd); border-radius: 999px; font-size: 0.74rem; color: var(--color-muted); overflow-wrap: anywhere; }

.explore-card-foot { padding: 10px var(--sp-3) var(--sp-3); border-top: 1px dashed var(--color-border, #eee); }
.explore-meta { display: flex; flex-wrap: wrap; gap: 2px 10px; min-width: 0; font-size: 0.74rem; color: var(--color-muted); }
.explore-author { color: var(--color-text, #333); font-weight: 600; overflow-wrap: anywhere; }

/* 冷啟動的幽靈卡：邀請人來公開自己的行程 */
.explore-card.is-ghost {
  align-items: center;
  justify-content: center;
  gap: 4px;
  min-height: 130px;
  padding: var(--sp-3);
  border: 1.5px dashed var(--color-border, #ccc);
  background: transparent;
  box-shadow: none;
  text-align: center;
  font-family: inherit;
}
.explore-card.is-ghost:hover { transform: none; box-shadow: none; }
.explore-card.is-ghost.is-action { cursor: pointer; }
.explore-card.is-ghost.is-action:hover { border-color: var(--color-primary, #333); }
.explore-ghost-title { font-family: var(--font-heading, serif); font-size: 0.95rem; color: var(--color-muted); }
.explore-ghost-sub { font-size: 0.84rem; font-weight: 600; color: var(--color-primary, #333); }

.explore-more { display: flex; flex-direction: column; align-items: center; margin: var(--sp-4) 0 0; }
.explore-more[hidden] { display: none; }
.explore-more-msg { margin: 0 0 var(--sp-2); font-size: 0.8rem; color: var(--color-danger, #b3261e); }
.explore-more-msg:empty { display: none; }
.explore-more-btn { min-height: 44px; padding: 10px 28px; border: 1px solid var(--color-primary, #333); border-radius: 999px; background: transparent; color: var(--color-primary, #333); font-family: inherit; font-size: 0.86rem; cursor: pointer; transition: all var(--transition); }
.explore-more-btn:hover:not(:disabled) { background: var(--color-primary, #333); color: var(--color-on-primary, #fff); }
.explore-more-btn:disabled { opacity: 0.6; cursor: default; }

.explore-empty { display: flex; flex-direction: column; align-items: center; gap: var(--sp-2); padding: var(--sp-5) var(--sp-3); border: 1px dashed var(--color-border, #ddd); border-radius: var(--radius-sm); text-align: center; }
.explore-empty[hidden] { display: none; }
.explore-empty-title { margin: 0; font-family: var(--font-heading, serif); font-size: 1.1rem; color: var(--color-text, #222); }
.explore-empty-text { margin: 0; max-width: 30em; font-size: 0.86rem; line-height: 1.7; color: var(--color-muted); }
.explore-empty-actions { display: flex; gap: var(--sp-2); flex-wrap: wrap; justify-content: center; margin-top: var(--sp-2); }
.explore-empty-actions .share-btn, .explore-empty .share-btn { text-decoration: none; display: inline-flex; align-items: center; justify-content: center; }
.explore-foot { margin: var(--sp-5) 0 0; text-align: center; font-size: 0.8rem; color: var(--color-text, #222); }

/* ---- 分享對話框：共用元件與「公開」區塊 ---- */
.share-btn { min-height: 44px; }
.share-link-btn { min-height: 44px; }
.share-close { width: 44px; height: 44px; margin: -8px -8px -8px 0; }
.share-msg { color: var(--color-danger, #b3261e); }
.share-msg.is-ok { color: var(--color-muted); }
.share-btn.danger { color: var(--color-danger, #b3261e); border-color: color-mix(in srgb, var(--color-danger, #b3261e) 40%, transparent); }
.share-btn.danger:hover:not(:disabled) { border-color: var(--color-danger, #b3261e); color: var(--color-danger, #b3261e); }
.share-link-btn:hover:not(:disabled) { background: color-mix(in srgb, var(--color-danger, #b3261e) 10%, transparent); color: var(--color-danger, #b3261e); }
.share-fine { color: var(--color-muted); }
.share-field { display: flex; flex-direction: column; gap: 4px; font-size: 0.78rem; color: var(--color-muted); }
.share-field input, .share-field textarea {
  padding: 8px 10px;
  border: 1px solid var(--color-border, #ddd);
  border-radius: var(--radius-sm);
  background: var(--color-bg, #fafafa);
  color: var(--color-text, #222);
  font-family: inherit;
  font-size: 0.85rem;
}
.share-field input { min-height: 44px; }
.share-field textarea { resize: vertical; }
.share-field input:focus, .share-field textarea:focus { outline: none; border-color: var(--color-primary, #333); box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary, #333) 14%, transparent); }
.share-count { align-self: flex-end; font-size: 0.72rem; color: var(--color-muted); font-variant-numeric: tabular-nums; }
.share-warn { margin: 0; padding: 8px 10px; border-radius: var(--radius-sm); background: color-mix(in srgb, #d99a2b 14%, transparent); font-size: 0.76rem; line-height: 1.65; color: var(--color-text, #444); }
.share-badge.is-public { background: color-mix(in srgb, var(--color-primary, #333) 12%, transparent); color: var(--color-primary, #333); }
.share-pub-meta { margin: 0; font-size: 0.8rem; line-height: 1.6; color: var(--color-muted); }
.share-pub-meta a { color: var(--color-primary, #333); }
.report-reasons { display: flex; flex-direction: column; gap: 2px; }
.report-reason { display: flex; align-items: flex-start; gap: 10px; min-height: 44px; padding: 8px 0; font-size: 0.88rem; color: var(--color-text, #222); cursor: pointer; }
.report-reason input { margin-top: 3px; width: 18px; height: 18px; flex: 0 0 auto; accent-color: var(--color-primary, #333); }
.report-reason small { display: block; font-size: 0.74rem; color: var(--color-muted); }
.share-btn[aria-disabled="true"] { opacity: 0.55; cursor: default; }

/* ---- 公開行程的分享頁 ---- */
.pub-bar {
  display: grid;
  grid-template-columns: 1fr;
  gap: var(--sp-2) var(--sp-4);
  margin: 0 0 var(--sp-3);
  padding: var(--sp-3);
  border: 1px dashed color-mix(in srgb, var(--color-primary, #333) 35%, transparent);
  border-radius: var(--radius-sm);
  background: color-mix(in srgb, var(--color-primary, #333) 5%, transparent);
}
.pub-crumb { display: inline-flex; align-items: center; width: fit-content; min-height: 44px; color: var(--color-primary, #333); font-size: 0.84rem; text-decoration: none; }
.pub-crumb:hover { text-decoration: underline; }
.pub-head { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
.pub-title { margin: 0; font-family: var(--font-heading, serif); font-size: 1.6rem; color: var(--color-text, #222); overflow-wrap: anywhere; }
.pub-blurb { margin: var(--sp-2) 0 0; font-size: 0.9rem; line-height: 1.65; color: var(--color-text, #333); overflow-wrap: anywhere; }
.pub-author { display: flex; align-items: center; gap: 8px; margin-top: var(--sp-2); font-size: 0.82rem; color: var(--color-muted); }
.pub-side { display: flex; flex-direction: column; gap: 6px; }
.pub-copy {
  width: 100%;
  min-height: 48px;
  padding: 10px 18px;
  border: none;
  border-radius: var(--radius-sm);
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  font-family: inherit;
  font-size: 0.92rem;
  font-weight: 600;
  cursor: pointer;
  transition: filter var(--transition);
}
.pub-copy:hover:not([aria-disabled="true"]) { filter: brightness(1.1); }
.pub-copy[aria-disabled="true"] { opacity: 0.6; cursor: default; }
.pub-fine { margin: 0; font-size: 0.76rem; line-height: 1.6; color: var(--color-muted); }
.pub-report { align-self: flex-end; min-height: 44px; padding: 0 6px; border: none; background: transparent; color: var(--color-muted); font-family: inherit; font-size: 0.78rem; text-decoration: underline; cursor: pointer; }
.pub-report:hover:not([aria-disabled="true"]) { color: var(--color-text, #222); }
.pub-report[aria-disabled="true"] { text-decoration: none; cursor: default; }
.pub-msg { margin: 0; font-size: 0.8rem; line-height: 1.5; color: var(--color-danger, #b3261e); }
.pub-msg:empty { display: none; }
.pub-owner { display: none; margin: 0; font-size: 0.86rem; color: var(--color-muted); }
.pub-owner a { color: var(--color-primary, #333); }
#pub-bar.is-owner .pub-side { display: none; }
#pub-bar.is-owner .pub-owner { display: block; }
body:has(#pub-bar.is-owner) .pub-foot { display: none; }
body:has(#pub-bar.is-owner) .pub-copy-tool { display: none; }
#pub-bar.is-checking .pub-side { visibility: hidden; }

/* 工具列上的主要動作（公開行程頁的「複製行程」） */
.tool-btn.is-primary {
  min-height: 44px;
  background: var(--color-primary, #333);
  border-color: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
}
.tool-btn.is-primary:hover:not([aria-disabled="true"]) {
  background: var(--color-primary, #333);
  color: var(--color-on-primary, #fff);
  filter: brightness(1.1);
}
.tool-btn.is-primary[aria-disabled="true"] { opacity: 0.6; cursor: default; }
@media (min-width: 720px) {
  .pub-bar { grid-template-columns: 1fr 240px; align-items: center; }
  .pub-crumb, .pub-owner { grid-column: 1 / -1; }
  #pub-bar.is-owner { grid-template-columns: 1fr; }
}

.pub-foot {
  display: flex; flex-direction: column; align-items: center; gap: var(--sp-2);
  margin: var(--sp-4) 0 0; padding: var(--sp-4) var(--sp-3);
  border: 1px dashed color-mix(in srgb, var(--color-primary, #333) 35%, transparent);
  border-radius: var(--radius-sm);
  background: color-mix(in srgb, var(--color-primary, #333) 5%, transparent);
  text-align: center;
}
.pub-foot-title { margin: 0; font-family: var(--font-heading, serif); font-size: 1.05rem; color: var(--color-text, #222); }
.pub-foot .pub-copy { max-width: 320px; }

/* 複製成功後的說明（取代 6 秒就消失的置中狀態列） */
.copy-banner {
  display: flex; align-items: flex-start; gap: 10px;
  margin: 0 0 var(--sp-3); padding: var(--sp-2) var(--sp-3);
  border: 1px dashed color-mix(in srgb, var(--color-primary, #333) 35%, transparent);
  border-radius: var(--radius-sm);
  background: color-mix(in srgb, var(--color-primary, #333) 5%, transparent);
}
.copy-banner-text { flex: 1 1 auto; min-width: 0; }
.copy-banner-title { margin: 0; font-size: 0.95rem; font-weight: 700; color: var(--color-text, #222); }
.copy-banner-body { margin: 2px 0 0; font-size: 0.82rem; line-height: 1.6; color: var(--color-text, #333); }
.copy-banner-close { flex: 0 0 auto; width: 44px; height: 44px; margin: -6px -10px -6px 0; border: none; border-radius: 50%; background: transparent; color: var(--color-muted); font-size: 0.9rem; cursor: pointer; }
.copy-banner-close:hover { background: rgba(0, 0, 0, 0.06); }

/* 首頁「產生行程」按鈕下方的提示：位置在按鈕之後，非同步冒出來也不會把按鈕推走 */
.explore-hint {
  display: flex; align-items: center; gap: 10px;
  margin: var(--sp-2) 0 0; min-height: 44px; padding: 8px 14px;
  border: 1px dashed color-mix(in srgb, var(--color-primary, #333) 40%, transparent);
  border-radius: var(--radius-sm);
  background: color-mix(in srgb, var(--color-primary, #333) 5%, transparent);
  text-decoration: none;
  animation: explore-hint-in 150ms ease-out;
}
.explore-hint[hidden] { display: none; }
.explore-hint:hover { border-style: solid; }
.explore-hint-text { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.explore-hint-title { font-size: 0.86rem; font-weight: 700; color: var(--color-text, #222); overflow-wrap: anywhere; }
.explore-hint-sub { font-size: 0.76rem; color: var(--color-muted); }
.explore-hint-arrow { margin-left: auto; color: var(--color-primary, #333); }
@keyframes explore-hint-in { from { opacity: 0; } to { opacity: 1; } }

/* 我的行程清單的標籤與資訊文字：字級與對比拉到及格 */
.menu-trip-tag { font-size: 0.72rem; }
.menu-trip-meta { color: var(--color-muted); }
.trips-empty-link { color: var(--color-primary, #333); }

/* 編輯模式：貼上地圖連結解析失敗時的說明 */
.stop-note {
  margin: 2px 0 0;
  font-size: 0.76rem;
  font-style: italic;
  line-height: 1.5;
  color: var(--color-muted);
}
.stop-note[hidden] { display: none; }
