  /* ---------- 尚未設計 ---------- */
  .placeholder-card{ border:1px dashed var(--line-strong); border-radius:var(--r-lg); padding:44px 24px; text-align:center; color:var(--ink-faint); background:var(--surface); }
  .placeholder-card h2{ font-size:var(--fs-xl); color:var(--ink); margin-bottom:8px; }
  .placeholder-card p{ font-size:var(--fs-md); line-height:1.7; max-width:520px; margin:0 auto 20px; }

  .route-note{ padding:12px 16px 16px; color:var(--ink-faint); font-size:var(--fs-sm); border-top:1px solid var(--line); line-height:1.6; }
  .route-note code{
    font-family:'JetBrains Mono',monospace; background:var(--surface-2); padding:2px 4px;
    border-radius:var(--r-sm); border:1px solid var(--line); color:var(--ink-soft);
    overflow-wrap:anywhere;   /* /d/{deviceId}/p/{portProfileId}/** 在 320px 下沒有斷點可折 */
  }

  /* ---------- toast ---------- */
  .toast-stack{ position:fixed; right:18px; top:18px; z-index:60; display:flex; flex-direction:column; gap:8px; max-width:min(380px, calc(100vw - 36px)); }
  /* 2026-09-15 重設計：拿掉左邊那條 3px 色條（重設計明確不用漸層飾條與左邊框色條），狀態改用
     跟全站一致的 7px 圓點講；左邊多出來的 4px 內距一併收回，四邊都是 12px。 */
  .toast{
    background:var(--chrome-bg); color:var(--chrome-ink); border:1px solid var(--chrome-line); border-radius:var(--r-md);
    padding:12px; font-size:var(--fs-md); line-height:1.55; box-shadow:var(--shadow-pop);
    display:flex; align-items:flex-start; gap:8px;
  }
  /* toast 永遠是深色殼（--chrome-bg），所以圓點吃 chrome-* 那組定死的色，不是會隨主題翻的 --ok/--crit。
     margin-top:6px 是讓圓點對齊第一行文字的中線（13px × 1.55 行高）。
     variant-info 不再吃資訊藍（設計稿色票沒有第五顆語意色），改用亮青 --accent-2。 */
  .toast .toast-dot{ width:7px; height:7px; border-radius:50%; flex:none; margin-top:6px; background:var(--chrome-ink-soft); }
  .toast.variant-ok .toast-dot{ background:var(--chrome-ok); }
  .toast.variant-warn .toast-dot{ background:var(--chrome-crit); }
  .toast.variant-info .toast-dot{ background:var(--accent-2); }
  .toast .toast-text{ flex:1; min-width:0; overflow-wrap:anywhere; }
  .toast .toast-close{ background:none; border:none; color:var(--chrome-ink-soft); cursor:pointer; font-size:var(--fs-lg); line-height:1; padding:0 2px; flex:none; }
  @media (max-width:899px){
    /* 通知改成從底部長出來（手機通知的慣例，也離拇指近）。置頂全寬會把整條頂欄連同導覽 pill 蓋掉。 */
    .toast-stack{ left:8px; right:8px; top:auto; bottom:8px; max-width:none; flex-direction:column-reverse; }
  }


  /* ---------- 開機失敗橫幅（主控台前端模組化後續事項 TASK-08：partial fail-loud，core/partials.mjs 產生） ---------- */
  /* z-index 要蓋過登入閘門（120）：partial 抓不到時主控台根本沒開機，閘門也不會開，但萬一之後有人把閘門提前，橫幅仍要在最上面。 */
  .boot-error{
    position:fixed; left:0; right:0; top:0; z-index:130;
    background:var(--crit); color:var(--crit-ink); padding:14px 18px;
    font-size:var(--fs-md); line-height:1.6; box-shadow:var(--shadow-pop);
  }
  .boot-error strong{ display:block; font-size:var(--fs-lg); margin-bottom:6px; }
  .boot-error ul{ margin:0 0 6px; padding-left:20px; }
  .boot-error li{ margin:0; font-family:ui-monospace,Consolas,monospace; overflow-wrap:anywhere; }
  .boot-error p{ margin:0; opacity:.9; }
