/* ══════════════════════════════════════════════════════════════════════════════════════════
   TOKEN v3 — MỘT NGUỒN CHO MỌI BỀ MẶT (bàn giao Claude Design 15/8, `tokens/tokens.css`).

   🔴 KHÔNG sửa giá trị ở đây rồi thôi. Bản Dart (`xvr_tokens.dart` của app máy trạm) sinh từ
      CÙNG nguồn; hai bảng lệch nhau đúng là thứ đợt này đi xoá.

   Vì sao tệp này tồn tại (15/8, đợt G9): trước đó 58 biến nằm nội tuyến trong `console.html`,
   nên `login.html` · `tra-cuu.html` · `pilot.html` không có cách nào nhìn thấy — phạm vi CSS
   không vượt qua ranh giới tài liệu. Hệ quả đo được: hai trang trắng, hai trang navy tối
   TRONG CÙNG MỘT PHIÊN, và `pilot.html` chép GIÁ TRỊ v3 mà không chép QUAN HỆ (bản sao chết:
   sửa token thì nó không đổi, mà không phép đo nào bắt được).

   ⚠️ v3 CỐ Ý không có khối [data-theme="dark"]. Đơn vị không có ca trực đêm (user xác nhận
      15/8). Thêm lại khối tối = quay về hai bảng phải bảo trì song song.

   ⚠️ Phục vụ qua route `/tokens.css` dùng chung cơ chế `_tep_tinh` (`api.py`): `no-cache` +
      ETag + 304. CỐ Ý không đặt dưới `/vendor/` — chỗ đó cache 86400 mà KHÔNG có 304, nên tối
      đa 24h người dùng nhận HTML mới + CSS cũ. Khi ấy `var(--xvr-…)` không phân giải được, CSS
      không báo lỗi mà lặng lẽ rơi về giá trị kế thừa/initial: chữ về đen, nền về trong suốt.
      Đó chính là cơ chế đã làm các nút "hiện mật khẩu / cấp lại / ngắt" biến mất trên tay điều
      khiển giữa buổi bind — trang tải thành công, HTTP 200, không lỗi console, và sai.
   ══════════════════════════════════════════════════════════════════════════════════════════ */
:root{
  --xvr-surface-canvas:    #F6F7F8;
  --xvr-surface-default:   #FFFFFF;
  --xvr-surface-sunken:    #F6F7F8;
  --xvr-surface-row-rule:  #EDEEF0;

  --xvr-text-primary:      #1F2124;  /* 16,1:1 — mọi con số an toàn bay */
  --xvr-text-secondary:    #55585C;  /* 7,1:1 — nhãn nút cứu sinh */
  --xvr-text-tertiary:     #63666B;  /* 5,8:1 trắng · 5,4:1 nền chìm */
  --xvr-text-disabled:     #6A6E73;  /* 5,1:1 trắng · 4,8:1 nền chìm ← con số quyết định */
  --xvr-text-on-brand:     #FFFFFF;
  --xvr-text-on-danger:    #FFFFFF;

  --xvr-border-default:    #DFE1E5;
  --xvr-border-strong:     #C4C7CC;  /* CHỈ dùng làm viền — làm màu chữ chỉ đạt 1,7:1 */
  --xvr-border-focus:      #1A73E8;

  --xvr-brand:             #D91F19;  /* logo · chữ mục đang chọn. 5,0:1 */
  --xvr-brand-subtle:      #FDECEA;  /* nền pill mục/tab/hàng đang chọn */

  --xvr-danger-solid:      #A11A11;  /* 7,9:1 với chữ trắng */
  --xvr-danger-press:      #7E1409;
  --xvr-danger-halo:       rgba(161,26,17,.16);  /* CHỈ nút cứu sinh */
  --xvr-danger-border:     #E8B4B0;
  --xvr-danger-muted:      #A85A54;  /* 4,9:1 — CHỈ trên nền trắng */
  --xvr-danger-bg:         #FDECEA;

  --xvr-warning-ink:       #7A4E00;  --xvr-warning-bg: #FEF7E0;
  --xvr-success-ink:       #0B4A44;  --xvr-success-bg: #E6F4EA;
  --xvr-info-ink:          #174EA6;  --xvr-info-bg:    #E8F0FE;

  --xvr-flight-flying:     #1A73E8;
  --xvr-flight-idle:       #55585C;
  --xvr-flight-debug:      #0F5E57;
  --xvr-flight-offline:    #7A4E00;  /* + dấu VUÔNG */
  --xvr-flight-unread:     #5B21B6;  /* + nét đứt + gạch chéo + dấu — */
  --xvr-flight-unread-bg:  #F5F1FD;

  --xvr-chart-1: #0E2F5C;  --xvr-chart-5: #B0510F;
  --xvr-chart-2: #5B21B6;  --xvr-chart-6: #7F8FA6;
  --xvr-chart-3: #0F5E57;  --xvr-chart-7: #4CC2FF;
  --xvr-chart-4: #1A73E8;  --xvr-chart-8: #5EEAD4;

  --xvr-radius-pill:  999px;
  --xvr-radius-card:  12px;
  --xvr-radius-field: 8px;

  --xvr-safebar-height: 76px;
  --xvr-safebar-gap:    12px;
  --xvr-safebar-clear:  88px;  /* MỌI phần tử bám đáy khác phải dùng giá trị này */
  /* 05/09 — NĂM BIẾN bàn giao spec/04 §3 mà tệp tokens.css của CHÍNH gói còn thiếu (gói tự mâu thuẫn 51/58) —
     bổ sung theo giá trị spec ghi. `--xvr-flight-unread-dark` KHÔNG thêm: web không có nhánh tối (v3 cố ý). */
  --xvr-safebar-danger-gap: 56px;   /* mép↔mép DỪNG KHẨN ↔ nút gần nhất — kênh 3 của rào 3 (spec/01 §2) */
  --xvr-estop-font: 19px;           /* nhãn DỪNG KHẨN — kênh 1 của rào 3, và là lý do #A11A11 đạt AAA */
  --xvr-cmd-font:   13px;           /* mọi lệnh khác trên thanh cứu sinh */
  --xvr-thumb-rest: 14%;            /* vùng cấm đặt nút ở khổ cảm ứng (rào 14) */
  --xvr-brand-ink:  #8F1410;        /* CHỮ mang màu brand trên nền sáng — 8,07:1 trên brand-subtle (rào 25) */

  --xvr-z-map: 0;        --xvr-z-overlay-panel: 200;  --xvr-z-status-strip: 400;
  --xvr-z-map-draw: 100; --xvr-z-chrome: 300;         --xvr-z-menu: 500;
  --xvr-z-scrim: 600;    --xvr-z-dialog: 700;         --xvr-z-toast: 800;
  --xvr-z-palette: 900;  --xvr-z-safebar: 1000;
}
/* THI HÀNH RÀO CỨNG — chép nguyên từ bàn giao, đừng chỉ đọc.
   Rào 2: KHÔNG lớp phủ nào che nút cứu sinh. Rào "cấm hoạt hoá": thanh cứu sinh, dải chưa đọc
   được, mọi dải cảnh báo, khối điều kiện trước bay, dải OSD, chip "N đang bay" phải xuất hiện
   ở 0ms — hoạt hoá làm người trực đọc một con số đang trên đường đổi. */
[data-safety="critical"], [data-safety="critical"] * { transition:none !important; animation:none !important; }
[data-safebar]{ position:fixed; bottom:0; z-index:var(--xvr-z-safebar); }
