  /* --navh / --sab 是「發佈版比嵌入版多出來的兩塊空間」：頂部導覽列的高度，
     與 iOS 底部橫條。用變數而不是在 standalone 區塊裡逐條蓋 top/bottom ——
     蓋的寫法踩過兩次同一個雷：覆寫區塊排在基礎規則**前面**，同權重後者贏，
     整排控制列就被壓在導覽列底下看不見（2026-08-14 讀者回報「沒有日期」）。
     變數只宣告這一次，先後順序就不再是正確性的一部分。 */
  /* 顏色一律走 token。深色主題原本是「把用到的選擇器一條一條列出來覆寫」，
     結果漏了 .hd 與 .price —— 清單標頭在深色下是白底、房價是 #1a1a1a 的黑字，
     等於整份清單看不見（2026-08-14 回報）。漏一條就是壞一塊，而且要有人剛好
     打開那一塊才會發現。改成一組 token：淺色在這裡、深色在檔尾整組覆寫，
     新增元件只要用 token 就自動兩種主題都對。 */
  :root{--sf:#fff;--sf2:#f1f3f5;--sf-h:#f5f9ff;
    --ink:#1a1a1a;--ink2:#666;--ink3:#888;--ink-dis:#ccc;
    --line:#eceef1;--line2:#e3e3e3;
    --good:#2e7d32;--goodbg:#f1f7f1;--goodsolid:#2e7d32;
    --tagbg:#eef3ff;--imgbg:#eef1f4;--scrim:rgba(255,255,255,.93);--score:#1a73e8;
    --sh:0 2px 10px rgba(0,0,0,.18);--sh-lg:0 8px 30px rgba(0,0,0,.24);--sh-pin:0 2px 7px rgba(0,0,0,.3);
    --pin:#fff;--pin-ink:#1a1a1a;--pin-w:#8a8a8a;--pin-line:transparent;
    --pin-sel:#1a1a1a;--pin-sel-ink:#fff;--pin-sel-w:#bbb;
    --dot:#5b6b7c;--dot-line:#fff;--vpl:#111;--vpl-ink:#fff;
    --badge-bg:rgba(17,18,20,.82);--badge-ink:rgba(255,255,255,.78);
    --glass:rgba(255,255,255,.72);--glass-line:rgba(255,255,255,.55);--glass-hi:rgba(255,255,255,.9);
    --glass-strong:rgba(255,255,255,.86);
    --navh:calc(52px + env(safe-area-inset-top));
    --sab:env(safe-area-inset-bottom)}
  *{box-sizing:border-box}
  html,body{margin:0;height:100%;font:14px/1.5 -apple-system,"Noto Sans TC",system-ui,sans-serif;color:var(--ink)}

  /* 版面：地圖鋪滿，控制列與清單都疊在上面（對標 Owen 提供的 Stay22 embed 截圖）。
     原本是「左清單 310px + 右地圖」—— 那讓地圖在 iframe 裡只剩一半寬度，
     而地圖才是這個產品的主體。 */
  #map{position:absolute;inset:0}
  
  /* 頂部導覽列：發佈版是獨立頁面，讀者需要知道「這是什麼活動的地圖」、
     能改日期人數、也能把它轉給同行的人。嵌入版不需要標題與分享 ——
     主辦方的頁面本來就有標題，控制列直接浮在地圖上。
     發佈版把控制列**收進導覽列裡**（#bar 變成 nav 的一個 flex 子元素）：
     兩排各自浮在地圖上會互相蓋，而且兩排白底看起來就是兩個不同的產品。 */
  #nav{position:absolute;top:0;left:0;right:0;z-index:1004;min-height:52px;
    padding:8px 12px 8px 16px;padding-top:calc(8px + env(safe-area-inset-top));
    display:flex;align-items:center;gap:10px;flex-wrap:wrap;
    background:var(--sf);border-bottom:1px solid var(--line)}
  .nav-t{font-size:15px;font-weight:700;max-width:26%;
    white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
  /* 導覽列裡的控制項用 Base UI 的尺度（36px 高、圓角 8、1px 邊框），
     不是浮在地圖上的藥丸 —— 白底上再打陰影會髒 */
  #nav #bar{position:static;flex:1;min-width:0;margin:0;gap:8px}
  #nav .ctl{border-radius:999px;height:36px;padding:0 14px;font-size:13.5px}
  /* 玻璃是「浮在地圖上」的語言 —— 進了實心白色導覽列，玻璃底、blur、
     外陰影全部拿掉，否則每顆按鈕在白底上都拖一團灰（2026-09-01 Owen 手機截圖，
     「按鈕跟按鈕之間都有灰色影子」）。改成安靜的填色膠囊（--sf2、無框線）。
     ⚠️ :not(.on)：啟用態是藍底白字，同特異性後寫的會把它洗掉 —— 這雷踩過。 */
  #nav .ctl:not(.on){background:var(--sf2);border-color:transparent;box-shadow:none;
    -webkit-backdrop-filter:none;backdrop-filter:none}
  #nav .ctl.on{box-shadow:none}   /* 藍底保留，但白面上不投影 */
  #nav .ctl.venue{display:none}   /* 標題已經寫在導覽列左邊了 */
  #nav .cta-main{border-radius:999px;height:36px;padding:0 16px;font-size:13.5px;box-shadow:none}
  #shareBtn{background:var(--sf2);border:1px solid transparent;border-radius:999px;height:36px;
    padding:0 14px;font-size:13.5px;font-weight:600;cursor:pointer;color:var(--ink);flex:none}
  #shareBtn:active{background:var(--line2)}

  /* 發佈版是獨立分享頁，不是 iframe —— 手機 Safari 要真的滿版。
     100vh 在 iOS 會被網址列吃掉一截（捲動時工具列收合，高度才對得上），
     所以用 100dvh，並留 -webkit-fill-available 給舊版。 */
  html,body{height:100%;overflow:hidden;overscroll-behavior:none}
  body{height:100dvh;min-height:-webkit-fill-available}
  .leaflet-control-zoom{margin-bottom:calc(10px + env(safe-area-inset-bottom))!important}
  @media(max-width:640px){
    /* 手機：標題與分享一排，控制列自己一排。
       原本的控制項是 36px 的框線盒子 —— 三個並排像表單不像 app（實測回報）。
       改成安靜的填色膠囊：無框線、32px、圓角 999，分享同款；只留一條底線分隔。
       （填色與去陰影的規則在上面的 #nav .ctl:not(.on) —— 全寬度共用，這裡只縮尺寸。） */
    #nav{gap:8px;row-gap:9px;padding:8px 12px;padding-top:calc(8px + env(safe-area-inset-top))}
    .nav-t{flex:1;max-width:none;font-size:16px;letter-spacing:-.01em}
    #nav #bar{flex-basis:100%;order:3;gap:6px}
    #nav .ctl{height:32px;padding:0 12px;font-size:12.5px;font-weight:600}
    #nav .ctl.icon{width:32px;padding:0;justify-content:center}
    #nav .cta-main{height:32px;border-radius:999px;padding:0 14px;font-size:12.5px}
    #shareBtn{height:32px;padding:0 13px;font-size:12.5px}
    :root{--navh:calc(90px + env(safe-area-inset-top))}
  }

  /* 頂部控制列：地點 · 日期 · 人數 · 篩選 ┈┈ 主要動作靠右 */
  #bar{position:absolute;top:calc(12px + var(--navh));left:12px;right:12px;z-index:1000;display:flex;gap:8px;align-items:center}
  /* 玻璃膠囊（嵌入版浮在地圖上、發佈版收在導覽列裡，同一套）。
     玻璃的辨識特徵不是 blur，是「邊緣高光 + 內部亮度層次」：
       · 半透明底色（不是實色）讓地圖透過來，saturate 讓透過來的顏色更活
       · 1px 半透明邊 + inset 頂部 1px 高光 = 光從上面來
     只做 backdrop-filter 就是「粗糙的玻璃」（實測回報）。 */
  .ctl{background:var(--glass);color:var(--ink);border-radius:999px;
    border:1px solid var(--glass-line);
    box-shadow:inset 0 1px 0 var(--glass-hi),0 2px 12px rgba(0,0,0,.18);
    -webkit-backdrop-filter:blur(14px) saturate(1.4);backdrop-filter:blur(14px) saturate(1.4);
    padding:9px 16px;font-size:13.5px;display:flex;align-items:center;gap:7px;white-space:nowrap}
  .ctl.venue{font-weight:600;max-width:38%;overflow:hidden;text-overflow:ellipsis;display:block}
  /* 焦點環（2026-09-01 Owen 兩次回報）：預設的 outline 按一下就留在那裡，
     但**不能只寫 outline:none** —— 只用鍵盤的人會完全找不到自己在哪一顆按鈕上。
     兩件事分開處理：
     ① 只靠 :focus-visible 擋不住滑鼠 —— 它的啟發式各家瀏覽器不同
        （Safari 對按鈕比 Chrome 寬鬆），實際上滑鼠點完環還是會留著。
        所以另外追蹤「最後一次互動是滑鼠還是鍵盤」（html.using-mouse），
        滑鼠時一律不畫環。這是確定性的，不依賴瀏覽器的判斷。
     ② 用 outline 不用 box-shadow：box-shadow 會蓋掉 .ctl 自己的玻璃陰影；
        而且先前那圈「2px 白 + 2px 藍」疊在 32px 的小膠囊上太厚，
        套在啟用態的藍底按鈕上會變成兩層藍。單圈 + offset 就夠了。 */
  #bar button:focus,#bar a:focus,#nav button:focus,#nav a:focus{outline:none}
  #bar button:focus-visible,#bar a:focus-visible,
  #nav button:focus-visible,#nav a:focus-visible{
    outline:2px solid var(--ink);outline-offset:2px}
  html.using-mouse :focus-visible{outline:none}
  .spacer{flex:1}
  /* 嵌入版的「查看住宿」是 <a>（真連結才右鍵得動、也不會被彈出視窗阻擋擋掉），
     獨立頁是 <button> —— 兩種都要長一樣，所以用 inline-flex 補回按鈕的排版行為 */
  .cta-main{background:var(--brand);color:var(--brand-ink);border:0;border-radius:999px;padding:10px 18px;
    font-size:13.5px;font-weight:700;cursor:pointer;box-shadow:var(--sh);white-space:nowrap;
    display:inline-flex;align-items:center;justify-content:center;
    text-decoration:none;font-family:inherit;line-height:1;box-sizing:border-box}
  a.cta-main:hover{color:var(--brand-ink)}

  /* 清單：由「查看住宿」開、清單標題裡的「隱藏列表」關 —— 一個入口一個出口 */
  /* ⚠️ 陰影只在打開時才給（2026-09-01 Owen 回報「地圖左邊一直有一道陰影」）：
     清單關著時是 translateX(-100%) 推到畫面外，但 box-shadow 照樣在算 ——
     它的右緣正好落在 x=0，30px 的模糊就整條滲進地圖左側。
     推到畫面外不等於不存在，陰影是會漏出來的。 */
  #list{position:absolute;top:calc(56px + var(--navh));bottom:0;left:0;width:340px;z-index:999;background:var(--sf);color:var(--ink);
    overflow:auto;box-shadow:none;
    transform:translateX(-100%);transition:transform .22s ease,box-shadow .22s ease}
  #list.open{transform:none;box-shadow:var(--sh-lg)}
  .hd{padding:12px 16px;border-bottom:1px solid var(--line);position:sticky;top:0;background:var(--sf);z-index:5}
  #hideList{display:block;margin:0 0 10px;border:0;background:var(--sf2);border-radius:999px;
    padding:6px 12px;font-size:12.5px;font-weight:600;cursor:pointer;color:var(--ink)}
  .hd b{font-size:15px}.hd div{color:var(--ink2);font-size:12px;margin-top:2px}
  .it{display:block;padding:14px 16px;border-bottom:1px solid var(--line);text-decoration:none;color:inherit;cursor:pointer}
  .ph{position:relative;border-radius:10px;overflow:hidden;margin-bottom:9px}
  .ph img{width:100%;height:150px;object-fit:cover;display:block;background:var(--imgbg)}
  .it .pc-m{margin-top:5px;display:flex;gap:8px;align-items:center}
  .it .pc-p{margin-top:6px}
  .mk-s{width:17px;height:17px;border-radius:4px;background:var(--brand);color:var(--brand-ink);font-size:10px;
    font-weight:800;display:inline-flex;align-items:center;justify-content:center}
  .it:hover,.it.on{background:var(--sf-h)}
  .nm{font-weight:600}
  .en{color:var(--ink3);font-size:12px}
  .mt{margin-top:4px;color:var(--ink2);font-size:12px;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
  .tag{background:var(--tagbg);color:var(--brand);border-radius:10px;padding:1px 7px;font-size:11px}
  .cta{color:var(--brand);font-weight:600}
  .mrt{background:var(--goodbg);color:var(--good);border-radius:10px;padding:1px 7px;font-size:11px}
  .ok{color:var(--good)}
  /* 載入骨架：pin 後到的那幾秒，清單放會呼吸的佔位卡，不留白 */
  .sk{padding:14px 16px;border-bottom:1px solid var(--line)}
  .sk div{background:var(--sf2);border-radius:8px;animation:skp 1.1s ease-in-out infinite}
  @keyframes skp{0%,100%{opacity:.5}50%{opacity:1}}
  .sk .a{height:150px;margin-bottom:10px}
  .sk .b{height:14px;width:65%;margin-bottom:7px}
  .sk .c{height:12px;width:45%}

  /* Pin：有房價的是白底 + 價格（截圖上最顯眼的元素）；沒房價的退成品牌色小標 */
  .pin{background:var(--pin);color:var(--pin-ink);border:1px solid var(--pin-line);border-radius:999px;padding:5px 13px 5px 5px;font-size:14px;
    font-weight:700;white-space:nowrap;box-shadow:var(--sh-pin);
    display:flex;align-items:center;gap:7px;cursor:pointer;
    transition:transform .15s ease,box-shadow .15s ease;transform-origin:50% 100%}
  /* 貼右緣時膠囊改成**往左長**（2026-09-01）：原本一律往右，貼邊的就被切掉，
     而「右側 150px 全部禁用」等於在 390px 手機上只剩 60% 可用 —— 大 pin 只剩 2 顆。
     翻面之後兩邊都放得下（Google Maps／Stay22 也是這樣處理邊緣的）。
     供應商方塊跟著換到右邊，才會貼著住宿的實際位置。 */
  .pin.flip{transform:translateX(-100%);flex-direction:row-reverse;padding:5px 5px 5px 13px}
  .pin:hover{transform:scale(1.07)}
  .pin.flip:hover{transform:translateX(-100%) scale(1.07)}
  .pin.sel{transform:scale(1.08) translateY(-2px)}
  .pin.flip.sel{transform:translateX(-100%) scale(1.08) translateY(-2px)}
  /* 避讓時縮成圓點 —— 資訊沒少（拉近就回來），只是不互蓋 */
  /* 價格是文字節點不是元素 —— 只靠 >*{display:none} 藏不掉它，
     font-size:0 才是把整顆縮成圓點的那一刀 */
  .pin.min{padding:0;width:15px;height:15px;border-radius:50%;overflow:hidden;font-size:0;
    background:var(--dot);border:2px solid var(--dot-line)}
  .pin.min>*{display:none}
  /* hover 的 pin 要浮到最上面 —— Leaflet 的 z-index 是行內樣式，只能 !important 蓋 */
  .leaflet-marker-icon:hover{z-index:9999!important}
  /* 供應商用首字方塊，不用對方的 logo —— 別人的商標不該貼在我們的 pin 上
     （docs/price-decision.md 紅線）。視覺節奏跟截圖一致，但用的是我們自己的標記。 */
  /* logo 照原樣放（素材包多半禁止改色），但要有邊界：Agoda 的圖是淺灰底淺灰字，
     直接放在白色 pin 上會整個消失。一條髮絲邊把它框出來，不動到 logo 本身。 */
  .pin .mk.lg,.mk-s.lg{background:#fff;object-fit:contain;border-radius:4px;
    box-shadow:inset 0 0 0 1px rgba(0,0,0,.12)}
  .pin .mk{width:22px;height:22px;border-radius:6px;background:var(--brand);color:var(--brand-ink);
    font-size:12px;font-weight:800;display:flex;align-items:center;justify-content:center;flex:none}
  .pin .w{color:var(--pin-w);font-weight:600;font-size:11.5px}
  .pin.sel{background:var(--pin-sel);color:var(--pin-sel-ink);border-color:var(--pin-sel);z-index:900}
  .pin.sel .w{color:var(--pin-sel-w)}
  .dot{width:13px;height:13px;border-radius:50%;background:var(--dot);border:2px solid var(--dot-line);
    box-shadow:0 1px 3px rgba(0,0,0,.35);cursor:pointer;transition:transform .15s ease}
  .dot:hover{transform:scale(1.35)}
  .dot.sel{background:var(--pin-sel);transform:scale(1.35)}
  /* 觸控裝置：把可點範圍墊到 44px（Apple HIG 底線），視覺大小不變。
     pin 膠囊本身 30px 高、小圓點 13px、卡片的 × 22px —— 手指按不準就是「點了沒反應」。 */
  @media(pointer:coarse){
    .pin{position:relative}
    .pin::after,.dot::after{content:'';position:absolute;inset:-9px}
    .dot{position:relative}
    #card .x::after{content:'';position:absolute;inset:-11px}
  }

  /* 會場：實心圓點，不是文字標籤（中文標籤在 divIcon 裡會被折成直書） */
  /* 44px 水滴 + 中心圓點（對標 Stay22 的場館標記大小）——
     它是讀者判斷「離會場多遠」的原點，比任何一個價格 pin 都重要 */
  .vp{position:absolute;left:3px;top:3px;width:44px;height:44px;
    border-radius:50% 50% 50% 0;transform:rotate(-45deg);
    background:var(--brand);border:3px solid #fff;box-shadow:0 3px 10px rgba(0,0,0,.35)}
  .vp::after{content:'';position:absolute;inset:0;margin:auto;width:14px;height:14px;
    border-radius:50%;background:#fff}

  /* 卡片貼著 pin，但**位置是算出來的** —— 先畫路徑，再從上下左右四個候選裡
     挑一個不壓到那條線、也還在畫面內的。固定在角落雖然不會壓到，但讀者要
     在地圖與角落之間來回找，體驗差。 */
  #card{position:absolute;z-index:1002;width:290px;background:var(--sf);color:var(--ink);border:1px solid var(--line);
    border-radius:8px;overflow:hidden;box-shadow:var(--sh-lg);
    transition:left .18s ease, top .18s ease}
  #card[hidden]{display:none}
  #card .x{position:absolute;top:8px;right:8px;z-index:6;width:26px;height:26px;border:0;
    border-radius:50%;background:var(--scrim);color:var(--ink);font-size:16px;line-height:1;cursor:pointer;
    box-shadow:0 1px 4px rgba(0,0,0,.25)}
  .pc-cta{display:block;margin-top:10px;text-align:center;background:var(--brand);color:var(--brand-ink);
    border-radius:6px;padding:0 16px;line-height:36px;font-size:14px;font-weight:600;text-decoration:none}
  .pc-img{width:100%;height:120px;object-fit:cover;display:block;background:var(--imgbg)}
  .pc-b{padding:10px 12px 12px}
  .pc-n{font-weight:700;font-size:14px;line-height:1.35}
  .pc-m{color:var(--ink2);font-size:12px;margin-top:3px;display:flex;gap:8px}
  /* 評分徽章：實心方塊缺左下角（OTA 通用的視覺記號），旁邊評語 + 則評論 */
  .scb{background:var(--score);color:#fff;border-radius:5px 5px 5px 0;
    padding:2px 7px;font-weight:800;font-size:12.5px;flex:none}
  .scw{color:var(--ink);font-weight:600}
  .rvn{color:var(--ink3)}
  .pc-p{margin-top:8px;text-align:right}
  .pc-p b{font-size:19px}
  .pc-p span{display:block;color:var(--ink3);font-size:11px}
  .pc-sup{margin-top:9px;padding-top:9px;border-top:1px solid var(--line);color:var(--ink3);font-size:11.5px;
    display:flex;align-items:center;gap:6px;flex-wrap:wrap}
  .pc-sup .sup{display:inline-flex;align-items:center;gap:4px;background:var(--sf2);border-radius:999px;
    padding:3px 9px 3px 3px;color:var(--ink);text-decoration:none;font-size:11.5px;font-weight:600}
  .pc-fc{position:absolute;top:8px;left:8px;z-index:5;background:var(--goodsolid);color:#fff;
    border-radius:6px;padding:2px 8px;font-size:11px;font-weight:700}
  #dateBtn{cursor:pointer;font:inherit}
  #dateBtn.on{background:var(--brand);color:var(--brand-ink);border-color:var(--brand);box-shadow:var(--sh)}
  /* 月曆：兩個月並排（跟參考圖一樣），手機一個月 */
  #cal{position:absolute;top:calc(56px + var(--navh));left:12px;z-index:1003;background:var(--sf);color:var(--ink);border:1px solid var(--line);border-radius:8px;
    padding:14px 16px 12px;box-shadow:var(--sh-lg);display:flex;gap:22px}
  #cal[hidden]{display:none}
  .mo{width:236px}
  .mo-h{display:flex;align-items:center;justify-content:space-between;font-weight:700;
    font-size:13.5px;margin-bottom:8px}
  .mo-h button{border:0;background:none;cursor:pointer;font-size:16px;padding:2px 8px;color:var(--ink)}
  .mo-g{display:grid;grid-template-columns:repeat(7,1fr);gap:1px;text-align:center}
  .mo-g .wd{font-size:11px;color:var(--ink3);padding:2px 0}
  .mo-g button{border:0;background:none;color:var(--ink);padding:6px 0;font-size:12.5px;cursor:pointer;border-radius:7px}
  .mo-g button:disabled{color:var(--ink-dis);cursor:default}
  .mo-g button.in{background:var(--tagbg)}
  .mo-g button.end{background:var(--brand);color:var(--brand-ink);font-weight:700}
  .cal-f{margin-top:8px;display:flex;justify-content:space-between;align-items:center;
    color:var(--ink3);font-size:12px}
  .cal-f button{border:0;background:none;color:var(--brand);font-size:12.5px;cursor:pointer}
  /* 旅客數用自己的浮層，不用原生 select —— iOS 會叫出系統輪盤，
     那是完全不同的視覺語彙，跟旁邊的篩選、月曆放在一起很突兀 */
  #guestBtn{cursor:pointer;font:inherit}
  #guestBtn.on{background:var(--brand);color:var(--brand-ink);border-color:var(--brand);box-shadow:var(--sh)}
  #guests{position:absolute;top:calc(56px + var(--navh));left:12px;z-index:1003;background:var(--sf);border:1px solid var(--line);border-radius:8px;
    padding:6px;box-shadow:var(--sh-lg);min-width:150px}
  #guests[hidden]{display:none}
  #guests{padding:6px 0;min-width:230px}
  .gr{display:flex;align-items:center;justify-content:space-between;gap:18px;
    padding:11px 16px;border-bottom:1px solid var(--line)}
  .gr:last-child{border-bottom:0}
  .gr small{color:var(--ink3);font-weight:400}
  .gs{display:flex;align-items:center;gap:12px}
  .gs b{min-width:16px;text-align:center;font-size:14px}
  .gs button{width:30px;height:30px;border-radius:50%;border:1px solid var(--line2);
    background:var(--sf);color:var(--ink);font-size:16px;line-height:1;cursor:pointer;
    display:flex;align-items:center;justify-content:center}
  .gs button:hover{background:var(--sf2)}
  .gs button:disabled{opacity:.35;cursor:default}
  .ctl.icon{cursor:pointer;font-size:14px;padding:7px 10px}
  /* 啟用態要連邊框一起換掉（2026-09-01 Owen 回報「實心藍外面又多一條線」）：
     .ctl 有 1px 的玻璃邊，只換背景的話那條淺色邊會留在藍底外圍 ——
     對照「查看住宿」用的是 .cta-main{border:0}，所以它是乾淨的一顆。
     box-shadow 也要換：.ctl 的玻璃陰影含一條 inset 的白色頂部高光
     （rgba(255,255,255,.9) 0 1px 0 inset），那條白線疊在藍底上就是第二圈。
     改成跟 .cta-main 同一個 var(--sh)，兩顆才長得一樣。 */
  .ctl.icon.on{background:var(--brand);color:var(--brand-ink);border-color:var(--brand);box-shadow:var(--sh)}
  /* 面板尺度對齊後台的 Base UI token（theme.js：圓角 8、控制項 36px、字 14px） */
  #filters{position:absolute;top:calc(56px + var(--navh));left:50%;transform:translateX(-50%);z-index:1002;width:304px;
    max-height:calc(100% - 76px - var(--navh));overflow:auto;background:var(--sf);color:var(--ink);border:1px solid var(--line);border-radius:8px;padding:4px 0 10px;
    box-shadow:var(--sh-lg)}
  #filters[hidden]{display:none}
  .fg{padding:12px 16px;border-bottom:1px solid var(--line)}
  .fl{font-weight:700;font-size:13px;text-align:center;margin-bottom:9px}
  .fr{display:flex;justify-content:space-between;color:var(--ink2);font-size:12px;margin-top:4px}
  #fPrice{width:100%}
  .seg{display:flex;gap:6px}
  .seg button{flex:1;border:1px solid var(--line2);background:var(--sf);border-radius:6px;height:36px;
    font-size:14px;cursor:pointer;color:var(--ink)}
  .seg button.on{background:var(--brand);color:var(--brand-ink);border-color:var(--brand)}
  .fclear{display:block;margin:12px auto 0;border:0;background:none;color:var(--brand);
    font-size:12.5px;cursor:pointer}
  #refetching{position:absolute;top:calc(60px + var(--navh));left:50%;transform:translateX(-50%);z-index:1002;
    background:var(--vpl);color:var(--vpl-ink);border-radius:999px;padding:6px 16px;font-size:12.5px;
    box-shadow:0 2px 8px rgba(0,0,0,.3)}
  #refetching[hidden]{display:none}
  #brand{position:absolute;left:10px;bottom:calc(8px + var(--sab));z-index:1000;background:var(--badge-bg);
    display:inline-flex;align-items:center;gap:6px;line-height:1;
    border-radius:6px;padding:4px 9px 4px 8px;font-size:11px;color:var(--badge-ink);text-decoration:none;
    box-shadow:0 1px 3px rgba(0,0,0,.25)}
  /* 字標的 viewBox 含 p 的下伸部（y 到 18.6），視覺重心偏上 —— 用固定高度 + 往下 1px 補回光學置中 */
  #brand .bl{height:12px;width:51px;display:block;color:#fff;position:relative;top:.5px}
  /* 圖資署名：授權要求顯示（OSM ODbL／Stadia 條款），但可以安靜 —— 10px、半透明、無邊框 */
  .leaflet-control-attribution{font-size:10px!important;padding:1px 6px!important;
    background:var(--scrim)!important;color:var(--ink3)!important;border-radius:4px 0 0 0}
  .leaflet-control-attribution a{color:var(--ink2)!important;text-decoration:none}
  /* 窄版收合成 ⓘ：整條「© Stadia Maps · © OpenMapTiles · © OpenStreetMap」在 331px 的
     側欄裡幾乎佔滿整個底邊。OSM 的署名指引明文允許把署名收在「(i) 按鈕」後面，
     條件是使用者找得到 —— 所以 ⓘ 永遠在、一點就展開，連結也都還在。
     Stadia 的條款是「保留，或換成能傳達同樣資訊、且符合你 UX 的形式」，收合符合後者。 */
  .leaflet-control-attribution.sw-mini{width:18px;height:18px;padding:0!important;border-radius:50%;
    overflow:hidden;color:transparent!important;cursor:pointer;position:relative}
  .leaflet-control-attribution.sw-mini::after{content:'i';position:absolute;inset:0;
    display:flex;align-items:center;justify-content:center;
    font:italic 700 11px/1 Georgia,serif;color:var(--ink2)}
  .leaflet-control-attribution.sw-mini.open{width:auto;height:auto;border-radius:4px 0 0 0;
    padding:1px 6px!important;color:var(--ink3)!important;overflow:visible}
  .leaflet-control-attribution.sw-mini.open::after{display:none}
  .empty{padding:28px 16px;color:var(--ink3);font-size:13px;text-align:center}
  .ft{padding:12px 16px;color:var(--ink3);font-size:11px}
  .credit{position:absolute;left:12px;bottom:22px;z-index:800;background:var(--scrim);
    border-radius:999px;padding:4px 11px;font-size:11px;color:var(--ink2)}
  @media(max-width:640px){
    #bar{flex-wrap:nowrap;gap:6px;overflow-x:auto;scrollbar-width:none}
    #bar::-webkit-scrollbar{display:none}
    /* 控制項不縮（帶可橫向捲動），但 spacer 要能長 —— 它被一起釘死成 flex:none 時
       「查看住宿」就只是左排到哪算哪，離右緣差一截（Owen 2026-09-02 兩張截圖：
       側欄與 1240px 都是同一個病） */
    #bar>*:not(.spacer){flex:none}
    /* 控制項一律用精簡尺度（原本只在 ≤340 才縮）—— 341–640px 才是手機的主要寬度 */
    #bar .ctl,#shareBtn{height:32px;font-size:12px;padding:0 10px}
    #bar .ctl svg{width:13px;height:13px}
    /* 「查看住宿」釘在右側：控制列是橫向捲動的，內容一長它就被捲出畫面，
       而它是整塊版位唯一的出口。sticky 讓它永遠貼在可視範圍的右緣。
       （精簡標籤已經讓內容放得下，這是保險 —— 語言、日期格式、場次數都可能再變長。） */
    #openList{position:sticky;right:0;z-index:2}
    /* 手機：「查看住宿」是進清單的唯一入口，縮小成跟其他控制項同尺度。
       height 是必要的：這裡把垂直 padding 歸零，而 #bar 是 align-items:center
       （不會撐高），所以沒有 height 的話整顆只剩一行文字的高度。
       341–640px 的嵌入（手機全寬的平台頁）一直是扁的 —— ≤340px 另有 height:30px
       的規則接住，FANSI 的 331px 側欄剛好落在那側，所以一直沒被看到。
       解法是直接複製旁邊 .ctl 的度量（同 padding、同字級、同 line-height）——
       stretch 會撐到 #bar 的高度（由最高的那個控制項決定，不一定是 .ctl），
       寫死 px 則會在字級改動時脫鉤。同度量最穩。 */
    /* 對齊到 .ctl 的每一項：padding 8＋8、line-height 1.5（12.5×1.5=18.75）、
       1px 邊框（.ctl 有玻璃邊，我們用透明的補回同樣的盒子）→ 兩者都是 37px。
       實測數字：8+8+18.75+1+1 = 36.75 */
    #openList{padding:8px 12px;font-size:12.5px;line-height:1.5;border:1px solid transparent}
    .ctl{padding:8px 12px;font-size:12.5px}
    .ctl.venue{max-width:100%}
    #list{width:100%}
    /* 手機沒有「旁邊」可以放 —— 一律從底部升起。
       版型改成橫式（圖左、內容右，對標 Booking 的手機卡）：
       原本的直式大圖佔掉半個螢幕，讀者看不到自己剛點的那個 pin。 */
    /* 等高：有沒有評分、名稱多長、有沒有「也可訂」，卡片都是同一個高度 ——
       高度跳動會讓左右滑瀏覽時整張卡上下跳（實測回報）。
       裝不下的（也可訂、條件列）收進上滑展開態。
       170px：158 在 iOS 的實際字高下會把 CTA 切掉（真機截圖回報）。 */
    #card{left:8px!important;right:8px;top:auto!important;bottom:calc(8px + var(--sab));width:auto;
      display:grid;grid-template-columns:104px 1fr;height:170px}
    /* 名稱讓開右上的 × —— 長名會鑽到按鈕底下 */
    :is(#card,.pcg) .pc-n{padding-right:26px}
    /* 沒報價時價格列一樣佔位 —— CTA 永遠在同一個高度 */
    :is(#card,.pcg) .pc-p{min-height:34px}
    /* 行高全部釘死成像素 —— iOS 的字體度量比桌機高，rem/倍數行高會把
       內容推進 CTA 區（實測回報「CTA 蓋到資訊」）。定死之後總高是常數：
       9+18+19+18+2+34 = 100，CTA 區從 116 開始，永遠碰不到。 */
    :is(#card,.pcg) .pc-n{font-size:14px;line-height:18px}
    :is(#card,.pcg) .pc-m{font-size:11.5px;line-height:16px;margin-top:3px}
    :is(#card,.pcg) .pc-p{margin-top:2px}
    :is(#card,.pcg) .pc-p b{font-size:17px;line-height:20px}
    :is(#card,.pcg) .pc-p span{font-size:10.5px;line-height:14px}
    /* CTA 絕對釘在卡底 —— 跟上面的高度計算脫鉤 */
    :is(#card,.pcg) .pc-b{position:relative;padding-bottom:54px}
    :is(#card,.pcg) .pc-cta{position:absolute;left:11px;right:11px;bottom:10px;margin:0}
    /* 鄰卡（ghost）＝完整卡片，與主卡同版型，藏在左右、露 20px 邊。
       拖主卡時三張一起位移 —— 這才是「下一張跟著進來」的 carousel。 */
    #card{left:26px!important;right:26px}
    .pcg{position:absolute;left:26px;right:26px;bottom:calc(8px + var(--sab));height:170px;
      z-index:1001;background:var(--sf);color:var(--ink);border:1px solid var(--line);
      border-radius:8px;overflow:hidden;box-shadow:var(--sh-lg);cursor:pointer;
      display:grid;grid-template-columns:104px 1fr}
    .pcg[hidden]{display:none}
    .pcg .x{display:none}
    .pcg .pc-cta{pointer-events:none}
    #card.full{height:auto}
    /* 每一列都 flex:none —— overflow:hidden 的 flex 子元素會被收縮到 0，
       名稱那一列就是這樣整列消失的（實測截圖）。空間由 CTA 的 margin-top:auto 吸收。 */
    :is(#card,.pcg) .pc-b{overflow:hidden;display:flex;flex-direction:column}
    :is(#card,.pcg) .pc-b>*{flex:none}
    :is(#card,.pcg) .pc-n{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
    #card.full .pc-n{white-space:normal}
    :is(#card,.pcg) .pc-sup{display:none}
    #card.full .pc-sup{display:flex}
    :is(#card,.pcg) .pc-cta{margin-top:auto}
    :is(#card,.pcg) .pc-img{height:100%;min-height:118px;border-radius:0}
    :is(#card,.pcg) .pc-b{padding:9px 11px 10px}
    :is(#card,.pcg) .pc-n{font-size:13.5px;line-height:1.3}
    :is(#card,.pcg) .pc-m{font-size:11.5px;margin-top:2px}
    :is(#card,.pcg) .pc-p{margin-top:4px}
    :is(#card,.pcg) .pc-p b{font-size:16px}
    :is(#card,.pcg) .pc-p span{font-size:10.5px}
    :is(#card,.pcg) .pc-sup{margin-top:6px;padding-top:6px;font-size:11px}
    :is(#card,.pcg) .pc-cta{margin-top:7px;padding:7px;font-size:12.5px}
    :is(#card,.pcg) .pc-fc{top:6px;left:6px;font-size:10px;padding:1px 6px}
    #card .x{width:22px;height:22px;font-size:14px;top:6px;right:6px}
    /* 抓握條：告訴讀者這張卡可以上滑 */
    #card::before{content:'';position:absolute;top:5px;left:50%;transform:translateX(-50%);
      width:36px;height:4px;border-radius:2px;background:var(--line2);z-index:6}
    :is(#card,.pcg) .pc-x{display:none}
    #card.full{grid-template-columns:1fr;max-height:72vh;overflow:auto}
    #card.full .pc-img{height:180px;min-height:0}
    #card.full .pc-x{display:flex}
    /* 手機：浮層一律從底部彈出，不再蓋在地圖中間 —— 兩個面板疊在一起就是這樣來的 */
    #cal,#filters,#guests{left:0!important;right:0;top:auto!important;bottom:0;transform:none!important;
      width:auto;max-width:none;border-radius:12px 12px 0 0;max-height:76vh;overflow:auto;
      padding-bottom:calc(18px + var(--sab));box-shadow:0 -6px 28px rgba(0,0,0,.28)}
    #cal{flex-direction:column;gap:14px}
    .mo{width:auto}
    /* 窄版**不隱藏**品牌（2026-08-31 Owen）：331px 側欄是平台嵌入的主要形狀，
       那正是最需要留下「這塊是誰做的」的地方。改讓圖資署名收合讓位。 */
    #brand{padding:3px 7px;font-size:10px}
    #brand .bl{height:10px;width:43px}
  }
    /* 超窄容器（< 340px）：landing 的手機框、極窄 iframe。375 的手機版型在這裡會折行 ——
     評分列「很好 4,972 則評論」折成三行、價格被擠出卡外（實測截圖）。圖欄縮、字再降一階、不折行。 */
  @media(max-width:340px){
    #card{grid-template-columns:84px 1fr;height:156px}
    :is(#card,.pcg) .pc-b{padding:8px 9px 10px}
    :is(#card,.pcg) .pc-n{font-size:12.5px;line-height:16px;padding-right:22px}
    :is(#card,.pcg) .pc-m{font-size:10.5px;line-height:14px;gap:5px;white-space:nowrap;overflow:hidden}
    :is(#card,.pcg) .scb{font-size:11px;padding:1px 5px}
    :is(#card,.pcg) .rvn{overflow:hidden;text-overflow:ellipsis}
    :is(#card,.pcg) .pc-p{min-height:30px;margin-top:0}
    :is(#card,.pcg) .pc-p b{font-size:15px;line-height:18px}
    :is(#card,.pcg) .pc-p span{font-size:9.5px;line-height:12px}
    :is(#card,.pcg) .pc-b{padding-bottom:46px}
    :is(#card,.pcg) .pc-cta{left:9px;right:9px;bottom:8px;line-height:30px;font-size:12px}
    :is(#card,.pcg) .pc-fc{font-size:9px;padding:1px 5px}
    .pcg,#card{left:18px!important;right:18px}
    .pcg{height:156px}
    #nav{padding-left:10px;padding-right:10px}
    .nav-t{font-size:14px}
    /* ⚠️ 用 #bar 不用 #nav：嵌入模式沒有 #nav 那層（#bar 直接掛在 body），
       #nav 開頭的規則在客戶頁面裡一條都不會命中（2026-08-23 在 FANSI 版位實測發現） */
    #bar .ctl,#shareBtn,#bar .cta-main{height:30px;font-size:11.5px;padding:0 8px}
    /* 場地名在 300px 的側欄裡是奢侈品（實測吃掉 227px）—— 外框卡片本來就有標題 */
    #bar .ctl.venue{display:none}
    #bar{gap:5px}
    #bar .ctl svg{width:12px;height:12px}
    #bar .cta-main{padding:0 10px}
  }


/* 深色主題 = **整組換掉調色盤**，不是把用到的選擇器一條一條列出來覆寫。
     舊寫法漏了 .hd 與 .price：清單標頭在深色下還是白底、房價還是 #1a1a1a 的黑字，
     於是整份清單看不見，而且要有人剛好把清單拉開才會發現（2026-08-14 回報）。
     ⚠️ 這一段仍必須排在基礎規則**之後** —— :root 同權重，後者贏。 */
  :root{
    --sf:#1e1f22;--sf2:#2c2e33;--sf-h:#26282d;
    --ink:#e8e8ea;--ink2:#9a9ca3;--ink3:#8b8e97;--ink-dis:#4a4d55;
    --line:#33353c;--line2:#3a3d45;
    /* 深綠在深色底上等於看不見 —— 綠字要拉亮，實心綠標則只要稍微提一階 */
    --good:#5cc98a;--goodbg:#22382a;--goodsolid:#2f7d4a;
    --tagbg:#2b3242;--imgbg:#26282d;--scrim:rgba(22,23,27,.92);--score:#3b82f6;
    /* 深色底上陰影幾乎看不出來，浮層改用邊框定邊界（--line），陰影只負責層次 */
    --sh:0 2px 10px rgba(0,0,0,.6);--sh-lg:0 10px 34px rgba(0,0,0,.7);
    /* 圖磚被提亮到 ~#2a–#3a 之後，原本 #1e1f22 的 pin 就跟地面同一階了。
       壓暗一階再加一條淺邊，pin 才會像「浮在地圖上的東西」而不是地圖的一部分。 */
    --sh-pin:0 2px 10px rgba(0,0,0,.7);
    --pin:#141519;--pin-ink:#f4f5f7;--pin-w:#9498a1;--pin-line:#43464f;
    --pin-sel:#f2f2f4;--pin-sel-ink:#111;--pin-sel-w:#555;
    --dot:#dfe2e8;--dot-line:#141519;--vpl:#f2f2f4;--vpl-ink:#111;
    --badge-bg:rgba(17,18,20,.72);--badge-ink:rgba(255,255,255,.78);
    --glass:rgba(30,31,36,.55);--glass-line:rgba(255,255,255,.14);--glass-hi:rgba(255,255,255,.10);
    --glass-strong:rgba(24,25,30,.72)}
  body{background:#111}
  /* ⚠️ CARTO dark_all 直接用會**黑到什麼都看不到**（2026-08-14 回報）：
     它的地面是 #131313、道路 #2a2a2a，兩者只差 6% 亮度 —— 在手機那種
     反光螢幕上就是一整片黑，讀者連自己在哪一區都認不出來。
     對標 futuremode.xyz 用的 Google 夜間樣式：地面約 #212121、道路 #3d–#5a，
     關鍵是「地面抬起來、道路抬得更多」。
     brightness 負責把整體抬進那個區間；contrast 只微調 —— 拉高到 1.2 以上
     地面會被壓回黑色，反而更花（實機比過 1.85／2.15／2.45 三組）。
     只動圖磚那一層：路徑線、pin、控制項都在別的 pane，不受影響。 */
  .leaflet-tile-pane{filter:brightness(2.45) contrast(1.02) saturate(.8)}
  /* 拖動時還沒補上的圖磚會露出底色 —— 純黑會閃，用跟地面差不多的深灰 */
  #map{background:#1c1d20}
  /* 會場那一根還是白框 —— 它要在提亮後的地圖上一眼認出來 */
  .vp{border-color:#fff}
  .leaflet-control-zoom a{background:var(--sf)!important;color:var(--ink)!important;border-color:var(--line)!important}

  /* ── A+C（Owen 2026-08-14 拍板）──
     A：面板整套毛玻璃 —— 卡片、清單、月曆、篩選、旅客數、導覽列同一種玻璃，
        跟地圖是同一個世界。@supports 守門：不支援 backdrop-filter 的裝置
        （老 Android WebView）自動落回上面的實色 token，一行都不用改。
     C：價格行拉到最高對比 —— 深色下的轉換元素不能跟著霧掉，
        金額用純白、副標比一般次要字亮一階。 */
  @supports ((backdrop-filter:blur(2px)) or (-webkit-backdrop-filter:blur(2px))){
    #nav,#card,.pcg,#list,#cal,#filters,#guests{background:var(--glass-strong);
      -webkit-backdrop-filter:blur(18px) saturate(1.15);backdrop-filter:blur(18px) saturate(1.15)}
    #nav{border-bottom-color:var(--glass-line)}
    #card,#cal,#filters,#guests{border-color:var(--glass-line);
      box-shadow:inset 0 1px 0 var(--glass-hi),var(--sh-lg)}
    /* 清單標頭是 sticky —— 底下滾過的內容也要被它模糊掉，自己再上一層 */
    .hd{background:rgba(24,25,30,.82);-webkit-backdrop-filter:blur(18px);backdrop-filter:blur(18px)}
  }
  .pc-p b{color:#fff}
  .pc-p span{color:#b9bcc4}
