  :root{
    --blue:#2f6fed;
    --teal:#19b8a6;
    --orange:#ff9a3c;
    --ink:#1c2740;
    --ink-soft:#5a6a8a;
    --bg:#f4f7fd;
    --card:#ffffff;
    --line:#e3eaf6;
    --glow:rgba(110,190,255,.65);
    --radius:18px;
    --shadow:0 10px 30px rgba(31,60,120,.10);
  }
  *{margin:0;padding:0;box-sizing:border-box}
  html{scroll-behavior:smooth}
  body{overflow-x:hidden}
  body{
    font-family:"Noto Sans TC","PingFang TC","Heiti TC","Microsoft JhengHei",system-ui,sans-serif;
    color:var(--ink);
    background:var(--bg);
    min-height:100vh;
  }
  a{color:inherit;text-decoration:none}

  /* ── 背景動態層 ─────────────────── */
  .bg-decor{position:fixed;inset:0;z-index:-1;pointer-events:none;overflow:hidden}
  .bg-decor .glow{position:absolute;border-radius:50%}
  .bg-decor .glow-a{
    width:min(1200px,90vw);aspect-ratio:2/1;left:-8%;top:-14%;
    background:radial-gradient(closest-side,#e2efff 0%,transparent 72%);
    animation:breathe 14s ease-in-out infinite;
  }
  .bg-decor .glow-b{
    width:min(1000px,80vw);aspect-ratio:2/1;right:-10%;top:-6%;
    background:radial-gradient(closest-side,#dcfaf4 0%,transparent 70%);
    animation:breathe 18s ease-in-out -6s infinite;
  }
  @keyframes breathe{
    0%,100%{opacity:.7;transform:translate(0,0) scale(1)}
    50%{opacity:1;transform:translate(28px,16px) scale(1.06)}
  }
  .bg-decor .orb{
    position:absolute;border-radius:50%;filter:blur(3px);
    animation:orbFloat var(--ot,10s) ease-in-out var(--od,0s) infinite;
  }
  @keyframes orbFloat{
    0%,100%{transform:translateY(0)}
    50%{transform:translateY(-26px)}
  }

  /* ── 頁首 ─────────────────────────── */
  header{
    position:sticky;top:0;z-index:50;
    display:flex;align-items:center;gap:14px;
    padding:14px clamp(16px,4vw,40px);
    background:rgba(255,255,255,.72);
    backdrop-filter:blur(14px);
    -webkit-backdrop-filter:blur(14px);
    border-bottom:1px solid rgba(227,234,246,.9);
  }
  .logo{display:flex;align-items:center;gap:10px;font-weight:800;font-size:1.15rem;letter-spacing:.5px}
  /* 公司圓印，本身就是紅底圓形，不需要再襯底色 */
  .logo .badge{
    width:38px;height:38px;flex-shrink:0;
    object-fit:contain;display:block;
  }
  /* 只在空格處斷行。不加的話 390px 寬會斷成「雲書苑 AI 學／院」，
     留一個孤字在第二行；加了之後最窄也只會斷成「雲書苑／AI 學院」。 */
  .logo > span{word-break:keep-all}
  .logo small{display:block;font-size:.7rem;font-weight:500;color:var(--ink-soft);letter-spacing:1.5px}
  header .spacer{flex:1}

  /* 檢視切換（地圖 / 清單） */
  .view-toggle{
    display:flex;align-items:center;gap:0;border:1px solid var(--line);border-radius:999px;
    background:#fff;box-shadow:var(--shadow);overflow:hidden;flex-shrink:0;
  }
  .view-toggle button{
    appearance:none;border:0;background:transparent;cursor:pointer;
    font:inherit;font-size:.88rem;font-weight:600;color:var(--ink-soft);
    padding:9px 16px;display:flex;align-items:center;gap:6px;
    transition:background .25s,color .25s;
  }
  .view-toggle button.active{
    background:linear-gradient(135deg,var(--blue),#5b8cff);color:#fff;
  }
  @keyframes popIn{0%{transform:scale(.92)}60%{transform:scale(1.06)}100%{transform:scale(1)}}
  .view-toggle button.active{animation:popIn .35s ease}
  .view-toggle button:not(.active):hover{color:var(--ink)}

  /* ── 頁首的家長入口 ───────────────── */
  .parent-entry{
    display:flex;align-items:center;gap:6px;flex-shrink:0;
    margin-left:10px;
    font-size:.88rem;font-weight:700;color:#fff;
    background:linear-gradient(135deg,#4a5db0,#6d7fd0);
    border-radius:999px;padding:9px 16px;
    box-shadow:0 6px 18px rgba(74,93,176,.28);
    transition:filter .2s ease,transform .2s ease;
  }
  .parent-entry:hover{filter:brightness(1.08);transform:translateY(-1px)}
  .parent-entry.is-soon{
    background:linear-gradient(135deg,#8a93ad,#a5adc4);
    box-shadow:0 4px 14px rgba(90,106,138,.22);
  }

  /* ── 即將推出說明覆蓋層 ───────────── */
  .notice{
    position:fixed;inset:0;z-index:200;
    display:none;align-items:center;justify-content:center;
    padding:20px;
    background:rgba(28,39,64,.55);
    backdrop-filter:blur(6px);-webkit-backdrop-filter:blur(6px);
  }
  .notice.open{display:flex;animation:noticeIn .3s ease-out}
  @keyframes noticeIn{from{opacity:0}to{opacity:1}}
  .notice-box{
    position:relative;
    background:var(--card);border-radius:var(--radius);
    box-shadow:0 24px 60px rgba(31,60,120,.28);
    padding:30px clamp(20px,4vw,38px);
    max-width:560px;width:100%;
    max-height:88vh;overflow-y:auto;
    text-align:center;
  }
  .notice-x{
    position:absolute;right:14px;top:14px;
    appearance:none;border:0;background:transparent;cursor:pointer;
    font-size:1.1rem;color:var(--ink-soft);line-height:1;
    padding:8px;border-radius:8px;
  }
  .notice-x:hover{background:#f2f6fe;color:var(--ink)}
  .notice-icon{font-size:2.6rem;display:block;margin-bottom:8px}
  .notice-box h2{font-size:1.25rem;font-weight:900;margin-bottom:10px}
  .notice-box > p{color:var(--ink-soft);font-size:.92rem;line-height:1.75}
  .notice-split{
    display:grid;grid-template-columns:1fr 1fr;gap:18px;
    margin:22px 0 20px;text-align:left;
  }
  .notice-split > div{
    background:#f7faff;border:1px solid var(--line);
    border-radius:14px;padding:16px;
  }
  .notice-split h3{font-size:.9rem;font-weight:800;margin-bottom:8px}
  .notice-split p{font-size:.84rem;line-height:1.7;color:var(--ink-soft)}
  .notice-contact{display:flex;flex-wrap:wrap;gap:6px 14px;margin-top:8px}
  .notice-contact a{color:var(--blue);font-weight:700}
  .btn-close{
    appearance:none;border:0;cursor:pointer;font:inherit;
    font-size:.9rem;font-weight:700;color:#fff;
    background:linear-gradient(135deg,var(--blue),#5b8cff);
    border-radius:999px;padding:11px 26px;
  }

  /* ── 主視覺文案 ───────────────────── */
  .hero-copy{
    text-align:center;
    padding:clamp(22px,4vw,44px) 20px 6px;
  }
  .hero-copy h1{
    font-size:clamp(1.5rem,3.4vw,2.4rem);font-weight:900;letter-spacing:1px;
    background:linear-gradient(100deg,var(--blue),var(--teal) 55%,var(--orange));
    -webkit-background-clip:text;background-clip:text;color:transparent;
  }
  .hero-copy p{margin-top:10px;color:var(--ink-soft);font-size:clamp(.9rem,1.6vw,1.02rem)}
  .hero-copy .hint{
    display:inline-flex;align-items:center;gap:8px;margin-top:14px;
    font-size:.82rem;color:var(--blue);font-weight:600;
    background:rgba(47,111,237,.08);border:1px solid rgba(47,111,237,.18);
    padding:7px 16px;border-radius:999px;
  }

  /* ── 進場動畫 ─────────────────────── */
  @keyframes enterUp{
    from{opacity:0;transform:translateY(18px)}
    to{opacity:1;transform:none}
  }
  @keyframes mapIn{
    from{opacity:0;transform:scale(.97)}
    to{opacity:1;transform:none}
  }
  .hero-copy h1{animation:enterUp .7s ease-out both}
  .hero-copy p{animation:enterUp .7s ease-out .12s both}
  .hero-copy .hint{animation:enterUp .7s ease-out .24s both}
  .map-scroll{animation:mapIn .8s ease-out .15s both}
  .zone-row{animation:enterUp .7s ease-out .45s both}
  .reveal{opacity:0;transform:translateY(16px);transition:opacity .7s ease,transform .7s ease}
  .reveal.in{opacity:1;transform:none}

  /* ── 地圖模式 ─────────────────────── */
  #map-view{max-width:1500px;margin:0 auto;padding:10px clamp(8px,2.5vw,32px) 30px}
  .map-scroll{border-radius:24px}
  .map-stage{
    position:relative;
    border-radius:24px;
  }
  .swipe-hint{display:none}
  .map-stage img.campus{
    display:block;width:100%;height:auto;
    mix-blend-mode:multiply;   /* 白底自動融入頁面背景，等同去背 */
    user-select:none;-webkit-user-drag:none;
  }

  /* ── 校園氛圍動畫（雲、鳥、星塵） ── */
  .ambient{
    position:absolute;inset:0;overflow:hidden;border-radius:24px;
    pointer-events:none;z-index:3;   /* 圖片之上、熱點(z:5)之下 */
  }
  /* 雲：軌道層跑整個舞臺寬度，雲體掛在軌道左端 */
  .cloud-track{
    position:absolute;left:0;width:100%;top:var(--ct);
    animation:cloudDrift var(--t) linear var(--cd) infinite;
  }
  @keyframes cloudDrift{
    from{transform:translateX(-18%)}
    to{transform:translateX(104%)}
  }
  .cloud{
    position:absolute;left:0;width:var(--w);aspect-ratio:5/2;
    background:rgba(255,255,255,.8);border-radius:999px;filter:blur(1px);
  }
  .cloud::before,.cloud::after{content:"";position:absolute;background:inherit;border-radius:50%}
  .cloud::before{width:55%;aspect-ratio:1;left:12%;bottom:28%}
  .cloud::after{width:40%;aspect-ratio:1;right:14%;bottom:36%}
  /* 飛鳥：一群三隻，週期性斜穿畫面 */
  .flock{
    position:absolute;left:0;top:34%;width:70px;height:44px;opacity:0;
    animation:flyAcross 24s linear 4s infinite;
  }
  @keyframes flyAcross{
    0%{transform:translate(-90px,0);opacity:0}
    2%{opacity:.9}
    30%{opacity:.9}
    33%{transform:translate(1560px,-150px);opacity:0}
    100%{transform:translate(1560px,-150px);opacity:0}
  }
  .bird{position:absolute;width:16px;height:8px}
  .bird::before,.bird::after{
    content:"";position:absolute;top:3px;width:9px;height:2px;border-radius:2px;
    background:#40587f;
  }
  .bird::before{left:0;transform-origin:right center;transform:rotate(-26deg);animation:flapL .5s ease-in-out infinite}
  .bird::after{left:7px;transform-origin:left center;transform:rotate(26deg);animation:flapR .5s ease-in-out infinite}
  @keyframes flapL{0%,100%{transform:rotate(-26deg)}50%{transform:rotate(6deg)}}
  @keyframes flapR{0%,100%{transform:rotate(26deg)}50%{transform:rotate(-6deg)}}
  /* 星塵：建築附近上升淡出的小亮點 */
  .spark{
    position:absolute;left:var(--sx);top:var(--sy);
    width:6px;height:6px;border-radius:50%;
    background:#ffd97a;box-shadow:0 0 8px 2px rgba(255,205,90,.5);
    opacity:0;animation:sparkRise var(--st) ease-out var(--sd) infinite;
  }
  @keyframes sparkRise{
    0%{opacity:0;transform:translateY(0) scale(.6)}
    15%{opacity:.95}
    100%{opacity:0;transform:translateY(-46px) scale(1.05)}
  }

  /* 建築光暈（滑過標籤時發亮） */
  .halo{
    position:absolute;left:var(--x);top:var(--y);
    width:calc(var(--r) * 1%);aspect-ratio:1;
    transform:translate(-50%,-50%);
    border-radius:50%;
    background:radial-gradient(circle,rgba(var(--accent,110,190,255),.5) 0%,rgba(var(--accent,110,190,255),0) 68%);
    filter:blur(6px);
    opacity:0;transition:opacity .4s ease;
    pointer-events:none;
  }

  /* 熱點：錨點在建築上，藥丸標籤漂浮於上方 */
  .spot{
    position:absolute;left:var(--x);top:var(--y);
    transform:translate(-50%,-100%);
    display:flex;flex-direction:column;align-items:center;
    z-index:5;
  }
  .spot .pill{
    display:flex;align-items:center;gap:7px;
    background:linear-gradient(rgba(var(--accent),.13),rgba(var(--accent),.05)),rgba(255,255,255,.88);
    backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
    border:1px solid rgba(var(--accent),.4);
    box-shadow:0 6px 22px rgba(var(--accent),.22), inset 0 0 0 1px rgba(255,255,255,.7);
    border-radius:999px;
    padding:8px 14px;
    font-size:clamp(.62rem,1.15vw,.9rem);font-weight:700;letter-spacing:.3px;
    white-space:nowrap;
    animation:float 3.6s ease-in-out infinite;
    animation-delay:var(--d,0s);
    transition:transform .45s cubic-bezier(.34,1.56,.64,1),box-shadow .3s ease,background .3s ease;
  }
  /* 分類色圖示：與清單卡片的圖示底色同一套語言 */
  .spot .pill .ic{
    width:1.6em;height:1.6em;flex-shrink:0;
    border-radius:50%;display:grid;place-items:center;
    background:rgba(var(--accent),.18);
    box-shadow:inset 0 0 0 1px rgba(var(--accent),.32);
  }
  .spot .pill .go{
    color:rgb(var(--accent));font-weight:800;font-size:.85em;
    opacity:.9;
  }
  .spot .stem{
    width:2px;height:clamp(14px,2.6vw,34px);
    background:linear-gradient(to bottom,rgba(var(--accent),.7),rgba(var(--accent),0));
    animation:float 3.6s ease-in-out infinite;
    animation-delay:var(--d,0s);
  }
  .spot .dot{
    width:10px;height:10px;border-radius:50%;
    background:rgb(var(--accent));
    animation:pulse 2.4s ease-out infinite;
    animation-delay:var(--d,0s);
  }
  .spot:hover .pill,.spot:focus-visible .pill{
    animation:none;
    transform:translateY(-6px) scale(1.1);
    background:linear-gradient(rgba(var(--accent),.2),rgba(var(--accent),.08)),rgba(255,255,255,.96);
    box-shadow:0 12px 34px rgba(var(--accent),.34), 0 0 0 2px rgba(var(--accent),.5);
  }
  /* 尚未上線的建築門牌：灰態。要放在上面幾條之後才蓋得掉它們的配色。 */
  .spot.is-soon .pill{
    background:linear-gradient(rgba(138,147,173,.16),rgba(138,147,173,.06)),rgba(255,255,255,.9);
    border-color:rgba(138,147,173,.45);
    box-shadow:0 6px 22px rgba(90,106,138,.18), inset 0 0 0 1px rgba(255,255,255,.7);
    color:var(--ink-soft);
  }
  .spot.is-soon .pill .ic{
    background:rgba(138,147,173,.18);
    box-shadow:inset 0 0 0 1px rgba(138,147,173,.32);
    filter:grayscale(1);
  }
  .spot.is-soon .pill .go{color:var(--ink-soft)}
  .spot.is-soon .dot{background:#8a93ad}
  .spot.is-soon:hover .pill,.spot.is-soon:focus-visible .pill{
    background:linear-gradient(rgba(138,147,173,.24),rgba(138,147,173,.1)),rgba(255,255,255,.98);
    box-shadow:0 12px 34px rgba(90,106,138,.3), 0 0 0 2px rgba(138,147,173,.5);
  }
  @keyframes float{
    0%,100%{transform:translateY(0) rotate(-1deg)}
    50%{transform:translateY(-10px) rotate(1deg)}
  }
  @keyframes pulse{
    0%{box-shadow:0 0 0 3px rgba(var(--accent),.35)}
    70%{box-shadow:0 0 0 12px rgba(var(--accent),0)}
    100%{box-shadow:0 0 0 3px rgba(var(--accent),0)}
  }

  /* ── 學區大標籤 ───────────────────── */
  .zone{
    position:absolute;left:var(--x);top:var(--y);
    transform:translate(-50%,-50%);
    display:flex;align-items:center;gap:6px;
    z-index:6;
    transition:opacity .35s ease;
  }
  .zone-pill{
    appearance:none;border:0;cursor:pointer;font:inherit;
    display:flex;align-items:center;gap:8px;
    background:linear-gradient(rgba(var(--accent),.16),rgba(var(--accent),.06)),rgba(255,255,255,.92);
    backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);
    border:1px solid rgba(var(--accent),.45);
    box-shadow:0 8px 26px rgba(var(--accent),.24), inset 0 0 0 1px rgba(255,255,255,.7);
    border-radius:999px;
    padding:10px 18px;
    font-size:clamp(.72rem,1.3vw,1rem);font-weight:800;letter-spacing:.4px;
    color:var(--ink);white-space:nowrap;
    animation:float 4.2s ease-in-out infinite;
    transition:transform .4s cubic-bezier(.34,1.56,.64,1),box-shadow .3s ease;
  }
  .zone-pill .zic{font-size:1.15em}
  .zone-pill .zcount{
    font-size:.72em;font-weight:800;color:rgb(var(--accent));
    background:rgba(var(--accent),.16);border-radius:999px;
    padding:2px 8px;min-width:22px;text-align:center;
  }
  .zone.is-focus .zone-pill{
    animation:none;
    transform:scale(1.06);
    box-shadow:0 14px 36px rgba(var(--accent),.36), 0 0 0 2px rgba(var(--accent),.5);
  }
  /* 主入口按鈕：只有帶 hub 的學區才有，展開時才出現 */
  /* 收合時一併用 visibility 藏起來，跟 .spot 一致——只有 opacity:0
     的話，看不見的連結照樣可以被 Tab 聚焦。 */
  .zone-enter{
    opacity:0;visibility:hidden;pointer-events:none;transform:translateX(-8px);
    font-size:.78rem;font-weight:800;color:#fff;
    background:linear-gradient(135deg,rgb(var(--accent)),rgba(var(--accent),.75));
    border-radius:999px;padding:8px 14px;white-space:nowrap;
    transition:opacity .3s ease,transform .3s ease,visibility 0s linear .3s;
  }
  .zone.is-focus .zone-enter{
    opacity:1;visibility:visible;pointer-events:auto;transform:none;
    transition:opacity .3s ease,transform .3s ease,visibility 0s;
  }
  /* 主入口尚未上線：灰態，點下去開站內說明 */
  .zone-enter.is-soon{background:linear-gradient(135deg,#8a93ad,#a5adc4)}

  /* 聚焦某區時，其他區淡下去 */
  .map-stage[data-focus] .zone:not(.is-focus){opacity:.4}

  /* ── 建築小光點：收合狀態下的存在感 ── */
  .beacon{
    position:absolute;left:var(--x);top:var(--y);
    width:12px;height:12px;border-radius:50%;
    transform:translate(-50%,-50%);
    background:rgb(var(--accent));
    box-shadow:0 0 0 4px rgba(var(--accent),.22);
    opacity:.85;z-index:4;
    animation:beaconBreathe 3.2s ease-in-out infinite;
    animation-delay:var(--d,0s);
    transition:opacity .3s ease;
  }
  @keyframes beaconBreathe{
    0%,100%{opacity:.55;transform:translate(-50%,-50%) scale(.9)}
    50%{opacity:.95;transform:translate(-50%,-50%) scale(1.1)}
  }
  /* 該區展開時光點讓位給門牌 */
  .map-stage[data-focus] .beacon{animation-play-state:paused}
  .map-stage[data-focus="creative"] .beacon[data-zone="creative"],
  .map-stage[data-focus="writing"]  .beacon[data-zone="writing"],
  .map-stage[data-focus="campus"]   .beacon[data-zone="campus"],
  .map-stage[data-focus="research"] .beacon[data-zone="research"]{opacity:0}

  /* ── 校車：沿環路行駛的熱點 ───────── */
  .busway{
    position:absolute;inset:0;width:100%;height:100%;
    pointer-events:none;z-index:4;
  }
  .bus{
    position:absolute;left:var(--x,50%);top:var(--y,50%);
    transform:translate(-50%,-50%);
    display:flex;flex-direction:column;align-items:center;gap:2px;
    z-index:7;
    text-decoration:none;
    transition:opacity .6s ease,visibility 0s linear 0s;
  }
  /* 環路有兩段被島擋住（見 campus.js 的 ROUTES.ring.hidden）。校車是疊在
     圖上的元素、不受遮擋，開到那兩段就淡出，否則會浮在屋頂上方。
     跟 .spot 一樣同時用 visibility——只有 opacity:0 的話，看不見的連結
     還是可以被 Tab 聚焦。visibility 延後 0.6 秒才切，讓淡出播完再隱藏；
     淡入時則立刻可見。 */
  .bus.is-behind{
    opacity:0;visibility:hidden;pointer-events:none;
    transition:opacity .6s ease,visibility 0s linear .6s;
  }
  /* 命中區域：透明的大圓，確保會動的目標點得到。
     桌機 56px、手機 48px，都在 44px 的最小可點尺寸之上 */
  .bus .bus-hit{
    position:absolute;left:50%;top:50%;
    width:56px;height:56px;border-radius:50%;
    transform:translate(-50%,-50%);
  }
  .bus .bus-icon{
    font-size:clamp(1.4rem,2.4vw,2rem);line-height:1;
    filter:drop-shadow(0 3px 6px rgba(31,60,120,.3));
    transition:transform .2s ease;
  }
  .bus.facing-left .bus-icon{transform:scaleX(-1)}
  .bus .bus-pill{
    opacity:0;transform:translateY(4px);
    background:rgba(255,255,255,.94);
    border:1px solid rgba(74,93,176,.4);
    box-shadow:0 6px 18px rgba(74,93,176,.24);
    border-radius:999px;padding:5px 11px;
    font-size:.74rem;font-weight:700;color:var(--ink);white-space:nowrap;
    transition:opacity .25s ease,transform .25s ease;
  }
  .bus:hover .bus-pill,.bus:focus-visible .bus-pill{opacity:1;transform:none}
  /* 尚未上線：灰態行駛 */
  .bus.is-soon .bus-icon{filter:grayscale(1) drop-shadow(0 3px 6px rgba(31,60,120,.2));opacity:.75}
  .bus.is-soon .bus-pill{color:var(--ink-soft);border-color:var(--line)}

  /* ── 建築門牌：預設收起 ─────────────── */
  /* 用 visibility 而不是只用 opacity——透明元素仍然可以用 Tab 聚焦，
     鍵盤使用者會跑到看不見的連結上。visibility 的過渡設成 0 秒但延後
     0.3 秒觸發，這樣淡出播完才真正隱藏，淡入時則立刻可見。 */
  .spot{
    opacity:0;visibility:hidden;pointer-events:none;
    transition:opacity .3s ease,visibility 0s linear .3s,
               transform .35s cubic-bezier(.34,1.56,.64,1);
    transition-delay:calc(var(--i,0) * 40ms);
  }
  /* 收合時把門牌動畫停下來。依 CSS 規範，visibility:hidden 的元素仍然生成
     盒子、動畫照跑（只有 display:none 才不跑），12 棟 × 3 層＝36 個無限
     迴圈會在什麼都沒展開的預設狀態下持續運算。
     animation-play-state 不是繼承屬性，所以要直接指到那三個子元素身上，
     只寫在 .spot 上沒有作用。過渡效果不受影響。 */
  .spot .pill,.spot .stem,.spot .dot{animation-play-state:paused}
  .map-stage[data-focus="creative"] .spot[data-zone="creative"],
  .map-stage[data-focus="writing"]  .spot[data-zone="writing"],
  .map-stage[data-focus="campus"]   .spot[data-zone="campus"],
  .map-stage[data-focus="research"] .spot[data-zone="research"]{
    opacity:1;visibility:visible;pointer-events:auto;
    transition:opacity .3s ease,visibility 0s,
               transform .35s cubic-bezier(.34,1.56,.64,1);
    transition-delay:calc(var(--i,0) * 60ms);   /* 進場 60ms 階梯，收合 40ms 較快 */
  }
  /* 展開的那一區才讓門牌動畫跑起來 */
  .map-stage[data-focus="creative"] .spot[data-zone="creative"] *,
  .map-stage[data-focus="writing"]  .spot[data-zone="writing"] *,
  .map-stage[data-focus="campus"]   .spot[data-zone="campus"] *,
  .map-stage[data-focus="research"] .spot[data-zone="research"] *{
    animation-play-state:running;
  }

  /* 學區徽章列 */
  .zone-row{
    display:flex;justify-content:center;flex-wrap:wrap;gap:10px;
    margin-top:6px;
  }
  .zone-row span{
    font-size:.8rem;font-weight:600;color:var(--ink-soft);
    background:#fff;border:1px solid var(--line);border-radius:999px;
    padding:6px 14px;box-shadow:0 3px 10px rgba(31,60,120,.06);
  }

  /* ── 清單模式（Adobe 目錄式） ─────── */
  #list-view{display:none;max-width:1240px;margin:0 auto;padding:18px clamp(16px,3vw,32px) 60px}
  .catalog{display:grid;grid-template-columns:230px 1fr;gap:28px;align-items:start}

  .cat-nav{
    position:sticky;top:84px;
    display:flex;flex-direction:column;gap:4px;
    background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
    padding:14px;box-shadow:var(--shadow);
  }
  .cat-nav button{
    appearance:none;border:0;background:transparent;cursor:pointer;text-align:left;
    font:inherit;font-size:.92rem;font-weight:600;color:var(--ink-soft);
    padding:10px 12px;border-radius:10px;
    display:flex;justify-content:space-between;align-items:center;gap:8px;
    transition:background .2s,color .2s;
  }
  .cat-nav button:hover{background:#f2f6fe;color:var(--ink)}
  .cat-nav button.active{background:linear-gradient(135deg,rgba(47,111,237,.12),rgba(25,184,166,.10));color:var(--blue)}
  .cat-nav button .count{
    font-size:.72rem;font-weight:700;color:var(--ink-soft);
    background:#eef2fa;border-radius:999px;padding:2px 8px;min-width:26px;text-align:center;
  }
  .cat-nav button.active .count{background:rgba(47,111,237,.15);color:var(--blue)}
  .cat-nav .dot-label{display:inline-flex;align-items:center;gap:8px}
  .cat-nav .cdot{
    width:8px;height:8px;border-radius:50%;flex-shrink:0;
    background:rgb(var(--accent,90,106,138));
  }

  /* 側欄的瀏覽維度切換 */
  .axis-switch{
    display:flex;gap:4px;padding:4px;margin-bottom:8px;
    background:#f2f6fe;border-radius:10px;
  }
  /* 這兩顆會吃到 .cat-nav button 的 space-between 與靠左對齊，要自己搶回來，
     不然維度切換的文字會擠在按鈕左邊而不是置中。 */
  .axis-switch button{
    flex:1;appearance:none;border:0;cursor:pointer;font:inherit;
    font-size:.82rem;font-weight:700;color:var(--ink-soft);
    padding:8px 6px;border-radius:8px;
    justify-content:center;text-align:center;
    transition:background .2s,color .2s;
  }
  /* 也要有自己的 hover 底色：.cat-nav button:hover 的 #f2f6fe
     跟這條軌道的底色同色，滑過去等於沒有回饋。 */
  .axis-switch button:hover{background:#e2eafa;color:var(--ink)}
  .axis-switch button.active{background:#fff;color:var(--blue);box-shadow:0 2px 8px rgba(31,60,120,.08)}

  /* 尚未上線的卡片 */
  .card .soon-badge{
    position:absolute;right:14px;top:14px;
    font-size:.68rem;font-weight:800;letter-spacing:.5px;
    color:#8a6d1f;background:#fdf3d6;border:1px solid #f0dfae;
    border-radius:999px;padding:3px 10px;
  }

  .cards{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:20px}
  .card{
    background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
    padding:22px;box-shadow:var(--shadow);
    display:flex;flex-direction:column;gap:12px;
    transition:transform .28s ease,box-shadow .28s ease;
    animation:enterUp .5s ease-out backwards;
    position:relative;overflow:hidden;
  }
  .card:hover{transform:translateY(-5px);box-shadow:0 18px 40px rgba(var(--accent),.22)}
  /* 分類色飾條：卡片的色彩身分 */
  .card::before{
    content:"";position:absolute;left:0;right:0;top:0;height:4px;
    background:linear-gradient(90deg,rgb(var(--accent)),rgba(var(--accent),.35));
  }
  .card::after{
    content:"";position:absolute;top:0;left:-60%;width:60%;height:100%;
    background:linear-gradient(105deg,transparent 20%,rgba(255,255,255,.45) 50%,transparent 80%);
    transform:translateX(0) skewX(-18deg);opacity:0;
    transition:transform .65s ease,opacity .3s ease;pointer-events:none;
  }
  .card:hover::after{transform:translateX(280%) skewX(-18deg);opacity:1}
  .card .top{display:flex;align-items:center;gap:12px}
  .card .icon{
    width:48px;height:48px;border-radius:14px;display:grid;place-items:center;font-size:1.5rem;flex-shrink:0;
    background:rgba(var(--accent),.12);
    box-shadow:inset 0 0 0 1px rgba(var(--accent),.22);
  }
  .card h2{font-size:1.08rem;font-weight:800}
  .card .loc{font-size:.75rem;color:var(--ink-soft);margin-top:2px}
  .card p{font-size:.88rem;line-height:1.7;color:var(--ink-soft);flex:1}
  .card .chips{display:flex;flex-wrap:wrap;gap:6px}
  .card .chips{align-items:center}
  /* 受眾標：方角實心，讀作「給誰用」 */
  .card .chips .aud{
    font-size:.71rem;font-weight:700;padding:4px 9px;border-radius:6px;
    background:#f6efe4;color:#96662a;border:0;
  }
  /* 分類標：圓角描邊加同色圓點，讀作「屬於哪類」 */
  .card .chips .tag{
    font-size:.72rem;font-weight:700;padding:4px 11px 4px 8px;border-radius:999px;
    background:#fff;color:rgb(var(--accent));border:1px solid rgba(var(--accent),.32);
    display:inline-flex;align-items:center;gap:5px;
  }
  .card .chips .tag::before{
    content:"";width:6px;height:6px;border-radius:50%;flex-shrink:0;
    background:rgb(var(--accent));
  }
  .card .chips .sep{width:1px;height:14px;background:var(--line);margin:0 3px}
  .card .cta{
    align-self:flex-start;
    display:inline-flex;align-items:center;gap:6px;
    font-size:.88rem;font-weight:700;color:#fff;
    background:linear-gradient(135deg,var(--blue),#5b8cff);
    border-radius:999px;padding:9px 18px;
    transition:filter .2s,transform .2s;
  }
  .card .cta:hover{filter:brightness(1.08);transform:translateY(-1px)}
  .cta.is-soon{
    appearance:none;border:0;cursor:pointer;font:inherit;
    background:linear-gradient(135deg,#8a93ad,#a5adc4);
  }
  .cta .arr{display:inline-block;transition:transform .25s ease}
  .cta:hover .arr{transform:translate(3px,-3px)}

  /* 頁腳走橫向：logo 在左、文字在右，省下垂直空間 */
  footer{
    color:var(--ink-soft);font-size:.8rem;
    padding:14px 16px 22px;
  }
  footer .foot-inner{
    display:flex;align-items:center;justify-content:center;
    flex-wrap:wrap;gap:6px 18px;
  }
  footer .footer-logo{
    width:76px;height:auto;display:block;flex-shrink:0;
  }
  footer .foot-text{text-align:left}
  footer .corp{margin-bottom:4px}
  footer .contact{
    display:flex;align-items:center;
    flex-wrap:wrap;gap:4px 14px;
  }
  footer a{
    color:var(--blue);font-weight:600;text-decoration:none;
    transition:opacity .2s ease;
  }
  footer a:hover{text-decoration:underline;opacity:.8}

  /* ── 響應式 ───────────────────────── */
  @media (max-width:860px){
    .catalog{grid-template-columns:1fr;gap:16px}
    .cat-nav{
      position:static;flex-direction:row;overflow-x:auto;gap:6px;padding:10px;
      scrollbar-width:none;
    }
    .cat-nav::-webkit-scrollbar{display:none}
    .cat-nav .axis-switch{flex-shrink:0;margin:0 8px 0 0}
    .cat-nav button{white-space:nowrap;flex-shrink:0}
  }
  @media (max-width:640px){
    header{padding:10px 12px;gap:8px}
    .logo{font-size:.95rem}
    .logo small{display:none}
    .logo .badge{width:32px;height:32px;font-size:1rem}
    .view-toggle button{padding:7px 9px;font-size:.74rem;gap:3px}
    .parent-entry{padding:8px 11px;font-size:.76rem;margin-left:6px}
    .parent-entry span{display:none}      /* 手機只留車子圖示 */
    .notice-split{grid-template-columns:1fr}
    .spot .pill{padding:6px 11px;gap:4px;font-size:.78rem}
    .spot .pill .go{display:none}
    .spot .stem{height:16px}
    .spot .dot{width:8px;height:8px}
    .zone-row span{font-size:.7rem;padding:5px 10px}
    .zone-pill{padding:9px 14px;font-size:.8rem}
    /* 手機：12 個門牌加 4 個學區標籤同時跑 backdrop-filter 是行動裝置上
       最貴的一項，改用不透明底色，視覺上幾乎看不出差別。 */
    .spot .pill,.zone-pill{backdrop-filter:none;-webkit-backdrop-filter:none}
    .spot .pill{background:linear-gradient(rgba(var(--accent),.13),rgba(var(--accent),.05)),#fff}
    .zone-pill{background:linear-gradient(rgba(var(--accent),.16),rgba(var(--accent),.06)),#fff}
    .spot.is-soon .pill{
      background:linear-gradient(rgba(138,147,173,.16),rgba(138,147,173,.06)),#fff;
    }
    .zone-pill .zcount{display:none}       /* 手機版省空間，數字讓位給名稱 */
    .zone-enter{padding:10px 14px;font-size:.76rem;min-height:44px;display:flex;align-items:center}
    /* 手機：地圖保持可讀寬度，改為左右滑動瀏覽 */
    .swipe-hint{
      display:block;text-align:center;color:var(--ink-soft);
      font-size:.78rem;font-weight:600;margin:2px 0 8px;
    }
    .map-scroll{overflow-x:auto;-webkit-overflow-scrolling:touch}
    .map-stage{width:860px}
    /* 手機：頁腳改回直向，文字置中 */
    footer .foot-inner{flex-direction:column;gap:8px}
    footer .foot-text{text-align:center}
    footer .contact{justify-content:center}
    footer .footer-logo{width:68px}
    /* 手機：氛圍元素減量 */
    .cloud-track.c3{display:none}
    .flock{animation-duration:30s}
    .bus .bus-hit{width:48px;height:48px}
    .bus .bus-pill{opacity:1;transform:none;font-size:.68rem}  /* 手機沒有 hover，直接顯示 */
  }
  /* 首次到訪的提示彈跳，只播一次 */
  .zone.hint-bounce .zone-pill{
    animation:hintBounce .7s ease-out var(--hint-delay,0s) 2;
  }
  @keyframes hintBounce{
    0%,100%{transform:translateY(0) scale(1)}
    35%{transform:translateY(-12px) scale(1.08)}
  }
  @media (prefers-reduced-motion:reduce){
    .spot .pill,.spot .stem,.spot .dot,.beacon,.zone-pill,
    .bg-decor .glow,.bg-decor .orb,
    .hero-copy h1,.hero-copy p,.hero-copy .hint,.map-scroll,.zone-row,.card,
    .view-toggle button.active{animation:none}
    /* 這條要單獨寫。上面那串只到 .zone-pill（特異度 0,1,0），
       贏不過 .zone.hint-bounce .zone-pill（0,3,0），
       停用動畫的人首次到訪照樣會看到四個標籤上下跳。
       campus.js 那邊也擋了一次，這裡是第二道保險。 */
    .zone.hint-bounce .zone-pill{animation:none}
    .ambient{display:none}
    .reveal{opacity:1;transform:none;transition:none}
    /* 展開收合的互動保留，只是不做過渡 */
    .spot{transition:none}
  }
