  /* ---------- 按鈕 ---------- */
  /* 2026-09-15 設計稿密度：控制項一律 32px／圓角 6px／13px／預設字重 500（實心強調鈕才 600）。
     改用固定 height 取代 min-height——原本 padding:8px 12px 疊上 13px 字行高會把實高撐到約 38px，
     min-height:32px 完全咬不到；固定 height 才是設計稿真正的 32px。 */
  .btn{
    appearance:none; border-radius:var(--r-md); cursor:pointer; white-space:nowrap;
    font-size:var(--fs-md); font-weight:500; height:32px; padding:0 12px;
    border:1px solid transparent; display:inline-flex; align-items:center; justify-content:center; gap:4px;
    transition:filter .12s ease, background-color .12s ease, border-color .12s ease, color .12s ease;
  }
  .btn:disabled{ cursor:not-allowed; opacity:.5; }
  /* RBAC TASK-04b：被權限擋住的按鈕。跟一般 disabled（「已達端點上限」「連線建立中」）刻意長得
     不一樣——一般 disabled 是「現在不能按、等一下就好」，權限 disabled 是「你這個帳號不能按」，
     兩件事共用同一種淡掉的強調色，使用者會一直在那邊等它自己亮起來。中性灰把「這不是暫時的」
     講出來，tooltip（title）再補為什麼。選擇器多一個屬性，蓋得過 .btn-primary／.btn-tonal。 */
  .btn[data-perm-blocked="1"]{ background:var(--surface-3); color:var(--ink-faint); border-color:var(--line); }
  /* 2026-09-15 .btn 預設字重降到 500，實心強調鈕（primary/danger）維持 600 撐出對比 */
  .btn-primary{ background:var(--accent); color:var(--accent-ink); font-weight:600; }
  .btn-primary:hover:not(:disabled){ filter:brightness(1.07); }
  /* 清單裡每一列都有動作時不能用實心強調色——四列四顆實心金按鈕等於什麼都沒強調。
     列內動作一律用淡色調；整個面板只留一顆實心按鈕給「＋ 新增端點」。 */
  .btn-tonal{ background:var(--accent-soft-bg); color:var(--accent-strong); }
  /* 2026-09-15 hover 統一改成「動底色」用既有 token，不用 filter:brightness——
     .btn-tonal 本來底色就是 12% alpha 的淡色，brightness 調不出可感知的差異。 */
  .btn-tonal:hover:not(:disabled){ background:var(--accent-alpha-18); }
  .btn-row{ min-width:96px; }
  .btn-ghost{ background:var(--surface); border-color:var(--line-strong); color:var(--ink-soft); }
  .btn-ghost:hover:not(:disabled){ color:var(--ink); border-color:var(--ink-faint); }
  /* 實心危險色，只給「永久移除裝置」這種不可逆、且整個畫面只出現一次的破壞性操作用——
     跟 .btn-primary 同一套做法（實色底＋對比文字），清單裡多顆同時出現的「刪除」
     用 .btn-danger-quiet，理由同 .btn-tonal 那則註解：到處都是實心紅等於沒有強調。 */
  /* 2026-09-15 同 .btn-primary，實心危險鈕維持 600 字重 */
  .btn-danger{ background:var(--crit); color:var(--crit-ink); font-weight:600; }
  .btn-danger:hover:not(:disabled){ filter:brightness(1.07); }
  .btn-danger-quiet{ background:none; border-color:transparent; color:var(--ink-faint); }
  .btn-danger-quiet:hover:not(:disabled){ color:var(--crit); border-color:var(--crit); }
  /* 2026-09-15 拿掉縮小尺寸，退化成跟 .btn 同尺寸的無害別名——43 處呼叫點的 class 字串
     一個都不用改，也符合設計稿「控制項一律 32px」不再另開一個更小的變體。 */
  .btn-sm{ font-size:var(--fs-md); padding:0 12px; }
  @media (pointer:coarse){
    .btn{ min-height:44px; }
    .tab, .nav-pill, .fleet-item{ min-height:44px; }
    /* 2026-09-15 觸控放大改掛外殼（seg-range／theme-toggle 本身），不掛內部 button——
       button 保留固定尺寸切齊分隔線，外殼撐高才不會讓格線跑掉。 */
    .theme-toggle, .seg-range, #view-settings .theme-toggle{ height:auto; min-height:44px; }
    .search-input, .tenant-select, .form-control{ min-height:44px; }
  }

  /* ---------- 表單 ---------- */
  .form-grid{ display:grid; grid-template-columns:repeat(auto-fit, minmax(180px, 1fr)); gap:12px; align-items:end; }
  .form-row{ display:flex; flex-direction:column; gap:4px; min-width:0; }
  /* 2026-09-15 跟彈窗欄位標籤（13/600）對齊，原本 --fs-sm=12px 跟彈窗是兩套標準 */
  .form-row > label{ font-size:var(--fs-md); font-weight:600; color:var(--ink-soft); }
  /* 欄位標籤是 --fs-md，說明文字要再降一階才看得出主從。.pv-modal-row 也共用這顆 class
     （密碼規則提示這輪要用在側滑抽屜裡的密碼欄），選擇器一起列，不要另開一份幾乎相同的樣式。
     2026-09-15：說明字級跟著設計稿的 12px 改用 --fs-sm，原本 --fs-xs(11px) 比設計稿小一階。 */
  .form-row .hint, .pv-modal-row .hint{ display:block; font-size:var(--fs-sm); color:var(--ink-faint); line-height:1.5; margin-top:4px; }
  /* 2026-09-15 設計稿 .input/.sel：surface 底（不是 surface-2）、圓角 6px、固定 32px、內距 0 10px；
     .search 是另一顆（50-panel-device.css 的 .search-input），本來就對得上設計稿的 surface-2，不動它。 */
  .form-control{
    background:var(--surface); border:1px solid var(--line-strong); border-radius:var(--r-md);
    height:32px; padding:0 10px; font-size:var(--fs-md); color:var(--ink); width:100%; min-width:0;
  }
  /* 2026-09-15 多行輸入不能吃固定 32px 高，退回自動高度＋原本的上下內距 */
  textarea.form-control{ height:auto; padding:8px 10px; }
  .form-actions{ display:flex; gap:8px; flex-wrap:wrap; margin-top:12px; }

  /* 密碼欄的顯示/隱藏眼睛：包一層 relative 容器，按鈕絕對定位疊在輸入框右緣，不佔版面。
     input 右邊留 36px padding 讓文字不會被按鈕蓋住。按鈕本身不切換 aria-label 用 title 屬性即可，
     因為狀態變化只影響「看不看得到自己打的字」，不是需要 SR 即時播報的內容變化。 */
  .pv-password-field{ position:relative; }
  .pv-password-field .form-control{ padding-right:36px; }
  .pv-password-toggle{
    position:absolute; right:2px; top:50%; transform:translateY(-50%);
    width:32px; height:32px; display:flex; align-items:center; justify-content:center;
    background:none; border:none; padding:0; margin:0; cursor:pointer; color:var(--ink-faint); border-radius:var(--r-sm);
  }
  .pv-password-toggle:hover{ color:var(--ink); }
  /* 2026-09-15 focus ring 全站統一吃 --focus（7710C 亮青），不要各自寫死顏色 */
  .pv-password-toggle:focus-visible{ outline:2px solid var(--focus); outline-offset:1px; }
  .pv-password-toggle svg{ pointer-events:none; }


