/* AMANKONG WebApp — Phần 1 — PC-first
 * CC-33: AMANKONG_GLOBAL_DESIGN_SYSTEM_V1
 * Rules: ONE_WEBAPP_ONE_DESIGN_SYSTEM · GLOBAL_CONSISTENCY_BY_DEFAULT ·
 *        TOKEN_FIRST_COMPONENT_SECOND_PAGE_THIRD.
 * Canonical tokens live in :root below. Older aliases (e.g. --bg, --card, --brand, --ok)
 * are kept as pointers to canonical tokens so legacy rules still work; new rules MUST
 * use canonical tokens. See 00_TÀI_LIỆU_HỆ_THỐNG/AMANKONG_GLOBAL_DESIGN_SYSTEM.md.
 */
:root {
  /* THEME_V1 = LIGHT_ONLY (WEBAPP05-GLOBAL-UI-DESIGN-LANGUAGE-REBASELINE-V1-01-C01).
     WebApp V1 CHỈ có giao diện sáng. Khai báo này báo cho trình duyệt đừng tự tô tối
     ô nhập, thanh cuộn, hộp chọn khi hệ điều hành để chế độ tối. KHÔNG thêm
     @media (prefers-color-scheme: dark) cục bộ ở bất kỳ module nào. */
  color-scheme: light;

  /* ---------- Sidebar chrome (single-brand dark shell, kept) ---------- */
  --sidebar-bg: #0b1d3a;
  --sidebar-bg-2: #0e2143;
  --sidebar-fg: #cbd5e1;
  --sidebar-fg-mute: #94a3b8;
  --sidebar-active: #1e3a8a;
  --sidebar-active-bar: #3b82f6;

  /* ================= CANONICAL TOKENS (CC-33 V1) ================= */

  /* A. Backgrounds — calm, low-eye-fatigue, PC-first */
  --bg-app:            #f2f4f8;
  --bg-surface:        #ffffff;
  --bg-surface-soft:   #f8fafc;
  --bg-surface-raised: #ffffff;
  --bg-subtle:         #f1f5f9;
  --bg-emphasis-soft:  #fdf9ee;

  /* B. Text — deep navy scale (không pure black) */
  --text-primary:      #1e293b;
  --text-secondary:    #475569;
  --text-muted:        #64748b;
  --text-disabled:     #94a3b8;
  --text-inverse:      #ffffff;
  --text-link:         #2563eb;

  /* C. Border */
  --border-soft:       #e2e8f0;
  --border-default:    #e5e7eb;
  --border-strong:     #cbd5e1;
  --border-focus:      #3b82f6;

  /* D. Brand / accent */
  --brand-primary:       #2563eb;
  --brand-primary-hover: #1d4ed8;
  --brand-primary-soft:  #eff6ff;
  --accent-primary:      var(--brand-primary);

  /* E. Semantic status (info / success / warning / danger / ai) */
  --status-info:        #0369a1;
  --status-info-soft:   #eff6ff;
  --status-success:     #059669;
  --status-success-soft:#ecfdf5;
  --status-warning:     #d97706;
  --status-warning-soft:#fef7e8;
  --status-danger:      #dc2626;
  --status-danger-soft: #fef2f2;
  --status-ai:          #5b21b6;
  --status-ai-soft:     #ede9fe;
  /* CRM V1.2 · trạng thái "AI + nhân viên phối hợp" (họ xanh ngọc) — khác AI tự xử lý (tím) và nhân viên bình thường (xanh lá) */
  --status-collab:      #0f766e;
  --status-collab-soft: #ccfbf1;

  /* F. Typography */
  --font-family-ui: 'Be Vietnam Pro', 'Inter', system-ui, -apple-system, Segoe UI, Roboto, 'Helvetica Neue', Arial, sans-serif;
  --text-xs:   11px;   /* metadata dày đặc, không dùng cho human-facing chính */
  --text-sm:   12.5px; /* metadata bình thường */
  --text-md:   13.5px; /* label, table cell, body dense */
  --text-lg:   15px;   /* body chính, card title nhỏ */
  --text-xl:   17px;   /* section title */
  --text-2xl:  20px;   /* page title */
  --text-metric: 28px; /* dominant metric value */
  --weight-normal:    400;
  --weight-medium:    500;
  --weight-semibold:  600;
  --weight-bold:      700;
  --weight-extrabold: 800;
  --line-tight:   1.2;
  --line-normal:  1.45;
  --line-relaxed: 1.6;

  /* G. Spacing scale (4px base) */
  --space-1:  4px;
  --space-2:  8px;
  --space-3:  12px;
  --space-4:  16px;
  --space-5:  20px;
  --space-6:  24px;
  --space-8:  32px;

  /* H. Radius — business system, không quá tròn */
  --radius-sm: 6px;
  --radius-md: 10px;
  --radius-lg: 14px;
  --radius-xl: 18px;

  /* I. Shadow — dùng dè */
  --shadow-sm:       0 1px 2px rgba(15,23,42,.06);
  --shadow-md:       0 4px 12px rgba(15,23,42,.08);
  --shadow-floating: 0 12px 30px rgba(15,23,42,.18);

  /* ================= DESIGN SYSTEM V1 — LỚP BỔ SUNG =================
     FORM: WEBAPP-DESIGN-SYSTEM-V1-PRODUCT-UI-CONSOLIDATION-01 · 14/09/2026
     Token màu/chữ/khoảng cách của CC-33 đã có và ĐƯỢC GIỮ NGUYÊN. Phần dưới bổ sung
     những nhóm CC-33 chưa đặt tên: vai trò chữ, chiều cao control, mật độ bảng, đệm thẻ,
     và chồng sticky. Có tên rồi thì không ai còn phải chế số mới ở từng màn hình. */

  /* J. VAI TRÒ CHỮ — gọi theo VIỆC, không gọi theo cỡ.
        Ai cũng biết "tên sản phẩm" là gì; "15px" thì mỗi người đoán một kiểu. */
  --font-page-title:    var(--text-2xl);   /* tiêu đề trang        20px/700 */
  --font-section-title: var(--text-xl);    /* tiêu đề khối         17px/700 */
  --font-card-title:    var(--text-lg);    /* tiêu đề thẻ          15px/600 */
  --font-body:          var(--text-md);    /* chữ thường           13.5px */
  --font-label:         var(--text-md);    /* nhãn trường          13.5px/600 */
  --font-meta:          var(--text-sm);    /* dữ liệu phụ          12.5px */
  --font-table-head:    var(--text-sm);    /* đầu bảng             12.5px/700 */
  --font-table-cell:    var(--text-md);    /* ô bảng               13.5px */
  --font-button:        var(--text-md);    /* nút                  13.5px/600 */
  --font-badge:         var(--text-sm);    /* huy hiệu             12.5px/600 */
  --font-help:          var(--text-sm);    /* chữ giải thích       12.5px */
  /* SÀN ĐỌC ĐƯỢC: không chữ người-đọc nào dưới 12px. --text-xs (11px) chỉ dành cho
     mã kỹ thuật và chú thích cực phụ, KHÔNG dùng cho dữ liệu nghiệp vụ. */
  --font-min-readable:  var(--text-sm);

  /* K. CONTROL — mọi ô nhập/nút/select trên một hàng phải CÙNG chiều cao */
  --control-h:        34px;
  --control-h-sm:     28px;
  --control-pad-x:    var(--space-3);
  --control-radius:   var(--radius-sm);

  /* L. MẬT ĐỘ BẢNG */
  --table-row-h:      40px;
  --table-cell-pad-y: var(--space-2);
  --table-cell-pad-x: var(--space-3);

  /* M. THẺ / KHỐI */
  --card-pad:         var(--space-4);
  --card-pad-sm:      var(--space-3);
  --section-gap:      var(--space-5);
  --stack-gap:        var(--space-3);

  /* N. CHỒNG STICKY — HỢP ĐỒNG DÙNG CHUNG, một nguồn sự thật duy nhất.
     SỬA 14/09/2026 (VISUAL-REFINEMENT-01): năm token cũ ở đây từng được khai báo nhưng
     KHÔNG chỗ nào dùng (đo được: 0 lần). CSS thật lại chạy bằng --topbar-height viết
     cứng và z-index rải rác 30/20/15. Token mà không ai dùng thì còn tệ hơn không có
     token: người sau đọc sẽ tin nhầm. Nay gộp về ĐÚNG cơ chế đang chạy.

     BA TẦNG DÍNH, theo đúng thứ tự từ trên xuống:
       1. thanh trên cùng      top: 0                          z: 30
       2. Trung tâm CSKH       top: tầng 1                     z: 20
       3. vỏ module (KPI/SP)   top: tầng 1 + tầng 2            z: 15
     Tầng dưới LUÔN có z nhỏ hơn tầng trên: nếu chạm nhau thì tầng trên che tầng dưới,
     không bao giờ có mép nội dung thò ra. Module KHÔNG được tự chế offset riêng —
     dùng var(--sticky-module-top) là đủ.

     ⚠️ BẪY ĐÃ DẪM PHẢI MỘT LẦN, GHI LẠI ĐỂ KHÔNG AI DẪM LẠI:
     --care-sticky-height do app.js đo rồi ghi lên PHẦN TỬ #main, KHÔNG ghi lên :root.
     Nếu đặt phép cộng offset ở :root thì lúc tính, --care-sticky-height chưa tồn tại
     trong phạm vi đó nên rơi về 0 — vỏ module dính lên sát topbar và BỊ KHỐI CSKH ĐÈ
     LÊN (z thấp hơn), tức là thanh tab + bộ lọc biến mất khi cuộn. Vì vậy phép cộng
     PHẢI đặt ở #main, nơi cả hai biến đều có thật. Chỉ z-index mới đặt được ở :root. */
  --sticky-z-topbar:   30;
  --sticky-z-care:     20;
  --sticky-z-module:   15;
  /* Viền dưới mềm của lớp dính — phân biệt phần đứng yên với phần đang cuộn,
     mà không dùng bóng nặng. */
  --sticky-edge:      0 6px 10px -8px rgba(15, 23, 42, .28);

  /* ---------- Legacy aliases (kept so pre-CC-33 rules keep working) ---------- */
  --bg:        var(--bg-app);
  --card:      var(--bg-surface);
  --border:    var(--border-default);
  --text:      var(--text-primary);
  --text-mute: var(--text-muted);
  --brand:     var(--brand-primary);
  --brand-2:   var(--border-focus);
  --ok:        var(--status-success);
  --warn:      var(--status-warning);
  --danger:    var(--status-danger);
  --purple:    var(--status-ai);
  --pink:      #ec4899;
  --shadow:    var(--shadow-md);
  --font:      var(--font-family-ui);
}

* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; height: 100%; }
body { font-family: var(--font); background: var(--bg-app); color: var(--text-primary); font-size: 14px; line-height: 1.5; }
button { font: inherit; color: inherit; }
a { color: var(--brand); }
code { font-family: ui-monospace, SF Mono, Consolas, monospace; background: #eef2ff; padding: 1px 6px; border-radius: 4px; }

.app-shell { display: grid; grid-template-columns: 260px 1fr; min-height: 100vh; }

/* ================= SIDEBAR ================= */
.sidebar {
  background: linear-gradient(180deg, var(--sidebar-bg) 0%, var(--sidebar-bg-2) 100%);
  color: var(--sidebar-fg);
  display: flex; flex-direction: column;
  padding: 20px 14px;
  position: sticky; top: 0; height: 100vh;
  overflow: hidden;
}
.brand { display: flex; flex-direction: column; align-items: center; gap: 4px; padding: 6px 6px 14px; border-bottom: 1px solid rgba(255,255,255,.08); min-width: 0; }
.brand-logo { width: 100%; max-width: 156px; height: auto; display: block; filter: drop-shadow(0 6px 14px rgba(239,15,26,.35)); }
.brand-sub { font-size: var(--font-meta); font-weight: var(--weight-medium); color: var(--sidebar-fg-mute); letter-spacing: .2px; text-align: center; white-space: nowrap; max-width: 100%; overflow: hidden; text-overflow: ellipsis; }

.nav { display: flex; flex-direction: column; gap: 2px; margin-top: 14px; flex: 1; overflow-y: auto; }
.nav-item {
  display: flex; align-items: center; gap: 12px;
  padding: 10px 12px; border: 0; background: transparent; color: var(--sidebar-fg);
  border-radius: 10px; cursor: pointer; text-align: left; width: 100%;
  font-size: 14px; font-weight: 500;
  position: relative; transition: background .15s, color .15s;
}
.nav-item:hover { background: rgba(255,255,255,.04); color: #fff; }
.nav-item.active { background: var(--sidebar-active); color: #fff; }
.nav-item.active::before {
  content: ''; position: absolute; left: -14px; top: 8px; bottom: 8px; width: 3px; background: var(--sidebar-active-bar); border-radius: 0 3px 3px 0;
}
.nav-icon { width: 22px; display: inline-grid; place-items: center; font-size: 15px; }
.nav-label { flex: 1; }
.nav-badge { background: var(--danger); color: var(--text-inverse); font-size: var(--text-xs); font-weight: 700; padding: 1px 6px; border-radius: 999px; }
.nav-parent.expanded { color: #fff; }

.nav-children { display: none; padding: 2px 0 6px 44px; flex-direction: column; gap: 0; }
.nav-children.open { display: flex; }
.nav-child {
  border: 0; background: transparent; color: var(--sidebar-fg-mute); text-align: left;
  padding: 8px 10px; border-radius: 8px; cursor: pointer;
  display: flex; align-items: center; gap: 8px; font-size: 13px;
}
.nav-child:hover { color: #fff; background: rgba(255,255,255,.04); }
.nav-child.active { color: #fff; background: rgba(59,130,246,.14); font-weight: 600; }
.nav-child .dot { width: 6px; height: 6px; border-radius: 999px; background: var(--brand-2); display: inline-block; }

.sidebar-footer { margin-top: 12px; padding-top: 12px; border-top: 1px solid rgba(255,255,255,.06); display: flex; flex-direction: column; gap: 10px; }
.user-card { display: flex; align-items: center; gap: 10px; padding: 8px; border-radius: 10px; background: rgba(255,255,255,.03); }
.user-avatar { width: 36px; height: 36px; border-radius: 999px; background: #3b82f6; color: #fff; font-weight: 700; display: grid; place-items: center; }
.user-name { color: #fff; font-weight: 600; }
.user-role { font-size: var(--font-meta); color: var(--sidebar-fg-mute); }
.chev { margin-left: auto; color: var(--sidebar-fg-mute); }
.db-badge { font-size: var(--font-meta); padding: 6px 10px; border-radius: 999px; text-align: center; }
.db-badge-ok { background: rgba(16,185,129,.12); color: #34d399; }
.db-badge-warn { background: rgba(239,68,68,.12); color: #f87171; }
.db-badge-unknown { background: rgba(148,163,184,.1); color: var(--sidebar-fg-mute); }

/* ================= MAIN ================= */
.main { display: flex; flex-direction: column; min-height: 100vh; }
.topbar {
  display: flex; align-items: center; justify-content: space-between;
  background: #fff; border-bottom: 1px solid var(--border); padding: 14px 28px; gap: 20px;
}
.welcome { display: flex; align-items: center; gap: 12px; }
.welcome-avatar { width: 40px; height: 40px; border-radius: 10px; background: #eff6ff; display: grid; place-items: center; font-size: 18px; }
.welcome-title { font-weight: 700; }
.welcome-sub { font-size: var(--font-meta); color: var(--text-mute); }
.topbar-right { display: flex; align-items: center; gap: 14px; }
.search { display: flex; align-items: center; gap: 8px; background: #f1f5f9; border-radius: 10px; padding: 8px 12px; width: 320px; }
.search input { border: 0; background: transparent; outline: none; width: 100%; font-size: 13px; }
.icon-btn { position: relative; border: 0; background: transparent; font-size: 16px; cursor: pointer; padding: 6px; }
.icon-btn .pip { position: absolute; top: 4px; right: 4px; width: 7px; height: 7px; background: var(--danger); border-radius: 999px; }
.avatar { width: 34px; height: 34px; border-radius: 999px; background: #64748b; color: #fff; font-weight: 700; display: grid; place-items: center; font-size: var(--font-meta); }
.pill { padding: 4px 10px; border-radius: 999px; font-size: var(--font-badge); background: #eef2ff; color: #3730a3; }

.view { padding: 22px 28px 40px; }

/* ================= HOME ================= */
.hero { text-align: center; padding: 12px 0 22px; }
.hero h1 { margin: 0; font-size: 24px; letter-spacing: .3px; }
.hero p { margin: 6px 0 0; color: var(--text-mute); }

.home-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 22px; }
.block {
  background: var(--card); border: 1px solid var(--border); border-radius: 18px;
  padding: 22px; box-shadow: var(--shadow); display: flex; flex-direction: column; gap: 18px;
}
.block-business { border-top: 4px solid #3b82f6; }
.block-ops      { border-top: 4px solid #10b981; }
.block-header { display: flex; align-items: center; gap: 14px; }
.block-header h2 { margin: 0; font-size: 18px; letter-spacing: .3px; }
.block-header p { margin: 4px 0 0; color: var(--text-mute); font-size: 13px; }
.block-icon { width: 44px; height: 44px; border-radius: 12px; display: grid; place-items: center; color: #fff; font-size: 22px; }
.block-icon-business { background: #3b82f6; }
.block-icon-ops      { background: #10b981; }

.tile-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 14px; }
.tile {
  border-radius: 16px; padding: 22px 14px; text-align: center; cursor: pointer;
  border: 1px solid transparent; transition: transform .12s, box-shadow .15s;
  display: flex; flex-direction: column; align-items: center; gap: 10px;
  background: #fff;
}
.tile:hover { transform: translateY(-3px); box-shadow: 0 12px 24px rgba(15,23,42,.08); }
.tile-icon { width: 48px; height: 48px; border-radius: 14px; display: grid; place-items: center; font-size: 22px; color: #fff; }
.tile-title { font-weight: 700; font-size: 15px; }
.tile-desc { font-size: var(--font-help); color: var(--text-mute); line-height: 1.35; }
.tile-soon .tile-desc { color: var(--text-muted); font-style: italic; }
.tile-soon { opacity: .95; }
.tile-soon:hover { transform: none; box-shadow: var(--shadow-sm); cursor: default; }

.block-cta {
  margin-top: 6px; padding: 12px; border-radius: 12px; border: 0; cursor: pointer;
  background: #eff6ff; color: #1d4ed8; font-weight: 600;
}
.block-cta-ops { background: #ecfdf5; color: #047857; }
.block-cta:hover { filter: brightness(.98); }

/* pastel tile bgs */
.tile.tile-crm     { background: #eff6ff; }
.tile.tile-content { background: #ecfdf5; }
.tile.tile-post    { background: #fef2f2; }
.tile.tile-quote   { background: #fffbeb; }
.tile.tile-order   { background: #f5f3ff; }
.tile.tile-kpi     { background: #ecfeff; }
.tile.tile-ops     { background: #f8fafc; }

.tile-icon-crm     { background: #3b82f6; }
.tile-icon-content { background: #10b981; }
.tile-icon-post    { background: #ef4444; }
.tile-icon-quote   { background: #f59e0b; }
.tile-icon-order   { background: #8b5cf6; }
.tile-icon-kpi     { background: #06b6d4; }
.tile-icon-ops     { background: #64748b; }

/* ================= CRM PAGE ================= */
.crm { display: flex; flex-direction: column; gap: 16px; }
.crumbs { color: var(--text-secondary); font-size: var(--text-md); font-weight: var(--weight-medium); }
.crumbs b { color: var(--text-primary); font-weight: var(--weight-bold); }
.page-header {
  background: var(--bg-surface); border: 1px solid var(--border-soft); border-radius: var(--radius-lg);
  padding: 18px 22px; display: flex; align-items: center; justify-content: space-between; gap: 20px;
  box-shadow: var(--shadow-sm);
}
.page-header-left { display: flex; align-items: center; gap: 14px; }
.page-icon { width: 44px; height: 44px; border-radius: var(--radius-md); background: var(--brand-primary-soft); display: grid; place-items: center; font-size: 22px; color: var(--brand-primary); }
.page-header h1 { margin: 0; font-size: var(--text-2xl); color: var(--text-primary); font-weight: var(--weight-bold); }
.page-header p  { margin: 4px 0 0; color: var(--text-secondary); font-size: var(--text-md); font-weight: var(--weight-medium); }

/* CC-33 button system — PRIMARY / SECONDARY / GHOST / DANGER / ICON_ONLY */
/* C01: .btn trần = NÚT TRUNG TÍNH canonical (cùng hình dạng .btn-secondary). Trước đây
   .btn không có nền nên trình duyệt tô xám mặc định rgb(240,240,240). Mọi biến thể
   (.btn-primary/-secondary/-ghost/-danger) khai SAU và vẫn đè đúng. */
.btn {
  background: var(--bg-surface); color: var(--text-primary);
  border: 1px solid var(--border-strong); border-radius: var(--radius-md);
  padding: 9px 14px; cursor: pointer; font-weight: var(--weight-semibold);
  font-size: var(--text-md); line-height: var(--line-tight);
  transition: background .12s, border-color .12s, color .12s;
}
/* C01: vòng tiêu điểm của .btn định nghĩa MỘT lần ở mục "10 · TIÊU ĐIỂM BÀN PHÍM".
   Bản quầng bóng ở đây từng chồng lên viền outline ⇒ hai vòng. Đã gỡ. */
.btn:where(:hover:not(:disabled)) { background-color: var(--bg-surface-soft); }
.btn-primary   { background: var(--brand-primary); color: var(--text-inverse); border-color: var(--brand-primary); }
.btn-primary:hover { background: var(--brand-primary-hover); border-color: var(--brand-primary-hover); }
.btn-secondary { background: var(--bg-surface); color: var(--text-primary); border-color: var(--border-strong); }
.btn-secondary:hover { background: var(--bg-surface-soft); }
.btn-ghost     { background: transparent; color: var(--text-secondary); border-color: var(--border-soft); }
.btn-ghost:hover { background: var(--bg-surface-soft); color: var(--text-primary); }
/* WEBAPP05-GLOBAL-UI-DESIGN-LANGUAGE-REBASELINE-V1-01: nút NGUY HIỂM dùng chung = viền đỏ, nền
   trắng, CHỈ đậm khi rê chuột (luật B5). Trước đây .btn-danger là nền đỏ ĐẶC — nổi hơn nút
   chính, trái luật, và khác hẳn .pm-danger-btn của Product. Nay cùng một ngôn ngữ. */
.btn.btn-danger { background: var(--bg-surface); color: var(--status-danger); border-color: var(--status-danger-soft); font-weight: var(--weight-medium); }
.btn.btn-danger:hover:not(:disabled) { background: var(--status-danger-soft); border-color: var(--status-danger); font-weight: var(--weight-semibold); }
/* .btn:disabled định nghĩa MỘT lần duy nhất ở mục "10 · TIÊU ĐIỂM BÀN PHÍM" (cuối tệp). */

.crm-tabs {
  background: var(--card); border: 1px solid var(--border); border-radius: 14px;
  padding: 4px 12px 0; display: flex; gap: 4px; overflow-x: auto;
}
.tab {
  border: 0; background: transparent; padding: 12px 16px; cursor: pointer;
  font-weight: var(--weight-semibold); font-size: var(--text-md);
  color: var(--text-secondary); white-space: nowrap;
  border-bottom: 3px solid transparent; border-radius: var(--radius-sm) var(--radius-sm) 0 0;
  transition: color .12s, border-color .12s;
}
.tab:hover { color: var(--text-primary); }
.tab.active { color: var(--brand-primary-hover); border-bottom-color: var(--brand-primary-hover); background: transparent; }
.tab:focus-visible { outline: none; box-shadow: 0 0 0 2px rgba(59,130,246,.35); }

.crm-panel { display: flex; flex-direction: column; gap: 16px; }

/* KPI cards */
.kpi-row { display: grid; grid-template-columns: repeat(5, 1fr); gap: 14px; }
.kpi {
  background: var(--card); border: 1px solid var(--border); border-radius: 14px;
  padding: 18px; display: flex; align-items: center; gap: 14px; box-shadow: var(--shadow-sm);
  transition: box-shadow .15s, transform .1s;
}
.kpi:hover { box-shadow: var(--shadow); }
.kpi-icon { width: 46px; height: 46px; border-radius: 12px; display: grid; place-items: center; font-size: 22px; color: #fff; flex-shrink: 0; }
.kpi-label { font-size: var(--text-md); color: var(--text-primary); font-weight: var(--weight-bold); letter-spacing: .1px; }
.kpi-value { font-size: var(--text-metric); font-weight: var(--weight-extrabold); margin-top: 4px; line-height: var(--line-tight); letter-spacing: -0.5px; color: var(--text-primary); }
.kpi-delta { font-size: var(--font-meta); margin-top: 4px; }
.kpi-delta.up { color: var(--ok); }
.kpi-delta.down { color: var(--danger); }

.kpi.kpi-blue    .kpi-icon { background: #3b82f6; }
.kpi.kpi-green   .kpi-icon { background: #10b981; }
.kpi.kpi-orange  .kpi-icon { background: #f59e0b; }
.kpi.kpi-red     .kpi-icon { background: #ef4444; }
.kpi.kpi-purple  .kpi-icon { background: #8b5cf6; }

/* Split panels */
.split { display: grid; grid-template-columns: 1.6fr 1fr; gap: 16px; }
.panel {
  background: var(--bg-surface); border: 1px solid var(--border-soft); border-radius: var(--radius-lg);
  padding: 16px; box-shadow: var(--shadow-sm); display: flex; flex-direction: column; gap: 12px;
}
.panel-title { font-weight: var(--weight-bold); font-size: var(--text-lg); color: var(--text-primary); display: flex; justify-content: space-between; align-items: center; }
.panel-title a { font-size: var(--text-sm); text-decoration: none; color: var(--text-link); font-weight: var(--weight-semibold); }

/* CC-33 table system — dense business readability */
table.data { width: 100%; border-collapse: collapse; font-size: var(--text-md); color: var(--text-primary); }
table.data th, table.data td { padding: 10px 10px; text-align: left; border-bottom: 1px solid var(--bg-subtle); }
/* ĐẦU BẢNG — SỬA 14/09/2026 (VISUAL-REFINEMENT-01).
   Trước: --text-xs (11px). Chính hệ thiết kế này ghi --text-xs "không dùng cho
   human-facing chính", nhưng đầu bảng LÀ human-facing: nó nói cột đó là dữ liệu gì.
   Đo được 7 đầu cột ở 11px trên tab Model. Nay dùng đúng vai trò --font-table-head. */
table.data th {
  color: var(--text-secondary); font-weight: var(--weight-bold);
  font-size: var(--font-table-head); text-transform: uppercase; letter-spacing: .4px;
  background: var(--bg-surface-soft);
  border-bottom: 1px solid var(--border-default);
  white-space: nowrap;
}
table.data tr:last-child td { border-bottom: 0; }
table.data tbody tr:hover { background: var(--bg-surface-soft); }

/* CC-33 badge/chip system — INFO / SUCCESS / WARNING / DANGER / AI / NEUTRAL, all pill-shaped */
.tag { padding: 3px 10px; border-radius: 999px; font-size: var(--text-sm); font-weight: var(--weight-semibold); display: inline-block; line-height: var(--line-tight); }
.tag-info    { background: var(--status-info-soft);    color: var(--status-info); }
.tag-ok      { background: var(--status-success-soft); color: var(--status-success); }
.tag-warn    { background: var(--status-warning-soft); color: var(--status-warning); }
.tag-danger  { background: var(--status-danger-soft);  color: var(--status-danger); }
.tag-purple, .tag-ai { background: var(--status-ai-soft); color: var(--status-ai); }
.tag-neutral { background: var(--bg-subtle);           color: var(--text-secondary); }

/* Activity feed */
.feed { display: flex; flex-direction: column; gap: 12px; }
.feed-item { display: flex; gap: 10px; padding: 10px 8px; border-radius: 10px; }
.feed-item:hover { background: #f8fafc; }
.feed-dot { width: 34px; height: 34px; border-radius: 10px; background: #eff6ff; display: grid; place-items: center; }
.feed-body { flex: 1; }
.feed-title { font-weight: 600; }
.feed-sub { color: var(--text-mute); font-size: var(--font-meta); margin-top: 2px; }
.feed-time { font-size: var(--font-meta); color: var(--text-mute); }

/* Soon */
.soon { display: grid; place-items: center; min-height: 60vh; }
.soon-card { background: var(--card); border: 1px solid var(--border); border-radius: 16px; padding: 32px 44px; text-align: center; max-width: 520px; box-shadow: var(--shadow); }
.soon-badge { display: inline-block; padding: 6px 14px; border-radius: 999px; background: #fffbeb; color: #92400e; font-weight: 700; font-size: var(--font-badge); margin-bottom: 12px; }
.soon-card h1 { margin: 8px 0; }
.soon-card p { color: var(--text-mute); }

/* Error/empty */
.empty { padding: 30px; text-align: center; color: var(--text-mute); }
.error { padding: 16px; border-radius: 10px; background: #fef2f2; color: #991b1b; border: 1px solid #fecaca; }

/* Row actions
   SỬA 14/09/2026 (VISUAL-REFINEMENT-01) — TRÙNG ĐỊNH NGHĨA ĐÃ GỠ.
   Ở đây từng có một bản .btn-ghost và .btn-danger THỨ HAI, viết cứng màu (#f1f5f9,
   #1f2937, #fef2f2), cỡ chữ 12px và border: 0. Vì nằm sau, nó ÂM THẦM ĐÈ bản dùng
   token ở khối nút CC-33 phía trên. Hậu quả: cùng một tên component mà ra hai hình
   dạng khác nhau tuỳ thứ tự nạp — đúng thứ hệ thiết kế sinh ra để dẹp.
   Nay chỉ còn MỘT định nghĩa duy nhất cho mỗi nút, ở khối nút CC-33. */
.row-actions { display: flex; gap: var(--space-2); flex-wrap: wrap; }

/* Modal */
.modal-root { position: fixed; inset: 0; background: rgba(15,23,42,.55); z-index: 100; display: grid; place-items: center; padding: var(--space-5); }
/* [CC-25] `display: grid` above phủ CSS default cho attribute [hidden].
   Nếu không có rule dưới đây, `modal-root.hidden = true` vẫn render backdrop → toàn WebApp bị phủ xám, không click được. */
.modal-root[hidden] { display: none !important; }
body.modal-open { overflow: hidden; }
.modal-card { background: var(--bg-surface); border: 1px solid var(--border-soft); border-radius: var(--radius-lg); width: 100%; max-width: 560px; box-shadow: var(--shadow-floating); max-height: 88vh; display: flex; flex-direction: column; overflow: hidden; }
.modal-header { display: flex; justify-content: space-between; align-items: center; padding: var(--space-4) var(--space-5); border-bottom: 1px solid var(--border-soft); }
.modal-header h2 { margin: 0; font-size: var(--font-section-title); font-weight: var(--weight-bold); color: var(--text-primary); }
.modal-close { background: transparent; border: 0; font-size: var(--text-2xl); line-height: 1; cursor: pointer; color: var(--text-muted); border-radius: var(--radius-sm); }
.modal-form { padding: var(--space-4) var(--space-5); display: flex; flex-direction: column; gap: var(--stack-gap); overflow: auto; }
.modal-form .row { display: flex; flex-direction: column; gap: 6px; }
/* CC-33 form/input system — reusable across future modules */
.modal-form label,
.form-label { font-size: var(--text-md); font-weight: var(--weight-semibold); color: var(--text-secondary); }
.modal-form input, .modal-form select, .modal-form textarea,
.form-input {
  padding: 9px 12px; border: 1px solid var(--border-strong); border-radius: var(--radius-md);
  font: inherit; font-size: var(--text-md); background: var(--bg-surface); color: var(--text-primary);
  transition: border-color .12s, box-shadow .12s;
}
.modal-form input:focus, .modal-form select:focus, .modal-form textarea:focus,
.form-input:focus {
  outline: none; border-color: var(--border-focus); box-shadow: 0 0 0 2px rgba(59,130,246,.35);
}
.modal-form input::placeholder, .form-input::placeholder { color: var(--text-muted); }
.identity-row { display: grid; grid-template-columns: 110px 120px 1fr auto; gap: 8px; margin-bottom: 8px; }
.identity-row select, .identity-row input { padding: 8px 10px; font-size: 13px; border: 1px solid var(--border); border-radius: 8px; }
.identity-row .del { background: #fef2f2; color: #991b1b; border: 0; border-radius: 8px; padding: 0 10px; cursor: pointer; }
.modal-actions { display: flex; justify-content: flex-end; gap: var(--space-2); margin-top: var(--space-1); }
.form-msg { min-height: 20px; font-size: var(--font-body); }
/* SCA-B · SCA-16 — ghi chú hướng dẫn thuộc về phần ĐIỀN, nên nằm TRƯỚC hàng nút.
   Bản cũ đặt nó sau `.modal-actions` và sau `.form-msg` (cao sẵn 20px dù rỗng), nên
   nó rơi xuống dưới Huỷ/Lưu, cách một khoảng trống đo được 52px. */
.modal-form .modal-note { margin-top: 0; }
.form-msg.err { color: var(--status-danger); }
.form-msg.ok  { color: var(--status-success); }

@media (max-width: 1180px) {
  .app-shell { grid-template-columns: 220px 1fr; }
  .home-grid { grid-template-columns: 1fr; }
  .kpi-row { grid-template-columns: repeat(2, 1fr); }
  .split { grid-template-columns: 1fr; }
}

/* CC-27: AI Cost widget (PC-first, mobile-compact) */
.block-ai-cost { background: linear-gradient(135deg, #f0f9ff 0%, #ede9fe 100%); border: 1px solid #ddd6fe; border-radius: 18px; padding: 20px 24px; margin-top: 20px; }
.block-icon-ai { background: linear-gradient(135deg, #8b5cf6, #6366f1); color: #fff; }
/* WEBAPP05-AI-MANAGEMENT-VISUAL-HARMONIZATION-V1-01 · reuse shared card language.
   Previously .ai-cost-card wrote raw hex; .ai-cost-percent used a decorative purple
   gradient with no semantic meaning. Both violated the design-system rules
   (§B0/§B3/§B4/§4 of the FORM). We now derive from tokens; % ngân sách stays neutral
   by default and only escalates to a warning tone through .ai-cost-percent.warn. */
.ai-cost-grid { display: grid; grid-template-columns: repeat(6, 1fr); gap: var(--stack-gap); margin-top: var(--space-3); }
.ai-cost-card {
  background: var(--bg-surface);
  border: 1px solid var(--border-soft);
  border-radius: var(--radius-md);
  padding: var(--card-pad-sm);
  text-align: center;
}
.ai-cost-label {
  font-size: var(--font-meta);
  font-weight: var(--weight-bold);
  color: var(--text-secondary);
  text-transform: uppercase;
  letter-spacing: .4px;
  margin-bottom: var(--space-1);
}
.ai-cost-value {
  font-size: var(--font-card-title);
  font-weight: var(--weight-bold);
  color: var(--text-primary);
  word-break: break-word;
  font-variant-numeric: tabular-nums;
}
.ai-cost-percent { background: var(--bg-surface-soft); }
.ai-cost-percent.warn { background: var(--status-warning-soft); border-color: var(--status-warning); }
.ai-cost-percent.warn .ai-cost-value { color: var(--status-warning); }
.ai-cost-error { grid-column: 1 / -1; color: #b91c1c; background: #fef2f2; }
@media (max-width: 900px) {
  .ai-cost-grid { grid-template-columns: 1fr 1fr; }
  .ai-cost-value { font-size: var(--font-body); }
}
@media (max-width: 480px) {
  .ai-cost-grid { grid-template-columns: 1fr; }
  .block-ai-cost { padding: 14px 12px; }
}

/* ===== CC-28 → CC-31 polished: Live Care Center on Home ===== */
.block-care-center {
  background: #ffffff;
  border: 1px solid var(--border-soft);
  border-top: 3px solid #b45309;
  border-radius: 14px;
  padding: 22px 24px;
  margin-top: 22px;
  box-shadow: 0 1px 3px rgba(15,23,42,.04);
}
.block-care-center .block-header h2 { color: var(--text-primary); font-size: 17px; letter-spacing: .3px; font-weight: 700; margin: 0; }
.block-care-center .block-header p  { color: var(--text-secondary); font-size: 13px; margin: 4px 0 0; font-weight: 500; }
.block-icon-care { background: #b45309; color:#fff; box-shadow: 0 4px 10px rgba(180,83,9,.20); }

.care-metric-strip { display:grid; grid-template-columns: repeat(5, 1fr); gap:10px; margin-top:14px; }
/* WEBAPP-UI-PRE-UAT-01 · HOME-CARE-METRIC-01
   Nhãn và số nằm CÙNG MỘT HÀNG. Trước đây nhãn tiếng Việt dài ("Khả năng chốt cao")
   xuống dòng rồi số nằm dòng dưới, thẻ cao ~86px và ăn hết chiều dọc của khu hội thoại.
   Vẫn giữ nguyên hệ màu ngữ nghĩa (viền trái + màu số) của Design System. */
.care-metric {
  background: var(--bg-surface);
  border: 1px solid var(--border-soft);
  border-left: 4px solid var(--border-soft);
  border-radius: 10px;
  padding: 9px 12px;
  display: flex; flex-direction: row; align-items: baseline; justify-content: space-between;
  gap: 10px; min-width: 0;
}
.care-metric-label {
  font-size: 13px;
  color: var(--text-primary);
  font-weight: 700;
  letter-spacing: 0.1px;
  text-transform: none;
  line-height: 1.25;
  min-width: 0;
}
.care-metric-value {
  font-size: 21px; font-weight: 800; color: var(--text-primary); line-height: 1.15;
  letter-spacing: -0.4px; flex: 0 0 auto; font-variant-numeric: tabular-nums;
}
/* semantic emphasis via left-border + tinted value color */
.care-metric[data-kind="info"]     { border-left-color: var(--status-info); }
.care-metric[data-kind="success"]  { border-left-color: var(--status-success); }
.care-metric[data-kind="success"]  .care-metric-value { color: var(--status-success); }
.care-metric[data-kind="warning"]  { border-left-color: var(--status-warning); background: var(--status-warning-soft); }
.care-metric[data-kind="warning"]  .care-metric-value { color: var(--status-warning); }
.care-metric[data-kind="highvalue"]{ border-left-color: var(--status-success); }
.care-metric[data-kind="highvalue"] .care-metric-value { color: var(--status-success); }
.care-metric[data-kind="attention"]{ border-left-color: var(--accent-primary); }
.care-metric[data-kind="attention"] .care-metric-value { color: var(--accent-primary); }

.care-cards { display:grid; grid-template-columns: repeat(3, 1fr); gap:14px; margin-top:16px; }
.care-card {
  background: var(--bg-surface);
  border: 1px solid var(--border-soft);
  border-radius: 12px;
  padding: 14px 16px;
  cursor: pointer;
  transition: transform .12s, box-shadow .15s, border-color .15s;
}
.care-card:hover { transform: translateY(-1px); box-shadow: 0 6px 16px rgba(15,23,42,.06); border-color: #cbd5e1; }
.care-card-head { display:flex; justify-content:space-between; align-items:center; gap:8px; }
.care-card-name { font-weight: 700; font-size: 14px; color: var(--text-primary); line-height: 1.3; }
.care-card-channel { font-size: var(--font-badge); padding: 2px 8px; background: var(--status-info-soft); color: var(--status-info); border-radius: 999px; font-weight: 600; letter-spacing: .2px; }
.care-card-row { font-size: 12.5px; color: var(--text-secondary); margin-top: 8px; }
.care-card-row b { color: var(--text-primary); font-weight: 600; }
.care-card-status { font-size: var(--font-badge); font-weight: 600; margin-top: 8px; padding: 3px 8px; display: inline-block; border-radius: 6px; background: #ede9fe; color: #5b21b6; }
.care-card-preview { font-size: 12.5px; color: var(--text-secondary); margin-top: 8px; line-height: 1.45; }
.care-card-time { font-size: var(--font-meta); color: var(--text-muted); margin-top: 8px; }

.care-action-zone { background: var(--bg-surface); border-radius: 14px; margin-top: 16px; padding: 18px 20px; border: 1px solid var(--border-soft); }
.care-action-zone h3 { margin: 0 0 12px; color: var(--text-primary); font-size: 15px; }
.action-grid { display:grid; grid-template-columns: 1fr 1fr; gap: 24px; }
.col-title { font-size: var(--font-meta); color: var(--text-secondary); font-weight: 700; text-transform: uppercase; letter-spacing: .5px; margin-bottom: 10px; }
.action-col button { margin: 4px 6px 4px 0; }

@media (max-width: 1180px) { .care-metric-strip { grid-template-columns: repeat(3, 1fr); } .care-cards { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 720px)  { .care-metric-strip { grid-template-columns: 1fr 1fr; } .care-cards { grid-template-columns: 1fr; } .action-grid { grid-template-columns: 1fr; } }

/* ===== CC-28: Global Customer Care Dock ===== */
.care-dock { position:fixed; right:16px; bottom:16px; z-index:9999; background:#fff; border:1px solid var(--border-soft); border-radius:14px; box-shadow: 0 12px 30px rgba(15,23,42,.18); overflow:hidden; }
.care-dock-expanded { width:400px; max-height:60vh; }
/* CC-30R2: COMPACT phải đủ chỗ 1-2 preview cards, không chỉ header. */
.care-dock-compact  { width:360px; max-height:200px; }
.care-dock-hidden   { display:none !important; }
.dock-header { display:flex; justify-content:space-between; align-items:center; padding:11px 14px; background:#0f2547; color:#fff; }
.dock-title { font-weight:700; font-size:13.5px; letter-spacing:.2px; }
.dock-icon { margin-right:6px; }
.dock-badge { display:inline-block; margin-left:8px; background:var(--status-danger); color:var(--text-inverse); font-size:var(--text-xs); padding:1px 7px; border-radius:999px; font-weight:700; }
/* CC-30: dock icon-only controls (no permanent text label) */
.dock-actions { display:flex; align-items:center; gap:2px; }
.dock-icon-btn {
  background:transparent; border:0; color:#94a3b8; cursor:pointer;
  width:26px; height:26px; padding:0; border-radius:6px;
  display:inline-flex; align-items:center; justify-content:center;
  font-size:14px; line-height:1; transition:background .12s, color .12s;
}
.dock-icon-btn:hover, .dock-icon-btn:focus-visible { background:rgba(255,255,255,.12); color:#fff; outline:none; }
.dock-icon-btn:focus-visible { box-shadow:0 0 0 2px rgba(59,130,246,.6); }
.care-dock-expanded .dock-icon-btn[data-dock="expand"]  { display:none; }
.care-dock-compact  .dock-icon-btn[data-dock="compact"] { display:none; }
.dock-body { padding:10px 12px; max-height:calc(60vh - 44px); overflow-y:auto; background: var(--bg-surface); }
.dock-item { padding:10px 0; border-bottom:1px solid var(--border-soft); font-size:var(--font-meta); }
.dock-item:first-child { padding-top:6px; }
.dock-item:last-child  { border-bottom:0; padding-bottom:4px; }
.dock-item-head { display:flex; justify-content:space-between; align-items:center; gap:8px; }
.dock-item-head b { color: var(--text-primary); font-weight:700; font-size:13.5px; }
.dock-item-channel { font-size:var(--font-badge); background: var(--status-info-soft); color: var(--status-info); padding:2px 8px; border-radius:8px; font-weight:700; letter-spacing:.2px; }
.dock-item-meta { color: var(--text-secondary); font-size:var(--font-meta); margin-top:5px; font-weight:500; }
.dock-item-meta b { color: var(--text-primary); font-weight:700; }
.dock-item-status { color:var(--status-ai); background:var(--status-ai-soft); font-size:var(--font-badge); font-weight:700; margin-top:6px; padding:3px 9px; border-radius:6px; display:inline-block; }
.dock-item-preview { color: var(--text-primary); font-size:var(--font-meta); margin-top:6px; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; font-weight:500; }
.dock-compact-summary { font-size:var(--font-meta); color: var(--text-muted); padding-bottom:8px; margin-bottom:6px; border-bottom:1px solid var(--border-soft); }
.dock-compact-summary b { color: var(--text-primary); font-weight:700; }

/* CC-30: reopen là small edge handle, không phải big button */
.dock-reopen-handle {
  position:fixed; right:16px; bottom:16px; z-index:80;
  width:44px; height:44px; padding:0; border:0; border-radius:22px;
  background:linear-gradient(135deg,#3b82f6,#6366f1); color:#fff;
  cursor:pointer; display:inline-flex; align-items:center; justify-content:center;
  box-shadow:0 4px 14px rgba(59,130,246,.35); transition:transform .12s, box-shadow .15s;
}
/* CC-30R: fix — display:inline-flex ở trên override attribute [hidden] mặc định.
   Cùng lớp bug với CC-25 .modal-root. Ép ẩn khi có attribute hidden. */
.dock-reopen-handle[hidden] { display:none !important; }
.care-dock[hidden] { display:none !important; }
.dock-reopen-handle:hover, .dock-reopen-handle:focus-visible { transform:translateY(-1px); box-shadow:0 8px 22px rgba(59,130,246,.45); outline:none; }
.dock-reopen-icon { font-size:18px; line-height:1; }
.dock-reopen-badge {
  position:absolute; top:-4px; right:-4px;
  min-width:18px; height:18px; padding:0 5px;
  background:#ef4444; color:#fff; border:2px solid #fff; border-radius:9px;
  font-size:var(--text-xs); font-weight:700; line-height:14px; text-align:center;
}
.dock-reopen-badge[data-critical="true"] { background:#dc2626; }
.dock-reopen-badge[data-count="0"] { display:none; }

/* ===== CC-32: GLOBAL CUSTOMER CARE — application-shell region =====
   Rules: CUSTOMER_CARE_IS_GLOBAL_NOT_PAGE_LOCAL · PERSISTENT_VISIBILITY_ADAPTIVE_SIZE ·
          ONE_CUSTOMER_CARE_COMPONENT_ONE_STATE_ONE_DATA_SOURCE.
   Layout: normal flow inside #main. Default sits between topbar and #view-root.
           On HOME (#main[data-route="home"]) it sits BELOW the workspace tiles (matches CC-32 §14).
*/
#main {
  display:flex; flex-direction:column;
  --topbar-height: 69px;
  /* Hai token dưới đây PHẢI nằm ở đây, không được đưa lên :root — xem ghi chú
     CHỒNG STICKY trong :root. --care-sticky-height do app.js đo và ghi lên chính
     phần tử này, nên phép cộng chỉ đúng khi tính tại đây. */
  --sticky-topbar-h:   var(--topbar-height, 69px);
  --sticky-care-h:     var(--care-sticky-height, 0px);
  --sticky-module-top: calc(var(--sticky-topbar-h) + var(--sticky-care-h));
}
#main > .topbar { order: 1; flex: 0 0 auto; }
#main > #global-care { order: 2; flex: 0 0 auto; }
#main > #view-root  { order: 3; flex: 1 1 auto; min-height: 0; }
#main[data-route="home"] > #global-care { order: 4; }

/* CC-32R2: PERSISTENT_VISIBILITY_ADAPTIVE_SIZE — topbar sticky on every route so scrollY does not eat header;
   on non-HOME routes, Global Customer Care becomes sticky right below the topbar so it stays visibly available
   while user scrolls long workspaces (CRM tables, AI Admin lists, coming-soon pages). HOME stays clean — the
   large expanded Care lives in normal flow at the bottom of the HOME workspace, no sticky duplicate.
   Same #global-care component — no second DOM node, no second state, no second polling loop. */
#main > .topbar { position: sticky; top: 0; z-index: var(--sticky-z-topbar); background: var(--bg-app, #ffffff); }
#main:not([data-route="home"]) > #global-care {
  position: sticky;
  top: var(--sticky-topbar-h);
  z-index: var(--sticky-z-care);
  margin-top: 0;
}

.global-care {
  background: #ffffff;
  border: 1px solid var(--border-soft);
  border-top: 3px solid #b45309;
  border-radius: 14px;
  margin: 12px 24px 20px;
  padding: 16px 20px;
  box-shadow: 0 1px 3px rgba(15,23,42,.04);
}
.global-care[hidden] { display:none !important; }
.global-care[data-state="COMPACT"]  { padding: 10px 18px; }
.global-care[data-state="EXPANDED"] { padding: 16px 20px; }

.global-care-header { display:flex; align-items:center; justify-content:space-between; gap:12px; }
.global-care-title  { display:flex; align-items:center; gap:10px; min-width:0; }
.global-care-title h2 {
  margin:0; color: var(--text-primary); font-weight: 700; letter-spacing:.2px;
  font-size: 15px;
}
.global-care[data-state="EXPANDED"] .global-care-title h2 { font-size: 17px; }
.global-care-icon { font-size: 18px; line-height: 1; }
.global-care-badge {
  display:inline-block; margin-left:4px; background: var(--status-danger); color:#fff;
  font-size: var(--text-xs); font-weight: 700; padding: 2px 8px; border-radius: 999px;
}
.global-care-actions { display:flex; align-items:center; gap:4px; }
.gc-icon-btn {
  background: transparent; border: 1px solid transparent; color: var(--text-secondary);
  cursor: pointer; width: 28px; height: 28px; border-radius: 7px; padding: 0;
  display: inline-flex; align-items: center; justify-content: center;
  font-size: 14px; line-height: 1; transition: background .12s, color .12s, border-color .12s;
}
.gc-icon-btn:hover, .gc-icon-btn:focus-visible {
  background: var(--bg-surface-soft); color: var(--text-primary);
  border-color: var(--border-soft); outline: none;
}
.gc-icon-btn:focus-visible { box-shadow: 0 0 0 2px rgba(59,130,246,.4); }
/* Hide the state control matching the current state (one-way toggles). */
.global-care[data-state="EXPANDED"] .gc-icon-btn[data-gc="EXPANDED"] { display: none; }
.global-care[data-state="COMPACT"]  .gc-icon-btn[data-gc="COMPACT"]  { display: none; }

/* Metrics area — COMPACT summary line vs EXPANDED 5-metric strip. Reuses .care-metric* tokens from CC-31R.
   WEBAPP-UI-PRE-UAT-01: dải chỉ số chỉ còn 1 hàng chữ nên khoảng cách cũng thu lại,
   phần chiều dọc tiết kiệm được chuyển hết sang khu khách hàng/hội thoại bên dưới. */
.global-care[data-state="COMPACT"]  #global-care-metrics { margin-top: 8px; }
.global-care[data-state="EXPANDED"] #global-care-metrics {
  display: grid; grid-template-columns: repeat(5, 1fr); gap: 10px; margin-top: 10px;
}
.care-compact-summary {
  font-size: 13px; color: var(--text-primary); font-weight: 500; line-height: 1.4;
}
.care-compact-summary b { font-weight: 800; color: var(--text-primary); }

/* Cards — COMPACT: horizontal 2 slim cards; EXPANDED: 3-4 rich cards grid. Reuses .care-card* tokens. */
.global-care[data-state="COMPACT"]  #global-care-cards {
  display: grid; grid-template-columns: repeat(2, minmax(0,1fr)); gap: 10px; margin-top: 10px;
}
.global-care[data-state="EXPANDED"] #global-care-cards {
  display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: 12px; margin-top: 12px;
  /* CHAT_AREA_SPACE_IMPROVED: khu hội thoại nhận phần chiều dọc lấy lại từ dải chỉ số —
     luôn có tối thiểu 2 hàng thẻ khách hàng, cuộn trong chính nó thay vì đẩy dài cả trang. */
  align-content: start; max-height: 44vh; overflow-y: auto; padding-right: 2px;
}
.global-care[data-state="EXPANDED"] #global-care-cards .empty { grid-column: 1 / -1; }
.global-care .care-card { padding: 12px 14px; }
.global-care[data-state="COMPACT"] .care-card { padding: 10px 12px; }
.global-care[data-state="COMPACT"] .care-card-preview { -webkit-line-clamp: 1; display:-webkit-box; -webkit-box-orient: vertical; overflow: hidden; }

/* .care-card-meta: same treatment as .care-card-row (used inside #global-care cards). */
.care-card-meta { font-size: 12.5px; color: var(--text-secondary); margin-top: 6px; font-weight: 500; }
.care-card-meta b { color: var(--text-primary); font-weight: 700; }

@media (max-width: 1180px) {
  .global-care[data-state="EXPANDED"] #global-care-metrics { grid-template-columns: repeat(3, 1fr); }
  .global-care[data-state="EXPANDED"] #global-care-cards   { grid-template-columns: repeat(2, 1fr); }
  /* CC-32R2: keep COMPACT dense — 2 slim cards side-by-side even on narrower desktop, so sticky panel stays short. */
  .global-care[data-state="COMPACT"]  #global-care-cards   { grid-template-columns: repeat(2, minmax(0,1fr)); }
}
@media (max-width: 720px) {
  .global-care[data-state="EXPANDED"] #global-care-metrics { grid-template-columns: repeat(2, 1fr); }
  .global-care[data-state="EXPANDED"] #global-care-cards   { grid-template-columns: 1fr; }
}

/* CC-32 reopen handle (small edge floater, HIDDEN mode only). */
.care-reopen-handle {
  position: fixed; right: 16px; bottom: 16px; z-index: 80;
  width: 44px; height: 44px; padding: 0; border: 0; border-radius: 22px;
  background: linear-gradient(135deg,#3b82f6,#6366f1); color: #fff;
  cursor: pointer; display: inline-flex; align-items: center; justify-content: center;
  box-shadow: 0 4px 14px rgba(59,130,246,.35); transition: transform .12s, box-shadow .15s;
}
.care-reopen-handle[hidden] { display: none !important; }
.care-reopen-handle:hover, .care-reopen-handle:focus-visible { transform: translateY(-1px); box-shadow: 0 8px 22px rgba(59,130,246,.45); outline: none; }
.care-reopen-icon { font-size: 18px; line-height: 1; }
.care-reopen-badge {
  position: absolute; top: -4px; right: -4px;
  min-width: 18px; height: 18px; padding: 0 5px;
  background: #ef4444; color: #fff; border: 2px solid #fff; border-radius: 9px;
  font-size: var(--text-xs); font-weight: 700; line-height: 14px; text-align: center;
}
.care-reopen-badge[data-critical="true"] { background: #dc2626; }
.care-reopen-badge[data-count="0"] { display: none; }

/* ===== CC-33R2: label-with-technical-identifier pattern =====
   Primary Vietnamese label + small secondary technical identifier below.
   Rule: HUMAN_PRIMARY_LABEL_VIETNAMESE, TECHNICAL_IDENTIFIER_SECONDARY. */
.label-primary   { color: var(--text-primary);   font-size: var(--text-md); font-weight: var(--weight-semibold); line-height: var(--line-tight); }
/* SỬA 14/09/2026: .label-secondary mang cả dữ liệu nghiệp vụ (ví dụ "chưa có giá"),
   không chỉ mã kỹ thuật — nên phải đạt sàn đọc được, không dùng --text-xs. */
.label-secondary { color: var(--text-muted);     font-size: var(--font-meta); font-weight: var(--weight-medium); font-family: ui-monospace, SF Mono, Consolas, monospace; margin-top: 2px; letter-spacing: .2px; }

/* ===== CC-28: AI Admin pages ===== */
.ai-admin-panel .panel { margin-bottom:14px; }
.ai-version-group { margin-top:14px; padding:12px; background:#f8fafc; border-radius:10px; }
.ai-version-group h4 { margin:0 0 8px; }
.ai-admin-cards, .ai-health-grid { display:grid; grid-template-columns: repeat(3, 1fr); gap:14px; margin-top:10px; }
.stat { background: var(--bg-surface-soft); border: 1px solid var(--border-soft); border-radius: var(--radius-md); padding: var(--space-3) var(--space-4); }
/* VISUAL-HARMONIZATION-V1: .stat-label bump 11px → 12.5px (var(--font-meta)) để đúng
   luật B1 của hệ thiết kế (11px chỉ cho mã kỹ thuật/badge đếm số). .stat được dùng
   duy nhất bởi AI Management renderers (đã grep xác nhận), không có cross-module regression. */
.stat-label { font-size: var(--font-meta); color: var(--text-secondary); font-weight: var(--weight-bold); text-transform: uppercase; letter-spacing: .4px; }
.stat-value { font-size: var(--font-card-title); font-weight: var(--weight-bold); color: var(--text-primary); margin-top: var(--space-1); word-break: break-word; line-height: var(--line-tight); }

/* ===== WEBAPP05-AI-MANAGEMENT-VISUAL-HARMONIZATION-V1-01 =====
   Đây là bản refactor của khối CSS `AI-MANAGEMENT-CONSOLIDATION-V1-01` cũ. Toàn bộ giá
   trị viết cứng (radius, màu, font-size, letter-spacing, transform) đã được thay bằng
   token canonical đã có ở `:root`, và các thành phần trùng vai trò với hệ thống chung
   (empty state, badge, header trang) được hướng về `.ds-empty(-sm)` / `.tag-*` / `.crumbs`
   thay vì bespoke local. Không thêm token mới; không định nghĩa lại token có sẵn. */

/* Sáu thẻ domain đọc như MỘT selector nghiệp vụ (§5 FORM), không phải sáu widget. */
.ai-domain-grid {
  display: grid;
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: var(--stack-gap);
  margin-top: var(--space-3);
}
.ai-domain-card {
  display: grid;
  grid-template-columns: auto 1fr;
  align-items: center;
  gap: var(--space-3);
  padding: var(--card-pad-sm) var(--card-pad);
  text-align: left;
  cursor: pointer;
  background: var(--bg-surface);
  border: 1px solid var(--border-soft);
  border-radius: var(--radius-md);
  color: var(--text-primary);
  font: inherit;
  transition: border-color .12s ease, background .12s ease;
}
.ai-domain-card:hover { border-color: var(--border-focus); background: var(--brand-primary-soft); }
.ai-domain-card:focus-visible { outline: none; box-shadow: 0 0 0 2px rgba(59,130,246,.35); }
.ai-domain-icon {
  width: 32px; height: 32px; border-radius: var(--radius-sm);
  background: var(--bg-surface-soft); color: var(--text-secondary);
  display: grid; place-items: center;
  font-size: var(--text-lg); line-height: 1;
}
.ai-domain-name {
  font-size: var(--font-card-title);
  font-weight: var(--weight-semibold);
  color: var(--text-primary);
  line-height: var(--line-tight);
}
.ai-domain-meta {
  grid-column: 2 / -1;
  font-size: var(--font-meta);
  color: var(--text-secondary);
  font-weight: var(--weight-medium);
  margin-top: var(--space-1);
}

/* Header của một domain — dùng cùng khuôn với `.crumbs` + nút ghost, không tự chế viền. */
.ai-domain-header {
  display: flex; align-items: center; gap: var(--space-3);
  padding-bottom: var(--space-3);
  border-bottom: 1px solid var(--border-soft);
  margin-bottom: var(--space-3);
}
.ai-domain-header-title {
  font-size: var(--font-section-title);
  font-weight: var(--weight-bold);
  color: var(--text-primary);
}

/* Tab con — giữ khuôn "chip" nhưng dùng brand primary + soft, không hardcode #0f172a. */
.ai-subtabs {
  display: flex; gap: var(--space-1);
  border-bottom: 1px solid var(--border-soft);
  margin-bottom: var(--space-3);
  overflow-x: auto;
}
.ai-subtab {
  padding: var(--space-2) var(--space-3);
  border: 1px solid transparent;
  border-bottom: 0;
  border-radius: var(--radius-sm) var(--radius-sm) 0 0;
  background: transparent;
  color: var(--text-secondary);
  cursor: pointer;
  white-space: nowrap;
  font-size: var(--font-button);
  font-weight: var(--weight-semibold);
  line-height: var(--line-tight);
  position: relative; top: 1px;
}
.ai-subtab:hover { background: var(--bg-surface-soft); color: var(--text-primary); }
.ai-subtab.active {
  background: var(--bg-surface);
  border-color: var(--border-soft);
  color: var(--brand-primary);
  box-shadow: inset 0 -3px 0 var(--brand-primary);
}
.ai-subpanel { padding-top: var(--space-2); }

/* Section heading nội bộ của một tab (tương đương .panel-title thu nhỏ). */
.ai-subsection-title {
  font-size: var(--font-card-title);
  font-weight: var(--weight-bold);
  color: var(--text-primary);
  margin: 0 0 var(--space-2);
}

/* Ghi chú, hint dùng chung — thay cho các inline style="color:var(--text-mute)" rải rác. */
.ai-hint { color: var(--text-secondary); font-size: var(--font-help); }
.ai-hint b { color: var(--text-primary); font-weight: var(--weight-semibold); }

/* Quy tắc chung: list đọc dễ, không tự chế line-height. */
.ai-global-rules {
  margin: var(--space-2) 0 var(--space-3) var(--space-5);
  padding: 0;
  line-height: var(--line-relaxed);
  font-size: var(--font-body);
  color: var(--text-primary);
}
.ai-global-rules li { margin-bottom: var(--space-1); }

/* Empty-state cũ `.ai-empty-state` giữ để backward-compat cho các trang khác nếu có tham
   chiếu, nhưng ánh xạ về cùng khuôn với `.ds-empty-sm` (dashed border-strong + bg-soft). */
.ai-empty-state {
  display: inline-block;
  padding: var(--space-2) var(--space-3);
  border: 1px dashed var(--border-strong);
  background: var(--bg-surface-soft);
  color: var(--text-muted);
  border-radius: var(--radius-sm);
  font-size: var(--font-help);
  font-style: normal;
  font-weight: var(--weight-medium);
}

/* Responsive: gói 3 → 2 → 1 cột theo breakpoint chung của WebApp. */
@media (max-width: 1100px) { .ai-domain-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 720px)  {
  .ai-domain-grid { grid-template-columns: 1fr; }
  .ai-subtabs { gap: 2px; }
  .ai-subtab { padding: var(--space-2) var(--space-3); }
}

/* ===== WEBAPP-AI-MANAGEMENT-2WORKSPACE-UI-V1-01 =====
   Quản trị AI tái cấu trúc về 2 workspace: Trung tâm AI + Agent & Điều khiển.
   Nguồn thiết kế: 2 ảnh reference IMAGE_A/IMAGE_B của FORM. Kích thước / màu / bo góc
   / khoảng cách đọc token canonical (:root); KHÔNG thêm token mới. Reuse tối đa
   `.panel`, `.stat`, `.tag`, `.ds-empty`, `.btn`, `.crumbs`. */

/* --- Workspace 1: TRUNG TÂM AI (giám sát toàn hệ) --- */
.ai-center-shell { display: flex; flex-direction: column; gap: var(--section-gap); }
.ai-center-header-actions { display: flex; align-items: center; gap: var(--space-3); }
.ai-center-timestamp {
  display: inline-flex; align-items: center; gap: var(--space-2);
  padding: var(--space-2) var(--space-3);
  background: var(--bg-surface-soft); border: 1px solid var(--border-soft);
  border-radius: var(--radius-sm);
  font-size: var(--font-meta); color: var(--text-secondary);
}
.ai-center-summary-grid {
  display: grid;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: var(--stack-gap);
}
.ai-center-summary-card {
  display: grid;
  grid-template-columns: 44px 1fr;
  gap: var(--space-3);
  align-items: center;
  padding: var(--card-pad-sm) var(--card-pad);
  background: var(--bg-surface);
  border: 1px solid var(--border-soft);
  border-radius: var(--radius-md);
  min-height: 76px;
}
.ai-center-summary-icon {
  width: 44px; height: 44px; border-radius: var(--radius-sm);
  display: grid; place-items: center;
  font-size: 20px; line-height: 1;
  background: var(--bg-surface-soft); color: var(--text-secondary);
}
.ai-center-summary-icon.ok       { background: var(--status-success-soft); color: var(--status-success); }
.ai-center-summary-icon.warn     { background: var(--status-warning-soft); color: var(--status-warning); }
.ai-center-summary-icon.error    { background: var(--status-danger-soft);  color: var(--status-danger); }
.ai-center-summary-icon.info     { background: var(--status-info-soft);    color: var(--status-info); }
.ai-center-summary-icon.paused   { background: var(--bg-subtle);           color: var(--text-secondary); }
.ai-center-summary-label {
  font-size: var(--font-meta);
  color: var(--text-secondary);
  font-weight: var(--weight-semibold);
}
.ai-center-summary-value {
  font-size: var(--text-metric);
  font-weight: var(--weight-bold);
  color: var(--text-primary);
  line-height: var(--line-tight);
  margin-top: 2px;
  font-variant-numeric: tabular-nums;
}
.ai-center-summary-note {
  font-size: var(--font-help);
  color: var(--text-muted);
  margin-top: 2px;
}

/* Grid ba khối: Trạng thái AI · Chi phí · Phân bổ */
.ai-center-3col {
  display: grid;
  grid-template-columns: 1fr 1.4fr 1fr;
  gap: var(--stack-gap);
}
.ai-center-3col > .panel { margin: 0; }

/* Donut trạng thái */
.ai-center-donut {
  display: grid; place-items: center;
  position: relative; width: 160px; height: 160px; margin: var(--space-2) auto;
}
.ai-center-donut svg { width: 160px; height: 160px; transform: rotate(-90deg); }
.ai-center-donut-center {
  position: absolute; text-align: center;
}
.ai-center-donut-center .n { font-size: 26px; font-weight: var(--weight-bold); color: var(--text-primary); }
.ai-center-donut-center .l { font-size: var(--font-meta); color: var(--text-secondary); }
.ai-center-status-list { display: flex; flex-direction: column; gap: var(--space-2); margin-top: var(--space-3); }
.ai-center-status-row {
  display: grid; grid-template-columns: 12px 1fr auto; align-items: center; gap: var(--space-2);
  font-size: var(--font-body); color: var(--text-primary);
}
.ai-center-status-row .dot { width: 10px; height: 10px; border-radius: 50%; }

/* Chi phí block */
.ai-center-cost-hero { text-align: left; }
.ai-center-cost-value {
  font-size: 30px; font-weight: var(--weight-bold); color: var(--text-primary);
  font-variant-numeric: tabular-nums;
}
.ai-center-cost-sub { font-size: var(--font-meta); color: var(--text-secondary); margin-top: 2px; }
.ai-center-cost-bars { display: flex; align-items: flex-end; gap: 3px; height: 90px; margin-top: var(--space-3); }
.ai-center-cost-bars .bar {
  flex: 1; background: var(--brand-primary-soft); border-radius: 2px 2px 0 0;
  border-top: 3px solid var(--brand-primary);
  min-height: 4px;
}
.ai-center-cost-axis { display: flex; justify-content: space-between; font-size: var(--font-help); color: var(--text-muted); margin-top: var(--space-1); }

/* Phân bổ chi phí theo Agent (bar list) */
.ai-center-alloc { display: flex; flex-direction: column; gap: var(--space-2); }
.ai-center-alloc-row {
  display: grid; grid-template-columns: 12px 1fr 40px 60px; align-items: center; gap: var(--space-2);
  font-size: var(--font-meta);
}
.ai-center-alloc-row .dot { width: 10px; height: 10px; border-radius: 50%; }
.ai-center-alloc-row .name { color: var(--text-primary); font-weight: var(--weight-medium); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ai-center-alloc-row .pct { text-align: right; color: var(--text-secondary); font-variant-numeric: tabular-nums; }
.ai-center-alloc-row .usd { text-align: right; color: var(--text-primary); font-weight: var(--weight-semibold); font-variant-numeric: tabular-nums; }
.ai-center-alloc-track { grid-column: 2 / 3; height: 4px; background: var(--bg-subtle); border-radius: 999px; margin-top: 4px; overflow: hidden; }
.ai-center-alloc-track .fill { height: 100%; background: var(--brand-primary); border-radius: 999px; }

/* 3 khối dưới: Cảnh báo, Tiến trình, Hoạt động */
.ai-center-lists { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: var(--stack-gap); }
.ai-center-list-item {
  display: grid; grid-template-columns: 36px 1fr auto; gap: var(--space-3); align-items: start;
  padding: var(--space-3) 0;
  border-bottom: 1px solid var(--border-soft);
}
.ai-center-list-item:last-child { border-bottom: 0; }
.ai-center-list-icon {
  width: 32px; height: 32px; border-radius: var(--radius-sm);
  background: var(--bg-surface-soft); color: var(--text-secondary);
  display: grid; place-items: center; font-size: 16px;
}
.ai-center-list-icon.warn { background: var(--status-warning-soft); color: var(--status-warning); }
.ai-center-list-icon.ok   { background: var(--status-success-soft); color: var(--status-success); }
.ai-center-list-icon.info { background: var(--status-info-soft); color: var(--status-info); }
.ai-center-list-title { font-size: var(--font-body); font-weight: var(--weight-semibold); color: var(--text-primary); line-height: 1.3; }
.ai-center-list-note  { font-size: var(--font-meta); color: var(--text-secondary); margin-top: 2px; }
.ai-center-list-when  { font-size: var(--font-meta); color: var(--text-muted); text-align: right; white-space: nowrap; }

/* Mini System Chat */
.ai-center-mini-chat {
  background: var(--bg-surface);
  border: 1px solid var(--border-soft);
  border-radius: var(--radius-lg);
  padding: var(--card-pad);
  display: flex; flex-direction: column; gap: var(--space-2);
}
.ai-center-mini-chat-head { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
.ai-center-mini-chat-head h3 { margin: 0; font-size: var(--font-card-title); font-weight: var(--weight-bold); color: var(--text-primary); }
.ai-center-mini-chat-note { font-size: var(--font-meta); color: var(--text-secondary); }
.ai-center-mini-chat-prompts { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-1); }
.ai-center-mini-chat-prompt {
  padding: 6px var(--space-3);
  background: var(--bg-surface-soft); border: 1px solid var(--border-soft);
  border-radius: 999px;
  font-size: var(--font-meta); color: var(--text-secondary);
  cursor: pointer;
}
.ai-center-mini-chat-prompt:hover:not(:disabled) { border-color: var(--brand-primary); color: var(--brand-primary); }
.ai-center-mini-chat-prompt:disabled { opacity: .6; cursor: not-allowed; }
.ai-center-mini-chat-input {
  display: flex; gap: var(--space-2); align-items: center; margin-top: var(--space-1);
}
.ai-center-mini-chat-input textarea {
  flex: 1; min-height: 44px; font: inherit; font-size: 15px;
  padding: var(--space-2) var(--space-3);
  border: 1px solid var(--border-strong); border-radius: var(--radius-sm);
  background: var(--bg-surface);
  resize: none;
}
.ai-center-mini-chat-input textarea:disabled { background: var(--bg-subtle); color: var(--text-muted); }
.ai-center-mini-chat-input button { min-height: 44px; }
.ai-center-mini-chat-gap {
  padding: var(--space-2) var(--space-3);
  background: var(--status-warning-soft);
  border: 1px solid var(--status-warning);
  color: var(--status-warning);
  border-radius: var(--radius-sm);
  font-size: var(--font-help);
}

/* --- Workspace 2: AGENT & ĐIỀU KHIỂN (3 cột) --- */
.ai-agents-header-row { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); flex-wrap: wrap; }
.ai-agents-shell {
  display: grid;
  grid-template-columns: 320px minmax(0, 1fr) 380px;
  gap: var(--stack-gap);
  align-items: stretch;
}
.ai-agents-col { background: var(--bg-surface); border: 1px solid var(--border-soft); border-radius: var(--radius-md); display: flex; flex-direction: column; min-height: 520px; overflow: hidden; }
.ai-agents-col-head { padding: var(--space-3) var(--card-pad); border-bottom: 1px solid var(--border-soft); display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); }
.ai-agents-col-head h3 { margin: 0; font-size: var(--font-card-title); font-weight: var(--weight-bold); color: var(--text-primary); }
.ai-agents-col-body { flex: 1 1 auto; overflow-y: auto; }

/* Left: agent list */
.ai-agents-list { list-style: none; margin: 0; padding: var(--space-2); display: flex; flex-direction: column; gap: 2px; }
.ai-agents-list-item {
  display: grid; grid-template-columns: 40px 1fr auto; gap: var(--space-3); align-items: center;
  padding: var(--space-3);
  border: 1px solid transparent;
  border-radius: var(--radius-sm);
  cursor: pointer;
  transition: background .12s ease, border-color .12s ease;
}
.ai-agents-list-item:hover { background: var(--bg-surface-soft); }
.ai-agents-list-item.active { background: var(--brand-primary-soft); border-color: var(--brand-primary); }
.ai-agents-list-icon { width: 40px; height: 40px; border-radius: var(--radius-sm); background: var(--bg-surface-soft); color: var(--text-secondary); display: grid; place-items: center; font-size: 18px; }
.ai-agents-list-name { font-size: var(--font-body); font-weight: var(--weight-semibold); color: var(--text-primary); }
.ai-agents-list-meta { font-size: var(--font-meta); color: var(--text-secondary); margin-top: 2px; }
.ai-agents-list-count { text-align: right; font-size: var(--font-meta); color: var(--text-secondary); font-weight: var(--weight-medium); font-variant-numeric: tabular-nums; }
.ai-agents-list-count .badge {
  display: inline-block; min-width: 22px; padding: 0 6px; height: 20px; line-height: 20px;
  background: var(--brand-primary); color: var(--text-inverse); border-radius: 999px;
  font-size: 11px; font-weight: var(--weight-bold);
}
.ai-agents-list-search { padding: var(--space-2) var(--card-pad); border-bottom: 1px solid var(--border-soft); }
.ai-agents-list-search input {
  width: 100%; font: inherit; font-size: var(--font-body);
  padding: var(--space-2) var(--space-3);
  border: 1px solid var(--border-soft); border-radius: var(--radius-sm);
  background: var(--bg-surface-soft);
}

/* Center: agent detail */
.ai-agents-detail-head { padding: var(--card-pad); display: grid; grid-template-columns: 56px 1fr auto; gap: var(--space-3); align-items: center; border-bottom: 1px solid var(--border-soft); }
.ai-agents-detail-icon { width: 56px; height: 56px; border-radius: var(--radius-sm); background: var(--brand-primary-soft); color: var(--brand-primary); display: grid; place-items: center; font-size: 26px; }
.ai-agents-detail-title { font-size: var(--font-section-title); font-weight: var(--weight-bold); color: var(--text-primary); }
.ai-agents-detail-sub { font-size: var(--font-meta); color: var(--text-secondary); margin-top: 2px; }
.ai-agents-detail-actions { display: flex; gap: var(--space-2); align-items: center; flex-wrap: wrap; }
.ai-agents-detail-tabs { display: flex; gap: var(--space-1); padding: 0 var(--card-pad); border-bottom: 1px solid var(--border-soft); overflow-x: auto; }
.ai-agents-detail-tab {
  padding: var(--space-2) var(--space-3);
  background: transparent; border: 0;
  color: var(--text-secondary); font-size: var(--font-button); font-weight: var(--weight-semibold);
  cursor: pointer; white-space: nowrap;
  border-bottom: 3px solid transparent;
  margin-bottom: -1px;
}
.ai-agents-detail-tab:hover { color: var(--text-primary); }
.ai-agents-detail-tab.active { color: var(--brand-primary); border-bottom-color: var(--brand-primary); }
.ai-agents-detail-panel { padding: var(--card-pad); overflow-y: auto; }
.ai-agents-detail-panel h4 { margin: var(--space-3) 0 var(--space-2); font-size: var(--font-card-title); font-weight: var(--weight-bold); color: var(--text-primary); }
.ai-agents-metric-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: var(--stack-gap); margin-top: var(--space-2); }
.ai-agents-metric { padding: var(--space-3); background: var(--bg-surface-soft); border: 1px solid var(--border-soft); border-radius: var(--radius-md); }
.ai-agents-metric .l { font-size: var(--font-meta); color: var(--text-secondary); font-weight: var(--weight-semibold); text-transform: uppercase; letter-spacing: .3px; }
.ai-agents-metric .v { font-size: 20px; font-weight: var(--weight-bold); color: var(--text-primary); margin-top: 4px; font-variant-numeric: tabular-nums; word-break: break-word; }
.ai-agents-kv { display: grid; grid-template-columns: 200px 1fr; gap: var(--space-2) var(--space-3); font-size: var(--font-body); }
.ai-agents-kv dt { color: var(--text-secondary); font-weight: var(--weight-medium); }
.ai-agents-kv dd { margin: 0; color: var(--text-primary); font-weight: var(--weight-semibold); }

/* Right: agent chat */
.ai-agents-chat-head { padding: var(--card-pad); border-bottom: 1px solid var(--border-soft); display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); }
.ai-agents-chat-title { font-size: var(--font-card-title); font-weight: var(--weight-bold); color: var(--text-primary); }
.ai-agents-chat-sub { font-size: var(--font-meta); color: var(--text-secondary); margin-top: 2px; }
.ai-agents-chat-body { flex: 1 1 auto; overflow-y: auto; padding: var(--card-pad); background: var(--bg-surface-soft); display: flex; flex-direction: column; gap: var(--space-2); }
.ai-agents-chat-msg { padding: var(--space-2) var(--space-3); border-radius: var(--radius-md); border: 1px solid var(--border-soft); background: var(--bg-surface); max-width: 92%; font-size: var(--font-body); line-height: var(--line-normal); }
.ai-agents-chat-msg.user      { align-self: flex-end; background: var(--brand-primary-soft); border-color: var(--brand-primary); }
.ai-agents-chat-msg.assistant { align-self: flex-start; }
.ai-agents-chat-msg.system    { align-self: stretch; background: var(--status-warning-soft); border-color: var(--status-warning); font-size: var(--font-help); }
.ai-agents-chat-footer { padding: var(--space-3) var(--card-pad); border-top: 1px solid var(--border-soft); }
.ai-agents-chat-input { display: flex; gap: var(--space-2); align-items: flex-end; }
.ai-agents-chat-input textarea {
  flex: 1; min-height: 44px; font: inherit; font-size: 15px;
  padding: var(--space-2) var(--space-3);
  border: 1px solid var(--border-strong); border-radius: var(--radius-sm);
  background: var(--bg-surface); resize: vertical; max-height: 30vh;
}
.ai-agents-chat-input textarea:disabled { background: var(--bg-subtle); color: var(--text-muted); }
.ai-agents-chat-gap {
  margin-top: var(--space-2);
  padding: var(--space-2) var(--space-3);
  background: var(--status-warning-soft); color: var(--status-warning);
  border: 1px solid var(--status-warning); border-radius: var(--radius-sm);
  font-size: var(--font-help);
}

/* Responsive 3-col → 2-col → 1-col */
@media (max-width: 1280px) {
  .ai-agents-shell { grid-template-columns: 280px minmax(0, 1fr); }
  .ai-agents-shell .ai-agents-col.chat { grid-column: 1 / -1; }
  .ai-center-3col { grid-template-columns: 1fr 1fr; }
  .ai-center-3col > .panel:nth-child(3) { grid-column: 1 / -1; }
  .ai-center-summary-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .ai-center-lists { grid-template-columns: 1fr 1fr; }
  .ai-center-lists > *:nth-child(3) { grid-column: 1 / -1; }
}
@media (max-width: 900px) {
  .ai-agents-shell { grid-template-columns: 1fr; }
  .ai-center-3col { grid-template-columns: 1fr; }
  .ai-center-summary-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ai-center-lists { grid-template-columns: 1fr; }
}
@media (max-width: 480px) {
  .ai-center-summary-grid { grid-template-columns: 1fr; }
  .ai-agents-detail-head { grid-template-columns: 44px 1fr; }
  .ai-agents-detail-actions { grid-column: 1 / -1; }
  .ai-agents-kv { grid-template-columns: 1fr; }
  .ai-agents-kv dt { color: var(--text-muted); font-size: var(--font-help); }
}

/* ===== WEBAPP-AI-MANAGEMENT-VISUAL-POLISH-SHARED-V1-02 =====
   Polish sau UAT Owner (2026-09-22). Áp dụng cho CẢ Trung tâm AI VÀ Agent & Điều khiển
   (visual language shared). KHÔNG thay đổi bố cục 3 vùng của Agent & Điều khiển.
   Đọc TOKEN canonical, không thêm token. */

/* --- Page header COMPACT (§3) — dùng chung cho ai-admin (cả 2 workspace) --- */
.ai-admin .page-header {
  padding: var(--space-3) 0;      /* trước ~24 → 12 */
  gap: var(--space-3);
  border-bottom: 1px solid var(--border-soft);
  margin-bottom: var(--space-4);
  display: flex; align-items: center; justify-content: space-between;
}
.ai-admin .page-header-left { display: flex; align-items: center; gap: var(--space-3); }
.ai-admin .page-icon {
  width: 40px; height: 40px;     /* trước 48+ */
  border-radius: var(--radius-sm);
  background: var(--brand-primary-soft); color: var(--brand-primary);
  display: grid; place-items: center; font-size: 18px;
}
.ai-admin .page-header h1 {
  font-size: 18px !important;    /* Owner đề xuất §11: 18px / 600–650 */
  font-weight: var(--weight-bold);
  line-height: var(--line-tight);
  margin: 0;
  color: var(--text-primary);
}
.ai-admin .page-header p {
  font-size: var(--font-meta);   /* subtitle nhỏ hơn, sát body */
  color: var(--text-secondary);
  margin: 2px 0 0;
  line-height: 1.4;
}
.ai-admin .crumbs {
  font-size: var(--font-help);
  color: var(--text-muted);
  margin-bottom: var(--space-2);
  font-weight: var(--weight-medium);
}
.ai-admin .crumbs b { color: var(--text-secondary); font-weight: var(--weight-semibold); }

/* --- SIDEBAR active state polish (§4, §21 · V1-02, tinh chỉnh V1-05 §2)
     V1-02 dùng brand-primary-soft (#eff6ff) — nhưng trên nền sidebar navy (#0b1d3a)
     nó trông gần như trắng gắt (Owner phản hồi V1-05 §2). Nay đổi sang navy soft
     (rgba brand-primary 15%) → tint hoà với navy, text chuyển sang trắng/blue sáng. */
.nav-child.active {
  background: rgba(59, 130, 246, 0.18);
  color: var(--text-inverse);
  font-weight: var(--weight-semibold);
  position: relative;
}
.nav-child.active::before {
  content: ''; position: absolute; left: 0; top: 4px; bottom: 4px; width: 3px;
  background: #60a5fa; border-radius: 2px;
}
.nav-child.active span { color: #dbeafe; }
.nav-child.active:hover { background: rgba(59, 130, 246, 0.26); }
/* Hover trên các nav-child KHÔNG active giữ nhẹ hơn active. */
.nav-child:not(.active):hover { background: rgba(148, 163, 184, 0.10); }

/* --- KPI STRIP compact (§5, §6) — 60–72px, số nổi, semantic color only ở icon+accent --- */
.ai-center-summary-grid {
  display: grid;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: var(--space-3);              /* gap nhỏ hơn để 5 card cùng hàng */
  margin-bottom: var(--space-4);
}
.ai-center-summary-card {
  grid-template-columns: 36px 1fr;  /* icon nhỏ hơn */
  gap: var(--space-3);
  padding: var(--space-3) var(--space-4);
  min-height: 64px;                 /* target 60–72 */
  border-left: 3px solid transparent;
  transition: border-color .12s ease;
}
.ai-center-summary-card.total   { border-left-color: var(--brand-primary); }
.ai-center-summary-card.active  { border-left-color: var(--status-success); }
.ai-center-summary-card.warn    { border-left-color: var(--status-warning); }
.ai-center-summary-card.error   { border-left-color: var(--status-danger); }
.ai-center-summary-card.paused  { border-left-color: var(--text-disabled); }
.ai-center-summary-icon {
  width: 36px; height: 36px; font-size: 16px;
}
.ai-center-summary-label {
  font-size: 12.5px;
  color: var(--text-secondary);
  font-weight: var(--weight-semibold);
  text-transform: none;
  letter-spacing: 0;
  line-height: 1.2;
}
.ai-center-summary-value {
  font-size: 22px;                  /* Owner §5: 20–24px */
  font-weight: var(--weight-bold);
  color: var(--text-primary);
  line-height: 1.15;
  margin-top: 2px;
}
.ai-center-summary-note {
  /* §5: tối đa 1 dòng phụ ngắn NẾU thật sự hữu ích. Ẩn note dài technical. */
  display: none;
}
.ai-center-summary-note.show {
  display: block;
  font-size: var(--font-help);
  color: var(--text-muted);
  margin-top: 2px;
  line-height: 1.2;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* --- MAIN GRID density (§7, §8) — card header baseline aligned, empty compact --- */
.ai-center-3col { gap: var(--space-3); margin-bottom: var(--space-3); }
.ai-center-3col > .panel { padding: var(--card-pad-sm); gap: var(--space-2); }
.ai-center-3col > .panel .panel-title { font-size: var(--font-card-title); line-height: 1.3; }
.ai-center-lists { gap: var(--space-3); margin-bottom: var(--space-4); }
.ai-center-lists > .panel { padding: var(--card-pad-sm); gap: var(--space-2); }
.ai-center-lists > .panel .panel-title { font-size: var(--font-card-title); line-height: 1.3; }
.ai-center-list-item { padding: var(--space-2) 0; grid-template-columns: 28px 1fr auto; gap: var(--space-2); }
.ai-center-list-icon { width: 28px; height: 28px; font-size: 14px; }
.ai-center-list-title { font-size: var(--font-body); }
.ai-center-list-note  { font-size: var(--font-help); line-height: 1.35; margin-top: 1px; }

/* Cost hero smaller */
.ai-center-cost-value { font-size: 24px; }
.ai-center-cost-sub { font-size: var(--font-help); line-height: 1.35; }
.ai-center-cost-bars { height: 60px; margin-top: var(--space-2); }
.ai-center-donut { width: 130px; height: 130px; margin: var(--space-1) auto var(--space-2); }
.ai-center-donut svg { width: 130px; height: 130px; }
.ai-center-donut-center .n { font-size: 22px; }
.ai-center-donut-center .l { font-size: var(--font-help); }
.ai-center-status-list { gap: var(--space-1); margin-top: var(--space-2); }
.ai-center-status-row { font-size: var(--font-help); }

/* --- BACKEND GAP presentation compact (§9) — icon + short title, 1 line, tooltip cho tech --- */
.ai-backend-gap {
  display: grid; grid-template-columns: 20px 1fr; align-items: center; gap: var(--space-2);
  padding: var(--space-2) var(--space-3);
  background: var(--bg-subtle);
  border: 1px solid var(--border-soft);
  border-radius: var(--radius-sm);
  font-size: var(--font-help);
  color: var(--text-secondary);
  line-height: 1.35;
}
.ai-backend-gap-icon { color: var(--text-muted); font-size: 14px; text-align: center; }
.ai-backend-gap b { color: var(--text-primary); font-weight: var(--weight-semibold); }

/* Empty state compact — CHỈ 1 dòng cho AI Center; không tạo khối trắng lớn (§8, §9) */
.ai-admin .ai-empty-state {
  display: block;
  padding: var(--space-2) var(--space-3);
  font-size: var(--font-help);
  border-radius: var(--radius-sm);
}
.ai-admin .ai-hint {
  font-size: var(--font-help);
  line-height: 1.4;
  color: var(--text-secondary);
  margin-top: var(--space-1);
}

/* --- MINI SYSTEM CHAT polish (§10) — compact, không thành block khổng lồ --- */
.ai-center-mini-chat { padding: var(--space-3) var(--card-pad); gap: var(--space-2); }
.ai-center-mini-chat-head { gap: var(--space-2); }
.ai-center-mini-chat-head h3 { font-size: var(--font-card-title); }
.ai-center-mini-chat-note { font-size: var(--font-help); line-height: 1.4; }
.ai-center-mini-chat-prompt { padding: 4px var(--space-3); font-size: var(--font-help); }
.ai-center-mini-chat-input textarea { min-height: 40px; font-size: 14px; }
.ai-center-mini-chat-gap {
  padding: var(--space-2) var(--space-3);
  background: var(--bg-subtle);
  border: 1px solid var(--border-soft);
  color: var(--text-secondary);
  border-radius: var(--radius-sm);
  font-size: var(--font-help);
}

/* --- AGENT & ĐIỀU KHIỂN shared polish (§14–20) — 0 layout change, chỉ visual --- */
.ai-agents-shell { gap: var(--space-3); }
.ai-agents-col { min-height: 480px; border-radius: var(--radius-md); }
.ai-agents-col-head { padding: var(--space-3) var(--space-4); }
.ai-agents-col-head h3 { font-size: var(--font-card-title); }
.ai-agents-list-item { padding: var(--space-2) var(--space-3); grid-template-columns: 36px 1fr auto; gap: var(--space-2); }
.ai-agents-list-icon { width: 36px; height: 36px; font-size: 16px; }
.ai-agents-list-name { font-size: var(--font-body); font-weight: var(--weight-semibold); }
.ai-agents-list-meta { font-size: var(--font-help); margin-top: 1px; }
.ai-agents-list-count { font-size: var(--font-help); }

/* Agent detail — cùng visual language */
.ai-agents-detail-head { padding: var(--space-3) var(--space-4); grid-template-columns: 44px 1fr auto; gap: var(--space-3); }
.ai-agents-detail-icon { width: 44px; height: 44px; font-size: 20px; border-radius: var(--radius-sm); }
.ai-agents-detail-title { font-size: 15px; }
.ai-agents-detail-sub { font-size: var(--font-help); }
.ai-agents-detail-tabs { padding: 0 var(--space-4); }
.ai-agents-detail-tab { padding: var(--space-2) var(--space-3); font-size: 13px; }
.ai-agents-detail-panel { padding: var(--space-3) var(--space-4); }
.ai-agents-detail-panel h4 { font-size: var(--font-card-title); margin: var(--space-3) 0 var(--space-1); }
.ai-agents-metric { padding: var(--space-3); }
.ai-agents-metric .l { font-size: 11.5px; }
.ai-agents-metric .v { font-size: 18px; }
.ai-agents-kv { font-size: 13px; grid-template-columns: 160px 1fr; gap: 4px var(--space-3); }
.ai-agents-kv dt { font-size: var(--font-help); }
.ai-agents-kv dd { font-size: 13px; }

/* Agent chat — sync visual với AI Center chat */
.ai-agents-chat-head { padding: var(--space-3) var(--space-4); }
.ai-agents-chat-title { font-size: var(--font-card-title); }
.ai-agents-chat-sub { font-size: var(--font-help); }
.ai-agents-chat-body { padding: var(--space-3) var(--space-4); gap: var(--space-2); }
.ai-agents-chat-msg { font-size: 13px; line-height: 1.4; }
.ai-agents-chat-footer { padding: var(--space-3) var(--space-4); }
.ai-agents-chat-input textarea { font-size: 14px; min-height: 40px; }
.ai-agents-chat-gap {
  background: var(--bg-subtle);
  border-color: var(--border-soft);
  color: var(--text-secondary);
  font-size: var(--font-help);
}

/* Badge unification: BACKEND_GAP không dùng warning gắt — dùng neutral. */
.tag-gap {
  background: var(--bg-subtle); color: var(--text-secondary);
  border: 1px solid var(--border-soft);
  font-weight: var(--weight-medium);
}

/* Header status/timestamp chip (right side of ai-admin header) */
.ai-header-slot {
  display: flex; align-items: center; gap: var(--space-2);
  font-size: var(--font-help); color: var(--text-secondary);
}
.ai-header-status {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 4px var(--space-3);
  border-radius: 999px;
  background: var(--status-success-soft); color: var(--status-success);
  font-weight: var(--weight-semibold); font-size: 12px;
}
.ai-header-status .dot { width: 6px; height: 6px; border-radius: 50%; background: var(--status-success); }
.ai-header-status.warn { background: var(--status-warning-soft); color: var(--status-warning); }
.ai-header-status.warn .dot { background: var(--status-warning); }

/* --- Responsive polish --- */
@media (max-width: 1024px) {
  .ai-center-summary-grid { grid-template-columns: repeat(5, minmax(0,1fr)); }
}
@media (max-width: 900px) {
  .ai-center-summary-grid { grid-template-columns: repeat(3, minmax(0,1fr)); }
  .ai-center-summary-card.paused { display: none; }
  .ai-admin .page-header { flex-wrap: wrap; }
  .ai-header-slot { order: 3; width: 100%; margin-top: var(--space-2); }
}
@media (max-width: 640px) {
  .ai-center-summary-grid { grid-template-columns: repeat(2, minmax(0,1fr)); }
  .ai-center-summary-card.paused { display: grid; }
  .ai-admin .page-header h1 { font-size: 17px !important; }
  .ai-center-cost-value { font-size: 20px; }
}
@media (max-width: 420px) {
  .ai-center-summary-grid { grid-template-columns: 1fr; }
}

/* ===== WEBAPP-AI-CENTER-PROVIDER-PERFORMANCE-UI-V1-03 =====
   Provider Performance là khối chính; 3-layer surface; pastel KPI; activity table;
   mini system chat 2-col với ops cards. Reuse token, KHÔNG thêm token mới. */

/* --- 3-layer surface (§25) --- */
.ai-admin { background: var(--bg-app); }
.ai-admin .ai-center-shell { display: flex; flex-direction: column; gap: var(--space-4); }
.ai-admin .panel { background: var(--bg-surface); border: 1px solid var(--border-soft); border-radius: var(--radius-md); box-shadow: 0 1px 2px rgba(15,23,42,.04); }
.ai-muted { color: var(--text-muted); font-style: normal; }
.ai-panel-icon {
  display: inline-flex; width: 26px; height: 26px; border-radius: var(--radius-sm);
  background: var(--brand-primary-soft); color: var(--brand-primary);
  align-items: center; justify-content: center; font-size: 14px; margin-right: 6px; vertical-align: -6px;
}

/* --- KPI STRIP pastel (§6) --- */
.ai-center-summary-grid { grid-template-columns: repeat(5, minmax(0,1fr)); gap: var(--space-3); margin-bottom: 0; }
.ai-center-summary-card {
  grid-template-columns: 44px 1fr;
  padding: var(--space-3) var(--space-4);
  border-radius: var(--radius-md);
  border: 1px solid var(--border-soft);
  border-left: 4px solid transparent;
  min-height: 84px;
  box-shadow: 0 1px 2px rgba(15,23,42,.04);
}
.ai-center-summary-card .ai-center-summary-icon {
  width: 40px; height: 40px; font-size: 18px;
  border-radius: var(--radius-sm);
  background: rgba(255,255,255,.6);
}
.ai-center-summary-card.kpi-total  { background: linear-gradient(180deg, #eff6ff, #ffffff); border-left-color: #3b82f6; }
.ai-center-summary-card.kpi-total  .ai-center-summary-icon { background: #dbeafe; color: #1d4ed8; }
.ai-center-summary-card.kpi-active { background: linear-gradient(180deg, #ecfdf5, #ffffff); border-left-color: #10b981; }
.ai-center-summary-card.kpi-active .ai-center-summary-icon { background: #d1fae5; color: #047857; }
.ai-center-summary-card.kpi-warn   { background: linear-gradient(180deg, #fef7e8, #ffffff); border-left-color: #f59e0b; }
.ai-center-summary-card.kpi-warn   .ai-center-summary-icon { background: #fef3c7; color: #b45309; }
.ai-center-summary-card.kpi-error  { background: linear-gradient(180deg, #fef2f2, #ffffff); border-left-color: #ef4444; }
.ai-center-summary-card.kpi-error  .ai-center-summary-icon { background: #fee2e2; color: #b91c1c; }
.ai-center-summary-card.kpi-paused { background: linear-gradient(180deg, #f1f5f9, #ffffff); border-left-color: #94a3b8; }
.ai-center-summary-card.kpi-paused .ai-center-summary-icon { background: #e2e8f0; color: #475569; }
.ai-center-summary-card .ai-center-summary-label { font-size: 12.5px; color: var(--text-secondary); font-weight: 600; }
.ai-center-summary-card .ai-center-summary-value { font-size: 24px; font-weight: 700; color: var(--text-primary); line-height: 1.15; margin-top: 2px; }
.ai-center-summary-card .ai-center-summary-note.show { font-size: 11.5px; color: var(--text-muted); font-style: normal; margin-top: 3px; white-space: normal; text-overflow: initial; overflow: visible; }

/* --- PROVIDER TABLE (khối chính) --- */
/* V1-04 · Provider panel gọn hơn (§11–14). Header 1 hàng compact, table 7 cột,
   row height 44–50px, chi tiết chuyển sang expandable detail row. */
.ai-prov-panel { padding: var(--space-3) var(--card-pad); gap: var(--space-2); }
.ai-prov-head {
  display: flex; justify-content: space-between; align-items: center; gap: var(--space-3);
  flex-wrap: wrap; padding-bottom: var(--space-2);
  border-bottom: 1px solid var(--border-soft);
}
.ai-prov-head > div:first-child { display: flex; align-items: baseline; gap: var(--space-3); flex-wrap: wrap; }
.ai-prov-head .ai-hint { font-size: 12.5px; }
.ai-prov-table th, .ai-prov-table td { padding: 12px 12px; font-size: 13px; vertical-align: middle; }
.ai-prov-table thead th { background: transparent; font-weight: 600; color: var(--text-secondary); font-size: 12.5px; text-transform: none; letter-spacing: 0; border-bottom: 1px solid var(--border-soft); }
.ai-prov-table tbody tr { transition: background .1s; }
.ai-prov-row { cursor: pointer; }
.ai-prov-row:hover { background: var(--bg-surface-soft); }
.ai-prov-row:focus-visible { outline: none; background: var(--brand-primary-soft); }
.ai-prov-row.is-open { background: var(--brand-primary-soft); }
.ai-prov-row.is-open + .ai-prov-detail-row { background: var(--bg-surface-soft); }
.ai-prov-row + tr { border-top: 0; }
.ai-prov-name { display: inline-flex; align-items: center; gap: 10px; font-weight: 600; color: var(--text-primary); }
.ai-prov-icon {
  display: inline-flex; width: 32px; height: 32px;
  align-items: center; justify-content: center;
  background: var(--bg-subtle); border-radius: var(--radius-sm);
  font-size: 12px; font-weight: 700; color: var(--text-secondary);
  flex-shrink: 0;
}
.ai-prov-icon.prov-openai   { background: #dcfce7; color: #059669; }
.ai-prov-icon.prov-deepseek { background: #dbeafe; color: #2563eb; }
.ai-prov-icon.prov-anthropic{ background: #fef3c7; color: #b45309; }
.ai-prov-icon.prov-gemini   { background: #f5f3ff; color: #7c3aed; }
.ai-prov-name-primary { font-size: 13.5px; font-weight: 600; color: var(--text-primary); line-height: 1.15; }
.ai-prov-name-secondary { font-size: 12px; color: var(--text-muted); line-height: 1.2; margin-top: 1px; }

/* Success cell với mini bar + số */
.ai-prov-succ-cell { display: flex; flex-direction: column; align-items: flex-end; gap: 4px; min-width: 74px; }
.ai-prov-succ-pct { font-weight: 700; font-size: 13.5px; font-variant-numeric: tabular-nums; }
.ai-prov-succ-pct.tag-color-ok     { color: var(--status-success); }
.ai-prov-succ-pct.tag-color-warn   { color: var(--status-warning); }
.ai-prov-succ-pct.tag-color-danger { color: var(--status-danger); }
.ai-prov-succ-pct.tag-color-muted  { color: var(--text-muted); }
.ai-prov-succ-bar { width: 60px; height: 4px; background: var(--bg-subtle); border-radius: 999px; overflow: hidden; }
.ai-prov-succ-bar-fill { height: 100%; border-radius: 999px; }
.ai-prov-succ-bar-fill.fill-ok     { background: var(--status-success); }
.ai-prov-succ-bar-fill.fill-warn   { background: var(--status-warning); }
.ai-prov-succ-bar-fill.fill-danger { background: var(--status-danger); }
.ai-prov-succ-bar-fill.fill-muted  { background: var(--text-disabled); }

/* Cost prominent (§9) */
.ai-prov-cost { font-weight: 700; font-size: 13.5px; color: var(--text-primary); font-variant-numeric: tabular-nums; }

/* Usage cell — bar + % inline right-aligned */
.ai-prov-usage-cell { display: flex; align-items: center; gap: 8px; min-width: 130px; }
.ai-prov-usage-bar { flex: 1; max-width: 90px; height: 6px; background: var(--bg-subtle); border-radius: 999px; overflow: hidden; }
.ai-prov-usage-bar > div { height: 100%; background: linear-gradient(90deg, #3b82f6, #6366f1); border-radius: 999px; }
.ai-prov-usage-pct { font-size: 12.5px; font-weight: 600; color: var(--text-secondary); font-variant-numeric: tabular-nums; min-width: 42px; text-align: right; }

/* Expandable detail row */
.ai-prov-detail { padding: var(--space-2) 0 var(--space-3); }
.ai-prov-detail-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-2) var(--space-4); padding: var(--space-2) var(--space-3); background: var(--bg-surface); border: 1px solid var(--border-soft); border-radius: var(--radius-sm); }
.ai-prov-detail-item { display: flex; flex-direction: column; gap: 2px; }
.ai-prov-detail-label { font-size: 12px; color: var(--text-muted); font-weight: 500; }
.ai-prov-detail-value { font-size: 13.5px; color: var(--text-primary); font-weight: 600; }
.ai-prov-detail-foot { margin-top: var(--space-2); }
@media (max-width: 900px) {
  .ai-prov-detail-grid { grid-template-columns: repeat(2, minmax(0,1fr)); }
}
@media (max-width: 640px) {
  .ai-prov-detail-grid { grid-template-columns: 1fr; }
}

.tag-danger { background: var(--status-danger-soft); color: var(--status-danger); }

/* --- OPS 2-col grid (Vận hành + Mini chat) --- */
.ai-center-ops-grid { display: grid; grid-template-columns: 1.5fr 1fr; gap: var(--space-3); }
.ai-center-ops-grid > .panel { padding: var(--card-pad); }
.ai-ops-cards { display: grid; grid-template-columns: repeat(4, 1fr); gap: var(--space-2); margin-top: var(--space-2); }
.ai-ops-card {
  display: grid; grid-template-columns: 36px 1fr; align-items: center; gap: var(--space-2);
  padding: var(--space-3);
  border-radius: var(--radius-sm);
  background: var(--bg-surface-soft);
  border: 1px solid var(--border-soft);
}
.ai-ops-card.kpi-active { background: linear-gradient(180deg, #ecfdf5, var(--bg-surface)); border-color: #a7f3d0; }
.ai-ops-card.kpi-info   { background: linear-gradient(180deg, #eff6ff, var(--bg-surface)); border-color: #bfdbfe; }
.ai-ops-card.kpi-warn   { background: linear-gradient(180deg, #fef7e8, var(--bg-surface)); border-color: #fde68a; }
.ai-ops-card-icon { width: 36px; height: 36px; border-radius: var(--radius-sm); background: rgba(255,255,255,.65); display: grid; place-items: center; font-size: 16px; color: var(--text-secondary); }
.ai-ops-card.kpi-active .ai-ops-card-icon { color: #059669; }
.ai-ops-card.kpi-info   .ai-ops-card-icon { color: #0369a1; }
.ai-ops-card.kpi-warn   .ai-ops-card-icon { color: #b45309; }
.ai-ops-card-label { font-size: 12px; color: var(--text-secondary); font-weight: 600; }
.ai-ops-card-value { font-size: 20px; font-weight: 700; color: var(--text-primary); line-height: 1.1; margin-top: 2px; }
.ai-ops-card-note  { font-size: 11px; color: var(--text-muted); margin-top: 2px; }

/* --- Mini chat V1-03 panel (soft violet accent) --- */
.ai-mini-panel {
  background: linear-gradient(180deg, #f5f3ff, var(--bg-surface));
  border-color: #ddd6fe;
  padding: var(--card-pad);
  display: flex; flex-direction: column; gap: var(--space-2);
}
.ai-mini-head { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--space-2); }
.ai-mini-panel .ai-panel-icon { background: #ede9fe; color: #6d28d9; }
.ai-mini-panel .ai-center-mini-chat-prompt { background: var(--bg-surface); border-color: var(--border-soft); }

/* --- Recent Activity grid --- */
.ai-center-activity-grid { display: grid; grid-template-columns: 2fr 1fr; gap: var(--space-3); }
.ai-center-activity-grid > .panel { padding: var(--card-pad); }
.ai-activity-head { display: flex; justify-content: space-between; align-items: center; gap: var(--space-2); flex-wrap: wrap; margin-bottom: var(--space-2); }
.ai-filter-chips { display: flex; gap: 6px; flex-wrap: wrap; }
.ai-chip { padding: 4px 10px; border: 1px solid var(--border-soft); background: var(--bg-surface); border-radius: 999px; font-size: 12px; color: var(--text-secondary); cursor: pointer; }
.ai-chip:hover { background: var(--bg-surface-soft); color: var(--text-primary); }
.ai-chip.active { background: var(--brand-primary); color: var(--text-inverse); border-color: var(--brand-primary); }
.ai-activity-table th, .ai-activity-table td { padding: 8px 12px; font-size: 12.5px; vertical-align: middle; }
.ai-activity-table thead th { background: var(--bg-surface-soft); color: var(--text-secondary); font-weight: 600; text-transform: none; letter-spacing: 0; font-size: 12px; }

/* --- Tips panel --- */
.ai-tips-panel {
  background: linear-gradient(180deg, #fef3c7, var(--bg-surface));
  border-color: #fde68a;
}
.ai-tips-panel .ai-panel-icon { background: #fef3c7; color: #b45309; }

/* --- Header slot polish for V1-03 --- */
.ai-header-slot { align-items: center; }
.ai-header-slot .btn-sm { padding: 5px 12px; font-size: 12.5px; }

/* --- Responsive V1-03 (override cả V1-02 để cascade đúng) --- */
@media (max-width: 1180px) {
  .ai-center-ops-grid { grid-template-columns: 1fr; }
  .ai-ops-cards { grid-template-columns: repeat(4, 1fr); }
}
@media (max-width: 900px) {
  .ai-center-summary-grid { grid-template-columns: repeat(3, minmax(0,1fr)); }
  .ai-center-summary-card.kpi-paused { display: none; }
  .ai-center-activity-grid { grid-template-columns: 1fr; }
  .ai-ops-cards { grid-template-columns: repeat(2, 1fr); }
  .ai-prov-table th:nth-child(7), .ai-prov-table td:nth-child(7) { display: none; }
}
@media (max-width: 640px) {
  .ai-center-summary-grid { grid-template-columns: repeat(2, minmax(0,1fr)); }
  .ai-center-summary-card.kpi-paused { display: grid; }
  .ai-ops-cards { grid-template-columns: 1fr; }
  .ai-prov-table th, .ai-prov-table td { padding: 10px 8px; font-size: 12.5px; }
  /* V1-04 @640: giữ nguyên 7 cột chính; ẩn cột "Phản hồi TB" (5) nếu quá chật */
  .ai-prov-table th:nth-child(5), .ai-prov-table td:nth-child(5) { display: none; }
  /* Cột 7 "Tỷ trọng" chuyển thành bar-only, ẩn số % để tiết kiệm chỗ */
  .ai-prov-usage-pct { display: none; }
}
@media (max-width: 420px) {
  .ai-center-summary-grid { grid-template-columns: 1fr; }
}

/* ===== WEBAPP05-GLOBAL-AI-ASSISTANT-SHELL-PRODUCT-PILOT-V1-01 =====
   Shared assistant shell (drawer trên desktop, bottom sheet trên mobile).
   Kích thước / màu / bo góc / khoảng cách đọc token canonical; nút "✨ Trợ lý AI"
   ở toolbar module CỐ Ý không dùng class .tab (đây KHÔNG phải tab nghiệp vụ). */

/* Nút Trợ lý AI trong toolbar Product (canonical, dùng lại được cho module khác). */
.pm-tab-assistant {
  margin-left: auto;              /* đẩy nút về cuối hàng tabs */
  align-self: center;
  /* SCA-B · SCA-06 — nhãn nút KHÔNG được xuống dòng và nút KHÔNG được co.
     Thiếu hai dòng này, hàng tab chật làm chữ "Trợ lý AI" gãy hai dòng: đo được nút
     cao 41px ở 1366 và 55px ở 1024 (một dòng là 28px), kéo cao cả hàng tab. */
  flex: 0 0 auto;
  white-space: nowrap;
  display: inline-flex; align-items: center; gap: var(--space-1);
  padding: 6px var(--space-3);
  border: 1px solid var(--border-strong);
  background: var(--bg-surface);
  color: var(--text-primary);
  border-radius: 999px;
  font-size: var(--font-button);
  font-weight: var(--weight-semibold);
  cursor: pointer;
  transition: border-color .12s ease, background .12s ease, color .12s ease;
  line-height: 1;
}
.pm-tab-assistant:hover { border-color: var(--brand-primary); background: var(--brand-primary-soft); color: var(--brand-primary); }
.pm-tab-assistant[aria-expanded="true"] { border-color: var(--brand-primary); background: var(--brand-primary); color: var(--text-inverse); }
.pm-tab-assistant:focus-visible { outline: none; box-shadow: 0 0 0 2px rgba(59,130,246,.35); }
.pm-tab-assistant .pm-tab-assistant-badge {
  min-width: 18px; height: 18px; padding: 0 5px; border-radius: 999px;
  background: var(--status-warning); color: var(--text-inverse);
  font-size: 11px; font-weight: var(--weight-bold);
  display: inline-flex; align-items: center; justify-content: center;
  margin-left: var(--space-1);
}
.pm-tab-assistant .pm-tab-assistant-badge[hidden] { display: none; }

/* Shared shell: default HIDDEN via [hidden]; on desktop trở thành drawer bên phải,
   trên mobile thành bottom sheet. Vị trí `position: fixed` cấp app-shell — nổi trên
   mọi màn hình, mọi module. */
.ai-assistant {
  position: fixed; top: 0; right: 0; bottom: 0;
  width: min(440px, 100vw);
  background: var(--bg-surface);
  border-left: 1px solid var(--border-soft);
  box-shadow: var(--shadow-floating);
  display: flex; flex-direction: column;
  /* CONTINUATION-01: z-index canonical stack (§D2 rule 5 + tokens). Trước đây 1000
     làm assistant che modal `.modal-root` (z=100) — sai. Nay 87 = trên CSKH sheet
     (85), CSKH backdrop (84), CSKH floating button (80), nhưng DƯỚI sidebar drawer
     backdrop (90), sidebar drawer (95) và modal (100). Modal luôn thắng. */
  z-index: 87;
  transform: translateX(0);
  transition: transform .18s ease;
}
.ai-assistant[hidden] { display: none; }
.ai-assistant-header {
  display: flex; align-items: flex-start; gap: var(--space-3);
  padding: var(--card-pad) var(--card-pad) var(--space-3);
  border-bottom: 1px solid var(--border-soft);
}
.ai-assistant-title-wrap { flex: 1; min-width: 0; }
.ai-assistant-header h2 {
  margin: 0; font-size: var(--font-section-title); font-weight: var(--weight-bold);
  color: var(--text-primary);
}
.ai-assistant-context {
  margin: var(--space-1) 0 0; font-size: var(--font-meta); color: var(--text-secondary);
  line-height: var(--line-normal); word-break: break-word;
}
.ai-assistant-context b { color: var(--text-primary); }
.ai-assistant-close {
  border: 0; background: transparent; cursor: pointer;
  font-size: 22px; line-height: 1; color: var(--text-secondary);
  padding: var(--space-1) var(--space-2); border-radius: var(--radius-sm);
}
.ai-assistant-close:hover { background: var(--bg-surface-soft); color: var(--text-primary); }
.ai-assistant-close:focus-visible { outline: none; box-shadow: 0 0 0 2px rgba(59,130,246,.35); }
.ai-assistant-body {
  flex: 1 1 auto; overflow-y: auto;
  padding: var(--card-pad);
  display: flex; flex-direction: column; gap: var(--space-3);
  font-size: var(--font-body); color: var(--text-primary);
  background: var(--bg-surface-soft);
}
.ai-assistant-msg {
  padding: var(--space-2) var(--space-3); border-radius: var(--radius-md);
  max-width: 92%; word-break: break-word; line-height: var(--line-normal);
  border: 1px solid var(--border-soft); background: var(--bg-surface);
}
.ai-assistant-msg.user { align-self: flex-end; background: var(--brand-primary-soft); border-color: var(--brand-primary); }
.ai-assistant-msg.assistant { align-self: flex-start; background: var(--bg-surface); }
.ai-assistant-msg.system {
  align-self: stretch; background: var(--status-warning-soft);
  border-color: var(--status-warning); color: var(--text-primary);
  font-size: var(--font-help);
}
.ai-assistant-msg .ai-assistant-msg-meta {
  font-size: var(--font-help); color: var(--text-muted); margin-top: var(--space-1);
}
.ai-assistant-footer {
  padding: var(--space-3) var(--card-pad);
  border-top: 1px solid var(--border-soft); background: var(--bg-surface);
}
.ai-assistant-form { display: flex; gap: var(--space-2); align-items: flex-end; }
#ai-assistant-input {
  flex: 1; min-width: 0;
  font: inherit; font-size: 16px;  /* B1: >=16px trên iOS để không zoom khi focus */
  padding: var(--space-2) var(--space-3);
  border: 1px solid var(--border-strong); border-radius: var(--radius-sm);
  background: var(--bg-surface); color: var(--text-primary);
  resize: vertical; min-height: 44px; max-height: 40vh;
}
#ai-assistant-input:focus-visible { outline: none; border-color: var(--border-focus); box-shadow: 0 0 0 2px rgba(59,130,246,.25); }
.ai-assistant-send { min-height: 44px; }
.ai-assistant-footer-note {
  margin: var(--space-2) 0 0; font-size: var(--font-help); color: var(--text-muted);
  line-height: var(--line-normal);
}
.ai-assistant-footer-note.gap { color: var(--status-warning); }

/* Backdrop chỉ dùng trên mobile bottom sheet. */
.ai-assistant-backdrop {
  position: fixed; inset: 0; background: rgba(15, 23, 42, .35);
  /* CONTINUATION-01: 86 nằm trên CSKH sheet-backdrop (84) và CSKH sheet (85),
     dưới assistant panel (87). Modal (100) và sidebar drawer (90/95) vẫn thắng. */
  z-index: 86;
}
.ai-assistant-backdrop[hidden] { display: none; }

/* Mobile bottom sheet: chuyển drawer bên phải thành sheet đáy. */
@media (max-width: 640px) {
  .ai-assistant {
    top: auto; right: 0; left: 0; bottom: 0;
    width: 100vw; max-height: 82vh;
    border-left: 0; border-top: 1px solid var(--border-soft);
    border-radius: var(--radius-lg) var(--radius-lg) 0 0;
  }
  .pm-tab-assistant { padding: 6px var(--space-2); }
  .pm-tab-assistant .pm-tab-assistant-label-full { display: none; }
  /* Đảm bảo input không kéo header trôi khi bàn phím ảo hiện. */
  .ai-assistant-body { padding: var(--space-3); }
}

/* Screen-reader-only helper (không có sẵn trong stylesheet chung). */
.visually-hidden {
  position: absolute !important; width: 1px; height: 1px; padding: 0; margin: -1px;
  overflow: hidden; clip: rect(0,0,0,0); white-space: nowrap; border: 0;
}

/* ===== CC-28: Notifications ===== */
.notif-panel .panel { margin-bottom:14px; }
.incident { padding:10px 12px; margin:8px 0; border-left:4px solid #ef4444; background:#fef2f2; border-radius:8px; }
.incident-P0 { border-left-color:#dc2626; background:#fef2f2; }
.incident-P1 { border-left-color:#ef4444; background:#fef2f2; }
.incident-P2 { border-left-color:#f59e0b; background:#fffbeb; }
.incident-P3 { border-left-color:#0ea5e9; background:#eff6ff; }
/* VISUAL-HARMONIZATION-V1: 11px → var(--font-meta) 12.5px, đồng bộ B1. Consumer: AI Overview + Notifications, đều là business metadata. */
.incident-meta { font-size: var(--font-meta); color: var(--text-secondary); margin-top: var(--space-1); }

/* ==========================================================
   WEBAPP-SECURITY-HARDENING-01 — login gate + logout control
   Uses the existing canonical tokens; no redesign of app views.
   ========================================================== */
.login-overlay {
  position: fixed; inset: 0; z-index: 9999;
  display: flex; align-items: center; justify-content: center;
  background: linear-gradient(160deg, var(--sidebar-bg) 0%, var(--sidebar-bg-2) 100%);
}
.login-overlay[hidden] { display: none !important; }
.login-card {
  width: 380px; padding: 36px 34px 28px;
  background: var(--bg-surface); border-radius: 14px;
  box-shadow: 0 24px 60px rgba(2, 12, 32, .45);
  display: flex; flex-direction: column;
}
.login-logo { width: 132px; align-self: center; margin-bottom: 18px; }
.login-title {
  margin: 0 0 22px; text-align: center;
  font-size: 19px; font-weight: 600; color: var(--text-primary);
}
.login-label {
  font-size: 12.5px; font-weight: 600; color: var(--text-secondary);
  margin-bottom: 6px;
}
.login-input {
  height: 40px; padding: 0 12px; margin-bottom: 16px;
  border: 1px solid #cbd5e1; border-radius: 8px;
  font-size: 14px; color: var(--text-primary); background: var(--bg-surface);
  font-family: inherit;
}
.login-input:focus {
  outline: none; border-color: var(--sidebar-active-bar);
  box-shadow: 0 0 0 3px rgba(59, 130, 246, .18);
}
.login-btn {
  height: 42px; margin-top: 6px; border: 0; border-radius: 8px; cursor: pointer;
  background: var(--sidebar-active); color: var(--text-inverse);
  font-size: 14.5px; font-weight: 600; font-family: inherit;
}
.login-btn:hover:not(:disabled) { background: #1d4ed8; }
.login-btn:disabled { opacity: .6; cursor: progress; }
.login-msg {
  min-height: 20px; margin-top: 12px; text-align: center;
  font-size: 13px; color: #b91c1c;
}
.logout-btn {
  margin-left: auto; width: 28px; height: 28px; flex: 0 0 28px;
  border: 0; border-radius: 6px; cursor: pointer;
  background: transparent; color: var(--sidebar-fg-mute);
  font-size: 15px; line-height: 1;
}
.logout-btn:hover { background: rgba(255, 255, 255, .1); color: var(--text-inverse); }

/* ============================================================
   WEBAPP-CRM-BULK-IMPORT-01 — Nhập khách hàng cũ
   Chỉ dùng token canonical CC-33. Không sửa component có sẵn.
   ============================================================ */
.import-mode { display: flex; gap: 6px; background: var(--bg-subtle); padding: 4px; border-radius: var(--radius-md); }
.import-mode-opt {
  display: flex; align-items: center; gap: 6px; cursor: pointer;
  padding: 6px 12px; border-radius: var(--radius-sm);
  font-size: var(--text-sm); font-weight: var(--weight-semibold); color: var(--text-secondary);
}
.import-mode-opt:has(input:checked) { background: var(--bg-surface); color: var(--text-primary); box-shadow: 0 1px 2px rgba(15, 23, 42, .08); }

.import-banner {
  border: 1px solid var(--border-soft); border-left-width: 4px;
  border-radius: var(--radius-md); padding: 10px 14px; margin-bottom: 14px;
  font-size: var(--text-md); color: var(--text-secondary); background: var(--bg-surface);
}
.import-banner code { background: var(--bg-subtle); padding: 1px 5px; border-radius: 4px; font-size: var(--text-sm); }
.import-banner-test { border-left-color: var(--status-ai);     background: var(--status-ai-soft); color: var(--status-ai); }
.import-banner-prod { border-left-color: var(--status-warning); background: var(--status-warning-soft); color: var(--status-warning); }

.import-form { display: flex; flex-direction: column; gap: 16px; padding: 4px 2px 2px; }
.import-field { display: flex; flex-direction: column; gap: 6px; }
.import-field > label { font-size: var(--text-sm); font-weight: var(--weight-semibold); color: var(--text-secondary); }
.import-textarea {
  width: 100%; min-height: 170px; resize: vertical;
  border: 1px solid var(--border-default); border-radius: var(--radius-md); padding: 10px 12px;
  font-family: ui-monospace, "Cascadia Mono", Consolas, monospace; font-size: 13px; line-height: 1.55;
  color: var(--text-primary); background: var(--bg-surface-soft);
}
.import-textarea:focus, .import-input:focus { outline: none; border-color: var(--border-focus); box-shadow: 0 0 0 2px rgba(59, 130, 246, .25); }
.import-input {
  border: 1px solid var(--border-default); border-radius: var(--radius-md);
  padding: 8px 12px; font-size: var(--text-md); color: var(--text-primary); background: var(--bg-surface);
}
.import-input-sm { padding: 6px 10px; font-size: var(--text-sm); min-width: 220px; }
.import-hint { font-size: var(--text-sm); color: var(--text-muted); line-height: var(--line-normal); }
.import-actions { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; }
.import-confirm {
  display: flex; align-items: center; gap: 8px; font-size: var(--text-md); color: var(--text-primary);
  background: var(--status-warning-soft); border: 1px solid var(--status-warning);
  border-radius: var(--radius-md); padding: 10px 14px;
}

.import-table-wrap { max-height: 480px; overflow: auto; border-radius: var(--radius-md); }
.import-table-wrap .data thead th { position: sticky; top: 0; z-index: 1; background: var(--bg-surface-soft); }
.imp-reason { font-size: var(--text-sm); color: var(--text-secondary); max-width: 420px; }
.imp-warn { font-size: var(--text-sm); color: var(--status-warning); margin-top: 2px; }
.imp-row-INVALID           td { background: var(--status-danger-soft); }
.imp-row-DUPLICATE_IN_BATCH td { background: var(--status-warning-soft); }
.imp-row-IDENTITY_CONFLICT td { background: var(--status-ai-soft); }

.import-result { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; padding: 4px 2px 14px; }
.import-result > div {
  background: var(--bg-surface-soft); border: 1px solid var(--border-soft);
  border-radius: var(--radius-md); padding: 10px 14px; display: flex; flex-direction: column; gap: 4px;
}
.import-result span { font-size: var(--text-sm); color: var(--text-muted); }
.import-result b { font-size: var(--text-lg); color: var(--text-primary); }

.import-assign-bar { display: flex; gap: 14px; align-items: center; flex-wrap: wrap; padding: 0 2px 12px; font-size: var(--text-sm); color: var(--text-secondary); }
.import-assign-bar label { display: flex; align-items: center; gap: 6px; cursor: pointer; }
.import-assign-actions { display: flex; gap: 10px; align-items: center; flex-wrap: wrap; padding: 2px 2px 12px; }
.import-skip-list { margin: 0; padding: 0 0 10px 22px; font-size: var(--text-sm); color: var(--status-warning); }
.btn-link { border: 0; background: transparent; color: var(--text-link); font-weight: var(--weight-semibold); cursor: pointer; padding: 0; font-size: var(--text-md); }
.btn-link:hover { text-decoration: underline; }
.btn-sm { padding: 5px 10px; font-size: var(--text-sm); }

/* ================= KPI-UI-POLISH-01 · trang KPI =================
   ONE_WEBAPP_ONE_DESIGN_SYSTEM — dùng lại token :root, .panel, table.data, .tag,
   .btn*, .label-primary/.label-secondary. Thẻ chỉ số compact dùng CÙNG ngôn ngữ
   thị giác với .care-metric của Trung tâm chăm sóc: nhãn và số trên MỘT hàng,
   ngữ nghĩa thể hiện bằng viền trái + màu số. Không có style dùng một lần. */

.kpi-controls { display: flex; align-items: flex-end; gap: 10px; flex-wrap: wrap; }
.kpi-control { display: flex; flex-direction: column; gap: 4px; }
.kpi-control-label { font-size: var(--font-meta); font-weight: var(--weight-bold); color: var(--text-secondary); text-transform: uppercase; letter-spacing: .4px; }
.kpi-controls .form-input { min-width: 150px; }

.kpi-truthbar {
  background: var(--bg-surface); border: 1px solid var(--border-soft); border-left: 4px solid var(--status-ai);
  border-radius: var(--radius-md); padding: 10px 14px; box-shadow: var(--shadow-sm);
}
.kpi-truthbar:empty { display: none; }
.kpi-truthbar-inner { display: flex; align-items: center; gap: 10px; flex-wrap: wrap; }
.kpi-truth-text { font-size: var(--text-sm); color: var(--text-secondary); font-weight: var(--weight-medium); }
.kpi-truth-text code { font-size: var(--text-xs); }
.kpi-truthbar-inner .btn-link { margin-left: auto; white-space: nowrap; }

/* Thẻ chỉ số compact — nhãn + số CÙNG HÀNG (giống .care-metric). */
/* auto-fit: số cột theo bề rộng thực có, để nhãn tiếng Việt giữ được 1 hàng
   trên màn hình rộng thay vì bị bó thành 6 cột hẹp cố định. */
.kpic-row, .kpic-row-5 { display: grid; grid-template-columns: repeat(auto-fit, minmax(176px, 1fr)); gap: 10px; }
.kpic {
  background: var(--bg-surface); border: 1px solid var(--border-soft);
  border-left: 4px solid var(--border-soft); border-radius: var(--radius-md);
  padding: 10px 12px; box-shadow: var(--shadow-sm); min-width: 0;
}
.kpic-head { display: flex; align-items: baseline; justify-content: space-between; gap: 8px; min-width: 0; }
.kpic-label { font-size: var(--text-md); font-weight: var(--weight-bold); color: var(--text-primary); line-height: 1.25; min-width: 0; }
.kpic-value {
  font-size: 19px; font-weight: var(--weight-extrabold); color: var(--text-primary);
  line-height: 1.15; letter-spacing: -.3px; white-space: nowrap; flex: 0 0 auto; font-variant-numeric: tabular-nums;
}
.kpic-sub { font-size: var(--font-meta); color: var(--text-muted); font-weight: var(--weight-medium); margin-top: 3px; }
.kpic-delta { font-size: var(--font-meta); font-weight: var(--weight-bold); margin-top: 4px; }
.kpic-delta[data-dir="up"]   { color: var(--status-success); }
.kpic-delta[data-dir="down"] { color: var(--status-danger); }
.kpic-delta[data-dir="flat"] { color: var(--text-muted); }
.kpic-delta-pct { font-weight: var(--weight-medium); color: var(--text-muted); }
.kpic[data-kind="success"]   { border-left-color: var(--status-success); }
.kpic[data-kind="success"] .kpic-value { color: var(--status-success); }
.kpic[data-kind="info"]      { border-left-color: var(--status-info); }
.kpic[data-kind="attention"] { border-left-color: var(--status-warning); background: var(--status-warning-soft); }
.kpic[data-kind="attention"] .kpic-value { color: var(--status-warning); }

.kpi-panel-note { font-size: var(--font-meta); font-weight: var(--weight-medium); color: var(--text-muted); font-family: ui-monospace, SF Mono, Consolas, monospace; }

/* Trend — cột SVG, không thư viện ngoài. */
.kpi-trend { display: flex; flex-direction: column; gap: 6px; }
.kpi-trend-svg { width: 100%; height: 120px; display: block; }
.kpi-bar { fill: #bfdbfe; }
.kpi-bar-current { fill: var(--brand-primary); }
.kpi-bar-zero { fill: var(--border-strong); }
.kpi-trend-ticks { display: grid; gap: 2px; }
.kpi-trend-tick { text-align: center; min-width: 0; }
.kpi-trend-tick-label { font-size: var(--font-meta); font-weight: var(--weight-bold); color: var(--text-secondary); }
.kpi-trend-tick-value { font-size: var(--font-meta); color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* Funnel — đếm sự kiện canonical theo bước nghiệp vụ. */
.kpi-funnel { display: flex; flex-direction: column; gap: 6px; }
.kpi-funnel-head, .kpi-funnel-row { display: grid; grid-template-columns: minmax(120px, 1.4fr) 2fr 54px 54px; gap: 10px; align-items: center; }
.kpi-funnel-head { font-size: var(--font-table-head); font-weight: var(--weight-bold); color: var(--text-secondary); text-transform: uppercase; letter-spacing: .4px; }
.kpi-funnel-head span:nth-child(3), .kpi-funnel-head span:nth-child(4) { text-align: right; }
.kpi-funnel-row { padding: 4px 6px; border-radius: var(--radius-sm); }
.kpi-funnel-row-worst { background: var(--status-warning-soft); }
.kpi-funnel-name { font-size: var(--text-md); font-weight: var(--weight-semibold); color: var(--text-primary); min-width: 0; }
.kpi-funnel-code { display: block; font-size: var(--text-xs); color: var(--text-muted); font-family: ui-monospace, SF Mono, Consolas, monospace; }
.kpi-funnel-track { background: var(--bg-subtle); border-radius: 999px; height: 10px; overflow: hidden; }
.kpi-funnel-fill { background: var(--brand-primary); height: 100%; border-radius: 999px; }
.kpi-funnel-row-worst .kpi-funnel-fill { background: var(--status-warning); }
.kpi-funnel-n { text-align: right; font-weight: var(--weight-extrabold); font-size: var(--text-lg); color: var(--text-primary); font-variant-numeric: tabular-nums; }
.kpi-funnel-drop { text-align: right; font-size: var(--text-sm); font-weight: var(--weight-semibold); color: var(--text-muted); font-variant-numeric: tabular-nums; }

/* Ghi chú — cùng một mẫu cho mọi cảnh báo diễn giải KPI. */
.kpi-note { font-size: var(--text-sm); color: var(--text-secondary); line-height: var(--line-normal); padding: 8px 10px; border-radius: var(--radius-sm); background: var(--bg-surface-soft); }
.kpi-note b { color: var(--text-primary); }
.kpi-note-warn { background: var(--status-warning-soft); color: #7c4a03; }
.kpi-note-muted { background: transparent; color: var(--text-muted); padding-left: 0; padding-right: 0; font-size: var(--font-meta); }

table.data td.num, table.data th.num { text-align: right; font-variant-numeric: tabular-nums; }
table.data .kpi-col-sep { border-left: 2px solid var(--border-soft); }
.kpi-people thead th { vertical-align: bottom; }
.kpi-barcell { width: 120px; }
.kpi-minibar { height: 8px; border-radius: 999px; background: var(--brand-primary); }
.kpi-minibar-alt { background: var(--status-ai); }

.kpi-drillbar {
  display: flex; align-items: center; gap: 12px;
  background: var(--brand-primary-soft); border: 1px solid #bfdbfe;
  border-radius: var(--radius-md); padding: 8px 12px; font-size: var(--text-md); color: var(--text-secondary);
}

.kpi-blocked { padding: 22px 6px; text-align: center; }
.kpi-blocked h3 { margin: 0 0 8px; font-size: var(--text-xl); color: var(--text-primary); }
.kpi-blocked p { margin: 0 auto 8px; color: var(--text-secondary); max-width: 620px; font-size: var(--text-md); }

.kpi-ai-entry {
  display: flex; align-items: center; gap: 14px;
  background: var(--status-ai-soft); border: 1px solid #ddd6fe; border-radius: var(--radius-md); padding: 12px 14px;
}
.kpi-ai-entry-icon { font-size: 22px; line-height: 1; }
.kpi-ai-entry-body { flex: 1; min-width: 0; }
.kpi-ai-entry-title { font-size: var(--text-lg); font-weight: var(--weight-bold); color: var(--status-ai); display: flex; align-items: baseline; gap: 8px; flex-wrap: wrap; }
.kpi-ai-entry-body p { margin: 4px 0 0; font-size: var(--text-md); color: var(--text-secondary); line-height: var(--line-normal); }

.kpi-modal { max-width: 780px; }
.kpi-modal-body { gap: 12px; }
.kpi-modal-head { display: grid; grid-template-columns: repeat(4, minmax(0,1fr)); gap: 12px; }
.kpi-modal-strong { font-size: var(--text-lg); font-weight: var(--weight-bold); color: var(--text-primary); }
.kpi-explain { display: flex; flex-direction: column; gap: 0; border: 1px solid var(--border-soft); border-radius: var(--radius-md); overflow: hidden; }
.kpi-explain-row { display: grid; grid-template-columns: 220px 1fr; gap: 12px; padding: 9px 12px; font-size: var(--text-md); border-bottom: 1px solid var(--bg-subtle); }
.kpi-explain-row:last-child { border-bottom: 0; }
.kpi-explain-row > span:first-child { color: var(--text-secondary); font-weight: var(--weight-semibold); }
.kpi-explain-row code { font-size: var(--text-xs); word-break: break-all; }

@media (max-width: 1180px) {
  .kpi-modal-head { grid-template-columns: repeat(2, minmax(0,1fr)); }
  .kpi-explain-row { grid-template-columns: 1fr; gap: 2px; }
}
@media (max-width: 720px) {
  .kpi-funnel-head, .kpi-funnel-row { grid-template-columns: minmax(90px, 1.2fr) 1fr 46px 44px; }
}

/* ==========================================================
   KPI-AI-WEBAPP-CONNECTION-01 — Hồ sơ KPI + AI Phân tích KPI
   Dùng lại đúng token của Design System hiện có; không thêm bảng màu mới.
   ========================================================== */

.kpi-ai-entry-actions { display: flex; gap: 8px; flex-shrink: 0; align-items: center; }
.kpi-ai-entry-actions .btn[disabled] { opacity: .5; cursor: not-allowed; }
.tag-muted { background: var(--bg-subtle); color: var(--text-muted); }

.kpi-case-table tbody tr.row-clickable { cursor: pointer; }
.kpi-case-table tbody tr.row-clickable:hover { background: var(--bg-subtle); }

/* --- một hồ sơ: đầu trang + chuỗi hội thoại dùng chung --- */
.kpi-case-head h3 { margin: 0 0 6px; font-size: var(--text-xl); color: var(--text-primary); }
.kpi-case-meta { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }

.kpi-case-decision {
  border-left: 3px solid var(--status-success); background: var(--status-success-soft);
  border-radius: var(--radius-md); padding: 10px 12px; font-size: var(--text-md); color: var(--text-primary);
}
.kpi-case-decision div { margin-top: 4px; color: var(--text-secondary); }

.kpi-case-thread {
  display: flex; flex-direction: column; gap: 10px;
  max-height: 46vh; overflow-y: auto; padding-right: 4px;
}
.kpi-msg { border: 1px solid var(--border-soft); border-left-width: 3px; border-radius: var(--radius-md); padding: 9px 12px; background: var(--bg-surface); }
.kpi-msg-head { display: flex; justify-content: space-between; gap: 10px; align-items: baseline; font-size: var(--text-md); }
.kpi-msg-body { margin-top: 5px; font-size: var(--text-md); color: var(--text-secondary); line-height: var(--line-normal); white-space: normal; }
/* Viền trái theo ngữ nghĩa người gửi — cùng quy ước với .care-* và data-kind. */
.kpi-msg-employee { border-left-color: var(--status-info); }
.kpi-msg-ai       { border-left-color: var(--status-ai); background: var(--status-ai-soft); }
.kpi-msg-director { border-left-color: var(--status-success); }
.kpi-msg-system   { border-left-color: var(--border-strong); background: var(--bg-subtle); }

.kpi-case-form { display: flex; flex-direction: column; gap: 10px; }
.kpi-case-form .field { display: flex; flex-direction: column; gap: 5px; }
.kpi-case-form .field > span { font-size: var(--text-md); font-weight: var(--weight-semibold); color: var(--text-secondary); }
.kpi-case-form input, .kpi-case-form select, .kpi-case-form textarea {
  padding: 9px 12px; border: 1px solid var(--border-strong); border-radius: var(--radius-md);
  font: inherit; font-size: var(--text-md); background: var(--bg-surface); color: var(--text-primary);
}
.kpi-case-form input:focus, .kpi-case-form select:focus, .kpi-case-form textarea:focus {
  outline: none; border-color: var(--border-focus); box-shadow: 0 0 0 2px rgba(59,130,246,.35);
}
.kpi-case-form .check { display: flex; align-items: center; gap: 8px; font-size: var(--text-md); color: var(--text-secondary); font-weight: var(--weight-normal); }
.kpi-case-form .modal-actions { justify-content: flex-start; }

@media (max-width: 1180px) {
  .kpi-ai-entry { flex-wrap: wrap; }
  .kpi-ai-entry-actions { width: 100%; justify-content: flex-start; }
}

/* ===================================================================
   WEBAPP-GLOBAL-FILTER-SYSTEM-01 — ONE filter toolbar, every module.
   Design brief: SIMPLE · STANDARD · EFFECTIVE. The default bar is ONE
   compact row; everything else hides behind "+ Bộ lọc". The bar must
   not eat vertical space that belongs to the data.
   =================================================================== */

.fbar { margin: 0 0 12px; }

.fbar-main {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  padding: 8px 10px;
  background: var(--bg-surface);
  border: 1px solid var(--border-default);
  border-radius: 10px;
}

.fbar-time, .fbar-src, .fbar-search, .fbar-time-extra { display: flex; align-items: center; gap: 6px; }
.fbar-ico { font-size: 13px; line-height: 1; opacity: .65; }
.fbar-dash { color: var(--text-muted); font-size: var(--font-meta); }

.fbar-select, .fbar-input, .fbar-date {
  font-family: inherit;
  font-size: 13px;
  color: var(--text-primary);
  background: var(--bg-surface-soft);
  border: 1px solid var(--border-default);
  border-radius: 8px;
  padding: 6px 10px;
  height: 32px;
  max-width: 100%;
}
.fbar-select { cursor: pointer; }
.fbar-input { width: 240px; }
.fbar-select:focus, .fbar-input:focus, .fbar-date:focus {
  outline: none;
  border-color: var(--brand-primary);
  box-shadow: 0 0 0 2px rgba(37, 99, 235, .12);
}

.fbar-btn {
  font-family: inherit;
  font-size: 13px;
  height: 32px;
  padding: 0 12px;
  border-radius: 8px;
  border: 1px solid var(--border-default);
  background: var(--bg-surface-soft);
  color: var(--text-primary);
  cursor: pointer;
  white-space: nowrap;
}
.fbar-btn:hover:not(:disabled) { background: var(--bg-subtle); }
.fbar-btn:disabled { opacity: .45; cursor: default; }
.fbar-more-btn.is-open { border-color: var(--brand-primary); color: var(--brand-primary); }
.fbar-clear { margin-left: auto; }

.fbar-badge {
  display: inline-block;
  min-width: 16px;
  padding: 0 4px;
  margin-left: 4px;
  border-radius: 8px;
  background: var(--brand-primary);
  color: var(--text-inverse);
  font-size: var(--text-xs);
  line-height: 16px;
  text-align: center;
}

/* "+ Bộ lọc" drawer: module-specific controls, never shown by default. */
.fbar-drawer {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: 10px 12px;
  margin-top: 8px;
  padding: 12px;
  background: var(--bg-surface-soft);
  border: 1px solid var(--border-default);
  border-radius: 10px;
}
.fbar-field { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.fbar-field-label { font-size: var(--font-meta); font-weight: 600; color: var(--text-muted); text-transform: uppercase; letter-spacing: .02em; }
.fbar-field .fbar-select { background: #fff; width: 100%; }
.fbar-note { grid-column: 1 / -1; font-size: var(--font-help); color: var(--text-muted); font-style: italic; }

/* Active-filter chips. Compact, one line, each removable on its own. */
.fbar-chips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.fbar-chip {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: var(--font-badge);
  padding: 3px 6px 3px 10px;
  border-radius: 999px;
  background: rgba(37, 99, 235, .08);
  color: var(--brand-primary);
  border: 1px solid rgba(37, 99, 235, .18);
}
.fbar-chip-x {
  border: 0; background: none; cursor: pointer;
  color: inherit; font-size: 14px; line-height: 1; padding: 0 2px;
}
.fbar-chip-x:hover { opacity: .6; }

/* Server-side pager. Rendered from the server's own total/limit/offset. */
.fbar-pager {
  display: flex; align-items: center; gap: 8px;
  padding: 10px 4px 2px;
  font-size: 13px; color: var(--text-muted);
}
.fbar-pager-info { margin-right: auto; }

/* A filtered aggregate must say what it is filtered by, or the number lies. */
.fbar-scope-note { font-size: var(--font-help); color: var(--text-muted); margin: -4px 0 10px; }

@media (max-width: 1100px) {
  .fbar-input { width: 180px; }
  .fbar-clear { margin-left: 0; }
}
@media (max-width: 760px) {
  .fbar-main { gap: 6px; padding: 8px; }
  .fbar-search { flex: 1 1 100%; }
  .fbar-input { width: 100%; flex: 1; }
  .fbar-drawer { grid-template-columns: 1fr 1fr; }
}

/* [hidden] must win over the display rules above — a flex/grid container with
   the hidden attribute would otherwise still paint (this is why the date range
   inputs showed up next to the "Tất cả thời gian" preset). */
.fbar [hidden] { display: none !important; }

/* ================= WEBAPP-KPI-DIRECTOR-UX-REVISION-01 =================
   Ba cửa của Giám đốc: Tổng quan công ty · Đội ngũ & Hiệu quả · Trao đổi &
   Phản hồi KPI. Dùng lại token canonical, không thêm bảng màu thứ hai. */

/* Cảnh báo lớn ở trang tổng quan — một dòng mỗi việc, có đường dẫn sang tab xử lý. */
.kpi-alerts {
  background: var(--bg-surface); border: 1px solid var(--border-default);
  border-radius: var(--radius-md); padding: 10px 12px; margin-bottom: 12px;
}
.kpi-alerts-title {
  font-size: var(--text-sm); font-weight: 700; text-transform: uppercase;
  letter-spacing: .04em; color: var(--text-muted); margin-bottom: 6px;
}
.kpi-alert {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  flex-wrap: wrap; padding: 6px 0; font-size: var(--text-md); color: var(--text-secondary);
  border-top: 1px dashed var(--border-default);
}
.kpi-alert:first-of-type { border-top: 0; }
.kpi-alert[data-kind="warn"] { color: var(--text-primary); }
.kpi-alert[data-kind="warn"] b { color: var(--status-warning); }
.kpi-alerts-clear {
  background: var(--status-success-soft); border: 1px solid #a7f3d0;
  border-radius: var(--radius-md); padding: 9px 12px; margin-bottom: 12px;
  font-size: var(--text-md); color: var(--text-secondary);
}

/* WEBAPP-KPI-UI-RECOVERY-3T-ALIGNMENT-V1-01 — băng "chưa có số liệu KPI thật".
   Màu TRUNG TÍNH có chủ ý, KHÔNG dùng vàng: đây là tin trung tính về trạng thái
   dữ liệu, không phải một việc cần người xử lý (luật vàng ở PHẦN B mục B3).
   Viền trái đậm để tách khỏi thẻ số, không dùng nền cảnh báo. */
.kpi-alerts-nodata {
  border-left: 3px solid var(--border-strong);
  background: var(--bg-surface-soft);
}
.kpi-nodata-body p {
  margin: 0 0 6px; font-size: var(--font-body); color: var(--text-secondary);
  line-height: var(--line-normal);
}
.kpi-nodata-body p:last-child { margin-bottom: 0; }
.kpi-nodata-body .label-secondary { font-size: var(--font-help); color: var(--text-muted); }

/* Bảng đội ngũ gộp nhiều chiều — cho phép cuộn ngang TRONG bảng, không đẩy
   cả trang trượt ngang. */
.table-scroll { overflow-x: auto; -webkit-overflow-scrolling: touch; }
.kpi-team thead th { vertical-align: bottom; white-space: nowrap; }
.kpi-team td { vertical-align: top; }
.kpi-team .kpi-cell-mix { min-width: 170px; }
.kpi-bw-val { color: var(--text-muted); font-weight: 400; }

.kpi-trendchip {
  display: inline-block; font-size: var(--text-sm); font-weight: 700;
  padding: 1px 7px; border-radius: 999px; white-space: nowrap;
}
.kpi-trendchip[data-dir="up"]   { color: var(--status-success); background: var(--status-success-soft); }
.kpi-trendchip[data-dir="down"] { color: var(--status-danger);  background: var(--status-danger-soft); }
.kpi-trendchip[data-dir="flat"] { color: var(--text-muted);     background: var(--bg-subtle); }

/* Đầu trang "xem trọn một nhân viên" */
.kpi-emp-head {
  display: flex; align-items: baseline; justify-content: space-between; gap: 12px;
  flex-wrap: wrap; margin: 2px 0 10px;
}
.kpi-emp-who { font-size: 15px; color: var(--text-primary); }

@media (max-width: 1100px) {
  .kpi-team .kpi-cell-mix { min-width: 150px; }
}
@media (max-width: 760px) {
  .kpi-alert { align-items: flex-start; flex-direction: column; gap: 4px; }
  .kpi-emp-head { flex-direction: column; gap: 2px; }
}

/* Bảng rộng phải cuộn TRONG khung của nó, không được kéo giãn cả khung ứng dụng.
   `#main`/`#view-root` là ô của lưới app-shell; mặc định `min-width:auto` nên
   chúng phình ra bằng min-content của nội dung (tiêu đề bảng không ngắt dòng),
   làm cả trang trượt ngang. Cho phép chúng co lại để `.table-scroll` làm đúng
   việc của mình. Đây là sửa lỗi layout, không đổi thiết kế màn hình nào. */
#main, #view-root { min-width: 0; }

/* ================= WEBAPP-KPI-DIRECTOR-UX-POLISH-02 =================
   Chủ sở hữu yêu cầu: DỄ NHÌN · DỄ CHỌN · DỄ QUẢN LÝ · KHÔNG RỐI.
   Chỉ chỉnh thanh lọc của trang KPI — các module khác giữ nguyên kích thước. */

/* Ô lọc chính của KPI: cao hơn, rộng đủ đọc hết giá trị đang chọn, chữ không bé.
   Vẫn dùng token canonical, không thêm bảng màu riêng. */
.kpi-page .fbar-select,
.kpi-page .fbar-date {
  height: 38px;
  font-size: var(--text-md);
  padding: 7px 12px;
  background: var(--bg-surface);
  min-width: 170px;
}
.kpi-page .fbar-time .fbar-select { min-width: 190px; font-weight: var(--weight-bold); }
.kpi-page .fbar-src .fbar-select  { min-width: 200px; }
.kpi-page .fbar-btn { height: 38px; font-size: var(--text-md); }

/* Thanh lọc thoáng hơn nhưng KHÔNG cao thêm: một hàng, bọc xuống khi hẹp. */
.kpi-page .fbar-main {
  gap: 10px;
  padding: 10px 12px;
  align-items: center;
}
.kpi-page .fbar { margin-bottom: 10px; }

/* Giá trị đang chọn phải nhìn thấy ngay: ô nào đang lọc thì viền + nền đổi. */
.kpi-page .fbar-select:not([data-empty="1"]) { border-color: var(--brand-primary); }
.kpi-page .fbar-src .fbar-select:not([data-empty="1"]),
.kpi-page .fbar-primary-extra .fbar-select:not([data-empty="1"]) {
  background: var(--brand-primary-soft);
  font-weight: var(--weight-bold);
}

/* Chip đang lọc: to hơn một chút cho dễ bấm bỏ. */
.kpi-page .fbar-chip { font-size: var(--text-md); padding: 4px 8px 4px 10px; }

@media (max-width: 1100px) {
  .kpi-page .fbar-select, .kpi-page .fbar-date { min-width: 150px; }
  .kpi-page .fbar-time .fbar-select { min-width: 160px; }
  .kpi-page .fbar-src .fbar-select { min-width: 165px; }
}

/* ================= WEBAPP-UAT-02 · PHẦN ĐẦU MÀN KPI =================
   Thông tin kỹ thuật/UAT gom vào MỘT control gấp lại, mặc định ĐÓNG, để vùng
   đầu màn KPI chỉ còn: tiêu đề → bộ lọc → điều hướng. Dùng lại token canonical. */

.kpi-info {
  background: var(--bg-surface); border: 1px solid var(--border-soft);
  border-left: 4px solid var(--status-ai); border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm);
}
.kpi-info-summary {
  display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
  padding: 8px 14px; cursor: pointer; list-style: none;
  font-size: var(--text-md); color: var(--text-secondary);
}
.kpi-info-summary::-webkit-details-marker { display: none; }
.kpi-info-summary:hover { background: var(--bg-surface-soft); border-radius: var(--radius-md); }
.kpi-info-title { font-weight: var(--weight-bold); color: var(--text-primary); }
.kpi-info-caret { color: var(--text-muted); transition: transform .15s ease; display: inline-block; }
.kpi-info[open] > .kpi-info-summary > .kpi-info-caret { transform: rotate(180deg); }
.kpi-info-body { padding: 4px 14px 12px; border-top: 1px dashed var(--border-default); }
.kpi-info-row {
  display: grid; grid-template-columns: 150px 1fr; gap: 10px;
  padding: 7px 0; font-size: var(--text-md); align-items: start;
}
.kpi-info-row + .kpi-info-row { border-top: 1px dashed var(--border-default); }
.kpi-info-label { color: var(--text-muted); font-weight: var(--weight-bold); }
.kpi-info-val { color: var(--text-secondary); min-width: 0; }
.kpi-info-val code { word-break: break-all; }
.kpi-info-val .form-input { height: 34px; min-width: 190px; margin-bottom: 4px; }
.kpi-info-actions { padding-top: 8px; }

/* Tab 4 — Chính sách & Định mức KPI */
.kpi-policy th {
  width: 220px; text-align: left; vertical-align: top;
  color: var(--text-muted); font-weight: var(--weight-bold); white-space: nowrap;
}
.kpi-policy td { vertical-align: top; }
.kpi-policy-empty {
  background: var(--bg-surface-soft); border: 1px dashed var(--border-default);
  border-radius: var(--radius-md); padding: 14px 16px; color: var(--text-secondary);
  font-size: var(--text-md);
}
.kpi-policy-empty-title {
  font-weight: var(--weight-bold); color: var(--text-primary); margin-bottom: 6px;
}
.kpi-policy-empty p { margin: 6px 0 0; }

@media (max-width: 760px) {
  .kpi-info-row { grid-template-columns: 1fr; gap: 2px; }
  .kpi-policy th { width: auto; white-space: normal; }
}

/* Giá trị canonical trong tab Chính sách là tên bảng/view rất dài — cho phép
   ngắt dòng để bảng không kéo giãn khung, và bảng tự cuộn trong khung của nó. */
.kpi-policy code { word-break: break-all; }
.kpi-policy { min-width: 0; }

/* ================= WEBAPP-UAT-02B · KPI SHARED STICKY SHELL =================
   MỘT vỏ dùng chung: context + 4 điều hướng + bộ lọc. Sticky NGAY DƯỚI Trung tâm
   CSKH (lớp sticky thứ 3):
     topbar          top:0                        z-30
     #global-care    top:var(--topbar-height)     z-20
     .kpi-shell      top:topbar + care height     z-15   ← lớp này
   Offset cộng bằng biến --care-sticky-height do app.js đo (ResizeObserver), vì
   chiều cao khối CSKH thay đổi theo trạng thái. z-index thấp hơn CSKH có chủ ý:
   nếu hai lớp có chạm nhau thì CSKH nằm trên, không có mép nội dung lọt ra. */
.kpi-shell {
  position: sticky;
  top: var(--sticky-module-top);
  z-index: var(--sticky-z-module);
  background: var(--bg-app);
  padding: 8px 0 10px;
  margin: 0 0 12px;
  display: flex; flex-direction: column; gap: 8px;
  /* Che mép nội dung cuộn qua phía dưới vỏ. */
  box-shadow: var(--sticky-edge);
}

/* A · HÀNG ĐẦU KPI — MỘT HÀNG DUY NHẤT (FIX_02, 19/09/2026)
   [← Trang chủ] [KPI — Kết quả của tôi · kỳ] [3 tab] … [Đang xem: X] [↻]
   Trước đây tiêu đề và hàng tab là HAI hàng. ⛔ Đừng tách lại.
   `.kpi-shell-context` cũ giữ lại làm lớp tương thích, không còn ai dùng. */
.kpi-shell-bar {
  display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap;
  min-height: 40px;
}
.kpi-home-btn { flex: 0 0 auto; padding: 4px 10px; font-size: var(--font-meta); white-space: nowrap; }
.kpi-shell-bar .kpi-context { flex: 0 1 auto; gap: 6px; }
.kpi-shell-bar .kpi-nav { flex: 0 1 auto; }
/* "Đang xem" là mục DUY NHẤT được co: nó nhận phần trống còn lại và CẮT CHỮ,
   thay vì đẩy cả hàng vỡ xuống dòng.
   ⛔ Đừng đặt `flex-basis: 100%` cho nó ở màn hẹp — đã thử và ĐO ĐƯỢC: ở 1024px
   nó tự chiếm một dòng rồi đẩy nút ↻ xuống dòng thứ ba (hàng cao 122,8px), trong
   khi các mục không co chỉ chiếm 703/977px. */
.kpi-watching {
  flex: 1 1 0; min-width: 0; text-align: right;
  font-size: var(--font-meta); color: var(--text-secondary);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.kpi-watching b { color: var(--text-primary); }
.kpi-watching-label { color: var(--text-muted); }
.kpi-shell-bar .kpi-controls { flex: 0 0 auto; margin-left: 0; align-items: center; }

/* Số đo tại 1366 (có thanh bên): bề rộng hàng 1035px; các mục KHÔNG co chiếm
   98+243+410+34 = 785px + 4 khe. Khe 12→8 giữ mọi thứ trên MỘT hàng. */
@media (max-width: 1440px) {
  .kpi-shell-bar { gap: var(--space-2); }
}

/* A-cũ · CONTEXT — đúng một dòng, không card cao */
.kpi-shell-context {
  display: flex; align-items: center; gap: 10px; flex-wrap: wrap;
  min-height: 32px;
}
.kpi-context { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; min-width: 0; }
.kpi-context-who { font-size: 16px; font-weight: var(--weight-bold); color: var(--text-primary); }
.kpi-context-scope, .kpi-context-label { font-size: var(--text-md); color: var(--text-muted); }
.kpi-context-sep { color: var(--text-disabled); }
.kpi-context-back { padding: 4px 10px; font-size: var(--text-md); }
.kpi-shell-context .kpi-controls { margin-left: auto; }
.kpi-refresh-btn {
  width: 34px; height: 34px; padding: 0; font-size: 16px; line-height: 1;
  display: inline-flex; align-items: center; justify-content: center;
}

/* B · ĐIỀU HƯỚNG — nổi bật, nhận ra tab đang mở ngay, không chỉ một gạch mảnh */
.kpi-nav { padding: 5px; gap: 5px; border-radius: 12px; background: var(--bg-subtle); border-color: var(--border-default); }
.kpi-nav .tab {
  font-size: 14.5px; font-weight: var(--weight-semibold);
  padding: 10px 16px; border-radius: 9px; color: var(--text-secondary);
  white-space: nowrap;
}
.kpi-nav .tab:hover { background: var(--bg-surface); color: var(--text-primary); }
/* Tab đang mở: nền nổi + chữ đậm + viền dưới dày — ba dấu hiệu, không phụ thuộc
   riêng vào màu để người khó phân biệt màu vẫn nhận ra. */
.kpi-nav .tab.active {
  background: var(--bg-surface); color: var(--brand-primary);
  font-weight: var(--weight-bold);
  box-shadow: 0 1px 2px rgba(15, 23, 42, .10), inset 0 -3px 0 var(--brand-primary);
}
.kpi-nav .tab.active::after { display: none; }   /* bỏ gạch chân mảnh cũ */

/* C · BỘ LỌC trong vỏ — chỉ đổi chỗ, không đổi logic */
.kpi-shell-filter .fbar { margin-bottom: 0; }

@media (max-width: 1100px) {
  .kpi-nav .tab { padding: 9px 12px; font-size: 14px; }
  .kpi-shell { padding: 6px 0 8px; }
}

/* ========== WEBAPP-UAT-03A · Cài đặt · Danh mục nền tảng ========== */
.settings-actions {
  display: flex; align-items: center; gap: 12px; flex-wrap: wrap; margin-bottom: 10px;
}
/* Nền tảng đã tắt: mờ đi nhưng VẪN ĐỌC ĐƯỢC — nó là lịch sử, không phải rác. */
.settings-page .data tr.row-off td { opacity: .6; }
/* WEBAPP-SETTINGS-UI-HIERARCHY-V1-02 · tiêu đề mục của một danh mục (bố cục dùng lại .pm-panel-head).
   Thanh cấp 2 dùng .ai-subtabs (display:flex) ⇒ phải ép [hidden] thì thuộc tính hidden mới có hiệu lực. */
#settings-subnav[hidden] { display: none; }
.settings-section-head { margin-bottom: var(--space-2); }
.settings-section-title { margin: 0; font-size: var(--font-section-title); font-weight: var(--weight-bold); color: var(--text-primary); line-height: var(--line-tight); }
.settings-section-desc { margin: 2px 0 0; font-size: var(--font-body); color: var(--text-secondary); }
.settings-section-note { margin: 0 0 var(--space-2); font-size: var(--font-meta); }
/* SCV2 · SYSTEM-CATALOG-UNIFIED-SPLITVIEW-V2-01 — Danh mục hệ thống: cây Nền tảng → Kênh (trái) + panel Thêm/Sửa (phải).
   Thay khối SETCAT (thẻ tổng quan + bảng). Chỉ token, không mã màu. Tiền tố .scv- ⇒ không va lớp module khác. */
/* Đầu trang workspace cùng khuôn gọn với "Người dùng & Tổ chức" (.org-head, đã LOCK) — chỉ chỉnh phía Danh mục hệ thống. */
.settings-page > .page-header { padding: 12px 18px; margin-bottom: var(--space-3); }
/* .crm là flex-cột gap 16px ⇒ lề dưới dải vị trí không gộp như ở Tổ chức; ép về cùng khoảng 8px (đo: dải→đầu trang 28px ở cả hai). */
.settings-page > .settings-crumbs .crumbs { margin-bottom: 0; }
.settings-page > .settings-crumbs + .page-header { margin-top: calc(var(--space-2) - 16px); }
.settings-page > .page-header h1 { font-size: var(--text-xl); }
.sc-tag-outline { background: var(--bg-surface); color: var(--text-secondary); box-shadow: inset 0 0 0 1px var(--border-default); }
.settings-page .tag { white-space: nowrap; }
/* Bố cục chia đôi: trái gọn (~41%), phải rộng (~59%) — theo ảnh chốt. */
.scv { display: grid; grid-template-columns: minmax(0, 41fr) minmax(0, 59fr); gap: var(--space-3); align-items: start; }
.scv > .panel { margin: 0; min-width: 0; }
.scv-title { margin: 0; font-size: var(--font-section-title); font-weight: var(--weight-bold); color: var(--text-primary); line-height: var(--line-tight); display: flex; align-items: center; gap: var(--space-2); }
.scv-sub { color: var(--text-muted); font-size: var(--font-meta); }
.scv-list-head { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); margin-bottom: var(--space-3); flex-wrap: wrap; }
.scv-warn { margin-bottom: var(--space-2); display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
.scv-tree { display: flex; flex-direction: column; gap: var(--space-2); }
.scv-group { border: 1px solid var(--border-soft); border-radius: var(--radius-md); background: var(--bg-surface); }
.scv-group.is-open { border-color: var(--border-default); }
.scv-row { display: flex; align-items: center; gap: var(--space-2); min-width: 0; padding: 8px; border-radius: var(--radius-md); cursor: pointer; }
.scv-row:hover { background: var(--bg-surface-soft); }
.scv-row:focus-visible { outline: 2px solid var(--brand-primary); outline-offset: -2px; }
.scv-row.is-sel { background: var(--brand-primary-soft); box-shadow: inset 3px 0 0 var(--brand-primary); }
/* SCVD: mũi tên là NÚT riêng (chỉ bung/thu); bấm phần còn lại của dòng = xem chi tiết. */
.scv-chev { width: 28px; height: 28px; flex: 0 0 28px; margin: -4px -4px -4px -6px; padding: 0; border: 0; border-radius: var(--radius-sm); background: transparent; color: var(--text-muted); font-size: 18px; line-height: 1; cursor: pointer; transition: transform .15s; text-align: center; }
.scv-chev:hover { background: var(--bg-subtle); color: var(--text-primary); }
.scv-chev:focus-visible { outline: 2px solid var(--brand-primary); outline-offset: 1px; }
.scv-group.is-open .scv-chev { transform: rotate(90deg); }
.scv-ico { flex: 0 0 auto; width: 32px; height: 32px; border-radius: 50%; background: var(--bg-subtle); display: inline-flex; align-items: center; justify-content: center; font-size: 17px; line-height: 1; }
.scv-crow .scv-ico { width: 26px; height: 26px; font-size: 14px; }
.scv-ico-lg { width: 64px; height: 64px; font-size: 32px; border-radius: var(--radius-md); }
.scv-name { flex: 1 1 auto; min-width: 0; font-weight: var(--weight-semibold); color: var(--text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.scv-crow .scv-name { font-weight: var(--weight-medium); }
.scv-count { flex: 0 0 auto; color: var(--text-muted); font-size: var(--font-meta); white-space: nowrap; }
.scv-prow .scv-count { width: 56px; }
.scv-prow .scv-status .tag { padding: 3px 8px; }
.scv-off-inline { display: none; }
.scv-status { flex: 0 0 auto; }
.scv-edit { flex: 0 0 auto; }
.scv-group.row-off > .scv-prow .scv-name, .scv-crow.row-off .scv-name { color: var(--text-muted); }
.scv-children { display: flex; flex-direction: column; gap: 2px; padding: 0 10px 10px 34px; }
.scv-none { color: var(--text-muted); font-size: var(--font-meta); padding: 6px 10px; }
.scv-add { display: block; width: 100%; text-align: left; margin-top: var(--space-1); padding: 8px 12px; border: 1px dashed var(--border-default); border-radius: var(--radius-md); background: var(--bg-surface); color: var(--text-link); font-weight: var(--weight-semibold); font-size: var(--font-body); cursor: pointer; }
.scv-add:hover { background: var(--brand-primary-soft); border-color: var(--brand-primary); }
.scv-loose { margin-top: var(--space-3); border-top: 1px solid var(--border-soft); padding-top: var(--space-3); }
.scv-loose-head { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); font-weight: var(--weight-semibold); color: var(--text-secondary); margin-bottom: var(--space-1); }
.scv-loose .scv-children { padding-left: 0; padding-right: 0; }
/* Panel phải: dính khi cuộn, cuộn nội bộ nếu dài. */
.scv-detail { position: sticky; top: calc(var(--sticky-module-top) + var(--space-2)); max-height: calc(100vh - var(--sticky-module-top) - var(--space-4)); overflow: auto; }
.scv-dhead { display: flex; align-items: flex-start; gap: var(--space-3); padding-bottom: var(--space-3); margin-bottom: var(--space-3); border-bottom: 1px solid var(--border-soft); }
.scv-dicon { width: 40px; height: 40px; flex: 0 0 40px; border-radius: var(--radius-md); background: var(--bg-subtle); display: inline-flex; align-items: center; justify-content: center; font-size: 20px; }
.scv-dtitle { flex: 1 1 auto; min-width: 0; }
.scv-dsub { margin-top: 4px; color: var(--text-secondary); font-size: var(--font-body); display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.scv-dsub .scv-ico { width: 22px; height: 22px; font-size: 12px; }
.scv-dhead .scv-back-list { display: none; }   /* máy tính: chi tiết không có nút đóng — panel không bao giờ trống khi có dữ liệu */
/* CHI TIẾT (chỉ đọc) */
.scv-dl { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: var(--space-3) var(--space-4); margin-bottom: var(--space-3); }
.scv-dl-item { display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.scv-dl-val { color: var(--text-primary); font-size: var(--font-body); min-height: 24px; display: flex; align-items: center; gap: 6px; overflow-wrap: anywhere; }
.scv-kid-list { display: flex; flex-direction: column; gap: 2px; }
.scv-kid { display: flex; align-items: center; gap: var(--space-2); width: 100%; min-width: 0; padding: 6px 8px; border: 0; border-radius: var(--radius-md); background: transparent; text-align: left; cursor: pointer; font: inherit; color: inherit; }
.scv-kid:hover { background: var(--bg-surface-soft); }
.scv-kid .scv-ico { width: 26px; height: 26px; font-size: 14px; }
.scv-link { display: inline-flex; align-items: center; gap: 6px; padding: 0; border: 0; background: transparent; color: var(--text-link); font: inherit; font-weight: var(--weight-semibold); cursor: pointer; }
.scv-link:hover { text-decoration: underline; }
.scv-link .scv-ico { width: 22px; height: 22px; font-size: 12px; }
.scv-foot-detail { justify-content: flex-start; flex-wrap: wrap; }
.scv-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-3) var(--space-4); }
.scv-field { display: flex; flex-direction: column; gap: 6px; min-width: 0; }
.scv-label { font-weight: var(--weight-semibold); color: var(--text-primary); font-size: var(--font-body); }
.scv-req { color: var(--status-danger); }
.scv-field input, .scv-field select { width: 100%; min-width: 0; min-height: 40px; padding: 8px 12px; border: 1px solid var(--border-default); border-radius: var(--radius-md); background: var(--bg-surface); color: var(--text-primary); font: inherit; font-size: var(--font-body); }
.scv-field input:focus, .scv-field select:focus { outline: none; border-color: var(--brand-primary); box-shadow: 0 0 0 3px var(--brand-primary-soft); }
.scv-field input[readonly] { background: var(--bg-subtle); color: var(--text-muted); }
.scv-help { color: var(--text-muted); font-size: var(--font-meta); }
.scv-iconbox { display: flex; align-items: center; gap: var(--space-3); }
.scv-note { color: var(--text-secondary); font-size: var(--font-meta); background: var(--bg-surface-soft); border: 1px solid var(--border-soft); border-radius: var(--radius-md); padding: 8px 10px; }
.scv-ro { min-height: 36px; display: flex; align-items: center; }
.scv-switch-row { display: flex; align-items: center; gap: var(--space-2); min-height: 36px; }
.scv-switch { position: relative; width: 44px; height: 24px; flex: 0 0 44px; border-radius: 999px; border: 0; padding: 0; background: var(--border-default); cursor: pointer; transition: background .15s; }
.scv-switch > span { position: absolute; top: 3px; left: 3px; width: 18px; height: 18px; border-radius: 50%; background: var(--bg-surface); box-shadow: var(--shadow-sm); transition: left .15s; }
.scv-switch.is-on { background: var(--status-success); }
.scv-switch.is-on > span { left: 23px; }
.scv-switch:disabled { opacity: .6; cursor: not-allowed; }
.scv-switch:focus-visible { outline: 2px solid var(--brand-primary); outline-offset: 2px; }
.scv-kids { margin-top: var(--space-4); border: 1px solid var(--border-soft); border-radius: var(--radius-md); padding: var(--space-3); }
.scv-kids-head { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); font-weight: var(--weight-semibold); margin-bottom: var(--space-2); }
.scv-chips { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-bottom: var(--space-2); }
.scv-chip { display: inline-flex; align-items: center; gap: 6px; padding: 4px 12px 4px 4px; border: 1px solid var(--border-soft); border-radius: 999px; background: var(--bg-surface-soft); cursor: pointer; font-size: var(--font-body); color: var(--text-primary); }
.scv-chip:hover { border-color: var(--brand-primary); }
.scv-chip .scv-ico { width: 24px; height: 24px; font-size: 13px; }
.scv-info { color: var(--status-info); background: var(--status-info-soft); border-radius: var(--radius-md); padding: 8px 10px; font-size: var(--font-meta); }
.scv-ok { color: var(--status-success); background: var(--status-success-soft); border-radius: var(--radius-md); padding: 8px 10px; margin-top: var(--space-3); font-weight: var(--weight-semibold); }
#scv-msg:not(:empty) { margin-top: var(--space-3); }
.scv-foot { display: flex; justify-content: flex-end; gap: var(--space-2); margin-top: var(--space-4); padding-top: var(--space-3); border-top: 1px solid var(--border-soft); }
.scv-foot .btn { min-width: 110px; }
.scv-empty { text-align: center; color: var(--text-secondary); padding: var(--space-6, 48px) var(--space-4); }
.scv-empty-ico { font-size: 36px; margin-bottom: var(--space-2); }
.scv-empty p { margin: 0 0 var(--space-3); }
/* ≤1024: vẫn chia đôi nhưng nhường thêm chỗ cho danh sách; ô trạng thái ở cây ẩn chữ đếm để không vỡ dòng. */
@media (max-width: 1024px) {
  .scv { grid-template-columns: minmax(0, 44fr) minmax(0, 56fr); }
  .scv-prow .scv-count { width: auto; }
  .scv-grid { gap: var(--space-3); }
}
/* Màn ≤1400 (đo: 1366 cắt tên “Facebook”): bỏ cột trạng thái ở cây; mục ĐÃ TẮT vẫn mang nhãn "Đã tắt" cạnh tên + làm mờ. */
@media (max-width: 1400px) {
  .scv-prow .scv-status { display: none; }
  .scv-off-inline { display: inline-block; }
}
/* ≤820: KHÔNG ép hai cột. Danh sách full width; chọn một mục ⇒ panel thay chỗ danh sách, nút "← Danh sách" để quay lại. */
@media (max-width: 820px) {
  .scv { grid-template-columns: minmax(0, 1fr); }
  /* Chỉ khi người dùng CHỦ ĐỘNG chọn (show-detail) panel mới thay danh sách; lựa chọn mặc định không đẩy khỏi danh sách. */
  .scv.show-detail > .scv-list { display: none; }
  .scv:not(.show-detail) > .scv-detail { display: none; }
  .scv-detail { position: static; max-height: none; overflow: visible; }
  .scv-grid { grid-template-columns: minmax(0, 1fr); }
  .scv-dhead .scv-back-list { display: inline-flex; }
  .scv-edit, .scv-foot .btn { min-height: 36px; }
  .scv-prow .scv-status { display: block; }   /* danh sách full width ⇒ đủ chỗ cho nhãn trạng thái */
  .scv-off-inline { display: none; }
}
@media (max-width: 520px) {
  .scv-prow .scv-status { display: none; }
  .scv-off-inline { display: inline-block; }
  .scv-prow .scv-count { display: none; }
}
/* V1-03: luật hạ tiêu đề "Người dùng & Tổ chức" của V1-02 đã gỡ — nay nó là tiêu đề WORKSPACE (bậc trang), ngang "Danh mục hệ thống". */
/* CALWORK · WEBAPP-CALENDAR-WORK-2WORKSPACE-UI-V1-01 — Lịch & Công việc. Dùng lại vỏ chia đôi .scv (Danh mục hệ thống);
   chỉ token, không mã màu. Tiền tố .cw- ⇒ không va lớp module khác. */
.cw-page > .page-header { padding: 12px 18px; margin-bottom: 0; }
.cw-page > .page-header h1 { font-size: var(--font-section-title); }
.cw-bar { display: flex; align-items: center; justify-content: space-between; gap: var(--space-3); flex-wrap: wrap; }
.cw-ws { display: inline-flex; gap: 4px; padding: 4px; background: var(--bg-subtle); border-radius: var(--radius-md); }
.cw-ws-btn { border: 0; background: transparent; padding: 8px 20px; border-radius: var(--radius-sm); font: inherit; font-size: var(--text-lg, 15px); font-weight: var(--weight-bold); color: var(--text-secondary); cursor: pointer; white-space: nowrap; }
.cw-ws-btn:hover { color: var(--text-primary); background: var(--bg-surface-soft); }
.cw-ws-btn.active { background: var(--brand-primary); color: var(--bg-surface); box-shadow: var(--shadow-sm); }
.cw-ws-btn:focus-visible { outline: 2px solid var(--brand-primary); outline-offset: 2px; }
.cw-bar-actions { display: inline-flex; gap: var(--space-2); align-items: center; }
.cw-split { grid-template-columns: minmax(0, 42fr) minmax(0, 58fr); }
.cw-list-head { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); flex-wrap: wrap; margin-bottom: var(--space-2); }
.cw-view { display: inline-flex; gap: 4px; flex-wrap: wrap; }
.cw-chips { display: flex; gap: 6px; overflow-x: auto; scrollbar-width: none; margin-bottom: var(--space-2); padding-bottom: 2px; }
.cw-chips::-webkit-scrollbar { display: none; }
.cw-chip { flex: 0 0 auto; border: 1px solid var(--border-default); background: var(--bg-surface); color: var(--text-secondary); border-radius: 999px; padding: 5px 12px; font: inherit; font-size: var(--font-body); cursor: pointer; white-space: nowrap; }
.cw-chip b { color: var(--text-primary); margin-left: 2px; }
.cw-chip:hover { border-color: var(--brand-primary); color: var(--text-primary); }
.cw-chip.active { background: var(--brand-primary-soft); border-color: var(--brand-primary); color: var(--brand-primary); font-weight: var(--weight-semibold); }
.cw-chip.active b { color: var(--brand-primary); }
.cw-chip.is-danger b { color: var(--status-danger); }
.cw-search { width: 100%; min-height: 38px; padding: 8px 12px; border: 1px solid var(--border-default); border-radius: var(--radius-md); font: inherit; font-size: var(--font-body); margin-bottom: var(--space-2); background: var(--bg-surface); color: var(--text-primary); }
.cw-search:focus { outline: none; border-color: var(--brand-primary); box-shadow: 0 0 0 3px var(--brand-primary-soft); }
.cw-rows { display: flex; flex-direction: column; gap: 2px; max-height: calc(100vh - var(--sticky-module-top) - 260px); overflow-y: auto; }
.cw-day { display: flex; justify-content: space-between; align-items: center; gap: var(--space-2); padding: 8px 10px; margin-top: var(--space-1); background: var(--bg-surface-soft); border-radius: var(--radius-md); font-weight: var(--weight-semibold); color: var(--text-primary); position: sticky; top: 0; z-index: 1; }
.cw-row { display: flex; align-items: flex-start; gap: var(--space-3); padding: 10px; border-radius: var(--radius-md); cursor: pointer; border: 1px solid transparent; min-width: 0; }
.cw-row:hover { background: var(--bg-surface-soft); }
.cw-row:focus-visible { outline: 2px solid var(--brand-primary); outline-offset: -2px; }
.cw-row.is-sel { background: var(--brand-primary-soft); border-color: var(--brand-primary); box-shadow: inset 3px 0 0 var(--brand-primary); }
.cw-time { flex: 0 0 48px; display: flex; flex-direction: column; font-size: var(--font-body); color: var(--text-primary); line-height: 1.35; }
.cw-main { flex: 1 1 auto; min-width: 0; }
.cw-title { font-weight: var(--weight-semibold); color: var(--text-primary); font-size: var(--font-body); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cw-meta { color: var(--text-muted); font-size: var(--font-meta); margin-top: 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cw-side { flex: 0 0 auto; }
.cw-src { display: inline-block; padding: 0 6px; border-radius: 999px; background: var(--bg-subtle); color: var(--text-secondary); font-size: var(--font-badge); font-weight: var(--weight-semibold); }
.cw-dot { flex: 0 0 10px; width: 10px; height: 10px; border-radius: 50%; margin-top: 5px; background: var(--status-info); }
.cw-dot-ok { background: var(--status-success); }
.cw-dot-neutral { background: var(--border-default); }
.cw-empty { padding: 12px 10px; color: var(--text-secondary); font-size: var(--font-body); background: var(--bg-surface-soft); border-radius: var(--radius-md); }
.cw-note { margin: var(--space-2) 0 0; font-size: var(--font-meta); color: var(--text-muted); }
.cw-gap { margin: var(--space-3) 0; padding: 8px 10px; border-radius: var(--radius-md); background: var(--bg-surface-soft); border: 1px dashed var(--border-default); color: var(--text-muted); font-size: var(--font-meta); }
.cw-sec { margin-top: var(--space-2); display: flex; flex-direction: column; gap: 4px; }
.cw-text { margin: 0; color: var(--text-primary); font-size: var(--font-body); white-space: pre-wrap; overflow-wrap: anywhere; }
.cw-status-line { margin-bottom: 4px; }
.cw-wide { grid-column: 1 / -1; }
.cw-detail textarea { width: 100%; min-width: 0; padding: 8px 12px; border: 1px solid var(--border-default); border-radius: var(--radius-md); font: inherit; font-size: var(--font-body); resize: vertical; }
.cw-detail .check { display: flex; align-items: center; gap: 6px; font-size: var(--font-body); }
.cw-month { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 4px; }
.cw-mwd { text-align: center; font-size: var(--font-meta); color: var(--text-muted); font-weight: var(--weight-semibold); padding: 4px 0; }
.cw-mcell { min-height: 64px; display: flex; flex-direction: column; align-items: flex-start; gap: 4px; padding: 6px 8px; border: 1px solid var(--border-soft); border-radius: var(--radius-md); background: var(--bg-surface); font: inherit; font-size: var(--font-body); color: var(--text-primary); cursor: pointer; text-align: left; min-width: 0; }
.cw-mcell:hover { border-color: var(--brand-primary); }
.cw-mcell.is-pad { border: 0; background: transparent; cursor: default; }
.cw-mcell.is-today { border-color: var(--brand-primary); background: var(--brand-primary-soft); font-weight: var(--weight-bold); }
.cw-mcount { font-size: var(--font-badge); color: var(--brand-primary); font-weight: var(--weight-semibold); }
/* ≤1024: vẫn chia đôi, nhường chỗ cho danh sách. ≤820: một cột — dùng luật show-detail của .scv (panel thay danh sách khi người dùng chọn). */
@media (max-width: 1024px) {
  .cw-split { grid-template-columns: minmax(0, 46fr) minmax(0, 54fr); }
  .cw-split .scv-grid { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 820px) {
  .cw-split { grid-template-columns: minmax(0, 1fr); }
  .cw-rows { max-height: none; }
  .cw-ws { width: 100%; }
  .cw-ws-btn { flex: 1 1 0; padding: 8px 10px; }
  .cw-bar-actions { width: 100%; justify-content: flex-end; }
  .cw-mcell { min-height: 48px; padding: 4px; }
  .cw-mcount { font-size: var(--text-xs); }
}

/* ===== WEBAPP-IMPL-PRODUCT-UI-01 · Quản trị sản phẩm (nền đọc) =====
   Chỉ THÊM class mới với tiền tố .pm-* / .product-* / .banner-* / .tag-official.
   Không sửa class dùng chung nào (.panel .data .tag-ok .table-scroll … giữ nguyên),
   nên không ảnh hưởng CRM / KPI / Cài đặt. Bảng rộng đã có .table-scroll lo cuộn
   ngang trong khung riêng — trang không bị tràn ngang. */

.product-page { min-width: 0; }

/* Băng cảnh báo chuyển đổi: nghĩa nghiệp vụ đọc trước, kỹ thuật thu gọn phía sau. */
.product-banner { margin: 0 0 14px; }
.banner { border-radius: 10px; padding: 12px 14px; font-size: var(--text-md); line-height: 1.55; }
.banner-warn { background: #fff8e1; border: 1px solid #f0c36d; color: #6b4e00; }
.banner-main { margin: 0; }
.banner-more { margin-top: 8px; }
.banner-more > summary { cursor: pointer; font-weight: 600; font-size: var(--text-sm); opacity: .85; }
.banner-more-body { margin-top: 6px; font-size: var(--text-sm); opacity: .95; }
.banner-more-body code { background: rgba(0,0,0,.06); padding: 1px 4px; border-radius: 4px; }

/* Thẻ số đo — tự xuống dòng, không tràn ngang trên laptop hay điện thoại. */
.pm-cards { display: grid; gap: 10px; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); margin-bottom: 14px; }
.pm-card { background: #fff; border: 1px solid var(--line, #e3e7ee); border-radius: 10px; padding: 12px 14px; min-width: 0; }
.pm-card-value { font-size: var(--text-metric); font-weight: 700; line-height: 1.1; }
.pm-card-label { font-size: var(--text-sm); font-weight: 600; margin-top: 4px; }
.pm-card-note { font-size: var(--text-sm); opacity: .7; margin-top: 3px; }
.pm-card.pm-ok { border-color: #b7e1c4; background: #f4fbf6; }
.pm-card.pm-warn { border-color: #f0c36d; background: #fffaf0; }

.pm-two-col { display: grid; gap: 12px; grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); }

.pm-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin: 0 0 10px; }
.pm-filters { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin: 0 0 10px; }
.pm-filters input[type="search"] { flex: 1 1 240px; min-width: 180px; padding: 7px 10px; border: 1px solid var(--line, #e3e7ee); border-radius: 8px; font: inherit; }
.pm-filters select { padding: 7px 10px; border: 1px solid var(--line, #e3e7ee); border-radius: 8px; font: inherit; max-width: 100%; }

.pm-rule { background: #f6f8fb; border: 1px solid var(--line, #e3e7ee); border-left: 3px solid #6c8cff;
  border-radius: 8px; padding: 10px 12px; font-size: var(--text-sm); line-height: 1.55; margin: 0 0 10px; }

.pm-history > summary { cursor: pointer; font-size: var(--text-md); padding: 4px 0; }

/* Nhãn tham quyền giá — phải phân biệt được ngay bằng mắt. */
.tag-official { background: #e6f6ec; color: #14713a; border: 1px solid #b7e1c4; font-weight: 700; }
.tag-unofficial { background: #fdeaea; color: #a12626; border: 1px solid #f0b4b4; font-weight: 700; }

/* Chi tiết model */
.pm-detail-panel { margin-top: 14px; }
.pm-detail-head { display: flex; flex-wrap: wrap; gap: 10px; justify-content: space-between; align-items: flex-start; margin-bottom: 10px; }
.pm-detail-name { font-size: var(--text-xl); }
.pm-detail-actions { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.pm-detail-sub { font-size: var(--text-sm); margin: 8px 0 12px; display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
.pm-fields { display: grid; gap: 8px 16px; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); }
.pm-field { display: flex; gap: 8px; justify-content: space-between; border-bottom: 1px dashed var(--line, #e3e7ee); padding-bottom: 5px; min-width: 0; }
.pm-field-label { font-size: var(--text-sm); opacity: .72; flex: 0 0 auto; }
.pm-field-value { font-size: var(--text-md); font-weight: 600; text-align: right; word-break: break-word; min-width: 0; }

/* Điện thoại: xếp dọc, không cố nhồi bảng vào màn hẹp. */
@media (max-width: 640px) {
  .pm-cards { grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); }
  .pm-card-value { font-size: var(--text-2xl); }
  .pm-detail-head { flex-direction: column; }
  .pm-field { flex-direction: column; gap: 2px; }
  .pm-field-value { text-align: left; }
}

/* ===== WEBAPP-UAT-PRODUCT-UI-FINAL-01 · cấu trúc lại UX Quản trị sản phẩm =====
   Chỉ THÊM class mới (.pm-*). Không sửa class dùng chung nào. */

/* Đầu trang gọn: một dòng, thay cho header lớn + khối vàng cũ. */
.pm-head { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between;
  gap: 10px; margin: 0 0 10px; }
.pm-head-left { display: flex; align-items: center; gap: 9px; min-width: 0; }
.pm-head-icon { font-size: var(--text-2xl); line-height: 1; }
.pm-head-title { font-size: var(--text-2xl); font-weight: 700; margin: 0; }
.pm-head-badge { flex: 0 0 auto; }
.pm-head-info > summary { cursor: pointer; font-size: var(--text-sm); font-weight: 600; opacity: .8;
  padding: 4px 9px; border: 1px solid var(--line, #e3e7ee); border-radius: 999px; background: #fff;
  list-style: none; }
.pm-head-info > summary::-webkit-details-marker { display: none; }
.pm-head-info[open] > summary { background: #f2f5fa; }
.pm-head-info-body { margin-top: 8px; padding: 11px 13px; background: #fff8e1;
  border: 1px solid #f0c36d; border-radius: 9px; font-size: var(--text-sm); line-height: 1.6; color: #6b4e00;
  max-width: 860px; }
.pm-head-info-body p { margin: 0 0 7px; }
.pm-head-info-body p:last-child { margin-bottom: 0; }
.pm-head-info-body code { background: rgba(0,0,0,.06); padding: 1px 4px; border-radius: 4px; }
.pm-tabs { margin-bottom: 8px; }

/* Vỏ bộ lọc dùng chung — sống ngoài panel nên ngữ cảnh không mất khi đổi tab. */
.pm-filter-shell { margin: 0 0 12px; }
.pm-fbar { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }
.pm-fbar input[type="search"] { flex: 1 1 200px; min-width: 160px; padding: 7px 10px;
  border: 1px solid var(--line, #e3e7ee); border-radius: 8px; font: inherit; }
.pm-fbar select, .pm-fbar-more select { padding: 7px 10px; border: 1px solid var(--line, #e3e7ee);
  border-radius: 8px; font: inherit; max-width: 260px; }
.pm-fbar-more[hidden] { display: none; }
.pm-fbar-more { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-top: 8px;
  padding: 9px 10px; background: #f6f8fb; border: 1px solid var(--line, #e3e7ee); border-radius: 9px; }
.pm-fchips { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 8px; }
.pm-chip { border: 1px solid #cfd8e8; background: #eef3fb; color: #2b4a7e; border-radius: 999px;
  padding: 3px 9px; font-size: var(--text-sm); font-weight: 600; cursor: pointer; }
.pm-chip:hover { background: #e2ebf9; }

/* Thẻ số đo: đúng 4 cột trên desktop nên không có thẻ lẻ nằm một dòng riêng. */
.pm-cards-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.pm-cards-sub .pm-card-value { font-size: var(--text-2xl); }
.pm-cards-sub .pm-card { background: #fbfcfe; }
@media (max-width: 1100px) { .pm-cards-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 560px) { .pm-cards-4 { grid-template-columns: minmax(0, 1fr); } }
.pm-scope-note { font-size: var(--text-sm); background: #eef3fb; border: 1px solid #cfd8e8; color: #2b4a7e;
  border-radius: 8px; padding: 8px 11px; margin: 0 0 11px; }

/* Dòng sản phẩm: gấp/mở cha → con, thay bảng phẳng kiểu cơ sở dữ liệu. */
.pm-fam-list { display: flex; flex-direction: column; gap: 8px; }
.pm-fam { border: 1px solid var(--line, #e3e7ee); border-radius: 10px; background: #fff; overflow: hidden; }
.pm-fam.open { border-color: #b9c8e4; box-shadow: 0 1px 4px rgba(20,40,80,.06); }
.pm-fam-head { display: flex; align-items: center; gap: 10px; width: 100%; padding: 11px 13px;
  background: none; border: 0; cursor: pointer; text-align: left; font: inherit; }
.pm-fam-head:hover { background: #f7f9fc; }
.pm-fam-caret { flex: 0 0 auto; width: 12px; opacity: .6; }
.pm-fam-name { font-weight: 700; font-size: var(--text-lg); }
.pm-fam-code { flex: 0 0 auto; font-size: var(--text-xs); opacity: .65; }
.pm-fam-sum { margin-left: auto; font-size: var(--text-sm); opacity: .75; text-align: right; }
.pm-fam-body { padding: 0 13px 12px; }
.pm-fam-table { width: 100%; }
.pm-fam-actions { display: flex; flex-wrap: wrap; align-items: center; gap: 12px; margin-top: 9px; }

/* Chi tiết model: khu làm việc có 4 tab con, ngay trong module sản phẩm. */
.pm-detail-panel { border-left: 3px solid #6c8cff; }
.pm-detail-head { display: flex; flex-wrap: wrap; gap: 10px; justify-content: space-between;
  align-items: flex-start; margin-bottom: 8px; }
.pm-detail-id { min-width: 0; }
.pm-detail-title { font-size: var(--text-xl); font-weight: 700; }
.pm-detail-status { display: flex; flex-wrap: wrap; gap: 7px; align-items: center; margin-top: 5px; }
.pm-detail-tabs { margin: 0 0 11px; }
.pm-detail-body { min-width: 0; }
.pm-row-sel > td { background: #eef3fb !important; }

@media (max-width: 640px) {
  .pm-head { flex-direction: column; align-items: flex-start; }
  .pm-fam-sum { margin-left: 0; text-align: left; width: 100%; }
  .pm-fam-head { flex-wrap: wrap; }
  .pm-detail-head { flex-direction: column; }
}

/* ===== WEBAPP-UAT-PRODUCT-UI-FINAL-02 · hoan tat chi tiet model ===== */

/* O du lieu CHUA CO: phai nhin ra ngay la chua co, khong duoc trong nhu mot
   thong so da duyet. Chu nghieng + mau nhat + khong dam. */
.pm-field-missing { font-style: italic; font-weight: 400; color: #9aa4b2; }

/* Khoi "Gia hien hanh" — cau tra loi dau tien khi Chu so huu mo tab Gia. */
.pm-price-now { border: 1px solid var(--line, #e3e7ee); border-left: 3px solid #14713a;
  border-radius: 9px; padding: 10px 13px; margin: 0 0 11px; background: #f7fbf8; }
.pm-price-now-label { font-size: var(--text-sm); font-weight: 600; opacity: .7; text-transform: uppercase;
  letter-spacing: .3px; }
.pm-price-now-value { font-size: var(--text-metric); font-weight: 700; margin-top: 3px; }
.pm-price-now-tags { display: flex; flex-wrap: wrap; gap: 7px; align-items: center; margin-top: 6px; }
.pm-price-now-why { font-size: var(--text-sm); color: #a12626; margin-top: 6px; }

/* Khoi "chua cau hinh chinh sach thuong luong" — canh bao, khong phai so lieu. */
.pm-nego { border: 1px solid #f0c36d; background: #fff8e1; color: #6b4e00;
  border-radius: 9px; padding: 10px 13px; margin: 11px 0; font-size: var(--text-sm); line-height: 1.6; }
.pm-nego-more { margin-top: 6px; }
.pm-nego-more > summary { cursor: pointer; font-weight: 600; opacity: .85; }
.pm-nego-more code { background: rgba(0,0,0,.06); padding: 1px 4px; border-radius: 4px; }

/* FIX-01: dong phien ban giao dien trong [Thong tin] — de UAT sau biet ngay trang
   dang chay ma moi hay ma cu con trong bo nho. */
.pm-build { border-top: 1px dashed rgba(0,0,0,.15); padding-top: 6px; margin-top: 8px; font-size: var(--text-sm); }

/* ===== WEBAPP-PRODUCT-UX-REFINE-01 =====
   1) Vỏ điều hướng sản phẩm DÍNH khi cuộn (chỉ trong module Quản trị sản phẩm).
   2) Tab đang chọn nổi bật hơn.
   3) "Đang chọn cái gì" phải thấy ngay — và PHẢI khác màu nhãn nghiệp vụ.

   NGUYÊN TẮC MÀU (quan trọng, đừng phá):
     · TRẠNG THÁI NGHIỆP VỤ = xanh lá (đã duyệt/đang dùng) · vàng (cần kiểm tra)
       · đỏ (không phải giá chính thức) · xám (ngừng dùng)
     · ĐANG CHỌN (selection) = XANH CHÀM/INDIGO, chỉ dùng cho việc "tôi đang xem cái này"
   Hai nhóm này không bao giờ dùng chung màu, để Chủ sở hữu không nhầm
   "đang chọn" với "đã duyệt". */

:root { --pm-select: #4f46e5; --pm-select-bg: #eef2ff; --pm-select-border: #c7d2fe; }

/* --- 1 · STICKY SHELL --- */
.pm-shell {
  position: sticky;
  /* Đúng công thức của vỏ KPI: dưới topbar, rồi dưới Trung tâm CSKH (chiều cao do
     app.js đo bằng ResizeObserver qua --care-sticky-height). */
  top: var(--sticky-module-top);
  z-index: var(--sticky-z-module);
  background: var(--bg-app);
  padding: 8px 0 10px;
  margin: 0 0 12px;
  display: flex; flex-direction: column; gap: 8px;
  /* Che mép nội dung cuộn qua phía dưới vỏ + phân biệt phần cố định với phần cuộn. */
  box-shadow: var(--sticky-edge);
}
.pm-shell .pm-tabs { margin-bottom: 0; }
.pm-shell .pm-filter-shell { margin: 0; }

/* --- 2 · TAB ĐANG CHỌN RÕ HƠN --- */
.pm-tabs .tab { border-radius: 10px 10px 0 0; }
.pm-tabs .tab.active {
  color: var(--pm-select);
  font-weight: 700;
  background: var(--pm-select-bg);
  border-bottom-color: var(--pm-select);
  box-shadow: inset 0 -3px 0 var(--pm-select);
}
.pm-tabs .tab.active::before { content: ''; }

/* --- 3 · Ô LỌC ĐANG CÓ GIÁ TRỊ --- */
.pm-fbar .has-value {
  border-color: var(--pm-select-border);
  background: var(--pm-select-bg);
  font-weight: 600;
}

/* --- 4 · DÒNG SẢN PHẨM ĐANG MỞ --- */
.pm-fam.open { border-color: var(--pm-select-border); box-shadow: 0 1px 5px rgba(79,70,229,.12); }
.pm-fam.open > .pm-fam-head { background: var(--pm-select-bg); }
.pm-fam.open .pm-fam-name { color: var(--pm-select); }
.pm-fam-caret { font-size: var(--text-md); opacity: .9; }
.pm-fam.open .pm-fam-caret { color: var(--pm-select); }
.pm-fam-openflag {
  flex: 0 0 auto; font-size: var(--text-xs); font-weight: 700; letter-spacing: .3px;
  color: var(--pm-select); background: #fff; border: 1px solid var(--pm-select-border);
  border-radius: 999px; padding: 1px 7px; text-transform: uppercase;
}

/* --- 5 · MODEL ĐANG XEM: chỉ báo ○ / ● + cả dòng sáng nhẹ --- */
.pm-model-btn { display: inline-flex; align-items: center; gap: 6px; }
.pm-dot { font-size: var(--text-xs); line-height: 1; color: #b6bdc9; }
.pm-model-btn.is-sel .pm-dot { color: var(--pm-select); }
.pm-model-btn.is-sel code { font-weight: 700; color: var(--pm-select); }
tr.pm-row-sel > td { background: var(--pm-select-bg) !important; }
tr.pm-row-sel > td:first-child { box-shadow: inset 3px 0 0 var(--pm-select); }

/* --- 6 · NÚT THÊM: rõ, không chìm, có khoá --- */
.pm-panel-head {
  display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between;
  gap: 10px; margin-bottom: 8px;
}
.pm-panel-head .panel-title { margin: 0; }
.pm-head-actions { display: flex; flex-wrap: wrap; gap: 8px; }
.pm-add-btn {
  border: 1px dashed #b9c0cc; background: #fff; color: #55607a;
  font-weight: 600; white-space: nowrap; opacity: 1;
}
.pm-add-btn[disabled] { cursor: not-allowed; opacity: .95; }
.pm-add-btn[disabled]:hover { border-color: #9aa4b2; }
.pm-add-hint { font-size: var(--text-sm); color: var(--text-muted, #6b7280); margin: 0 0 10px; }
.pm-fam-actions .pm-add-btn { padding: 4px 10px; font-size: var(--text-sm); }

@media (max-width: 640px) {
  .pm-panel-head { flex-direction: column; }
  .pm-shell { padding-bottom: 8px; }
}

/* ===== WEBAPP-PRODUCT-P5B-POLICY-UI-01 — màn Chính sách thương mại ===== */

/* Cảnh báo vận hành quan trọng nhất của màn này: chính sách CHƯA được hệ thống tự áp
   vào báo giá. Phải nhìn thấy ngay, nhưng không được hét vào mặt người dùng. */
.pm-pol-warn {
  margin: 10px 0;
  padding: 10px 12px;
  border: 1px solid #fcd34d;
  border-left: 4px solid #f59e0b;
  border-radius: 8px;
  background: #fffbeb;
  color: #78350f;
  font-size: var(--text-md);
  line-height: 1.55;
}

.pm-pol-filters {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  align-items: center;
  margin: 10px 0 12px;
}
.pm-pol-filters input[type="search"] { min-width: 260px; flex: 1 1 260px; }
.pm-pol-filters select { min-width: 150px; }

.pm-pol-rule { max-width: 520px; }
.pm-pol-prov { margin-top: 4px; }
.pm-pol-actions { white-space: nowrap; }
.pm-pol-actions .btn { margin: 2px 4px 2px 0; padding: 4px 10px; font-size: var(--text-sm); }

/* Nhãn "Nhập từ dữ liệu cũ" — cố ý KHÁC màu với nhãn đã duyệt trong hệ thống, để
   không ai nhầm một dòng nhập từ Google Sheet là một lần duyệt có người. */
.tag-legacy {
  background: #f1f5f9;
  color: #475569;
  border: 1px dashed #94a3b8;
}

.pm-pol-sum { font-weight: 600; margin-bottom: 8px; }
.pm-pol-quote {
  margin: 8px 0;
  padding: 10px 12px;
  border-left: 3px solid #cbd5e1;
  background: #f8fafc;
  border-radius: 0 6px 6px 0;
  white-space: pre-wrap;
  line-height: 1.55;
}
.pm-pol-uuid { font-size: var(--text-xs); color: #64748b; }

.pm-pol-group { margin: 12px 0; }
.pm-pol-group-title {
  font-weight: 600;
  margin-bottom: 6px;
  padding-bottom: 4px;
  border-bottom: 1px solid #e2e8f0;
}
.pm-pol-item {
  padding: 8px 10px;
  margin-bottom: 6px;
  border: 1px solid #e2e8f0;
  border-radius: 6px;
  background: #fff;
  line-height: 1.55;
}
.pm-pol-item-subject {
  display: flex;
  gap: 8px;
  align-items: center;
  font-weight: 600;
  margin-bottom: 4px;
}

/* LIGHT_ONLY_V1: khối @media (prefers-color-scheme: dark) cục bộ đã gỡ (C01). */

/* ===================================================================
   P6A-FAMILY-MODEL-UI — giao diện ghi Dòng sản phẩm + Model
   =================================================================== */

/* Nhóm nút hành động của một dòng/model. Nhỏ, xếp ngang, xuống dòng khi hẹp. */
.pm-fam-ops { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; }
/* NÚT NHỎ — SỬA 14/09/2026 (VISUAL-REFINEMENT-01).
   Trước: 11px. Đo được 34 nút ở 11px chỉ riêng tab Model ("Sửa" x20, "Duyệt" x10,
   "Ngừng sử dụng" x4). Đây là những nút Chủ sở hữu bấm hằng ngày, không phải chú
   thích kỹ thuật. Nay đạt sàn đọc được, và có chiều cao control thống nhất để các
   nút trên cùng một hàng không cao thấp so le. */
.btn-xs {
  padding: 0 10px;
  height: var(--control-h-sm);
  font-size: var(--font-badge);
  font-weight: var(--weight-semibold);
  line-height: 1;
  border-radius: var(--radius-sm);
  display: inline-flex; align-items: center; justify-content: center;
}
/* Hàng đầu của một dòng sản phẩm: tiêu đề bấm được + nhóm nút, không chồng lên nhau. */
.pm-fam-ops { padding: 6px 12px 10px; }

/* Lời nhắc mã bất biến — đặt NGAY DƯỚI ô nhập, không phải tooltip. */
.pm-immutable-hint {
  display: block; margin-top: 4px;
  font-size: var(--text-xs); color: var(--text-secondary); line-height: var(--line-normal);
}
/* Trường chỉ đọc trong form sửa: nhìn khác hẳn ô nhập, để không ai thử gõ vào. */
.pm-readonly {
  padding: 6px 10px; border-radius: var(--radius-sm);
  background: var(--bg-surface-soft); color: var(--text-secondary);
  border: 1px dashed var(--border-subtle);
}

/* Lời nhắn sau khi ghi xong, hiện ở đầu tab cùng lúc với kết quả thật. */
.pm-notice {
  margin-bottom: 12px; padding: 10px 12px;
  border-radius: var(--radius-sm); border-left: 3px solid var(--status-success, #17803d);
  background: var(--status-success-soft, #e9f7ef); color: #14532d;
  font-size: var(--text-sm); line-height: var(--line-normal);
}

/* Lý do một model chưa có giá chính thức. Liệt kê từng lý do, không gom một câu. */
.pm-why {
  margin-top: 8px; padding: 8px 10px; border-radius: var(--radius-sm);
  background: var(--status-warning-soft); color: #7c4a03; font-size: var(--text-sm);
}
.pm-why ul { margin: 4px 0 0; padding-left: 18px; }
.pm-why li { line-height: var(--line-normal); }

/* Lý do model bị trả lại — phải đọc được ngay dưới tiêu đề chi tiết. */
.pm-reject-note {
  margin-top: 6px; padding: 6px 10px; border-radius: var(--radius-sm);
  background: var(--status-danger-soft, #fdecec); color: #8a1c1c;
  font-size: var(--text-sm); line-height: var(--line-normal);
}

/* LIGHT_ONLY_V1: khối @media (prefers-color-scheme: dark) cục bộ đã gỡ (C01). */

/* ===================================================================
   P6B-PRICE-DRAFT-UI — khối Đề xuất giá trong Chi tiết model
   Mục đích của mọi luật màu ở đây: KHÔNG để ai đọc nhầm một đề xuất
   thành giá bán. Nền khác, viền khác, tiêu đề riêng.
   =================================================================== */

.pm-draft-panel {
  margin-top: 18px; padding: 12px 14px 14px;
  border: 1px dashed var(--border-strong, #c7ccd4);
  border-radius: var(--radius-md, 10px);
  background: var(--bg-surface-soft);
}
.pm-draft-panel .panel-title { margin-bottom: 0; }

/* Câu cảnh báo "đây không phải bảng giá" — phải đọc được trước khi nhìn số tiền. */
.pm-draft-warn {
  margin: 8px 0 10px; padding: 8px 10px;
  border-radius: var(--radius-sm); border-left: 3px solid var(--text-muted, #8a93a0);
  background: var(--bg-surface, #fff); color: var(--text-secondary);
  font-size: var(--text-sm); line-height: var(--line-normal);
}
.pm-draft-warn b { color: var(--text-primary); }
.pm-draft-hint {
  margin-top: 10px; font-size: var(--text-xs); color: var(--text-secondary);
  line-height: var(--line-normal);
}

/* Khối "Chưa thể duyệt giá". Không phải nút xám có tooltip — là lời giải thích đọc
   được trên mọi thiết bị, kể cả điện thoại không có con trỏ để rê. */
.pm-approval-lock {
  margin-top: 12px; padding: 10px 12px;
  border-radius: var(--radius-sm); border-left: 3px solid var(--status-warning, #b8770a);
  background: var(--status-warning-soft); color: #7c4a03;
  font-size: var(--text-sm); line-height: var(--line-normal);
}
.pm-approval-lock b { display: block; margin-bottom: 4px; }
.pm-approval-lock div + div { margin-top: 4px; }

.tag-bad {
  background: var(--status-danger-soft, #fdecec); color: #8a1c1c;
  border: 1px solid rgba(138,28,28,.25);
}

/* LIGHT_ONLY_V1: khối @media (prefers-color-scheme: dark) cục bộ đã gỡ (C01). */

/* ==========================================================================
   WEBAPP-PRODUCT-PRICE-UX-AND-DEACTIVATION-SAFETY-V1-01
   Ba việc: (1) nói rõ đổi giá ở đâu · (2) tách hành động nguy hiểm khỏi hành
   động thường · (3) hiện ranh giới thương lượng đúng sự thật là CHƯA CÓ.
   Giữ nguyên tone WebApp — không thiết kế lại Product.
   ========================================================================== */

/* --- Hành động NGUY HIỂM: viền đỏ, KHÔNG phải nút chính, không đặc ruột ---
   Cố ý không dùng nền đỏ đặc: nền đặc trông như nút chính và mời người ta bấm. */
.pm-danger-btn {
  background: #fff;
  color: #a3231f;
  border: 1px solid #e0b4b2;
  font-weight: 600;
}
.pm-danger-btn:hover:not(:disabled) { background: var(--status-danger-soft, #fef2f2); border-color: #c9706c; }
.pm-danger-btn:disabled { opacity: .5; cursor: not-allowed; }

/* --- Khu hành động quản trị (cuối tab Thông tin chung) --- */
.pm-admin-zone { margin-top: 18px; padding-top: 12px; border-top: 1px solid var(--line, #e3e7ee); }
.pm-admin-zone-title {
  font-size: var(--text-sm); font-weight: 700; letter-spacing: .04em; text-transform: uppercase;
  opacity: .7; margin-bottom: 8px;
}
.pm-admin-zone-acts { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; }

/* --- Vùng nguy hiểm: tách hẳn, phải cuộn tới mới thấy --- */
.pm-danger-zone {
  margin-top: 16px; padding: 12px 13px; border: 1px solid #e6c3c1;
  border-left: 3px solid #b4322c; border-radius: 8px; background: #fffaf9;
}
.pm-danger-zone-title {
  font-size: var(--text-sm); font-weight: 700; letter-spacing: .04em; text-transform: uppercase;
  color: #a3231f; margin-bottom: 6px;
}
.pm-danger-zone-desc { font-size: var(--text-sm); color: #6f4a48; margin-bottom: 10px; line-height: 1.5; }
.pm-danger-zone-acts { display: flex; flex-wrap: wrap; gap: 8px; }

/* --- Hộp xác nhận: nói rõ đang dừng CÁI GÌ --- */
.pm-confirm-what {
  border: 1px solid var(--line, #e3e7ee); border-radius: 8px;
  padding: 10px 12px; margin-bottom: 10px; background: #fbfcfe;
}
.pm-danger-note {
  border: 1px solid #e6c3c1; border-left: 3px solid #b4322c; border-radius: 8px;
  background: #fffaf9; color: #7a3f3c; padding: 10px 12px; margin-bottom: 12px;
  font-size: var(--text-md); line-height: 1.55;
}

/* --- Thẻ giá hiện hành: câu trả lời cho "đổi giá ở đâu?" --- */
.pm-price-now-howto {
  margin-top: 9px; font-size: var(--text-sm); line-height: 1.55; color: var(--text-secondary, #55627a);
}
.pm-price-now-cta {
  margin-top: 9px; display: flex; flex-wrap: wrap; gap: 9px; align-items: center;
}

/* --- Ranh giới thương lượng --- */
.pm-nego-head { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-bottom: 6px; }
.pm-nego-title { font-weight: 700; font-size: var(--text-md); letter-spacing: .01em; }
.pm-nego-say { font-size: var(--text-md); line-height: 1.55; margin-bottom: 9px; }
.pm-nego-shape {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(248px, 1fr)); gap: 2px 18px;
  background: rgba(255,255,255,.55); border: 1px solid rgba(240,195,109,.7);
  border-radius: 8px; padding: 9px 11px; margin-bottom: 9px;
}
.pm-nego-ai { font-size: var(--text-sm); line-height: 1.55; }

/* LIGHT_ONLY_V1: khối @media (prefers-color-scheme: dark) cục bộ đã gỡ (C01). */

/* Huy hiệu trạng thái dòng sản phẩm — chỉ hiện khi KHÁC "đang dùng", để dòng tạm dừng
   không trông giống dòng bình thường. Tên dòng vẫn là cấp bậc chính. */
.pm-fam-st { flex: 0 0 auto; display: inline-flex; align-items: center; }

/* ==========================================================================
   DESIGN SYSTEM V1 — THÀNH PHẦN DÙNG CHUNG
   FORM: WEBAPP-DESIGN-SYSTEM-V1-PRODUCT-UI-CONSOLIDATION-01 · 14/09/2026
   Product là module ÁP DỤNG ĐẦU TIÊN. KPI/CRM chưa chuyển sang lớp này.
   Thang bậc chi phối: DỮ LIỆU NGHIỆP VỤ > TRẠNG THÁI > HÀNH ĐỘNG > CHỮ GIẢI THÍCH.
   ========================================================================== */

/* --- BĂNG THÔNG BÁO: một dòng, không chiếm chỗ hơn dữ liệu --- */
.ds-banner {
  display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap;
  padding: var(--space-2) var(--space-3);
  border: 1px solid var(--border-soft); border-left: 3px solid var(--border-strong);
  border-radius: var(--radius-sm); background: var(--bg-surface-soft);
  font-size: var(--font-help); line-height: var(--line-normal);
  margin: var(--space-3) 0;
}
.ds-banner-text { flex: 1 1 240px; color: var(--text-secondary); }
.ds-banner-text b { color: var(--text-primary); }
.ds-banner-info  { border-left-color: var(--status-info);    background: var(--status-info-soft); }
.ds-banner-warn  { border-left-color: var(--status-warning); background: var(--status-warning-soft); }
.ds-banner-danger{ border-left-color: var(--status-danger);  background: var(--status-danger-soft); }
.ds-banner-link {
  flex: 0 0 auto; background: none; border: 0; padding: 0; cursor: pointer;
  color: var(--text-link); font-size: var(--font-help); font-weight: var(--weight-semibold);
  text-decoration: underline; text-underline-offset: 2px;
}
.ds-banner-link:hover { color: var(--brand-primary-hover); }

/* --- KHỐI BUNG RA ĐỌC THÊM --- */
.ds-disclosure {
  border: 1px solid var(--border-soft); border-radius: var(--radius-sm);
  background: var(--bg-surface-soft); padding: var(--space-3);
  margin: 0 0 var(--space-3); font-size: var(--font-help);
  line-height: var(--line-relaxed); color: var(--text-secondary);
}
.ds-disclosure-item + .ds-disclosure-item { margin-top: var(--space-2); padding-top: var(--space-2); border-top: 1px dashed var(--border-soft); }
.ds-disclosure b { color: var(--text-primary); }

/* --- TRẠNG THÁI RỖNG: nói rõ và mời hành động, không bỏ mặc --- */
.ds-empty {
  border: 1px dashed var(--border-strong); border-radius: var(--radius-md);
  background: var(--bg-surface-soft); padding: var(--space-6) var(--space-4);
  text-align: center; margin: var(--space-3) 0;
}
.ds-empty-title { font-size: var(--font-card-title); font-weight: var(--weight-semibold); color: var(--text-primary); }
.ds-empty-note  { font-size: var(--font-help); color: var(--text-muted); margin-top: var(--space-2); line-height: var(--line-relaxed); }
.ds-empty-sm { padding: var(--space-4); font-size: var(--font-help); color: var(--text-muted); }

/* --- TRUNG TÂM TÀI LIỆU & MEDIA --- */
.pm-media-head {
  display: flex; align-items: center; justify-content: space-between; gap: var(--space-3);
  flex-wrap: wrap; margin-bottom: var(--space-3);
}
.pm-media-title { font-size: var(--font-section-title); font-weight: var(--weight-bold); color: var(--text-primary); }
.pm-media-head-acts { display: flex; gap: var(--space-2); align-items: center; flex-wrap: wrap; }
.pm-media-blocked { color: var(--text-secondary); }
.pm-media-blocked b { color: var(--status-warning); }

.pm-media-counts {
  display: grid; grid-template-columns: repeat(auto-fit, minmax(118px, 1fr));
  gap: var(--space-2); margin-bottom: var(--space-3);
}
.pm-media-count {
  border: 1px solid var(--border-soft); border-radius: var(--radius-sm);
  background: var(--bg-surface); padding: var(--space-2) var(--space-3);
}
.pm-media-count.is-warn { border-left: 3px solid var(--status-warning); }
.pm-media-count.is-ok   { border-left: 3px solid var(--status-success); }
.pm-media-count-n { font-size: var(--text-2xl); font-weight: var(--weight-bold); line-height: var(--line-tight); color: var(--text-primary); }
.pm-media-count-l { font-size: var(--font-meta); color: var(--text-muted); margin-top: 2px; }

.pm-media-grid {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(232px, 1fr));
  gap: var(--space-3); margin-bottom: var(--space-4);
}
.pm-media-card {
  border: 1px solid var(--border-soft); border-radius: var(--radius-md);
  background: var(--bg-surface); padding: var(--card-pad-sm); box-shadow: var(--shadow-sm);
}
.pm-media-card.is-primary { border-left: 3px solid var(--status-success); }
.pm-media-card-top { display: flex; align-items: baseline; gap: var(--space-2); flex-wrap: wrap; }
.pm-media-card-title { font-size: var(--font-body); font-weight: var(--weight-semibold); color: var(--text-primary); }
.pm-media-card-meta { font-size: var(--font-meta); color: var(--text-muted); margin-top: 2px; }
.pm-media-card-tags { display: flex; gap: 5px; flex-wrap: wrap; margin-top: var(--space-2); }
.pm-media-card-acts { display: flex; gap: var(--space-3); flex-wrap: wrap; margin-top: var(--space-2); font-size: var(--font-meta); }
.pm-media-row-acts { white-space: nowrap; }
.pm-media-row-acts .btn-link + .btn-link, .pm-media-row-acts a + .btn-link { margin-left: var(--space-2); }
.pm-danger-link { color: var(--status-danger); }

.pm-scope-box { display: flex; flex-wrap: wrap; gap: var(--space-2) var(--space-3); }
.pm-scope-item { display: inline-flex; align-items: center; gap: 5px; font-size: var(--font-body); }

/* --- Ô GIÁ: dữ liệu chính phải nổi hơn chữ quanh nó --- */
.pm-cell-price { font-weight: var(--weight-semibold); white-space: nowrap; }
.pm-cell-eff { white-space: nowrap; }
.pm-arrow { color: var(--text-disabled); padding: 0 2px; }

/* LIGHT_ONLY_V1: khối @media (prefers-color-scheme: dark) cục bộ đã gỡ (C01). */

/* --- KÉO & THẢ TẢI TỆP LÊN DRIVE (OD-M1) --- */
.pm-drop {
  border: 2px dashed var(--border-strong); border-radius: var(--radius-md);
  background: var(--bg-surface-soft); padding: var(--space-6) var(--space-4);
  text-align: center; cursor: pointer; margin-bottom: var(--space-3);
  transition: background .12s, border-color .12s;
}
.pm-drop:hover, .pm-drop:focus-visible { border-color: var(--brand-primary); background: var(--brand-primary-soft); outline: none; }
.pm-drop.is-over { border-color: var(--brand-primary); background: var(--brand-primary-soft); }
.pm-drop.is-busy { opacity: .6; cursor: progress; }
.pm-drop-title { font-size: var(--font-card-title); font-weight: var(--weight-semibold); color: var(--text-primary); }
.pm-drop-note { font-size: var(--font-help); color: var(--text-muted); margin-top: var(--space-1); }
.pm-drop-limits { opacity: .8; }

.pm-upq { margin-bottom: var(--space-3); }
.pm-upq-row {
  display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap;
  border: 1px solid var(--border-soft); border-radius: var(--radius-sm);
  background: var(--bg-surface); padding: var(--space-2) var(--space-3); margin-bottom: var(--space-2);
  font-size: var(--font-body);
}
.pm-upq-row.is-fail { border-left: 3px solid var(--status-danger); }
.pm-upq-name { flex: 1 1 220px; font-weight: var(--weight-medium); color: var(--text-primary); }
.pm-upq-size { color: var(--text-muted); font-size: var(--font-meta); }
.pm-upq-err { color: var(--status-danger); font-size: var(--font-meta); }

/* --- ẢNH XEM TRƯỚC --- */
.pm-media-thumb {
  height: 132px; margin: calc(var(--card-pad-sm) * -1) calc(var(--card-pad-sm) * -1) var(--space-2);
  border-radius: var(--radius-md) var(--radius-md) 0 0; overflow: hidden;
  background: var(--bg-subtle); display: flex; align-items: center; justify-content: center;
}
.pm-media-thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.pm-media-thumb.is-blank::after {
  content: 'Chưa có ảnh xem trước'; font-size: var(--font-meta); color: var(--text-disabled);
}

/* LIGHT_ONLY_V1: khối @media (prefers-color-scheme: dark) cục bộ đã gỡ (C01). */

/* ====================================================================
   DESIGN SYSTEM V1 — LỚP TINH CHỈNH THỊ GIÁC
   FORM: WEBAPP-DESIGN-SYSTEM-V1-PRODUCT-VISUAL-REFINEMENT-01 · 14/09/2026

   Nguyên tắc của cả khối này:
     · KHÔNG con số lạ. Mọi giá trị phải là token đã có tên.
     · Thang bậc thị giác: DỮ LIỆU NGHIỆP VỤ > TRẠNG THÁI > HÀNH ĐỘNG > CHỮ GIẢI THÍCH.
     · Mã/ID là hạng hai. Nó không bao giờ được to hoặc đậm bằng TÊN.
     · Nút nguy hiểm không bao giờ nổi bằng nút chính.
     · Vay mượn được thì dùng component chung, đừng đẻ biến thể riêng cho Product.
   ==================================================================== */

/* ---------- 0 · CHIỀU SÂU NỀN: app < khối < thẻ ----------
   Trước đây gần như mọi mặt phẳng đều trắng, nên không phân biệt được đâu là nền,
   đâu là nội dung. Ba mức dưới đây đủ để mắt tách lớp mà không cần bóng nặng. */
.pm-fam,
.pm-detail-panel,
.pm-media-card,
.pm-upq-row {
  background: var(--bg-surface);
  border: 1px solid var(--border-soft);
  border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm);
}

/* ---------- 1 · DÒNG SẢN PHẨM — thang bậc rõ ---------- */
.pm-fam-list { gap: var(--space-2); }
.pm-fam { overflow: hidden; transition: border-color .15s, box-shadow .15s; }
.pm-fam:hover { border-color: var(--border-strong); }
.pm-fam-head {
  gap: var(--space-3);
  padding: var(--space-3) var(--space-4);
  align-items: center;
}
.pm-fam-head:hover { background: var(--bg-surface-soft); }

/* TÊN dòng sản phẩm = nhân vật chính của hàng này. */
.pm-fam-name {
  font-size: var(--font-card-title);
  font-weight: var(--weight-semibold);
  color: var(--text-primary);
  letter-spacing: -.01em;
}
/* MÃ = hạng hai. Đọc được, nhưng không tranh chỗ với tên. */
.pm-fam-code {
  font-size: var(--font-meta);
  font-weight: var(--weight-medium);
  color: var(--text-muted);
  background: var(--bg-subtle);
  border: 0;
  border-radius: var(--radius-sm);
  padding: 2px var(--space-2);
  opacity: 1;
}
/* Dữ liệu phụ (đếm model, ghi chú) = hạng ba. */
.pm-fam-sum {
  font-size: var(--font-meta);
  color: var(--text-muted);
  opacity: 1;
  font-variant-numeric: tabular-nums;
}
.pm-fam-caret { color: var(--text-disabled); opacity: 1; }
.pm-fam.open { border-color: var(--pm-select-border); box-shadow: var(--shadow-sm); }
.pm-fam.open > .pm-fam-head { background: var(--pm-select-bg); }
.pm-fam-openflag { font-size: var(--font-badge); padding: 2px var(--space-2); }
.pm-fam-body { padding: 0 var(--space-4) var(--space-4); }

/* HÀNG HÀNH ĐỘNG của dòng sản phẩm: tách khỏi tiêu đề bằng một đường rất nhẹ,
   để nút không trôi lơ lửng giữa hai dòng dữ liệu. */
.pm-fam-ops {
  padding: var(--space-2) var(--space-4) var(--space-3);
  gap: var(--space-2);
  border-top: 1px solid var(--border-soft);
  background: var(--bg-surface-soft);
}
.pm-fam.open .pm-fam-ops { background: transparent; }

/* ---------- 2 · THANG BẬC NÚT — nguy hiểm KHÔNG nổi hơn việc thường ----------
   Trước: Sửa và Ngừng sử dụng cùng một sắc độ, cùng một độ nổi. Người dùng mệt
   thì bấm nhầm. Nay: việc thường = viền nhạt; việc nguy hiểm = chữ đỏ trên nền
   trắng, CHỈ đỏ đậm khi rê chuột vào (tức là khi đã có chủ đích). */
.pm-fam-ops .btn-xs:not(.btn-primary):not(.pm-danger-btn) {
  background: var(--bg-surface);
  color: var(--text-secondary);
  border-color: var(--border-default);
}
.pm-fam-ops .btn-xs:not(.btn-primary):not(.pm-danger-btn):hover {
  background: var(--bg-surface-soft);
  color: var(--text-primary);
  border-color: var(--border-strong);
}
.pm-danger-btn {
  background: var(--bg-surface);
  color: var(--status-danger);
  border-color: var(--status-danger-soft);
  font-weight: var(--weight-medium);
}
.pm-danger-btn:hover:not(:disabled) {
  background: var(--status-danger-soft);
  border-color: var(--status-danger);
  color: var(--status-danger);
  font-weight: var(--weight-semibold);
}

/* ---------- 3 · BẢNG MODEL — đọc được, thẳng cột ---------- */
table.data td { font-size: var(--font-table-cell); }
table.data tbody tr { transition: background .12s; }
table.data tbody tr:hover { background: var(--brand-primary-soft); }
/* Số tiền: canh phải + chữ số đều bề ngang, để mắt so hàng dọc được. */
table.data td.num, table.data th.num {
  font-variant-numeric: tabular-nums;
  font-weight: var(--weight-semibold);
}
/* Ô hành động không bao giờ bị xuống dòng lệt bệt. */
table.data td .pm-fam-ops {
  padding: 0; border-top: 0; background: transparent;
  flex-wrap: nowrap; justify-content: flex-end;
}
/* Mã model trong bảng = hạng hai, nhưng vẫn phải bấm được và đọc được. */
.pm-model-btn code {
  font-size: var(--font-table-cell);
  font-weight: var(--weight-semibold);
  background: transparent;
  padding: 0;
  color: var(--text-link);
}
.pm-model-btn.is-sel code { color: var(--pm-select); }
.pm-dot { font-size: var(--font-meta); }

/* ---------- 4 · CHI TIẾT MODEL — tên trước, mã sau ---------- */
.pm-detail-panel {
  border-left: 3px solid var(--brand-primary);
  padding: var(--card-pad);
}
.pm-detail-head { margin-bottom: var(--space-3); gap: var(--space-3); }
.pm-detail-title {
  font-size: var(--font-section-title);
  font-weight: var(--weight-bold);
  color: var(--text-primary);
  line-height: var(--line-tight);
}
/* Mã model trong tiêu đề: hạng hai, không to bằng tên sản phẩm. */
.pm-detail-title code {
  font-size: var(--font-body);
  font-weight: var(--weight-semibold);
  color: var(--text-muted);
  background: var(--bg-subtle);
  padding: 2px var(--space-2);
  border-radius: var(--radius-sm);
  margin-right: var(--space-1);
}
.pm-detail-status { margin-top: var(--space-2); gap: var(--space-2); }
/* Đóng là điều hướng, không phải hành động nghiệp vụ — giữ nó nhạt. */
#pm-detail-close { color: var(--text-muted); font-weight: var(--weight-medium); }
#pm-detail-close:hover { color: var(--text-primary); }

/* ---------- 5 · BỘ LỌC & Ô NHẬP — cùng chiều cao, đọc được ----------
   Trước: nhãn trường 11px viết cứng, các control cao thấp so le. */
.fbar-field-label { font-size: var(--font-meta); color: var(--text-secondary); letter-spacing: .02em; }
.fbar select, .fbar input, .fbar-select,
.pm-filter-shell select, .pm-filter-shell input {
  height: var(--control-h);
  font-size: var(--font-body);
  border-radius: var(--control-radius);
  border: 1px solid var(--border-default);
  background: var(--bg-surface);
  color: var(--text-primary);
  padding: 0 var(--control-pad-x);
}
.fbar select:focus, .fbar input:focus,
.pm-filter-shell select:focus, .pm-filter-shell input:focus {
  outline: none;
  border-color: var(--border-focus);
  box-shadow: 0 0 0 3px var(--brand-primary-soft);
}
/* Chữ gợi ý không được nhạt tới mức không đọc nổi. */
.fbar input::placeholder, .pm-filter-shell input::placeholder { color: var(--text-disabled); }

/* ---------- 6 · GIÁ & CHÍNH SÁCH — ba tầng thị giác ----------
   Tầng 1 GIÁ CHÍNH THỨC nổi nhất · tầng 2 ĐỀ XUẤT · tầng 3 RANH GIỚI (nội bộ). */
.pm-price-card, .pm-nego { border-radius: var(--radius-md); }
.pm-nego {
  background: var(--bg-surface-soft);
  border: 1px solid var(--border-soft);
  padding: var(--card-pad-sm);
}
.pm-nego-title { font-size: var(--font-card-title); font-weight: var(--weight-semibold); }
.pm-nego-say   { font-size: var(--font-help); color: var(--text-secondary); line-height: var(--line-normal); }
/* Khối 8 mục sẽ phải quyết là tham khảo nội bộ — gọn lại thành lưới, không phải
   một danh sách dài chiếm nửa màn hình. */
.pm-nego-shape {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(200px, 1fr));
  gap: var(--space-2);
}
.pm-field-missing { color: var(--text-disabled); font-style: italic; }

/* ---------- 7 · BĂNG THÔNG BÁO — không to hơn dữ liệu ----------
   Màu vàng CHỈ dùng khi thật sự là cảnh báo cần hành động. Thông tin trung tính
   dùng nền xám, không dùng vàng. */
.ds-banner {
  padding: var(--space-2) var(--space-3);
  font-size: var(--font-help);
  line-height: var(--line-normal);
  border-radius: var(--radius-sm);
}
.ds-banner-neutral { border-left-color: var(--border-strong); background: var(--bg-surface-soft); }
.ds-disclosure { font-size: var(--font-help); }

/* ---------- 8 · TÀI LIỆU & MEDIA — nói rõ tải được cái gì ---------- */
.pm-drop { padding: var(--space-5); border-radius: var(--radius-md); }
.pm-drop-note { font-size: var(--font-help); }
/* Bốn nhóm tệp được phép — hiện thành hàng chip, để người dùng biết ngay được
   phép đưa loại nào lên, thay vì đọc một dòng chữ nhỏ. */
.pm-drop-kinds {
  display: flex; flex-wrap: wrap; gap: var(--space-2);
  justify-content: center; margin-top: var(--space-3);
}
.pm-drop-kind {
  display: inline-flex; align-items: center; gap: var(--space-1);
  font-size: var(--font-badge); font-weight: var(--weight-medium);
  color: var(--text-secondary); background: var(--bg-surface);
  border: 1px solid var(--border-default); border-radius: 999px;
  padding: 3px var(--space-3);
}
.pm-drop-kind b { color: var(--text-primary); font-weight: var(--weight-semibold); }
.pm-drop-kind-ext { color: var(--text-muted); font-weight: var(--weight-normal); }
/* Đích đến của tệp mới — sự thật quan trọng, không giấu trong chữ tí hon. */
.pm-drop-dest {
  margin-top: var(--space-3); font-size: var(--font-help); color: var(--text-secondary);
  background: var(--status-info-soft); border-radius: var(--radius-sm);
  padding: var(--space-2) var(--space-3); display: inline-block;
}
.pm-drop-dest b { color: var(--text-primary); }
/* Khối kết nối Drive: gọn một hàng, không chiếm diện tích của dữ liệu. */
.pm-media-conn { padding: var(--space-2) var(--space-3); font-size: var(--font-help); }
.pm-upq-row { padding: var(--space-2) var(--space-3); font-size: var(--font-body); }
.pm-upq-state { margin-left: auto; }

/* ---------- 9 · TRẠNG THÁI RỖNG — giải thích, không để trắng ---------- */
.empty { padding: var(--space-6); font-size: var(--font-help); color: var(--text-muted); }

/* ---------- 10 · TIÊU ĐIỂM BÀN PHÍM — thấy được ở mọi nút ----------
   Không chỉ dựa vào màu để báo trạng thái: nút vô hiệu có cả độ mờ lẫn con trỏ khác. */
.btn:focus-visible, .btn-link:focus-visible, .pm-fam-head:focus-visible,
.tab:focus-visible, [data-ds-toggle]:focus-visible {
  outline: 2px solid var(--border-focus);
  outline-offset: 2px;
  border-radius: var(--radius-sm);
}
.btn:disabled, .btn[disabled] { opacity: .55; cursor: not-allowed; }

/* ---------- 11 · MÀN HÌNH HẸP HƠN (1366x768) ----------
   Không thu nhỏ chữ để nhét dữ liệu. Thay vào đó giảm đệm và cho bảng tự cuộn ngang. */
@media (max-width: 1400px) {
  .pm-fam-head { padding: var(--space-2) var(--space-3); }
  .pm-detail-panel { padding: var(--card-pad-sm); }
  .table-scroll { overflow-x: auto; }
  .pm-media-counts { gap: var(--space-2); }
}

/* ---------- KHO GOOGLE DRIVE — huy hiệu trạng thái + hành động nhẹ ----------
   FORM: WEBAPP-PRODUCT-WEBAPP-FIRST-DRIVE-PROVISIONING-V1-01 · 14/09/2026
   Mã thư mục Drive là metadata KỸ THUẬT, không phải thông tin nghiệp vụ. Người bán
   hàng không cần nhìn nó và nhìn cũng không làm gì được. Ô này hiện TRẠNG THÁI. */
.pm-drive-cell { display: inline-flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
.pm-drive-retry { font-size: var(--font-meta); font-weight: var(--weight-semibold); }
/* "Mở vị trí lưu trữ" là tiện ích cho quản trị kỹ thuật, KHÔNG phải luồng nghiệp vụ
   chính — nên nó phải nhạt hơn mọi thứ khác trong ô. */
.pm-drive-open { font-size: var(--font-meta); color: var(--text-muted); font-weight: var(--weight-normal); }
.pm-drive-open:hover { color: var(--text-secondary); }
/* Hàng tiêu đề dòng sản phẩm nay có thêm ô trạng thái kho, đặt sát mép phải
   cạnh nhóm nút — cùng hàng, không đẩy tên xuống. */
.pm-fam-drive { padding: 0 var(--space-4) var(--space-2); }
.pm-fam.open .pm-fam-drive { padding-bottom: var(--space-1); }

/* =====================================================================
   WEBAPP05-C1B-ADMIN-CONTROL-PLANE-OBSERVE-V1-01
   TRUNG TÂM QUẢN TRỊ — NGƯỜI DÙNG & TỔ CHỨC

   LUẬT TỰ ÁP CHO KHỐI NÀY (Design System V1 · PHẦN B):
     · CHỈ dùng token ở :root. Không một mã màu hay cỡ chữ viết cứng nào.
     · KHÔNG định nghĩa lại .panel .data .tag-* .btn-* — dùng nguyên lớp chung.
       (Hai bản của .btn-ghost/.btn-danger từng âm thầm đè nhau; không lặp lại.)
     · Sàn chữ nghiệp vụ 12.5px (--text-sm). --text-xs chỉ cho mã kỹ thuật.
     · Không tự cộng offset sticky — khối này không dính.
   Tiền tố .org- nên không va vào lớp của module nào khác.
   ===================================================================== */

/* Băng trạng thái chế độ — thứ người dùng phải đọc trước khi bấm bất cứ gì */
.org-banner {
  background: var(--status-warning-soft);
  border: 1px solid var(--status-warning);
  color: var(--text-primary);
  border-radius: var(--radius-md);
  padding: 10px 12px;
  font-size: var(--text-md);
  line-height: var(--line-normal);
  margin-bottom: var(--space-3);
}
.org-banner-info {
  background: var(--status-info-soft);
  border-color: var(--border-focus);
}

/* Dải số tổng quan */
.org-stats { display: flex; flex-wrap: wrap; gap: var(--space-3); margin-bottom: var(--space-3); }
.org-stat { flex: 1 1 190px; min-width: 190px; }
.org-stat-num {
  font-size: var(--text-metric);
  font-weight: var(--weight-bold);
  color: var(--text-primary);
  line-height: var(--line-tight);
}
.org-stat-label { font-size: var(--text-md); color: var(--text-secondary); font-weight: var(--weight-medium); }
.org-stat-sub   { font-size: var(--text-sm); color: var(--text-muted); margin-top: 2px; }
.org-stat-warn  { border-color: var(--status-warning); background: var(--status-warning-soft); }

/* ---- WEBAPP-SETTINGS-USERS-ORG-OVERVIEW-UI-V1-01 · đầu workspace + Tổng quan ----
   Chỉ token sẵn có. Tiền tố .org-head / .org-ov- ⇒ không va lớp module khác.
   Khối @media của phần này nằm NGAY CUỐI khối, sau mọi quy tắc nó cần đè. */
.org-head { padding: 12px 18px; margin-bottom: var(--space-3); flex-wrap: nowrap; }
.org-head > .page-header-left { flex: 1 1 auto; min-width: 0; }
.org-head .pm-head-info > summary { white-space: nowrap; }
.org-head-right { position: relative; }
.org-head .pm-head-info-body { position: absolute; right: 0; top: 100%; z-index: 5; width: min(560px, calc(100vw - 32px)); max-width: none; box-shadow: var(--shadow-sm); }
.org-head .pm-head-info-body code { white-space: normal; overflow-wrap: anywhere; }
.org-head h1 { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; font-size: var(--text-xl); }
.org-head-badge { font-size: var(--text-sm); font-weight: var(--weight-medium); }
.org-head-right { display: flex; align-items: center; gap: var(--space-2); flex: 0 1 430px; min-width: 260px; }
.org-head-note {
  flex: 1 1 auto; min-width: 0;
  background: var(--status-info-soft); color: var(--status-info);
  border: 1px solid var(--border-focus); border-radius: var(--radius-md);
  padding: 6px 10px; font-size: var(--text-sm); line-height: var(--line-normal);
}
.org-crumb-home { color: inherit; text-decoration: none; }
.org-crumb-home:hover { text-decoration: underline; }

.org-ov-banner { padding: 6px 10px; font-size: var(--text-sm); }

.org-ov-cards {
  display: grid; gap: var(--space-3); margin-bottom: var(--space-3);
  grid-template-columns: repeat(auto-fit, minmax(170px, 1fr));
}
.org-ov-card { margin: 0; padding: 12px 14px; min-width: 0; }
.org-ov-card.is-warn { border-color: var(--status-warning); background: var(--status-warning-soft); }
.org-ov-icon {
  width: 34px; height: 34px; border-radius: var(--radius-md); display: grid; place-items: center;
  font-size: 18px; background: var(--tone-bg, var(--bg-subtle)); color: var(--tone-fg, var(--text-secondary));
  margin-bottom: 6px;
}
.org-ov-num { font-size: var(--text-metric); font-weight: var(--weight-bold); color: var(--text-primary); line-height: var(--line-tight); }
.org-ov-label { font-size: var(--text-md); color: var(--text-primary); font-weight: var(--weight-semibold, 600); }
.org-ov-sub { font-size: var(--text-sm); color: var(--text-muted); margin-top: 2px; }

.org-ov-grid { display: grid; gap: var(--space-3); grid-template-columns: minmax(0, 2fr) minmax(300px, 1fr); align-items: start; }
.org-ov-side { display: grid; gap: var(--space-3); min-width: 0; }
.org-ov-people, .org-ov-tree, .org-ov-rules { margin: 0; min-width: 0; }
.org-ov-phead { display: flex; justify-content: space-between; align-items: flex-start; gap: var(--space-2); flex-wrap: wrap; margin-bottom: var(--space-2); }
.org-ov-ptitle { font-size: var(--text-lg); font-weight: var(--weight-bold); color: var(--text-primary); }
.org-ov-psub { font-size: var(--text-sm); color: var(--text-muted); }
.org-ov-tools { display: flex; gap: var(--space-2); flex-wrap: wrap; align-items: center; }
.org-ov-seg, .org-ov-views { display: inline-flex; border: 1px solid var(--border-default); border-radius: var(--radius-md); overflow: hidden; }
.org-ov-segbtn, .org-ov-view {
  border: 0; background: var(--bg-surface); color: var(--text-secondary); padding: 4px 10px;
  font-size: var(--text-sm); cursor: pointer; min-height: 28px;
}
.org-ov-segbtn + .org-ov-segbtn, .org-ov-view + .org-ov-view { border-left: 1px solid var(--border-default); }
.org-ov-segbtn.active, .org-ov-view.active { background: var(--brand-primary-soft); color: var(--brand-primary); font-weight: var(--weight-bold); }

.org-ov-scroll { max-height: min(420px, 52vh); overflow: auto; border: 1px solid var(--border-soft); border-radius: var(--radius-md); }
.org-ov-table { table-layout: fixed; width: 100%; margin: 0; }
/* Lớp chung ở ≤1024 biến table.data thành khối tự cuộn (display:block) — bảng này đã có khung cuộn riêng nên giữ display:table (đặc hiệu cao hơn, không phụ thuộc thứ tự tệp). */
.org-ov-scroll table.data { display: table; max-width: none; overflow: visible; }
.org-ov-table thead th { position: sticky; top: 0; z-index: 1; background: var(--bg-subtle); }
.org-ov-table td { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; vertical-align: middle; }
.org-ov-code { font-weight: var(--weight-bold); color: var(--text-primary); }
.org-ov-table .tag { padding: 1px 6px; }
table.data.org-ov-table th, table.data.org-ov-table td { padding-left: 6px; padding-right: 6px; }
.org-ov-person { display: flex; align-items: center; gap: 8px; min-width: 0; }
.org-ov-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; min-width: 0; }
.org-ov-av {
  flex: 0 0 26px; width: 26px; height: 26px; border-radius: 50%; display: grid; place-items: center;
  background: var(--bg-subtle); color: var(--text-secondary); font-size: var(--text-xs); font-weight: var(--weight-bold);
}
.org-ov-open { min-width: 28px; padding: 0 6px; }
.org-ov-foot { font-size: var(--text-sm); color: var(--text-muted); margin-top: var(--space-2); }

.org-ov-root { border: 1px solid var(--border-focus); background: var(--status-info-soft); border-radius: var(--radius-md); padding: 8px 10px; margin-bottom: var(--space-2); }
.org-ov-rootlbl, .org-ov-branchlbl { font-weight: var(--weight-bold); color: var(--text-primary); display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.org-ov-rootnames { font-size: var(--text-sm); color: var(--text-secondary); margin-top: 2px; }
.org-ov-count { font-size: var(--text-sm); font-weight: var(--weight-medium); color: var(--text-secondary); background: var(--bg-subtle); border-radius: 999px; padding: 0 8px; white-space: nowrap; }
.org-ov-muted { font-size: var(--text-sm); color: var(--text-muted); font-weight: var(--weight-medium); }
.org-ov-nodes { list-style: none; margin: 6px 0 0; padding: 0 0 0 12px; border-left: 2px solid var(--border-soft); max-height: min(220px, 30vh); overflow: auto; }
.org-ov-node { display: flex; align-items: center; gap: 8px; padding: 4px 6px; min-width: 0; }
.org-ov-nname { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--text-md); }
.org-ov-nname small { color: var(--text-muted); margin-left: 6px; }
.org-ov-gap { font-size: var(--text-sm); color: var(--text-muted); margin-top: var(--space-2); border-top: 1px dashed var(--border-soft); padding-top: 6px; }

.org-ov-rulegrid { display: grid; gap: var(--space-2); grid-template-columns: repeat(auto-fit, minmax(170px, 1fr)); margin-top: var(--space-2); }
.org-ov-rule { border: 1px solid var(--border-soft); border-radius: var(--radius-md); padding: 8px 10px; background: var(--bg-surface); }
.org-ov-rule b { display: block; font-size: var(--text-md); color: var(--text-primary); }
.org-ov-rule span { font-size: var(--text-sm); color: var(--text-muted); }

@media (max-width: 1100px) {
  .org-ov-grid { grid-template-columns: minmax(0, 1fr); }
  .org-head { flex-wrap: wrap; }
  .org-head-right { flex-basis: 100%; min-width: 0; }
}
@media (max-width: 640px) {
  .org-ov-scroll { max-height: none; }
  .org-ov-table { table-layout: auto; }
  .org-ov-table td { white-space: normal; }
}

/* ---- WEBAPP-SETTINGS-USERS-ORG-2TAB-CORE-V2-01 · hai workspace Nhân sự & Tổ chức / Quyền & Ủy quyền ----
   Bố cục chia đôi dùng NGUYÊN lớp .scv* của Danh mục hệ thống (đã LOCK). Khối này chỉ thêm phần riêng của Tổ chức,
   tiền tố .org-w- / .org-p-, chỉ token. @media của khối nằm CUỐI khối. */
.org-page .scv { margin-top: var(--space-1); }
.org-w-sec { font-size: var(--font-meta); font-weight: var(--weight-semibold); color: var(--text-muted); text-transform: uppercase; letter-spacing: .04em; margin: var(--space-3) 0 var(--space-1); }
.org-w-code { color: var(--text-muted); font-weight: var(--weight-medium); font-size: var(--font-meta); margin-left: 6px; }
.org-w-thu { margin-left: 6px; padding: 1px 6px; }
.org-w-nochev { visibility: hidden; cursor: default; }
.org-w-search { width: 100%; min-height: 36px; padding: 6px 10px; border: 1px solid var(--border-default); border-radius: var(--radius-md); background: var(--bg-surface); color: var(--text-primary); font: inherit; margin-bottom: var(--space-2); }
.org-w-search:focus { outline: none; border-color: var(--brand-primary); box-shadow: 0 0 0 3px var(--brand-primary-soft); }
.org-w-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-bottom: var(--space-2); }
#org-w-list .scv-list-head, #org-p-list .scv-list-head { margin-bottom: var(--space-2); }
.org-ov-card[data-wpv] { cursor: pointer; }
.org-ov-card[data-wpv]:hover { border-color: var(--brand-primary); }
.org-ov-card[data-wpv]:focus-visible { outline: 2px solid var(--brand-primary); outline-offset: 2px; }
/* Panel lồng trong khung chi tiết: nhẹ hơn panel ngoài để không thành "hộp trong hộp". */
#org-w-detail .panel { box-shadow: none; border: 1px solid var(--border-soft); padding: 12px; margin: 0 0 var(--space-3); }
#org-w-detail .org-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-bottom: var(--space-3); }
#org-w-detail .org-half { min-width: 0; flex-basis: 260px; }
.org-p-sec:first-of-type { border-top: 0; margin-top: 0; padding-top: 0; }
.org-p-owner { margin: 0 0 var(--space-2); padding: 0; list-style: none; display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 6px var(--space-4); }
.org-p-owner li { font-size: var(--font-body); color: var(--text-secondary); }
.org-w-audit { margin-top: var(--space-3); }
/* COMPACT-HEADER-V2-PATCH-01 · đầu trang gọn + huy hiệu "Chế độ quan sát ⓘ" (dải tóm tắt → thẻ số gọn ở VISUAL-POLISH-V2-02).
   Khoá theo .org-head-v3 / .org-strip ⇒ không đụng đầu trang Danh mục hệ thống (.settings-page > .page-header). */
.org-head.org-head-v3 { padding: 8px 14px; margin-bottom: 0; flex-wrap: nowrap; align-items: center; }
/* .crm là flex-cột gap 16px ⇒ lề riêng của vỏ tab cộng dồn; bỏ bớt, chỉ ở trang Tổ chức (#org-shell). */
.org-page > #org-shell { padding: 2px 0 4px; margin-bottom: 0; }
.org-head.org-head-v3 h1 { font-size: var(--text-xl); margin: 0; line-height: var(--line-tight); }
.org-head.org-head-v3 p { margin: 2px 0 0; font-size: var(--text-sm); color: var(--text-muted); }
.org-head.org-head-v3 .org-head-right { flex: 0 0 auto; min-width: 0; }
.org-obs > summary.org-head-badge { list-style: none; cursor: pointer; white-space: nowrap; border: 0; padding: 3px 10px; }
.org-obs > summary.org-head-badge::-webkit-details-marker { display: none; }
.org-obs > summary.org-head-badge:focus-visible { outline: 2px solid var(--brand-primary); outline-offset: 2px; }
.org-obs > .pm-head-info-body p { margin: 0 0 6px; }
/* VISUAL-POLISH-V2-02 · thứ bậc chữ · thẻ số gọn · bộ lọc dạng nút phân đoạn · dòng cây 2 tầng · panel Quyền.
   Mọi quy tắc khoá trong .org-page / #org-w-* / #org-p-* ⇒ KHÔNG đổi .scv* dùng chung của Danh mục hệ thống (LOCK).
   Thứ bậc: tiêu đề trang 17/600 · tiêu đề khối 15/600 · tên người 13,5/600 · chữ thân 13,5 · chữ phụ 12,5 (sàn đọc 12,5px). */
.org-head.org-head-v3 h1 { font-weight: var(--weight-semibold); }
.org-page .scv-title { font-size: var(--text-lg); font-weight: var(--weight-semibold); line-height: var(--line-normal); }
.org-page .scv-dtitle .scv-title { font-weight: var(--weight-bold); }
.org-sec-ico { font-size: var(--text-lg); margin-right: 6px; }
.org-page .scv-list, .org-page .scv-detail { padding: 14px 16px; }
.org-page .scv-dhead { align-items: center; }
.org-dhead-right { margin-left: auto; flex: 0 0 auto; align-self: flex-start; }
.org-page .scv-dl { gap: var(--space-3) var(--space-4); }
.org-page .scv-dl .scv-label { font-size: var(--font-meta); font-weight: var(--weight-medium); color: var(--text-muted); }
.org-page .scv-dl-val { line-height: var(--line-normal); }
.org-page .scv-help { font-size: var(--font-meta); color: var(--text-muted); line-height: var(--line-normal); }

/* Thẻ số gọn — một hàng khi đủ chỗ, cao ~62px */
.org-stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-2); margin-bottom: var(--space-3); }
.org-sc {
  display: flex; align-items: center; gap: 10px; min-width: 0; min-height: 58px; padding: 10px 12px;
  background: var(--bg-surface); border: 1px solid var(--border-soft); border-radius: var(--radius-md); box-shadow: var(--shadow-sm);
  font: inherit; color: inherit; text-align: left;
}
button.org-sc { cursor: pointer; }
button.org-sc:hover { border-color: var(--brand-primary); }
button.org-sc:focus-visible { outline: 2px solid var(--brand-primary); outline-offset: 2px; }
.org-sc.is-warn { border-color: var(--status-warning); }
.org-sc-ico {
  flex: 0 0 36px; width: 36px; height: 36px; border-radius: var(--radius-md);
  display: inline-flex; align-items: center; justify-content: center; font-size: 18px;
  background: var(--tone-bg); color: var(--tone-fg);
}
.org-sc-body { display: flex; flex-direction: column; min-width: 0; }
.org-sc-label { font-size: var(--font-meta); font-weight: var(--weight-medium); color: var(--text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.org-sc-line { display: flex; align-items: baseline; gap: 8px; min-width: 0; }
.org-sc-num { font-size: var(--text-2xl); font-weight: var(--weight-bold); color: var(--text-primary); line-height: var(--line-tight); }
.org-sc.is-warn .org-sc-num { color: var(--status-warning); }
.org-sc-sub { font-size: var(--font-meta); color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }

/* Hàng công cụ: ô tìm + bộ lọc cùng nhịp */
.org-w-tools { display: flex; align-items: center; gap: var(--space-2); margin-bottom: var(--space-2); }
.org-w-tools .org-w-search { flex: 1 1 auto; min-width: 0; margin-bottom: 0; }
.org-w-tools .org-ov-seg {
  flex: 0 0 auto; display: inline-flex; gap: 2px; padding: 2px;
  background: var(--bg-subtle); border: 1px solid var(--border-soft); border-radius: var(--radius-md); overflow: visible;
}
.org-w-tools .org-ov-segbtn {
  border: 0; border-radius: var(--radius-sm); background: transparent; color: var(--text-secondary);
  padding: 4px 12px; min-height: 30px; font-size: var(--font-meta); font-weight: var(--weight-medium); cursor: pointer;
}
.org-w-tools .org-ov-segbtn + .org-ov-segbtn { border-left: 0; }
.org-w-tools .org-ov-segbtn:hover { color: var(--text-primary); }
.org-w-tools .org-ov-segbtn.active {
  background: var(--brand-primary-soft); color: var(--brand-primary); font-weight: var(--weight-semibold);
  box-shadow: inset 0 0 0 1px var(--brand-primary);
}
.org-w-tools .org-ov-segbtn:focus-visible { outline: 2px solid var(--brand-primary); outline-offset: 1px; }

/* Dòng cây / danh sách: tên đậm ở trên, vai · mã ở dưới */
.org-page .scv-tree .scv-row { padding: 8px 10px; gap: 10px; }
.org-page .scv-tree .scv-row + .scv-row, .org-page .scv-tree .scv-group + .scv-group { margin-top: 2px; }
.org-page .scv-name.org-nm { display: flex; flex-direction: column; gap: 1px; white-space: normal; }
.org-nm-main { font-size: var(--font-body); font-weight: var(--weight-semibold); color: var(--text-primary); line-height: var(--line-normal); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.org-page .scv-crow .org-nm-main { font-weight: var(--weight-medium); }
.org-nm-meta { font-size: var(--font-meta); font-weight: var(--weight-normal); color: var(--text-muted); line-height: var(--line-normal); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.org-pill {
  flex: 0 0 auto; padding: 2px 8px; border-radius: 999px; white-space: nowrap;
  background: var(--brand-primary-soft); color: var(--brand-primary); font-size: var(--font-meta); font-weight: var(--weight-semibold);
}

/* Panel Quyền: mục tách rõ, tiêu đề mục 15/600 có biểu tượng */
.org-p-sec { border-top: 1px solid var(--border-soft); padding-top: var(--space-4); margin-top: var(--space-4); }
.org-p-h { display: flex; align-items: center; margin: 0 0 var(--space-3); font-size: var(--text-lg); font-weight: var(--weight-semibold); color: var(--text-primary); line-height: var(--line-normal); }
.org-p-empty {
  display: flex; align-items: center; gap: 12px; padding: 10px 12px;
  border: 1px dashed var(--border-default); border-radius: var(--radius-md); background: var(--bg-surface-soft);
}
.org-p-empty strong { color: var(--text-primary); font-size: var(--font-body); }
.org-p-empty .org-muted { font-size: var(--font-meta); margin-top: 2px; }
.org-p-empty-ico {
  flex: 0 0 32px; width: 32px; height: 32px; border-radius: var(--radius-md); background: var(--bg-subtle);
  display: inline-flex; align-items: center; justify-content: center; font-size: 16px;
}
.org-p-owner li { display: flex; align-items: baseline; gap: 6px; line-height: var(--line-normal); }
.org-p-owner li::before { content: "🔒"; font-size: 12px; }
.org-w-audit > summary { cursor: pointer; display: flex; align-items: baseline; flex-wrap: wrap; gap: 4px var(--space-2); padding: 6px 0; }
.org-w-audit > summary .org-p-h { display: inline-flex; margin: 0; }
.org-w-audit > summary .org-muted { font-size: var(--font-meta); }

/* Quyền & Ủy quyền · nối API thật (SETTINGS-PERMISSION-DELEGATION-UI-INTEGRATION-V1-01): một thẻ / module + biểu mẫu tại chỗ */
.org-pm { border: 1px solid var(--border-soft); border-radius: var(--radius-md); padding: 10px 12px; background: var(--bg-surface); }
.org-pm + .org-pm { margin-top: var(--space-2); }
.org-pm.is-off { background: var(--bg-surface-soft); }
.org-pm.is-off .org-pm-name, .org-pm.is-off .org-pm-eff { color: var(--text-muted); }
.org-pm-top { display: flex; align-items: center; flex-wrap: wrap; gap: 6px var(--space-2); }
.org-pm-name { font-size: var(--font-body); font-weight: var(--weight-semibold); color: var(--text-primary); }
.org-pm-eff { margin-left: auto; padding: 2px 8px; border-radius: 999px; background: var(--brand-primary-soft); color: var(--brand-primary);
  font-size: var(--font-meta); font-weight: var(--weight-semibold); white-space: nowrap; }
.org-pm-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: 4px var(--space-3); margin-top: 6px;
  font-size: var(--font-body); color: var(--text-secondary); }
.org-pm-grid .scv-label { display: block; font-size: var(--font-meta); color: var(--text-muted); }
.org-pm-note { margin-top: 6px; font-size: var(--font-meta); color: var(--text-muted); }
.org-pm-acts { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-2); }
.org-pm-form { margin-top: var(--space-3); padding-top: var(--space-3); border-top: 1px dashed var(--border-default); }
.org-pm-form-h { font-size: var(--font-body); font-weight: var(--weight-semibold); color: var(--text-primary); margin-bottom: 4px; }
.org-pm-form select, .org-pm-form textarea, .org-pm-form input[type="datetime-local"] { width: 100%; max-width: 420px; box-sizing: border-box; }
.org-pm-exp { border: 0; margin: 0; padding: 0; min-width: 0; }
.org-pm-radio { display: inline-flex; align-items: center; gap: 6px; margin-right: var(--space-3); font-size: var(--font-body); color: var(--text-secondary); }
.org-pm-flash { margin-bottom: var(--space-2); padding: 6px 10px; border-radius: var(--radius-md); background: var(--status-success-soft); color: var(--status-success);
  font-size: var(--font-body); font-weight: var(--weight-medium); }
.org-pm-hist-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--space-2); }
.org-pm-hist { padding: 8px 10px; border: 1px solid var(--border-soft); border-radius: var(--radius-md); }
.org-pm-hist-top { font-size: var(--font-body); color: var(--text-primary); line-height: var(--line-normal); }
.org-pm-hist .org-muted { font-size: var(--font-meta); margin-top: 2px; word-break: break-word; }

@media (max-width: 1100px) {
  .org-head.org-head-v3 { flex-wrap: nowrap; }
  .org-head.org-head-v3 .org-head-right { flex-basis: auto; }
}
@media (max-width: 820px) {
  .org-w-actions .btn { min-height: 36px; }
  .org-head.org-head-v3 { flex-wrap: wrap; row-gap: 6px; }
  .org-stats { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .org-w-tools .org-ov-segbtn { min-height: 34px; }
}
@media (max-width: 520px) {
  .org-pm-acts .btn, .org-pm-form .btn { min-height: 40px; }
  .org-pm-eff { margin-left: 0; }
  .org-w-tools { flex-wrap: wrap; }
  .org-w-tools .org-w-search { flex-basis: 100%; }
  .org-sc { padding: 8px 10px; gap: 8px; }
  .org-sc-ico { flex-basis: 30px; width: 30px; height: 30px; font-size: 15px; }
  .org-sc-sub { display: none; }
  /* Đầu trang xuống dòng ⇒ huy hiệu nằm bên TRÁI; ô giải thích neo trái để không tràn ra ngoài màn (đo 375: left −179px). */
  .org-head.org-head-v3 .pm-head-info-body { left: 0; right: auto; width: calc(100vw - 32px); }
}

/* Hai cột cạnh nhau — dùng cho HỒ SƠ vs TÀI KHOẢN, và cho các bảng đôi */
.org-two  { display: flex; flex-wrap: wrap; gap: var(--space-4); }
.org-half { flex: 1 1 320px; min-width: 300px; }
.org-half-title {
  font-size: var(--text-md);
  font-weight: var(--weight-bold);
  color: var(--text-secondary);
  text-transform: uppercase;
  letter-spacing: .02em;
  margin-bottom: var(--space-2);
}

.org-muted { font-size: var(--text-sm); color: var(--text-muted); }
.org-json  { font-size: var(--text-sm); color: var(--text-secondary); max-width: 260px; word-break: break-word; }

/* Cảnh báo tại chỗ: dùng đúng khi HỒ SƠ và TÀI KHOẢN nói hai điều khác nhau */
.org-warn-inline {
  font-size: var(--text-sm);
  color: var(--status-warning);
  font-weight: var(--weight-medium);
  margin-top: var(--space-1);
}

.org-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; }

.org-list { margin: var(--space-2) 0 0; padding-left: 18px; font-size: var(--text-md); line-height: var(--line-normal); }
.org-list li { margin-bottom: 2px; }

/* Cây tổ chức — không giả lập cấp bậc nào ngoài quan hệ có thật trong dữ liệu */
.org-tree { margin: 0; padding-left: 18px; font-size: var(--text-md); line-height: var(--line-normal); }
.org-tree ul { padding-left: 20px; margin: var(--space-1) 0 var(--space-2); }
.org-tree li { margin-bottom: 3px; }

/* Form đề xuất CTV */
.org-form { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; margin-bottom: var(--space-2); }
.org-form input {
  font-family: inherit;
  font-size: var(--text-md);
  padding: 5px 8px;
  border: 1px solid var(--border-strong);
  border-radius: var(--radius-sm);
  min-width: 180px;
  color: var(--text-primary);
  background: var(--bg-surface);
}
.org-form input:focus { outline: 2px solid var(--border-focus); outline-offset: -1px; }

@media (max-width: 1100px) {
  .org-half { flex-basis: 100%; }
}

/* CRM-CORE-V1 — dòng bảng bấm được để mở hồ sơ khách hàng.
   Dùng token của hệ thiết kế, không viết cứng màu (WEBAPP_DESIGN_SYSTEM_V1 mục A). */
.data tr.row-link { cursor: pointer; }
.data tr.row-link:hover { background: var(--bg-surface-soft); }
.data tr.row-link:focus-visible { outline: 2px solid var(--brand-primary-hover); outline-offset: -2px; }

/* =====================================================================
   WEBAPP05-GLOBAL-APP-SHELL-RESPONSIVE-V1-01 · KHUNG ỨNG DỤNG RESPONSIVE
   Chỉ lớp KHUNG + lớp dùng chung. Không đụng bố cục nghiệp vụ của module.

   BA MỐC — tên theo VIỆC, con số theo khung đang chạy:
     DESKTOP_LARGE  > 1180px    thanh bên đầy đủ 260px
     DESKTOP        1025–1180px thanh bên 220px (quy ước cũ, giữ nguyên)
     TABLET/MOBILE  ≤ 1024px    thanh bên thành NGĂN KÉO (off-canvas) mở bằng nút ☰
     MOBILE         ≤ 640px     topbar gọn, đệm nội dung nhỏ hơn
   Thứ tự tầng: module 15 < CSKH 20 < topbar 30 < nút nổi CSKH 80
              < nền mờ ngăn kéo 90 < ngăn kéo 95 < hộp thoại 100.
   (Hộp thoại luôn NỔI TRÊN menu; menu luôn nổi trên nội dung.)
   ===================================================================== */
:root {
  --shell-sidebar-w:    260px;
  --shell-sidebar-w-md: 220px;
  --shell-drawer-w:     min(300px, 86vw);
  --z-shell-backdrop:   90;
  --z-shell-drawer:     95;
}

/* Ô nội dung được CO: minmax(0,1fr) thay cho 1fr — nội dung rộng không kéo giãn cả trang. */
.app-shell { grid-template-columns: var(--shell-sidebar-w) minmax(0, 1fr); }
@media (max-width: 1180px) {
  .app-shell { grid-template-columns: var(--shell-sidebar-w-md) minmax(0, 1fr); }
}

/* Lưới dùng chung (.split · .home-grid · .kpi-row): ô lưới được CO dưới min-content.
   Không có dòng này, một bảng dài trong ô lưới kéo cả lưới rộng hơn màn hình (đo: CRM ở
   390px rộng 493px). Trên máy tính không đổi gì vì nội dung vốn đã vừa. */
.split > *, .home-grid > *, .kpi-row > *, .panel { min-width: 0; }

/* Thẻ người dùng cuối thanh bên: khối tên co giãn, nút đăng xuất không chiếm chỗ tên. */
.user-card > div:not(.user-avatar) { flex: 1 1 auto; min-width: 0; }
.user-card .logout-btn { flex: 0 0 auto; }
.user-name, .user-role { overflow-wrap: anywhere; }

/* Topbar: mọi phần tử được co, ô tìm kiếm co giãn thay vì cứng 320px. */
.topbar { min-width: 0; }
.welcome { min-width: 0; }
.welcome > div:not(.welcome-avatar) { min-width: 0; }
.welcome-title { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.topbar-right { min-width: 0; flex: 0 1 auto; }
.search { width: clamp(180px, 24vw, 320px); min-width: 0; flex: 0 1 auto; }

/* Nút mở menu + nền mờ: chỉ hiện ở ngăn kéo. */
.shell-menu-btn {
  display: none; flex: 0 0 auto;
  width: var(--control-h); height: var(--control-h);
  align-items: center; justify-content: center;
  border: 1px solid var(--border-strong); border-radius: var(--control-radius);
  background: var(--bg-surface); color: var(--text-primary);
  font-size: var(--font-section-title); line-height: 1; cursor: pointer;
}
.shell-menu-btn:hover { background: var(--bg-surface-soft); }
.shell-menu-btn:focus-visible { outline: 2px solid var(--border-focus); outline-offset: 2px; }
.shell-backdrop { display: none; }

/* SCA-A · SCA-01 — ô CHỌN (radio/checkbox) KHÔNG phải ô NHẬP. Quy tắc .scv-field input (khối SCV2 đã KHOÁ) dựng ô nhập chữ
   (rộng 100%, cao 40px, đệm, viền bo) và từng áp NHẦM cả lên ô chọn ⇒ vòng tròn phình rộng
   200–420px, chữ bị đẩy sang phải và gãy dòng (Lịch → Tạo lịch: "Có giờ/Cả ngày",
   "Yêu cầu người tham gia xác nhận OK"). Trả ô chọn về kích thước tự nhiên; chữ trong
   <label class="check"> vẫn bấm được nên vùng bấm không nhỏ đi.
   ⛔ Đặt NGOÀI khối SCV2 có chủ ý: khối đó bị khoá từng ký tự. Độ đặc hiệu (0,2,1) > (0,1,1) nên không phụ thuộc thứ tự. */
.scv-field input[type="radio"], .scv-field input[type="checkbox"] {
  width: 16px; height: 16px; min-height: 0; flex: 0 0 auto;
  margin: 0; padding: 0; border-radius: 0; cursor: pointer;
  accent-color: var(--brand-primary);
}
.scv-field input[type="radio"] { border-radius: 50%; }
.scv-field input[type="radio"]:focus, .scv-field input[type="checkbox"]:focus { box-shadow: none; }
.scv-field input[type="radio"]:focus-visible, .scv-field input[type="checkbox"]:focus-visible { outline: 2px solid var(--border-focus); outline-offset: 2px; }
.scv-field label.check { cursor: pointer; }

/* SCA-A · SCA-13 — nhãn THỬ NGHIỆM trên thanh trên. Máy tính (> 1024px) KHÔNG hiện: thẻ người dùng
   ở thanh bên đã nói điều đó. ≤ 1024px thanh bên thành ngăn kéo (bị giấu) ⇒ nhãn chuyển lên đây.
   Hiện/ẩn theo đúng cờ phiên is_test_data (app.js renderSession), không suy từ tên người dùng. */
.topbar-test-badge {
  display: none; flex: 0 0 auto; align-items: center;
  padding: 2px 8px; border-radius: 999px; white-space: nowrap;
  background: var(--status-warning-soft); color: var(--status-warning);
  border: 1px solid var(--status-warning);
  font-size: var(--font-meta); font-weight: var(--weight-semibold); line-height: 1.4;
}
@media (max-width: 1024px) {
  .topbar-test-badge:not([hidden]) { display: inline-flex; }
}

/* Hộp thoại + ô nhập: không bao giờ vượt khung nhìn. */
.modal-card { max-width: min(560px, 100%); max-height: calc(100dvh - 2 * var(--space-5)); }
.kpi-modal { max-width: min(780px, 100%); }
.modal-form { min-height: 0; }
.modal-form input, .modal-form select, .modal-form textarea,
.form-input { max-width: 100%; min-width: 0; }

/* ---------- TABLET + MOBILE: thanh bên thành ngăn kéo ---------- */
@media (max-width: 1024px) {
  .app-shell { grid-template-columns: minmax(0, 1fr); }
  .sidebar {
    position: fixed; top: 0; left: 0; bottom: 0;
    width: var(--shell-drawer-w); height: 100dvh;
    z-index: var(--z-shell-drawer);
    transform: translateX(-100%); visibility: hidden;
    transition: transform .2s ease, visibility 0s linear .2s;
  }
  body.shell-nav-open .sidebar {
    transform: none; visibility: visible; box-shadow: var(--shadow-floating);
    transition: transform .2s ease, visibility 0s;
  }
  body.shell-nav-open .shell-backdrop {
    display: block; position: fixed; inset: 0;
    background: rgba(15, 23, 42, .45); z-index: var(--z-shell-backdrop);
  }
  body.shell-nav-open { overflow: hidden; }
  .shell-menu-btn { display: inline-flex; }
  .topbar { padding: var(--space-3) var(--space-4); gap: var(--space-3); }
  .view { padding: var(--space-4) var(--space-4) var(--space-8); }

  /* Bảng rộng CUỘN TRONG khung của nó. Bảng đã có vỏ cuộn (.table-scroll,
     .import-table-wrap) giữ nguyên. Không đổi cột, không đổi dữ liệu. */
  table.data { display: block; max-width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
  .table-scroll table.data, .import-table-wrap table.data { display: table; max-width: none; overflow: visible; }
}

/* ---------- MOBILE ---------- */
@media (max-width: 640px) {
  .welcome-avatar, .welcome-sub { display: none; }
  .topbar { padding: var(--space-2) var(--space-3); gap: var(--space-2); }
  .topbar-right { flex: 1 1 auto; justify-content: flex-end; gap: var(--space-2); }
  .search { width: auto; flex: 1 1 auto; max-width: 220px; padding: 6px 10px; }
  .topbar-right .avatar { display: none; }
  .view { padding: var(--space-3) var(--space-3) var(--space-6); }
  .modal-root { padding: var(--space-3); }
  .modal-card { max-height: calc(100dvh - 2 * var(--space-3)); }
  .modal-header, .modal-form { padding-left: var(--space-4); padding-right: var(--space-4); }
}

/* =====================================================================
   WEBAPP05-CSKH-CENTER-MOBILE-RESPONSIVE-V1-01 · TRUNG TÂM CSKH TRÊN MÁY TÍNH BẢNG / ĐIỆN THOẠI
   Chỉ lớp HIỂN THỊ. Không đổi dữ liệu, không đổi tuyến, không đổi nghiệp vụ CSKH.
   Máy tính (> 1024px): KHÔNG có quy tắc nào ở đây áp dụng.
     TABLET 641–1024px : COMPACT chỉ còn tiêu đề + dòng tóm tắt (thẻ xem ở "Mở rộng");
                         EXPANDED không dính (nằm trong dòng chảy) ⇒ không nuốt màn hình khi cuộn.
     MOBILE ≤ 640px    : mặc định THU GỌN thành nút "CSKH" ở đáy; bấm ⇒ ngăn trượt đáy.
   Tầng: nút nổi CSKH 80 < nền mờ ngăn CSKH 84 < ngăn CSKH 85 < nền mờ menu 90 < menu 95 < hộp thoại 100.
   Chiều cao sticky: app.js chỉ tính --care-sticky-height khi khối CSKH thật sự position:sticky.
   ===================================================================== */
:root {
  --z-care-sheet-backdrop: 84;
  --z-care-sheet:          85;
  --care-sheet-max-h:      min(78dvh, 640px);
  --care-fab-clearance:    72px;   /* chừa đáy trang để nút CSKH không che nút cuối trang */
}
.care-reopen-text { display: none; }
.care-sheet-backdrop { display: none; }

@media (min-width: 641px) and (max-width: 1024px) {
  .global-care { margin: var(--space-2, 8px) var(--space-4) var(--space-3); }
  .global-care[data-state="COMPACT"] #global-care-cards { display: none; }
  .global-care[data-state="COMPACT"] .global-care-title h2 { font-size: 14px; }
  #main:not([data-route="home"]) > #global-care[data-state="EXPANDED"] { position: static; }
  .global-care[data-state="EXPANDED"] #global-care-metrics { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .gc-icon-btn { width: 36px; height: 36px; }
}

@media (max-width: 640px) {
  /* Thu gọn: khối CSKH không chiếm chỗ trong trang (kể cả trước khi JS chạy). */
  body:not(.care-sheet-open) #main > #global-care { display: none; }
  #view-root { padding-bottom: var(--care-fab-clearance); }

  /* Thanh/nút CSKH nhỏ ở đáy — dùng lại nút nổi sẵn có, huy hiệu là số hội thoại THẬT từ API. */
  .care-reopen-handle {
    right: var(--space-3); bottom: var(--space-3);
    width: auto; min-width: 44px; height: 44px; padding: 0 var(--space-4) 0 var(--space-3);
    gap: 6px; border-radius: 22px;
  }
  .care-reopen-text { display: inline; font-size: 13px; font-weight: 700; letter-spacing: .3px; }
  .care-reopen-handle[aria-expanded="true"] { visibility: hidden; }

  /* Mở: ngăn trượt đáy, cuộn bên trong, không cuộn trang phía sau. */
  body.care-sheet-open { overflow: hidden; }
  body.care-sheet-open .care-sheet-backdrop:not([hidden]) {
    display: block; position: fixed; inset: 0;
    background: rgba(15, 23, 42, .45); z-index: var(--z-care-sheet-backdrop);
  }
  body.care-sheet-open #main > #global-care {
    position: fixed; left: 0; right: 0; bottom: 0; top: auto;
    margin: 0; max-height: var(--care-sheet-max-h);
    overflow-y: auto; overscroll-behavior: contain; -webkit-overflow-scrolling: touch;
    z-index: var(--z-care-sheet);
    border-radius: var(--radius-lg) var(--radius-lg) 0 0;
    box-shadow: var(--shadow-floating);
    padding: 0 var(--space-4) calc(var(--space-4) + env(safe-area-inset-bottom, 0px));
  }
  body.care-sheet-open #global-care .global-care-header {
    position: sticky; top: 0; z-index: 1; background: var(--bg-surface);
    padding: var(--space-3) 0 var(--space-2); margin: 0;
  }
  #global-care .global-care-title h2 { font-size: 14px; }
  #global-care .global-care-title { min-width: 0; }
  #global-care .gc-icon-btn[data-gc="EXPANDED"],
  #global-care .gc-icon-btn[data-gc="COMPACT"] { display: none; }
  #global-care .gc-icon-btn[data-gc="HIDDEN"] {
    width: 44px; height: 44px; font-size: 22px; border-color: var(--border-soft);
  }
  /* Nội dung giữ nguyên, chỉ xếp một cột; ngăn tự cuộn nên khu thẻ không cần cuộn riêng. */
  .global-care[data-state="EXPANDED"] #global-care-metrics { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-2, 8px); }
  .global-care[data-state="EXPANDED"] #global-care-cards { grid-template-columns: minmax(0, 1fr); max-height: none; overflow: visible; }
}

/* =====================================================================
   WEBAPP05-PRODUCT-UI-OPERATIONAL-FIX-V1-01 · QUẢN TRỊ SẢN PHẨM — VẬN HÀNH
   Chỉ lớp hiển thị của Product. Mọi luật dùng token; phạm vi khoá vào #product-* hoặc
   class .pm-* MỚI để không chạm module khác đang dùng chung .pm-shell (Tổ chức).
   ===================================================================== */

/* U1/U2 · thông tin kỹ thuật thu gọn, đứng sau nội dung nghiệp vụ */
.pm-tech-info { margin-top: var(--space-2); font-size: var(--text-sm); color: var(--text-muted); }
.pm-tech-info > summary { cursor: pointer; font-weight: var(--weight-semibold); }
.pm-tech-info > p, .pm-tech-info > div { margin: var(--space-1) 0 0; }

/* U3 · hành động trên dòng bảng Model: một nút + menu ⋯ (mở trong ô, không bị khung cuộn cắt) */
.pm-row-acts { display: flex; flex-wrap: wrap; align-items: flex-start; gap: var(--space-1); }
.pm-row-menu > summary { list-style: none; min-width: 32px; text-align: center; }
.pm-row-menu > summary::-webkit-details-marker { display: none; }
.pm-row-menu[open] > summary { background: var(--status-info-soft); border-color: var(--border-focus); }
.pm-row-menu-list { display: flex; flex-direction: column; align-items: stretch; gap: var(--space-1);
  margin-top: var(--space-1); padding: var(--space-1); border: 1px solid var(--border);
  border-radius: var(--radius-sm); background: var(--card); box-shadow: var(--shadow-floating, none); }
.pm-row-menu-list .btn { text-align: left; white-space: nowrap; }

/* U6 · dòng thời gian Lịch sử */
.pm-timeline { list-style: none; margin: 0 0 var(--space-2); padding: 0; border-left: 2px solid var(--border); }
.pm-timeline-item { position: relative; padding: var(--space-2) 0 var(--space-2) var(--space-4); }
.pm-timeline-item::before { content: ''; position: absolute; left: -6px; top: 14px; width: 10px; height: 10px;
  border-radius: 50%; background: var(--card); border: 2px solid var(--brand-primary); }
.pm-timeline-when { font-size: var(--text-sm); color: var(--text-muted); }
.pm-timeline-what { font-size: var(--text-md); }
.pm-timeline-meta { font-size: var(--text-sm); color: var(--text-muted); overflow-wrap: anywhere; }

/* U7 · khu quản trị kết nối/kho lưu trữ trong tab Tài liệu & Ảnh */
.pm-media-admin { margin-top: var(--space-3); border: 1px solid var(--border); border-radius: var(--radius-md);
  background: var(--card); }
.pm-media-admin > summary { cursor: pointer; padding: var(--space-2) var(--space-3); font-size: var(--text-sm);
  font-weight: var(--weight-semibold); color: var(--text-muted); }
.pm-media-admin-body { padding: 0 var(--space-3) var(--space-3); display: flex; flex-direction: column; gap: var(--space-2); }
.pm-media-admin-row { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); font-size: var(--text-sm); }

/* G · nút "Bộ lọc": nhãn đầy đủ trên máy tính, nhãn gọn ≤1024px */
.pm-more-short { display: none; }

/* H · 4 tab sản phẩm: cuộn ngang có gợi ý mép phải khi còn tab khuất */
#product-tabs { scroll-snap-type: x proximity; scrollbar-width: thin; }
#product-tabs .tab { scroll-snap-align: start; white-space: nowrap; }

/* I · MẬT ĐỘ DÍNH: màn thấp (≤900px) hoặc hẹp (≤1024px) chỉ giữ HÀNG TAB dính; bộ lọc cuộn
   theo nội dung. display:contents gỡ hộp vỏ để hàng tab dính trong phạm vi cả trang. */
@media (max-height: 900px), (max-width: 1024px) {
  #product-shell { display: contents; }
  #product-shell > #product-tabs {
    position: sticky; top: var(--sticky-module-top); z-index: var(--sticky-z-module);
    box-shadow: var(--sticky-edge); margin-bottom: var(--space-2);
  }
  #product-shell > .pm-filter-shell { display: block; margin: 0 0 var(--space-3); }
}

@media (max-width: 1024px) {
  #product-filterbar .pm-fbar { flex-wrap: nowrap; }
  #product-filterbar .pm-fbar > input[type="search"] { flex: 1 1 auto; min-width: 0; }
  #product-filterbar .pm-fbar:not(.is-expanded) > select { display: none; }
  #product-filterbar .pm-fbar.is-expanded { flex-wrap: wrap; }
  #product-filterbar .pm-fbar.is-expanded > select { flex: 1 1 100%; max-width: none; }
  #product-filterbar .pm-more-full { display: none; }
  #product-filterbar .pm-more-short { display: inline; }
  #product-filterbar .pm-more-btn, #product-filterbar .pm-clear-btn { flex: 0 0 auto; white-space: nowrap; }
  #product-filterbar .pm-clear-btn[disabled] { display: none; }
  #product-filterbar .pm-fbar-more select { flex: 1 1 100%; max-width: none; }
}

@media (max-width: 640px) {
  /* R3 · nhãn tab gọn để cả 4 tab vừa 375px; tên đầy đủ vẫn là nhãn truy cập của nút */
  #product-tabs { padding: 4px 6px 0; gap: 2px; }
  #product-tabs .tab[data-short], #product-tabs .tab { padding: 10px 10px; }
  #product-tabs .tab[data-short] { font-size: 0; }
  #product-tabs .tab[data-short]::after { content: attr(data-short); font-size: var(--text-md); }
  .pm-head-info-body { max-width: 100%; }
}

@media (max-width: 640px) {
  /* R3 · tab con của Chi tiết model: cùng cách nhãn gọn như 4 tab chính */
  #product-panel .pm-detail-tabs { padding: 4px 6px 0; gap: 2px; }
  #product-panel .pm-detail-tabs .tab { padding: 10px 8px; white-space: nowrap; }
  #product-panel .pm-detail-tabs .tab[data-short] { font-size: 0; }
  #product-panel .pm-detail-tabs .tab[data-short]::after { content: attr(data-short); font-size: var(--text-md); }
}

/* =====================================================================
   WEBAPP05-PRODUCT-SPECIFICATIONS-ARCHITECTURE-V1-01 · THÔNG SỐ KỸ THUẬT V1
   Chỉ class .pm-spec-* / .pm-tpl-* mới; chỉ dùng token. Điện thoại: danh sách xếp dọc, không bảng rộng.
   ===================================================================== */
.pm-legacy-title { margin: var(--space-3) 0 var(--space-2); font-size: var(--text-sm); font-weight: var(--weight-semibold); color: var(--text-muted); }
.pm-spec-head { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--space-2); margin-bottom: var(--space-3); }
.pm-spec-summary { font-size: var(--text-md); display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); }
.pm-spec-section { margin-bottom: var(--space-3); }
.pm-spec-section-title { margin: var(--space-3) 0 var(--space-2); font-size: var(--text-sm); font-weight: var(--weight-semibold); color: var(--text-muted); text-transform: none; }
.pm-spec-list { margin: 0; border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--card); }
.pm-spec-row { display: grid; grid-template-columns: minmax(0, 2fr) minmax(0, 3fr); gap: var(--space-3); padding: var(--space-2) var(--space-3); border-top: 1px solid var(--border); }
.pm-spec-row:first-child { border-top: 0; }
.pm-spec-row dt { font-size: var(--text-md); color: var(--text-muted); margin: 0; }
.pm-spec-row dd { font-size: var(--text-md); font-weight: var(--weight-semibold); margin: 0; overflow-wrap: anywhere; }
.pm-spec-archive { margin-top: var(--space-3); }
.pm-spec-archive > summary { cursor: pointer; font-size: var(--text-sm); color: var(--text-muted); font-weight: var(--weight-semibold); margin-bottom: var(--space-2); }
.pm-spec-inputs { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
.pm-spec-inputs input { flex: 1 1 90px; min-width: 70px; }
.pm-spec-unit { flex: 0 0 auto; font-size: var(--text-sm); color: var(--text-muted); white-space: nowrap; }
.pm-spec-checks { display: flex; flex-wrap: wrap; gap: var(--space-2) var(--space-3); }
.pm-spec-checks label, .pm-spec-flag { display: inline-flex; align-items: center; gap: var(--space-1); font-size: var(--text-md); }
.pm-tpl-list { list-style: none; margin: 0 0 var(--space-3); padding: 0; border: 1px solid var(--border); border-radius: var(--radius-md); background: var(--card); }
.pm-tpl-item { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--space-2); padding: var(--space-2) var(--space-3); border-top: 1px solid var(--border); }
.pm-tpl-item:first-child { border-top: 0; }
.pm-tpl-main { min-width: 0; flex: 1 1 260px; }
.pm-tpl-name { font-size: var(--text-md); font-weight: var(--weight-semibold); }
.pm-tpl-meta, .pm-tpl-flags { font-size: var(--text-sm); color: var(--text-muted); overflow-wrap: anywhere; }
.pm-tpl-acts { display: flex; flex-wrap: wrap; gap: var(--space-1); }
.pm-tpl-add { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); margin-bottom: var(--space-2); }
.pm-tpl-add select { flex: 1 1 220px; min-width: 0; }
.pm-tpl-incomplete { display: flex; flex-wrap: wrap; gap: var(--space-2); }
.pm-chip-static { border: 1px solid var(--border); border-radius: 999px; padding: 2px var(--space-2); font-size: var(--text-sm); background: var(--status-warning-soft); }
@media (max-width: 640px) {
  .pm-spec-row { grid-template-columns: minmax(0, 1fr); gap: 2px; }
  .pm-tpl-acts { width: 100%; }
  #product-panel .pm-detail-tabs { overflow-x: auto; }
}

/* ===== V041 · WEBAPP05-PRODUCT-APPROVAL-VERSION-WORKFLOW-V1-01 — Cần duyệt / Việc của tôi ===== */
.pm-review-btn.has-items { border-color: var(--status-warning); color: var(--status-warning); background: var(--status-warning-soft); font-weight: 600; }
#pm-review:empty { display: none; }
.pm-review-panel { display: flex; flex-direction: column; gap: var(--space-4); margin-bottom: var(--space-4); min-width: 0; }
.pm-review-sec { display: flex; flex-direction: column; gap: var(--space-2); min-width: 0; }
.pm-review-card { border: 1px solid var(--border-soft); border-radius: var(--radius-md); background: var(--bg-surface); padding: var(--space-3); display: flex; flex-direction: column; gap: var(--space-2); min-width: 0; }
.pm-review-top { display: flex; flex-wrap: wrap; justify-content: space-between; gap: var(--space-2); font-size: var(--text-md); color: var(--text-primary); min-width: 0; overflow-wrap: anywhere; }
.pm-review-meta { font-size: var(--text-sm); color: var(--text-muted); overflow-wrap: anywhere; }
.pm-review-acts { display: flex; flex-wrap: wrap; gap: var(--space-2); }
.pm-review-acts:empty { display: none; }
.pm-diff { display: flex; flex-direction: column; border-top: 1px solid var(--border-soft); }
.pm-diff:empty { display: none; }
.pm-diff-row { display: grid; grid-template-columns: minmax(120px, 30%) minmax(0, 1fr); gap: var(--space-2); padding: var(--space-2) 0; border-bottom: 1px solid var(--border-soft); font-size: var(--text-md); }
.pm-diff-row.is-stale { background: var(--status-warning-soft); }
.pm-diff-label { color: var(--text-secondary); font-weight: 500; overflow-wrap: anywhere; }
.pm-diff-vals { min-width: 0; overflow-wrap: anywhere; }
.pm-diff-before { color: var(--text-muted); text-decoration: line-through; }
.pm-diff-arrow { color: var(--text-muted); margin: 0 var(--space-1); }
.pm-diff-after { color: var(--text-primary); font-weight: 600; }
@media (max-width: 640px) {
  .pm-diff-row { grid-template-columns: minmax(0, 1fr); gap: var(--space-1); }
}

/* V042 · WEBAPP05-PRODUCT-FAMILY-SPEC-ONBOARDING-MXD-REAL-APPLY-V1-01 — ô "khoảng" cho thông số số */
.pm-spec-approx { display: inline-flex; align-items: center; gap: var(--space-1); margin-top: var(--space-1);
  font-size: var(--text-sm); color: var(--text-secondary); }

/* =====================================================================
   S4 · MẪU HỆ THỐNG (WEBAPP05-GENERIC-SYSTEM-TEMPLATE-UI-V1-01)
   Chỉ THÊM class tiền tố .st-* + một quy tắc ẩn vỏ lọc Product khi ở tab Mẫu hệ thống.
   Dùng token có sẵn; không màu viết cứng; LIGHT_ONLY.
   ===================================================================== */
#product-filterbar[hidden] { display: none !important; }
.st-filters { display: flex; flex-wrap: wrap; gap: var(--space-2); margin: var(--space-2) 0 var(--space-3); }
.st-filters > input, .st-filters > select { flex: 1 1 170px; min-width: 0; }
.st-filters > .btn { flex: 0 0 auto; }
.st-row { cursor: pointer; }
.st-row:focus-visible { outline: 2px solid var(--brand-primary, currentColor); outline-offset: -2px; }
.st-toolbar { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; margin: 0 0 var(--space-3); }
.st-tree { display: flex; flex-direction: column; gap: var(--space-2); min-width: 0; }
.st-node { display: flex; flex-wrap: wrap; align-items: flex-start; justify-content: space-between; gap: var(--space-2);
  padding: var(--space-2) var(--space-3); border: 1px solid var(--border-soft); border-radius: var(--radius-md);
  background: var(--bg-surface); margin-left: calc(var(--st-depth, 0) * 24px); min-width: 0; }
.st-node.is-leaf { background: var(--bg-subtle); }
.st-node-main { flex: 1 1 280px; min-width: 0; display: flex; flex-direction: column; gap: 2px; overflow-wrap: anywhere; }
.st-node-meta { font-size: var(--font-meta); color: var(--text-muted); overflow-wrap: anywhere; }
.st-node-warn { font-size: var(--font-meta); color: var(--status-warning); }
.st-node-acts { display: flex; flex-wrap: wrap; gap: var(--space-1); align-items: center; }
.st-check { flex-direction: row !important; align-items: center; gap: var(--space-2); }
.st-check input { width: auto; }
.st-raw { white-space: pre-wrap; overflow-wrap: anywhere; font-size: var(--font-meta); margin: 0; }
@media (max-width: 640px) {
  .st-node { margin-left: calc(var(--st-depth, 0) * 12px); }
  .st-node-main { flex-basis: 100%; }
  .st-node-acts { width: 100%; }
}

/* =====================================================================
   S4.5 · KHỞI TẠO DÒNG SẢN PHẨM (WEBAPP05-PRODUCT-FAMILY-ONBOARDING-UI-V1-01)
   Chỉ THÊM class .pm-onb-*; token có sẵn; LIGHT_ONLY; nhánh ≤640px.
   ===================================================================== */
.pm-onb-panel { display: flex; flex-direction: column; gap: var(--space-3); min-width: 0; }
.pm-onb-step { border: 1px solid var(--border-soft); border-radius: var(--radius-md); background: var(--bg-surface); padding: var(--space-3); min-width: 0; }
.pm-onb-step.is-done { background: var(--bg-subtle); }
.pm-onb-step-head { display: flex; align-items: center; gap: var(--space-2); margin-bottom: var(--space-2); }
.pm-onb-num { display: inline-grid; place-items: center; min-width: 24px; height: 24px; border-radius: 999px; border: 1px solid var(--border-soft); font-size: var(--font-meta); }
.pm-onb-step.is-done .pm-onb-num { color: var(--status-success); border-color: var(--status-success); }
.pm-onb-step-body { display: flex; flex-direction: column; gap: var(--space-2); min-width: 0; overflow-wrap: anywhere; }
.pm-onb-starters { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: var(--space-2); }
.pm-onb-starter { display: flex !important; flex-direction: row !important; align-items: flex-start; gap: var(--space-2); padding: var(--space-2) var(--space-3);
  border: 1px solid var(--border-soft); border-radius: var(--radius-md); background: var(--bg-surface); cursor: pointer; min-width: 0; }
.pm-onb-starter input { width: auto; margin-top: 3px; }
.pm-onb-plan, .pm-onb-checks { margin: 0; padding-left: var(--space-5); display: flex; flex-direction: column; gap: 2px; overflow-wrap: anywhere; }
.pm-onb-gaps { font-size: var(--font-meta); color: var(--status-warning); display: flex; flex-direction: column; gap: 2px; margin-top: var(--space-2); }
@media (max-width: 640px) {
  .pm-onb-starters { grid-template-columns: 1fr; }
  .pm-onb-step .pm-actions .btn { flex: 1 1 100%; white-space: normal; }
}

/* =====================================================================
   CẤU HÌNH DỰ ÁN (S7 · WEBAPP05-PROJECT-CONFIGURATION-C2-V1-01)
   Nằm trong Hồ sơ khách hàng (CRM). Chỉ token; LIGHT_ONLY; nhánh ≤640px.
   ===================================================================== */
.pc-title { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); flex-wrap: wrap; }
.pc-actions { display: flex; gap: var(--space-2); flex-wrap: wrap; }
.pc-actions-bar { margin: var(--space-2) 0; }
.pc-hint { padding: 0 2px var(--space-2); }
.pc-h { margin: var(--space-1) 0 var(--space-2); font-size: var(--text-md); color: var(--text-primary); }
.pc-meta { display: flex; flex-wrap: wrap; gap: var(--space-1) var(--space-3); margin-bottom: var(--space-2); }
.pc-lock { padding: var(--space-2) var(--space-3); border: 1px dashed var(--border-default); border-radius: var(--radius-sm); background: var(--bg-subtle); margin-bottom: var(--space-2); }
.pc-warn { padding: var(--space-2) var(--space-3); border-radius: var(--radius-sm); background: var(--status-warning-soft); color: var(--status-warning); margin-bottom: var(--space-2); }
.pc-kinds { font-size: var(--text-sm); color: var(--text-secondary); }
.pc-tree td { vertical-align: top; }
.pc-name { min-width: 0; }
.pc-ref { font-size: var(--text-sm); }
.pc-row-actions { white-space: nowrap; }
.pc-row-actions .btn + .btn { margin-left: var(--space-1); }
.pc-removed td { color: var(--text-muted); }
.pc-removed .pc-name b { text-decoration: line-through; }
.pc-revs { display: flex; flex-wrap: wrap; gap: var(--space-2); }
@media (max-width: 640px) {
  .pc-title { align-items: flex-start; }
  .pc-actions .btn { flex: 1 1 auto; }
  /* cây cấu hình: thẻ dọc thay vì bảng 4 cột (không cuộn ngang, không che cột "Thay đổi") */
  .pc-tree thead { display: none; }
  .pc-tree, .pc-tree tbody, .pc-tree tr, .pc-tree td { display: block; width: 100%; }
  .pc-tree tr { border-bottom: 1px solid var(--border-soft); padding: var(--space-2) 0; }
  .pc-tree td { border: 0; padding: 2px var(--space-1); }
  .pc-row-actions { display: flex; gap: var(--space-2); white-space: normal; }
  .pc-row-actions .btn + .btn { margin-left: 0; }
}

/* =====================================================================
   WEBAPP05-CRM-OPPORTUNITY-SYSTEM-PROJECT-LINKAGE-V1-01 (S8) · GIẢI PHÁP / CẤU HÌNH CỦA CƠ HỘI
   Dùng lại khối .pc-* của cấu hình dự án (S7). Chỉ thêm lưới nhãn–giá trị và hàng nút trong bảng cơ hội.
   ===================================================================== */
.ol-grid { display: grid; grid-template-columns: minmax(140px, max-content) minmax(0, 1fr); gap: var(--space-2) var(--space-4); margin: var(--space-2) 0; }
.ol-grid dt { color: var(--text-secondary); font-size: var(--font-meta); font-weight: var(--weight-medium); }
.ol-grid dd { margin: 0; min-width: 0; overflow-wrap: anywhere; color: var(--text-primary); }
.ol-row-actions { white-space: nowrap; }
.ol-row-actions .btn + .btn { margin-left: var(--space-1); }
@media (max-width: 640px) {
  .ol-grid { grid-template-columns: minmax(0, 1fr); gap: 2px; }
  .ol-grid dd { margin-bottom: var(--space-2); }
  .ol-row-actions { white-space: normal; }
}

/* =====================================================================
   WEBAPP05-QUOTE-TREE-C2-SLICE2-V1-01 (S9) · BÁO GIÁ DẠNG CÂY
   Ba cột giá tách riêng (tham khảo · cấu hình · báo khách). Dùng lại .pc-* / .ol-grid; ≤640px mỗi dòng thành thẻ có nhãn cột.
   ===================================================================== */
.qt-tree td { vertical-align: top; }
.qt-num { white-space: nowrap; }
.qt-sub { font-size: var(--font-meta); }
.qt-tree tr.qt-system td { background: var(--bg-surface-soft); }
@media (max-width: 640px) {
  .qt-tree thead { display: none; }
  .qt-tree, .qt-tree tbody, .qt-tree tr, .qt-tree td { display: block; width: 100%; }
  .qt-tree tr { border-bottom: 1px solid var(--border-soft); padding: var(--space-2) 0; }
  .qt-tree td { border: 0; padding: 2px var(--space-1); white-space: normal; }
  .qt-tree td[data-label]::before { content: attr(data-label) ": "; color: var(--text-secondary); font-size: var(--font-meta); }
  .qt-tree .pc-name { padding-left: 0 !important; }
}

/* =====================================================================
   CRM UI PROTOTYPE V1 — Lead & Chăm sóc · hồ sơ khách 3 vùng · CSKH ngữ cảnh
   (continuation WEBAPP05-QUOTE-TREE-C2-SLICE2-V1-01). Chỉ token canonical, không màu viết cứng.
   ===================================================================== */
.crm-test-toggle-inline { display: inline-flex; gap: 6px; align-items: center; margin-bottom: var(--space-2); }
.crm-ov-row .crm-ov-card[data-go] { cursor: pointer; }
.crm-ov-row .crm-ov-card[data-go]:hover { border-color: var(--brand-primary); }
.crm-ov-note, .crm-ov-proto { font-size: var(--font-meta); color: var(--text-muted); }
.crm-ov-proto { margin-bottom: var(--space-2); }
.crm-alert[data-go] { cursor: pointer; }
.crm-alert-danger .feed-title { color: var(--status-danger); }
.crm-cell-sub { font-size: var(--font-meta); }

.crm-sum-row { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-2); margin-bottom: var(--space-3); }
.crm-sum-card { background: var(--bg-surface); border: 1px solid var(--border-soft); border-radius: var(--radius-md); padding: var(--space-2) var(--space-3); min-width: 0; }
.crm-sum-n { font-size: var(--text-xl); font-weight: var(--weight-bold); color: var(--text-primary); line-height: var(--line-tight); }
.crm-sum-l { font-size: var(--font-label); color: var(--text-secondary); font-weight: var(--weight-semibold); }
.crm-sum-note { font-size: var(--font-meta); color: var(--text-muted); }

/* hồ sơ khách: 3 vùng */
.cd-zones { display: flex; gap: var(--space-1); flex-wrap: wrap; margin: var(--space-2) 0; }
.cd-zone-btn { border: 1px solid var(--border-default); background: var(--bg-surface); color: var(--text-secondary); border-radius: 999px;
  padding: 6px var(--space-3); font-size: var(--font-button); font-weight: var(--weight-semibold); cursor: pointer; }
.cd-zone-btn.on { background: var(--brand-primary); border-color: var(--brand-primary); color: var(--text-inverse); }
.cd-zone-btn.on .muted { color: var(--text-inverse); }
[data-cd-zone][hidden] { display: none !important; }
tr.cd-ep-on td { background: var(--brand-primary-soft); }

/* danh sách định nghĩa dùng chung (chi tiết Lead + tổng quan khách) */
.cl-dl { display: grid; grid-template-columns: minmax(120px, 190px) minmax(0, 1fr); gap: 6px var(--space-3); margin: var(--space-2) 0; font-size: var(--font-body); }
.cl-dl dt { color: var(--text-muted); font-size: var(--font-label); }
.cl-dl dd { margin: 0; color: var(--text-primary); min-width: 0; overflow-wrap: anywhere; }

/* Lead & Chăm sóc */
.cl-banner { margin-bottom: var(--space-2); }
.cl-strip { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-2); margin-bottom: var(--space-2); }
.cl-chip { display: flex; align-items: center; gap: var(--space-2); background: var(--bg-surface); border: 1px solid var(--border-soft); border-left-width: 4px;
  border-radius: var(--radius-md); padding: var(--space-2) var(--space-3); cursor: pointer; text-align: left; font-size: var(--font-label); color: var(--text-secondary); min-width: 0; }
.cl-chip-n { font-size: var(--text-xl); font-weight: var(--weight-bold); color: var(--text-primary); }
.cl-chip.cl-ai { border-left-color: var(--status-ai); }
.cl-chip.cl-mix { border-left-color: var(--status-info); }
.cl-chip.cl-wait { border-left-color: var(--status-warning); }
.cl-chip.cl-danger { border-left-color: var(--status-danger); }
.cl-chip.on { background: var(--brand-primary-soft); border-color: var(--brand-primary); }
.cl-filters { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; margin-bottom: var(--space-2); }
.cl-filters input, .cl-filters select { height: var(--control-h-sm); border: 1px solid var(--border-default); border-radius: var(--control-radius);
  padding: 0 var(--space-2); font-size: var(--font-body); background: var(--bg-surface); color: var(--text-primary); min-width: 0; }
.cl-filters input[type="search"] { flex: 1 1 220px; }
.cl-more { display: flex; gap: var(--space-2); flex-wrap: wrap; width: 100%; }
.cl-more[hidden] { display: none; }
.cl-work { display: grid; grid-template-columns: minmax(300px, 400px) minmax(0, 1fr); gap: var(--space-3); align-items: start; }
.cl-queue-col, .cl-detail-col { min-width: 0; }
.cl-buckets { display: flex; flex-wrap: wrap; gap: 4px; margin-bottom: var(--space-2); }
.cl-bucket { border: 1px solid var(--border-soft); background: var(--bg-surface); border-radius: 999px; padding: 4px 10px; font-size: var(--font-label); cursor: pointer; color: var(--text-secondary); }
.cl-bucket.on { background: var(--brand-primary); color: var(--text-inverse); border-color: var(--brand-primary); }
.cl-bucket.on .muted { color: var(--text-inverse); }
.cl-queue { display: flex; flex-direction: column; gap: 6px; max-height: calc(100vh - 260px); overflow: auto; padding-right: 2px; }
.cl-card { display: block; width: 100%; text-align: left; background: var(--bg-surface); border: 1px solid var(--border-soft); border-radius: var(--radius-md);
  padding: var(--space-2) var(--space-3); cursor: pointer; color: var(--text-primary); font-size: var(--font-body); }
.cl-card:hover { border-color: var(--border-strong); }
.cl-card.on { border-color: var(--brand-primary); box-shadow: 0 0 0 1px var(--brand-primary); background: var(--brand-primary-soft); }
.cl-card-top { display: flex; justify-content: space-between; gap: var(--space-2); align-items: flex-start; }
.cl-card-name { min-width: 0; overflow-wrap: anywhere; }
.cl-prio { flex: none; font-size: var(--font-badge); border-radius: 999px; padding: 2px 8px; background: var(--bg-subtle); color: var(--text-secondary); white-space: nowrap; }
.cl-prio-1 { background: var(--status-danger-soft); color: var(--status-danger); }
.cl-prio-2 { background: var(--status-warning-soft); color: var(--status-warning); }
.cl-prio-3 { background: var(--status-info-soft); color: var(--status-info); }
.cl-card-meta { margin: 4px 0; display: flex; flex-wrap: wrap; gap: 4px; }
.cl-card-sub { font-size: var(--font-meta); color: var(--text-muted); }
.cl-card-task { font-size: var(--font-meta); color: var(--text-secondary); margin-top: 2px; }
.cl-overdue { color: var(--status-danger) !important; }
.cl-detail { background: var(--bg-surface); border: 1px solid var(--border-soft); border-radius: var(--radius-lg); padding: var(--card-pad); margin-bottom: var(--space-3); }
.cl-d-head { display: flex; gap: var(--space-2); align-items: center; flex-wrap: wrap; }
.cl-d-head h3 { margin: 0; font-size: var(--font-section-title); }
.cl-back { display: none; margin-bottom: var(--space-2); }
.cl-steps { display: flex; gap: 4px; flex-wrap: wrap; margin: var(--space-2) 0; }
.cl-step { font-size: var(--font-label); padding: 3px 10px; border-radius: 999px; background: var(--bg-subtle); color: var(--text-muted); }
.cl-step.done { background: var(--status-success-soft); color: var(--status-success); }
.cl-step.on { background: var(--brand-primary); color: var(--text-inverse); font-weight: var(--weight-semibold); }
.cl-sub { font-size: var(--font-label); font-weight: var(--weight-semibold); color: var(--text-secondary); margin-top: var(--space-2); }
.cl-tasks { margin: 4px 0 var(--space-2); padding-left: 18px; font-size: var(--font-body); }
.cl-tasks li { margin: 3px 0; }
.cl-conv { border: 1px dashed var(--status-ai); background: var(--status-ai-soft); border-radius: var(--radius-md); padding: var(--space-2) var(--space-3); display: flex; flex-direction: column; gap: 6px; font-size: var(--font-body); }
.cl-conv-done { border-style: solid; border-color: var(--status-success); background: var(--status-success-soft); display: block; }
.cl-conv .btn { align-self: flex-start; }
.cl-actions { margin-top: var(--space-2); display: flex; gap: var(--space-2); flex-wrap: wrap; }
.form-msg.warn { color: var(--status-warning); }

/* V1.1: bỏ chế độ gắn CSKH vào khu Lead — chỉ còn MỘT Trung tâm CSKH toàn cục. */

/* CSKH: khu ngữ cảnh */
.global-care-context[hidden] { display: none !important; }
#global-care-cards[hidden] { display: none !important; }   /* ngữ cảnh đang mở: ẩn thẻ hội thoại chung (CSS grid đè thuộc tính hidden) */
.global-care-context { margin-top: var(--space-2); display: flex; flex-direction: column; gap: var(--space-2); min-width: 0; }
.cc-compact { font-size: var(--font-body); display: flex; gap: var(--space-2); align-items: center; flex-wrap: wrap; }
.cc-head { display: flex; justify-content: space-between; gap: var(--space-2); flex-wrap: wrap; align-items: center; }
.cc-title { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; min-width: 0; }
.cc-links { display: flex; gap: 4px; flex-wrap: wrap; }
.cc-ep { font-size: var(--font-label); color: var(--text-secondary); display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.cc-ep select { height: var(--control-h-sm); border: 1px solid var(--border-default); border-radius: var(--control-radius); max-width: 100%; }
.cc-state { display: flex; gap: var(--space-2); align-items: center; flex-wrap: wrap; font-size: var(--font-meta); color: var(--text-muted); }
.cc-state-actions { margin-left: auto; }
.cc-pill { font-size: var(--font-label); font-weight: var(--weight-bold); padding: 3px 10px; border-radius: 999px; }
.cc-pill-ai { background: var(--status-ai-soft); color: var(--status-ai); }
.cc-pill-human { background: var(--status-warning-soft); color: var(--status-warning); }
.cc-view, .cc-modes { display: inline-flex; border: 1px solid var(--border-default); border-radius: 999px; overflow: hidden; align-self: flex-start; max-width: 100%; flex-wrap: wrap; }
.cc-seg { border: 0; background: var(--bg-surface); padding: 5px 12px; font-size: var(--font-button); color: var(--text-secondary); cursor: pointer; }
.cc-seg.on { background: var(--brand-primary); color: var(--text-inverse); font-weight: var(--weight-semibold); }
.cc-stream { display: flex; flex-direction: column; gap: 6px; max-height: 340px; overflow: auto; padding: var(--space-2); background: var(--bg-subtle); border-radius: var(--radius-md); }
.cc-stream[data-view="customer"] { outline: 2px solid var(--status-info-soft); }
.cc-msg { max-width: 85%; padding: 6px 10px; border-radius: var(--radius-md); font-size: var(--font-body); background: var(--bg-surface); border: 1px solid var(--border-soft); overflow-wrap: anywhere; }
.cc-msg-in { align-self: flex-start; }
.cc-msg-out { align-self: flex-end; background: var(--brand-primary-soft); border-color: var(--brand-primary-soft); }
.cc-msg-note { align-self: stretch; max-width: none; background: var(--status-warning-soft); border: 1px dashed var(--status-warning); }
.cc-msg-instr { align-self: stretch; max-width: none; background: var(--status-ai-soft); border: 1px dashed var(--status-ai); }
.cc-msg-sys { align-self: center; max-width: none; background: transparent; border: 0; color: var(--text-muted); font-size: var(--font-meta); text-align: center; }
.cc-msg-meta { font-size: var(--font-meta); color: var(--text-muted); margin-top: 2px; display: flex; flex-wrap: wrap; gap: 4px; align-items: center; }
.cc-badge { font-size: var(--font-badge); border-radius: 999px; padding: 1px 6px; background: var(--bg-subtle); color: var(--text-secondary); }
.cc-badge-internal { background: var(--status-warning-soft); color: var(--status-warning); }
.cc-badge-instr { background: var(--status-ai-soft); color: var(--status-ai); }
.cc-badge-dir { background: var(--status-danger-soft); color: var(--status-danger); }
.cc-sub { font-size: var(--font-label); color: var(--text-secondary); font-weight: var(--weight-semibold); }
.cc-instr, .cc-kc { display: flex; flex-direction: column; gap: 4px; font-size: var(--font-body); }
.cc-instr-row, .cc-kc-row { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.cc-composer { display: flex; flex-direction: column; gap: 6px; border-top: 1px solid var(--border-soft); padding-top: var(--space-2); }
.cc-hint { font-size: var(--font-meta); color: var(--text-muted); }
.cc-hint[data-mode="CUSTOMER"] { color: var(--status-info); }
.cc-draft { font-size: var(--font-body); background: var(--bg-subtle); border-radius: var(--radius-sm); padding: 6px var(--space-2); }
.cc-input-row { display: flex; gap: var(--space-2); align-items: stretch; }
.cc-input-row textarea { flex: 1; min-width: 0; border: 1px solid var(--border-default); border-radius: var(--control-radius); padding: 6px var(--space-2); font: inherit; font-size: var(--font-body); resize: vertical; }
.cc-noconv { margin: 0; }

@media (max-width: 1024px) {
  .cl-work { grid-template-columns: minmax(0, 1fr); }
  .cl-queue { max-height: none; }
  .crm-ov-row { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}
@media (max-width: 640px) {
  .crm-sum-row, .cl-strip { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .crm-ov-row { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .cl-work .cl-detail-col { display: none; }
  .cl-work.cl-show-detail .cl-queue-col { display: none; }
  .cl-work.cl-show-detail .cl-detail-col { display: block; }
  .cl-back { display: inline-flex; }
  .cl-dl { grid-template-columns: minmax(0, 1fr); gap: 2px; }
  .cl-dl dd { margin-bottom: 6px; }
  .cc-msg { max-width: 100%; }
  .cc-input-row { flex-direction: column; }
  .cc-state-actions { margin-left: 0; }
  #crm-ai-assistant-btn { margin-left: 0; }
}

/* =====================================================================
   CRM UI PROTOTYPE V1.1 — Lead 4 vùng · thẻ Lead ngắn · menu thêm khách · breadcrumb · UAT MODE
   ===================================================================== */
.crm-uat-badge { margin-left: var(--space-2); vertical-align: middle; font-size: var(--font-badge); }
.crm-uat-badge[hidden] { display: none; }
.crumb-link { color: var(--text-link); text-decoration: none; }
.crumb-link:hover { text-decoration: underline; }
.settings-crumbs .crumbs { margin-bottom: var(--space-2); }
.cl-banner { font-size: var(--font-meta); margin: 0 0 var(--space-2); }
.cl-presets { display: flex; gap: 4px; margin-bottom: var(--space-2); flex-wrap: wrap; }
.cl-preset { border: 1px solid var(--border-default); background: var(--bg-surface); border-radius: 999px; padding: 5px 12px;
  font-size: var(--font-button); font-weight: var(--weight-semibold); color: var(--text-secondary); cursor: pointer; }
.cl-preset.on { background: var(--brand-primary); border-color: var(--brand-primary); color: var(--text-inverse); }
.cl-preset-n { font-weight: var(--weight-normal); opacity: .85; }
.cl-card { display: flex; flex-direction: column; gap: 2px; }
.cl-card-name { font-weight: var(--weight-semibold); color: var(--text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cl-card-sub { font-size: var(--font-meta); color: var(--text-muted); }
.cl-card-alert { font-size: var(--font-meta); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cl-alert-danger { color: var(--status-danger); font-weight: var(--weight-semibold); }
.cl-alert-warn { color: var(--status-warning); font-weight: var(--weight-semibold); }
.cl-alert-info { color: var(--status-info); }
.cl-alert-ok { color: var(--status-success); }
.cl-alert-muted { color: var(--text-muted); }
.cl-d-head { justify-content: space-between; }
.cl-d-alert { font-size: var(--font-body); margin: 4px 0 var(--space-2); }
.cl-dl-compact { grid-template-columns: minmax(110px, 150px) minmax(0, 1fr); gap: 4px var(--space-3); }
.cl-more-menu { position: relative; }
.cl-more-menu summary { list-style: none; }
.cl-more-menu summary::-webkit-details-marker { display: none; }
.cl-more-list, .crm-add-list { position: absolute; right: 0; top: calc(100% + 4px); z-index: 20; background: var(--bg-surface); border: 1px solid var(--border-default);
  border-radius: var(--radius-md); box-shadow: var(--shadow-md); padding: var(--space-1); display: flex; flex-direction: column; gap: 4px; min-width: 190px; }
.cl-more-list .btn, .crm-add-list .btn { justify-content: flex-start; text-align: left; }
.cl-note { font-size: var(--font-meta); margin-top: 4px; }
.crm-cust-title { display: flex; align-items: center; gap: var(--space-2); }
.crm-add-menu { position: relative; margin-left: auto; }
.crm-add-menu summary { list-style: none; }
.crm-add-menu summary::-webkit-details-marker { display: none; }
.crm-need-cell { max-width: 220px; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
@media (max-width: 640px) {
  .cl-dl-compact { grid-template-columns: minmax(0, 1fr); }
}

/* =====================================================================
   CRM UI STANDARD V1.2 — vỏ dính 2 tầng · chỉ số chuẩn · màu theo nghĩa · tooltip · 4 vùng Lead · Tổng quan 4 khu
   Tone: ai · collab · ok · wait · urgent · info · neutral (cùng một luật cho MỌI màn CRM)
   ===================================================================== */
.tone-ai      { --tone-fg: var(--status-ai);      --tone-bg: var(--status-ai-soft); }
.tone-collab  { --tone-fg: var(--status-collab);  --tone-bg: var(--status-collab-soft); }
.tone-ok      { --tone-fg: var(--status-success); --tone-bg: var(--status-success-soft); }
.tone-wait    { --tone-fg: var(--status-warning); --tone-bg: var(--status-warning-soft); }
.tone-urgent  { --tone-fg: var(--status-danger);  --tone-bg: var(--status-danger-soft); }
.tone-info    { --tone-fg: var(--status-info);    --tone-bg: var(--status-info-soft); }
.tone-neutral { --tone-fg: var(--text-secondary); --tone-bg: var(--bg-subtle); }

/* ---- A/B · vỏ dính 2 tầng ---- */
.crm-v12 .crm-page-header { margin-bottom: var(--space-2); }
.crm-shell-sentinel { height: 1px; margin-bottom: -1px; }
.crm-shell {
  position: sticky; top: var(--sticky-module-top); z-index: var(--sticky-z-module);
  background: var(--bg-app); padding: 6px 0 8px; margin: 0 0 var(--space-3);
  display: flex; flex-direction: column; gap: 6px; box-shadow: var(--sticky-edge);
}
.crm-nav-row { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; min-width: 0; }
.crm-back { flex: none; }
.crm-crumbs { margin: 0; font-size: var(--font-meta); display: flex; flex-wrap: wrap; align-items: center; gap: 2px 6px; min-width: 0; }
.crm-crumbs .crumb-sep { color: var(--text-muted); }
.crm-module-tabs { margin: 0; align-items: center; }
.crm-mode-slot { margin-left: auto; display: inline-flex; align-items: center; gap: var(--space-2); }
.crm-mode-slot + .pm-tab-assistant { margin-left: var(--space-2); }
/* SCA-B · SCA-06 — hàng tab CRM cuộn ngang khi chật (`.crm-tabs { overflow-x: auto }`),
   và ở 1024 nút Trợ lý AI nằm NGOÀI tầm nhìn: đo được mép phải nút vượt mép phải hàng.
   Ghim ĐUÔI HÀNG (nhãn chế độ + nút Trợ lý AI) vào mép phải: chỉ các TAB cuộn phía dưới,
   còn cảnh báo "đang xem dữ liệu THỬ" và nút Trợ lý AI LUÔN thấy và bấm được.
   ⛔ Đừng ghim riêng mỗi nút: nút sẽ che mất nhãn cảnh báo (đo được ở 1024) — đổi một
   lỗi lấy một lỗi. Giữ MỘT hàng, không thêm tầng dọc. */
.crm-module-tabs .crm-tabs-tail {
  margin-left: auto; position: sticky; right: 0; z-index: 1;
  display: inline-flex; align-items: center; gap: var(--space-2);
  flex: 0 0 auto; padding-left: var(--space-2);
  background: var(--card);
  box-shadow: var(--shadow-md);   /* token, KHÔNG màu viết cứng (hợp đồng CSS của CRM) */
}
.crm-module-tabs .crm-tabs-tail .crm-mode-slot,
.crm-module-tabs .crm-tabs-tail .pm-tab-assistant { margin-left: 0; }
/* …nhưng GHIM CHỈ CỨU ĐƯỢC ĐUÔI: ở khổ hẹp đuôi ghim sẽ che một phần TAB cuối
   ("Thông báo CRM" mất cả huy hiệu số chưa đọc — đo thấy ở 1024). Đó vẫn là đổi một
   lỗi lấy một lỗi. Nên dưới 1100px cho cả hàng XUỐNG DÒNG: 5 tab một dòng, đuôi một
   dòng, KHÔNG che gì và KHÔNG cuộn ngang. Ghim ở trên vẫn giữ cho các khổ rộng hơn.
   ⚠️ Đã kiểm: không quy tắc nào sau đây đặt flex-wrap/overflow-x cho hai lớp này. */
/* Và thu gọn mật độ hàng tab ở khổ laptop để hàng HẾT CHẬT hẳn, thay vì chấp nhận che:
   ở 1366 hàng cần 1066px mà chỉ có 1048 ⇒ thiếu đúng 18px, vừa đủ để đuôi ghim nuốt mất
   huy hiệu số chưa đọc của tab "Thông báo CRM". Bớt lề/khoảng cách trả lại ~58px ⇒ không
   còn cuộn ngang, ghim thành vô hiệu, không che gì. Chỉ đụng hàng tab CRM. */
@media (max-width: 1400px) {
  .crm-module-tabs { gap: 2px; padding-left: var(--space-2); padding-right: var(--space-2); }
  .crm-module-tabs .tab { padding-left: 12px; padding-right: 12px; }
}
/* Dưới 1100px thì dù đã thu gọn vẫn không đủ chỗ ⇒ cho cả hàng XUỐNG DÒNG: 5 tab một dòng,
   đuôi một dòng, KHÔNG che gì và KHÔNG cuộn ngang. */
@media (max-width: 1100px) {
  .crm-module-tabs { flex-wrap: wrap; overflow-x: visible; row-gap: 4px; }
  .crm-module-tabs .crm-tabs-tail { box-shadow: none; padding-left: 0; }
}
.crm-uat-badge { cursor: help; white-space: nowrap; }
.crm-uat-badge[hidden], .crm-test-toggle[hidden] { display: none !important; }
.crm-test-toggle { display: inline-flex; align-items: center; gap: 4px; font-size: var(--font-meta); color: var(--text-secondary); white-space: nowrap; }
.crm-work-header { display: flex; flex-direction: column; gap: 6px; }
.crm-work-header[hidden] { display: none !important; }
.crm-work-header .fbar { margin: 0; }

/* ---- D · chỉ số chuẩn: NHÃN → SỐ + ĐƠN VỊ → giải thích ---- */
.crm-metrics { display: grid; gap: var(--space-2); }
.crm-metrics-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.crm-metrics-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); }
.crm-metric { display: flex; flex-direction: column; align-items: flex-start; gap: 1px; min-width: 0; text-align: left;
  background: var(--bg-surface); border: 1px solid var(--border-soft); border-left: 4px solid var(--tone-fg, var(--border-default));
  border-radius: var(--radius-md); padding: 8px var(--space-3); color: var(--text-primary); font: inherit; }
.crm-metric.is-action { cursor: pointer; }
.crm-metric.is-action:hover, .crm-metric:focus-visible { background: var(--tone-bg); outline: none; }
.crm-metric.on { background: var(--tone-bg); box-shadow: inset 0 0 0 1px var(--tone-fg); }
.crm-metric-label { font-size: var(--font-label); font-weight: var(--weight-semibold); color: var(--tone-fg, var(--text-secondary)); text-transform: uppercase; letter-spacing: .02em; }
.crm-metric-value { font-size: var(--font-body); color: var(--text-secondary); line-height: var(--line-tight); }
.crm-metric-value b { font-size: var(--text-xl); font-weight: var(--weight-bold); color: var(--text-primary); }
.crm-metric-hint { font-size: var(--font-meta); color: var(--text-muted); }
/* Đã dính ⇒ dải thấp: một dòng NHÃN · SỐ, ẩn giải thích (vẫn đọc được qua tooltip) */
.crm-shell.is-compact { padding: 4px 0 6px; gap: 4px; }
.crm-shell.is-compact .crm-metric { flex-direction: row; align-items: baseline; gap: 6px; padding: 3px var(--space-2); }
.crm-shell.is-compact .crm-metric-hint { display: none; }
.crm-shell.is-compact .crm-metric-value b { font-size: var(--text-md); }
.crm-shell.is-compact .crm-metric-label { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.crm-shell.is-compact .crm-nav-row .crm-crumbs { display: none; }

/* ---- F/G · huy hiệu theo nghĩa + tooltip ---- */
.crm-badge { display: inline-flex; align-items: center; gap: 3px; max-width: 100%; font-size: var(--font-badge); font-weight: var(--weight-semibold);
  line-height: 1.3; padding: 1px 8px; border-radius: 999px; background: var(--tone-bg); color: var(--tone-fg); border: 1px solid transparent;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; vertical-align: middle; }
.crm-badge[data-tip] { cursor: help; }
.crm-badge[data-tip]:hover, .crm-badge[data-tip]:focus-visible { border-color: var(--tone-fg); outline: none; }
.crm-tooltip { position: fixed; z-index: 120; background: var(--text-primary); color: var(--text-inverse); font-size: var(--font-meta);
  line-height: var(--line-normal); padding: 6px 10px; border-radius: var(--radius-sm); box-shadow: var(--shadow-md); pointer-events: none; }
.crm-tooltip[hidden] { display: none; }
.crm-need-cell[data-tip], td[data-tip] { cursor: help; }

/* ---- C · hàng đợi Lead (preset gắn liền) + D Lead đang chọn ---- */
.crm-v12 .cl-work { grid-template-columns: minmax(300px, 400px) minmax(0, 1fr); }
.cl-queue-col { background: var(--bg-surface); border: 1px solid var(--border-soft); border-radius: var(--radius-lg); padding: var(--space-2); }
.cl-queue-head { display: flex; flex-direction: column; gap: 6px; padding: 2px 2px var(--space-2); border-bottom: 1px solid var(--border-soft); margin-bottom: var(--space-2); }
.cl-queue-title { font-size: var(--font-label); font-weight: var(--weight-bold); letter-spacing: .04em; color: var(--text-secondary); }
.crm-v12 .cl-presets { margin: 0; }
.crm-v12 .cl-card { cursor: pointer; }
.crm-v12 .cl-card:focus-visible { outline: 2px solid var(--brand-primary); outline-offset: 1px; }
.crm-v12 .cl-card-sub { display: flex; flex-wrap: wrap; gap: 4px; margin: 3px 0; }
.crm-v12 .cl-card-alert .crm-badge { max-width: 100%; }
.cl-d-sub { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 4px; }
.cl-dl-10 dt { display: flex; align-items: baseline; gap: 6px; }
.cl-dt-n { display: inline-block; min-width: 16px; font-size: var(--font-badge); color: var(--text-muted); text-align: right; }
.cl-dl-10 dd .crm-badge { margin: 1px 2px 1px 0; }
@media (min-width: 1025px) {
  /* Cuộn riêng: hàng đợi và chi tiết cuộn trong khung, không bị header dính che */
  .crm-v12 .cl-queue { max-height: calc(100vh - var(--sticky-module-top) - var(--crm-shell-h, 160px) - 110px); overflow: auto; }
  .crm-v12 .cl-detail-col, .crm-v12 .cl-queue-col { position: sticky; top: calc(var(--sticky-module-top) + var(--crm-shell-h, 160px) + 8px); }
  .crm-v12 .cl-detail { max-height: calc(100vh - var(--sticky-module-top) - var(--crm-shell-h, 160px) - 24px); overflow: auto; margin-bottom: 0; }
}

/* ---- Tổng quan 4 khu ---- */
.crm-ov-section { margin-bottom: var(--space-3); }
.crm-section-title { font-size: var(--font-label); font-weight: var(--weight-bold); text-transform: uppercase; letter-spacing: .04em; color: var(--text-secondary);
  margin: 0 0 6px; display: flex; align-items: center; gap: var(--space-2); }
.crm-att-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 4px; }
.crm-att { display: flex; align-items: center; gap: var(--space-2); padding: 6px var(--space-2); border-radius: var(--radius-sm); font-size: var(--font-body); }
.crm-att[data-go] { cursor: pointer; }
.crm-att[data-go]:hover, .crm-att[data-go]:focus-visible { background: var(--bg-subtle); outline: none; }
.crm-att.is-zero { color: var(--text-muted); }
.crm-att-text { flex: 1; min-width: 0; }
.crm-att-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--tone-fg); flex: none; }
.crm-sub-title { font-size: var(--font-label); font-weight: var(--weight-semibold); color: var(--text-secondary); margin: var(--space-2) 0 4px; }
table.crm-mini td { padding-top: 4px; padding-bottom: 4px; }

/* ---- CSKH thu gọn trong CRM: một dòng ngữ cảnh đủ nghĩa; thẻ hội thoại chung chỉ hiện khi MỞ RỘNG ---- */
.cc-compact-entity { display: inline-flex; align-items: center; gap: 4px; min-width: 0; }
#main[data-route="crm"] > #global-care[data-state="COMPACT"] #global-care-cards { display: none; }

@media (max-width: 1024px) {
  .crm-metrics-5 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .crm-v12 .cl-work { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 640px) {
  /* Điện thoại: vỏ KHÔNG dính (tránh chiếm nửa màn hình); chỉ số cuộn ngang gọn; danh sách → chi tiết */
  .crm-shell { position: static; box-shadow: none; }
  .crm-metrics-4, .crm-metrics-5 { display: flex; overflow-x: auto; gap: 6px; padding-bottom: 2px; scroll-snap-type: x proximity; }
  .crm-metrics-4 .crm-metric, .crm-metrics-5 .crm-metric { flex: 0 0 150px; scroll-snap-align: start; }
  .crm-mode-slot { margin-left: 0; flex-wrap: wrap; }
  .crm-crumbs { font-size: var(--font-meta); }
  .crm-v12 .cl-work .cl-detail-col { display: none; }
  .crm-v12 .cl-work.cl-show-detail .cl-queue-col { display: none; }
  .crm-v12 .cl-work.cl-show-detail .cl-detail-col { display: block; }
}

.crm-latest { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; }
.crm-latest-item { display: flex; flex-direction: column; gap: 2px; padding: 6px var(--space-2); border-radius: var(--radius-sm); cursor: pointer; min-width: 0; }
.crm-latest-item:hover, .crm-latest-item:focus-visible { background: var(--bg-subtle); outline: none; }
.crm-latest-name { font-weight: var(--weight-semibold); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.crm-latest-meta { display: flex; flex-wrap: wrap; align-items: center; gap: 4px; font-size: var(--font-meta); }

/* CRM V1.2 · ô chọn của thanh lọc trong header CRM không được rộng quá khung (tên sản phẩm dài) — chỉ phạm vi CRM, KHÔNG đổi .fbar dùng chung */
.crm-work-header .fbar-src, .crm-work-header .fbar-search { min-width: 0; max-width: 100%; }
.crm-work-header .fbar-select { max-width: 100%; min-width: 0; text-overflow: ellipsis; }
@media (max-width: 640px) { .crm-work-header .fbar-select { max-width: calc(100vw - 48px); } }

/* =====================================================================
   CRM OVERVIEW DASHBOARD V1.3 — chỉ Tổng quan. Màu từ tone V1.2; biểu đồ SVG nội tuyến.
   ===================================================================== */
.crm-ov-v13 { display: flex; flex-direction: column; gap: var(--space-3); }
.crm-ov-scope { display: flex; flex-wrap: wrap; align-items: center; gap: 6px; font-size: var(--font-meta); }
.crm-card { background: var(--bg-surface); border: 1px solid var(--border-soft); border-radius: var(--radius-lg); padding: var(--space-3); min-width: 0; }
.crm-ov-grid { display: grid; grid-template-columns: minmax(0, 62fr) minmax(280px, 38fr); gap: var(--space-3); align-items: start; }
.crm-ov-main { display: flex; flex-direction: column; gap: var(--space-3); min-width: 0; }
.crm-ov-charts { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 6fr); gap: var(--space-3); }
.crm-title-sub { font-weight: var(--weight-normal); text-transform: none; letter-spacing: 0; }
/* SCA-B · SCA-04 — dòng sự thật về khách CHƯA PHÂN CÔNG, ngay dưới cây nhân sự.
   Có khách mà chưa gắn người KHÔNG được hiển thị thành 'không có dữ liệu' (hợp đồng §12). */
.crm-unassigned { margin-top: 6px; padding: 6px 10px; border-radius: var(--radius-sm);
  font-size: var(--font-meta); color: var(--text-secondary); background: var(--bg-surface-soft); }
.crm-unassigned.has-rows { color: var(--status-warning); background: var(--status-warning-soft); }
.crm-unassigned b { color: inherit; font-weight: var(--weight-bold); }
.crm-chart-note { font-size: var(--font-meta); color: var(--text-muted); margin-top: var(--space-2); line-height: var(--line-normal); }
.crm-chart-empty { font-size: var(--font-body); color: var(--text-muted); padding: var(--space-4) var(--space-2); text-align: center; background: var(--bg-subtle); border-radius: var(--radius-md); }
.crm-gap-inline { border-bottom: 1px dashed var(--text-muted); cursor: help; }
/* A · vòng */
.crm-donut { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; }
.crm-donut-svg { width: 160px; height: 160px; flex: none; overflow: visible; }
.crm-donut-seg { cursor: pointer; transition: stroke-width .12s ease; }
.crm-donut-seg:hover, .crm-donut-seg:focus-visible { stroke-width: 27; outline: none; }
.crm-donut-n { font-size: 28px; font-weight: var(--weight-bold); fill: var(--text-primary); }
.crm-donut-cap { font-size: 11px; fill: var(--text-muted); }
.crm-donut-legend { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 2px; flex: 1; min-width: 170px; }
.crm-donut-key { display: grid; grid-template-columns: 12px minmax(0, 1fr) auto; align-items: center; gap: 8px; width: 100%; background: none; border: 0;
  padding: 5px 6px; border-radius: var(--radius-sm); font: inherit; font-size: var(--font-body); color: var(--text-primary); text-align: left; cursor: pointer; }
.crm-donut-key:hover:not(:disabled), .crm-donut-key:focus-visible { background: var(--tone-bg); outline: none; }
.crm-donut-key:disabled { cursor: default; color: var(--text-muted); }
.crm-donut-swatch { width: 12px; height: 12px; border-radius: 3px; background: var(--tone-fg); }
.crm-donut-key-val { white-space: nowrap; font-size: var(--font-meta); color: var(--text-secondary); }
.crm-donut-key-val b { font-size: var(--font-body); color: var(--text-primary); }
/* B · xu hướng: cột = Lead mới (xanh dương thông tin) · đường = chuyển khách hàng (xanh lá) · một trục */
.crm-trend-legend { list-style: none; margin: 0 0 4px; padding: 0; display: flex; gap: var(--space-3); flex-wrap: wrap; font-size: var(--font-meta); color: var(--text-secondary); }
.crm-trend-legend li { display: inline-flex; align-items: center; gap: 6px; }
.crm-trend-legend b { color: var(--text-primary); }
.crm-key-rect { width: 10px; height: 10px; border-radius: 2px; background: var(--status-info); }
.crm-key-line { width: 16px; height: 2px; background: var(--status-success); }
.crm-trend-svg { width: 100%; height: auto; display: block; }
.crm-trend-bar { fill: var(--status-info); }
.crm-trend-line { stroke: var(--status-success); stroke-width: 2; }
.crm-trend-dot { fill: var(--status-success); stroke: var(--bg-surface); stroke-width: 2; }
.crm-trend-grid { stroke: var(--border-soft); stroke-width: 1; }
.crm-trend-axis { font-size: 11px; fill: var(--text-muted); }
.crm-trend-hit { fill: transparent; cursor: help; }
.crm-trend-hit:hover, .crm-trend-hit:focus-visible { fill: var(--bg-subtle); fill-opacity: .6; outline: none; }
.crm-trend-table { margin-top: 4px; font-size: var(--font-meta); }
.crm-trend-table summary { cursor: pointer; color: var(--text-link); }
/* C · khách hàng: ô nhỏ hơn biểu đồ */
.crm-metrics-sm .crm-metric { padding: 6px var(--space-2); }
.crm-metrics-sm .crm-metric-value b { font-size: var(--text-lg); }
/* D · cần chú ý */
.crm-ov-att .crm-att { border-left: 3px solid var(--tone-fg); }
.crm-att-icon { font-size: 12px; flex: none; }
/* E · mới nhất: 2 cột */
.crm-ov-latest { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-4); }
.crm-latest-col { min-width: 0; }
@media (max-width: 1280px) { .crm-ov-charts { grid-template-columns: minmax(0, 1fr); } }
@media (max-width: 1024px) {
  .crm-ov-grid { grid-template-columns: minmax(0, 1fr); }
  .crm-ov-charts { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
}
@media (max-width: 760px) { .crm-ov-charts { grid-template-columns: minmax(0, 1fr); } }
@media (max-width: 640px) {
  .crm-ov-latest { grid-template-columns: minmax(0, 1fr); }
  .crm-donut { justify-content: center; }
  .crm-donut-legend { min-width: 0; width: 100%; }
}
#ovf-owner { max-width: 240px; }
@media (max-width: 640px) { #ovf-owner { max-width: calc(100vw - 48px); } }
/* V1.3 · Tổng quan trên điện thoại: 4 ô khách hàng xếp 2×2 (không cuộn ngang) — chỉ trong .crm-ov-v13, tab Khách hàng giữ dải cuộn V1.2. */
@media (max-width: 640px) {
  .crm-ov-v13 .crm-metrics-sm { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); overflow: visible; }
  .crm-ov-v13 .crm-metrics-sm .crm-metric { flex: none; }
}
@media (max-width: 640px) { .crm-ov-v13 .crm-donut-legend { flex: 1 1 100%; } }

/* =====================================================================
   04_KPI · KPI MODULE STRUCTURE REFACTOR V1 — KPI WORKSPACE (2 tab · 3 tầng)
   Chỉ dùng token của WEBAPP_DESIGN_SYSTEM_V1. N/A dùng màu TRUNG TÍNH:
   "chưa cấu hình" không phải cảnh báo (luật B3).
   ===================================================================== */
.kpi-na { display: inline-block; color: var(--text-muted); font-size: var(--font-meta); font-weight: var(--weight-semibold);
  background: var(--bg-subtle); border-radius: var(--radius-sm); padding: 1px var(--space-2); }

.kpi-ws-scopebar { display: flex; flex-wrap: wrap; align-items: flex-end; gap: var(--space-3);
  background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-md);
  padding: var(--card-pad-sm); margin-bottom: var(--stack-gap); }
.kpi-ws-field { display: flex; flex-direction: column; gap: var(--space-1); min-width: 0; }
.kpi-ws-field > span { font-size: var(--font-meta); font-weight: var(--weight-semibold); color: var(--text-muted); text-transform: uppercase; letter-spacing: .02em; }
.kpi-ws-field select { height: var(--control-h); min-width: 200px; max-width: 100%; font-size: var(--font-body); }
.kpi-ws-fixed { font-size: var(--font-body); height: var(--control-h); display: inline-flex; align-items: center; }
.kpi-ws-role { font-size: var(--font-badge); font-weight: var(--weight-semibold); color: var(--brand-primary);
  background: var(--brand-primary-soft); border-radius: var(--radius-sm); padding: var(--space-1) var(--space-2); }
.kpi-ws-hint { font-size: var(--font-help); color: var(--text-muted); }

.kpi-ws-progress .kpi-ws-prog-grid { display: grid; grid-template-columns: repeat(6, minmax(0, 1fr)); gap: var(--space-2); }
.kpi-ws-prog-cell { background: var(--bg-surface-soft); border-radius: var(--radius-sm); padding: var(--space-2) var(--space-3); min-width: 0; }
.kpi-ws-prog-label { font-size: var(--font-meta); color: var(--text-muted); font-weight: var(--weight-semibold); }
.kpi-ws-prog-value { margin-top: var(--space-1); }
.kpi-ws-empty { margin-top: var(--space-3); font-size: var(--font-body); color: var(--text-secondary); line-height: var(--line-normal);
  border-left: 3px solid var(--border-strong); background: var(--bg-surface-soft); padding: var(--space-2) var(--space-3); border-radius: var(--radius-sm); }

.kpi-ws-tracks { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: var(--stack-gap); margin-bottom: var(--stack-gap); }
.kpi-ws-track { background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm); padding: var(--card-pad); display: flex; flex-direction: column; gap: var(--space-3); min-width: 0; }
.kpi-ws-track[data-state="NA"] { border-top: 3px solid var(--border-strong); }
.kpi-ws-track[data-state="APPLIED"] { border-top: 3px solid var(--brand-primary); }
.kpi-ws-track-head { display: flex; justify-content: space-between; align-items: flex-start; gap: var(--space-2); }
.kpi-ws-track-head h3 { margin: 0; font-size: var(--font-card-title); font-weight: var(--weight-bold); color: var(--text-primary); }
.kpi-ws-track-kv { display: grid; grid-template-columns: 1fr 1fr; gap: var(--space-2) var(--space-3); margin: 0; }
.kpi-ws-track-kv dt { font-size: var(--font-meta); color: var(--text-muted); }
.kpi-ws-track-kv dd { margin: 2px 0 0; font-size: var(--font-body); color: var(--text-primary); }
.kpi-ws-track-note { margin: 0; font-size: var(--font-help); color: var(--text-muted); }
.kpi-ws-track-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center; margin-top: auto; }
.kpi-ws-fb { display: inline-flex; flex-wrap: wrap; gap: var(--space-1); }

.kpi-ws-charts { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--stack-gap); margin-bottom: var(--stack-gap); }
.kpi-ws-chart { margin: 0; min-width: 0; }
.kpi-ws-chart-wide { grid-column: 1 / -1; }
.kpi-ws-chart-empty { display: flex; align-items: center; gap: var(--space-4); color: var(--text-secondary); font-size: var(--font-body); }
.kpi-ws-chart-empty p { margin: 0; line-height: var(--line-normal); }
.kpi-ws-ring { flex: 0 0 auto; width: 72px; height: 72px; border-radius: 50%; border: 8px solid var(--bg-subtle);
  display: grid; place-items: center; color: var(--text-muted); font-weight: var(--weight-bold); font-size: var(--font-card-title); }
.kpi-ws-bars { display: flex; flex-direction: column; gap: var(--space-2); }
.kpi-ws-bar { display: grid; grid-template-columns: minmax(120px, 1.2fr) 2fr minmax(80px, auto); gap: var(--space-2); align-items: center; }
.kpi-ws-bar.is-dim { opacity: .45; }
.kpi-ws-bar-name { font-size: var(--font-body); color: var(--text-primary); font-weight: var(--weight-semibold); }
.kpi-ws-bar-track, .kpi-ws-funnel-track { height: 10px; background: var(--bg-subtle); border-radius: var(--radius-sm); overflow: hidden; }
.kpi-ws-bar-fill, .kpi-ws-funnel-fill { display: block; height: 100%; background: var(--brand-primary); border-radius: var(--radius-sm); }
.kpi-ws-bar-val { text-align: right; font-size: var(--font-body); font-variant-numeric: tabular-nums; font-weight: var(--weight-semibold); }
.kpi-ws-line { width: 100%; height: auto; max-height: 180px; display: block; }
.kpi-ws-axis { stroke: var(--border-default); stroke-width: 1; }
.kpi-ws-path { fill: none; stroke-width: 2; }
.kpi-ws-path-events { stroke: var(--brand-primary); }
.kpi-ws-path-orders { stroke: var(--status-success); stroke-dasharray: 4 3; }
.kpi-ws-dot-events { fill: var(--brand-primary); }
.kpi-ws-dot-orders { fill: var(--status-success); }
.kpi-ws-tick { font-size: 9px; fill: var(--text-muted); text-anchor: middle; }
.kpi-ws-legend { display: flex; gap: var(--space-4); font-size: var(--font-meta); color: var(--text-secondary); margin-top: var(--space-1); }
.kpi-ws-legend span::before { content: ""; display: inline-block; width: 14px; height: 3px; margin-right: var(--space-1); vertical-align: middle; }
.kpi-ws-legend .lg-events::before { background: var(--brand-primary); }
.kpi-ws-legend .lg-orders::before { background: var(--status-success); }
.kpi-ws-funnel { display: flex; flex-direction: column; gap: var(--space-2); }
.kpi-ws-funnel-row { display: grid; grid-template-columns: minmax(170px, 1.2fr) 3fr 60px; gap: var(--space-3); align-items: center;
  padding: var(--space-1) var(--space-2); border-radius: var(--radius-sm); }
.kpi-ws-funnel-row[role="button"] { cursor: pointer; }
.kpi-ws-funnel-row[role="button"]:hover, .kpi-ws-funnel-row[role="button"]:focus-visible { background: var(--brand-primary-soft); outline: none; }
.kpi-ws-funnel-row[data-mapping="NOT_DEFINED"] .kpi-ws-funnel-name { color: var(--text-muted); }
.kpi-ws-funnel-name { font-size: var(--font-body); font-weight: var(--weight-semibold); color: var(--text-primary); display: flex; flex-direction: column; }
.kpi-ws-funnel-name small { font-size: var(--font-meta); font-weight: var(--weight-normal); color: var(--text-muted); }
.kpi-ws-funnel-row[data-mapping="CANDIDATE"] .kpi-ws-funnel-fill { background: var(--status-info); }
.kpi-ws-funnel-n { text-align: right; font-variant-numeric: tabular-nums; font-weight: var(--weight-bold); font-size: var(--font-body); }

.kpi-ws-team tr.is-self td { background: var(--brand-primary-soft); }
.kpi-ws-ctv { margin-top: var(--space-2); font-size: var(--font-body); color: var(--text-secondary); }
.kpi-ws-evidence { margin-bottom: var(--stack-gap); background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-md); padding: var(--card-pad-sm); }
.kpi-ws-evidence > summary { cursor: pointer; font-size: var(--font-card-title); font-weight: var(--weight-semibold); color: var(--text-primary); }
.kpi-ws-req-counts { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-bottom: var(--space-3); }
.kpi-ws-req { font-size: var(--font-body); background: var(--bg-surface-soft); border-radius: var(--radius-sm); padding: var(--space-1) var(--space-3); }
.kpi-ws-req[data-bucket="NEW"] b { color: var(--status-warning); }
.kpi-ws-req-group { border-top: 1px solid var(--border-soft); padding: var(--space-2) 0; }
.kpi-ws-req-group > summary { cursor: pointer; font-size: var(--font-body); font-weight: var(--weight-semibold); }
.kpi-ws-anchor { display: grid; grid-template-columns: repeat(auto-fit, minmax(150px, 1fr)); gap: var(--space-2); margin: 0 0 var(--space-3);
  background: var(--bg-surface-soft); border-radius: var(--radius-sm); padding: var(--space-2) var(--space-3); }
.kpi-ws-anchor dt { font-size: var(--font-meta); color: var(--text-muted); }
.kpi-ws-anchor dd { margin: 2px 0 0; font-size: var(--font-body); }

.kpi-policy-head { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-3); margin-bottom: var(--stack-gap); }
.kpi-policy-access { font-size: var(--font-badge); letter-spacing: .04em; }
.kpi-policy-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-bottom: var(--space-2); }
.kpi-policy-lifecycle { margin: 0 0 var(--space-3); padding-left: var(--space-5); font-size: var(--font-body); line-height: 1.9; }
.kpi-policy-rules { margin: 0; padding-left: var(--space-5); font-size: var(--font-help); color: var(--text-secondary); line-height: var(--line-normal); }

@media (max-width: 1100px) {
  .kpi-ws-progress .kpi-ws-prog-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .kpi-ws-charts { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 640px) {
  .kpi-ws-progress .kpi-ws-prog-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .kpi-ws-field, .kpi-ws-field select { width: 100%; min-width: 0; }
  .kpi-ws-funnel-row { grid-template-columns: minmax(0, 1fr) 1fr 44px; }
  .kpi-ws-bar { grid-template-columns: minmax(0, 1fr) 1fr auto; }
  .kpi-ws-track-kv { grid-template-columns: 1fr; }
}

/* =====================================================================
 * WEBAPP-BAI-DANG-UI-V1-01 · MODULE BÀI ĐĂNG (Giai đoạn 1)
 * Bám 4 ảnh Chủ sở hữu chốt 19/09/2026. Chỉ dùng token canonical (PHẦN A/B/C).
 * LIGHT_ONLY_V1 — KHÔNG thêm khối prefers-color-scheme: dark ở đây.
 * Sàn đọc được: không khai font-size dưới var(--font-min-readable),
 * trừ huy hiệu mã nhân sự đã có ngoại lệ ở C8.3.
 * ===================================================================== */

/* ---- Khung cố định: tiêu đề · 3 trạng thái nhanh · 2 nút ---- */
.post-page-header { display: flex; align-items: center; gap: var(--space-4); flex-wrap: wrap; }
.post-page-header .page-header-left { flex: 1 1 260px; min-width: 0; }
.post-page-icon { background: var(--brand-primary-soft); color: var(--brand-primary); }
.post-quick { display: flex; gap: var(--space-3); flex-wrap: wrap; min-width: 0; }
.post-header-actions { display: flex; gap: var(--space-2); align-items: center; margin-left: auto; }
.post-create-btn, .post-assistant-btn { white-space: nowrap; }

.pd-quick { display: flex; align-items: center; gap: var(--space-3); min-width: 158px;
  padding: 10px var(--space-4); border-radius: var(--radius-lg); border: 1px solid var(--tone-line);
  background: var(--tone-bg); color: var(--text-primary); font: inherit; cursor: pointer; text-align: left; }
.pd-quick:hover { box-shadow: var(--shadow-sm); }
.pd-quick:focus-visible { outline: 2px solid var(--border-focus); outline-offset: 2px; }
.pd-quick-ico { font-size: var(--text-lg); color: var(--tone-fg); line-height: 1; }
.pd-quick-body { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.pd-quick-label { font-size: var(--font-meta); color: var(--tone-fg); font-weight: var(--weight-semibold); }
.pd-quick-num { font-size: var(--text-2xl); font-weight: var(--weight-bold); color: var(--tone-fg); line-height: var(--line-tight); }
.pd-quick-wait   { --tone-bg: var(--status-warning-soft); --tone-fg: var(--status-warning); --tone-line: var(--status-warning); }
.pd-quick-info   { --tone-bg: var(--status-info-soft);    --tone-fg: var(--status-info);    --tone-line: var(--status-info); }
.pd-quick-urgent { --tone-bg: var(--status-danger-soft);  --tone-fg: var(--status-danger);  --tone-line: var(--status-danger); }

/* ---- Vỏ DÍNH tầng 3 · công thức chung B6, KHÔNG tự cộng offset ---- */
.post-shell-sentinel { height: 1px; margin-bottom: -1px; }
.post-shell { position: sticky; top: var(--sticky-module-top); z-index: var(--sticky-z-module);
  background: var(--bg-app); padding: 6px 0 8px; margin: 0 0 var(--space-3);
  display: flex; flex-direction: column; gap: var(--space-2); box-shadow: var(--sticky-edge); }
/* Ba tab cố định. Màn hẹp thì CUỘN NGANG TRONG KHUNG (luật PHẦN D), không đẩy tràn cả trang. */
.post-tabs { display: flex; align-items: center; gap: var(--space-5); margin: 0;
  border-bottom: 1px solid var(--border-soft); overflow-x: auto; scrollbar-width: thin; min-width: 0; }
.post-tabs .tab { flex: none; white-space: nowrap; }
.post-work-header { display: flex; flex-direction: column; gap: var(--space-2); }
.post-shell.is-compact { padding: 4px 0 6px; gap: 4px; }
.post-shell.is-compact .pd-nsum { display: none; }

/* ---- Thanh lọc ---- */
.pd-fbar { display: flex; gap: var(--space-2); align-items: flex-end; flex-wrap: wrap; margin: 0; }
.pd-field { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1 1 165px; }
.pd-field-search { flex: 2 1 260px; }
.pd-field-label { font-size: var(--font-meta); color: var(--text-secondary); }
.pd-field select, .pd-field input { height: var(--control-h); border-radius: var(--control-radius);
  border: 1px solid var(--border-default); background: var(--bg-surface); color: var(--text-primary);
  padding: 0 var(--control-pad-x); font-size: var(--font-body); width: 100%; min-width: 0; }
.pd-field select:focus, .pd-field input:focus { outline: none; border-color: var(--border-focus);
  box-shadow: 0 0 0 3px var(--brand-primary-soft); }

.pd-chips { display: flex; gap: var(--space-2); flex-wrap: wrap; }
.pd-chip { display: inline-flex; align-items: center; gap: 5px; height: var(--control-h-sm);
  padding: 0 var(--space-3); border-radius: 999px; border: 1px solid var(--border-default);
  background: var(--bg-surface); color: var(--text-secondary); font-size: var(--font-body); cursor: pointer; }
.pd-chip:hover { background: var(--bg-surface-soft); }
.pd-chip.is-on { background: var(--brand-primary-soft); border-color: var(--brand-primary);
  color: var(--brand-primary); font-weight: var(--weight-semibold); }

/* ---- Thẻ dùng chung ---- */
.pd-card { display: flex; flex-direction: column; gap: var(--space-3); min-width: 0; padding: var(--card-pad); }
.pd-card-head { display: flex; align-items: center; gap: var(--space-2); justify-content: space-between; min-width: 0; }
.pd-card-head-right { display: inline-flex; align-items: center; gap: var(--space-2); }
.pd-card-title { display: inline-flex; align-items: center; gap: var(--space-2); margin: 0;
  font-size: var(--font-card-title); font-weight: var(--weight-semibold); color: var(--text-primary); min-width: 0; }
.pd-card-title i { color: var(--brand-primary); font-style: normal; }
.pd-count { font-size: var(--font-meta); color: var(--text-secondary); white-space: nowrap; }
.pd-link { white-space: nowrap; }
.pd-muted { color: var(--text-muted); font-size: var(--font-meta); }
.pd-hint { margin: 0; font-size: var(--font-meta); color: var(--text-secondary); text-align: center; }
.pd-proto-note { margin: 0; font-size: var(--font-help); color: var(--text-muted); }
.pd-row-more { border: 0; background: transparent; color: var(--text-muted); cursor: pointer;
  border-radius: var(--radius-sm); padding: 2px 6px; font-size: var(--font-body); line-height: 1; }
.pd-row-more:hover { background: var(--bg-surface-soft); color: var(--text-primary); }

/* ---- Mã nhân sự A / A1 / B / B1 (FORM muc 5) ---- */
.pd-code { display: inline-flex; align-items: center; justify-content: center; min-width: 26px;
  padding: 1px 7px; border-radius: var(--radius-sm); font-size: var(--font-badge);
  font-weight: var(--weight-bold); letter-spacing: .02em; white-space: nowrap; }
.pd-code-emp  { background: var(--brand-primary); color: var(--text-inverse); }
.pd-code-ctv  { background: var(--brand-primary-soft); color: var(--brand-primary); }
.pd-code-link { background: transparent; color: var(--text-link); }

/* ---- Avatar + ô thống kê ---- */
.pd-me { display: flex; align-items: center; gap: var(--space-3); min-width: 0; }
.pd-avatar { display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px;
  border-radius: 999px; background: var(--brand-primary); color: var(--text-inverse);
  font-weight: var(--weight-bold); font-size: var(--font-body); flex: none; }
.pd-me-text { display: flex; flex-direction: column; min-width: 0; }
.pd-me-text b { font-size: var(--font-body); color: var(--text-primary); }
.pd-me-text span { font-size: var(--font-meta); color: var(--text-secondary); }

.pd-statgrid { display: grid; gap: var(--space-2); }
.pd-statgrid-4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.pd-statgrid-2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.pd-stat { min-width: 0; padding: 8px var(--space-3); border-radius: var(--radius-md);
  border: 1px solid var(--tone-line); background: var(--tone-bg); }
.pd-stat-label { font-size: var(--font-meta); color: var(--tone-fg); font-weight: var(--weight-semibold);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pd-stat-value { display: flex; align-items: baseline; gap: 5px; }
.pd-stat-value i { font-style: normal; color: var(--tone-fg); font-size: var(--font-body); }
.pd-stat-value b { font-size: var(--text-xl); font-weight: var(--weight-bold); color: var(--tone-fg); }
.pd-stat-wait   { --tone-bg: var(--status-warning-soft); --tone-fg: var(--status-warning); --tone-line: var(--status-warning); }
.pd-stat-info   { --tone-bg: var(--status-info-soft);    --tone-fg: var(--status-info);    --tone-line: var(--status-info); }
.pd-stat-ok     { --tone-bg: var(--status-success-soft); --tone-fg: var(--status-success); --tone-line: var(--status-success); }
.pd-stat-urgent { --tone-bg: var(--status-danger-soft);  --tone-fg: var(--status-danger);  --tone-line: var(--status-danger); }

/* ---- TAB 1 · Tổng quan (IMAGE-01 Admin / IMAGE-02 Nhân viên) ---- */
.pd-ov-grid { display: grid; gap: var(--space-3); margin-bottom: var(--space-3);
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.05fr) minmax(0, 1.5fr); align-items: start; }
.pd-ov-grid > .pd-card { min-width: 0; }

.pd-tree-search { display: flex; align-items: center; gap: var(--space-2); height: var(--control-h);
  border: 1px solid var(--border-default); border-radius: var(--control-radius);
  background: var(--bg-surface); padding: 0 var(--control-pad-x); }
.pd-tree-search input { border: 0; outline: none; background: transparent; width: 100%; min-width: 0;
  font-size: var(--font-body); color: var(--text-primary); }
.pd-tree-search-ico { color: var(--text-muted); font-size: var(--font-meta); }

.pd-tree, .pd-tree-kids { list-style: none; margin: 0; padding: 0; }
.pd-tree-kids { margin-left: var(--space-4); border-left: 1px solid var(--border-soft); padding-left: var(--space-3); }
.pd-tree-row { display: flex; align-items: center; gap: var(--space-2); min-width: 0;
  padding: 6px var(--space-2); border-radius: var(--radius-md); cursor: pointer; }
.pd-tree-row:hover { background: var(--brand-primary-soft); }
.pd-tree-row.is-sel { background: var(--brand-primary-soft); box-shadow: inset 3px 0 0 var(--brand-primary); }
.pd-tree-toggle { border: 0; background: transparent; color: var(--text-muted); cursor: pointer;
  font-size: var(--font-body); line-height: 1; padding: 0 2px; flex: none; }
.pd-tree-text { display: flex; flex-direction: column; min-width: 0; flex: 1 1 auto; }
.pd-tree-text b { font-size: var(--font-body); color: var(--text-primary);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pd-tree-sub { font-size: var(--font-meta); color: var(--text-secondary); }
.pd-tree-root + .pd-tree-root { margin-top: 2px; }

.pd-info-body { display: flex; gap: var(--space-4); align-items: flex-start; min-width: 0; flex-wrap: wrap; }
.pd-info-kv { flex: 1 1 210px; min-width: 0; display: flex; flex-direction: column; gap: var(--space-2); }
.pd-info-stats { flex: 1 1 230px; min-width: 0; display: flex; flex-direction: column; gap: var(--space-2); }
.pd-kv { display: flex; align-items: center; gap: var(--space-2); min-width: 0; font-size: var(--font-body); }
.pd-kv > span:first-child { color: var(--text-secondary); flex: none; }
.pd-kv b { color: var(--text-primary); font-weight: var(--weight-semibold); min-width: 0;
  overflow: hidden; text-overflow: ellipsis; }
.pd-kv-block { flex-direction: column; align-items: flex-start; gap: 5px; }
.pd-ctv-list { display: flex; flex-direction: column; gap: 4px; width: 100%; }
.pd-ctv-chip { display: inline-flex; align-items: center; gap: var(--space-2); border: 0; cursor: pointer;
  background: transparent; padding: 2px 4px; border-radius: var(--radius-sm); font-size: var(--font-body);
  color: var(--text-primary); text-align: left; }
.pd-ctv-chip:hover { background: var(--bg-surface-soft); }
.pd-total { display: flex; align-items: center; gap: var(--space-3); padding: 10px var(--space-3);
  border: 1px solid var(--border-soft); border-radius: var(--radius-md); background: var(--bg-surface-soft); }
.pd-total-ico { font-size: var(--text-lg); color: var(--brand-primary); }
.pd-total-text { display: flex; flex-direction: column; min-width: 0; }
.pd-total-text span { font-size: var(--font-meta); color: var(--text-secondary); }
.pd-total-text b { font-size: var(--text-2xl); font-weight: var(--weight-bold);
  color: var(--text-primary); line-height: var(--line-tight); }
.pd-detail-btn { width: 100%; justify-content: center; }

/* ---- Bảng ---- */
.pd-table-wrap { overflow: auto; min-width: 0; }
.pd-list-scroll { max-height: 62vh; }
.pd-recent-table, .pd-list-table { width: 100%; }
.pd-recent-table tbody tr, .pd-list-table tbody tr { cursor: pointer; }
.pd-col-idx { width: 34px; color: var(--text-muted); }
.pd-col-more { width: 34px; text-align: right; }
.pd-col-time { white-space: nowrap; }
.pd-col-content, .pd-col-title { min-width: 180px; }
.pd-col-thumb { width: 54px; }
.pd-col-kind, .pd-col-act { white-space: nowrap; }
.pd-list-table tbody tr.is-sel { background: var(--brand-primary-soft); box-shadow: inset 3px 0 0 var(--brand-primary); }
.pd-view-btn { color: var(--text-link); }

.pd-channel { display: inline-flex; align-items: center; gap: 5px; white-space: nowrap;
  font-size: var(--font-body); color: var(--text-primary); }
.pd-channel i { display: inline-flex; align-items: center; justify-content: center; width: 18px; height: 18px;
  border-radius: var(--radius-sm); font-style: normal; font-size: var(--font-badge);
  font-weight: var(--weight-bold); color: var(--text-inverse); flex: none; }
.pch-fb i  { background: #1877F2; }
.pch-tt i  { background: #111827; }
.pch-zl i  { background: #0068FF; }
.pch-web i { background: #C4302B; }
.pd-status i { font-style: normal; margin-right: 3px; }
.pd-kind { display: inline-flex; align-items: center; gap: 4px; font-size: var(--font-body); color: var(--text-secondary); }
.pd-kind i { font-style: normal; }

/* ---- Ô giữ chỗ media (chưa có kho media thật) ---- */
.pd-thumb { display: inline-flex; align-items: center; justify-content: center; width: 44px; height: 38px;
  border-radius: var(--radius-sm); flex: none; border: 1px solid var(--border-soft);
  background: hsl(var(--pd-hue, 200) 45% 92%); color: hsl(var(--pd-hue, 200) 45% 32%); }
.pd-thumb-lg { width: 170px; height: 170px; border-radius: var(--radius-md); }
.pd-thumb-lg .pd-thumb-play, .pd-thumb-lg .pd-thumb-ico { font-size: var(--text-2xl); }

/* ---- TAB 2 · Quản lý bài đăng (IMAGE-03) ---- */
.pd-manage-grid, .pd-notify-grid { display: grid; gap: var(--space-3); align-items: start;
  grid-template-columns: minmax(0, 1.2fr) minmax(0, 1fr); }
.pd-detail-top { display: flex; gap: var(--space-4); align-items: flex-start; flex-wrap: wrap; min-width: 0; }
.pd-detail-kv { flex: 1 1 260px; min-width: 0; display: flex; flex-direction: column; gap: var(--space-2); }
.pd-detail-kv .pd-kv { display: grid; grid-template-columns: 96px minmax(0, 1fr); align-items: center; }
.pd-detail-kv input, .pd-detail-kv select { height: var(--control-h); width: 100%; min-width: 0;
  border: 1px solid var(--border-default); border-radius: var(--control-radius);
  background: var(--bg-surface); color: var(--text-primary); padding: 0 var(--control-pad-x);
  font-size: var(--font-body); }
.pd-row-field { display: flex; flex-direction: column; gap: 3px; min-width: 0; position: relative; }
.pd-row-field > span:first-child { font-size: var(--font-meta); color: var(--text-secondary); }
.pd-row-field input, .pd-row-field select, .pd-row-field textarea {
  border: 1px solid var(--border-default); border-radius: var(--control-radius);
  background: var(--bg-surface); color: var(--text-primary); font-size: var(--font-body);
  padding: 8px var(--control-pad-x); width: 100%; min-width: 0; font-family: inherit; }
.pd-row-field input, .pd-row-field select { height: var(--control-h); padding-top: 0; padding-bottom: 0; }
.pd-row-field textarea { resize: vertical; line-height: var(--line-normal); }
.pd-row-field input:read-only, .pd-row-field textarea:read-only,
.pd-detail-kv input:read-only { background: var(--bg-surface-soft); color: var(--text-secondary); }
.pd-row-field input:focus, .pd-row-field select:focus, .pd-row-field textarea:focus,
.pd-detail-kv input:focus, .pd-detail-kv select:focus {
  outline: none; border-color: var(--border-focus); box-shadow: 0 0 0 3px var(--brand-primary-soft); }
.pd-row-2 { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-3); }
.pd-req { color: var(--status-danger); font-weight: var(--weight-bold); }
.pd-counter { position: absolute; right: var(--space-2); bottom: 6px;
  font-size: var(--font-meta); color: var(--text-muted); }
.pd-detail-actions { display: flex; gap: var(--space-2); flex-wrap: wrap; }
.pd-detail-actions .btn { flex: 1 1 auto; justify-content: center; }

/* ---- TAB 3 · Thông báo (IMAGE-04) ---- */
.pd-nsum { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-3); }
.pd-nsum-card { display: flex; align-items: center; gap: var(--space-3); min-width: 0;
  padding: 10px var(--space-4); border-radius: var(--radius-lg);
  border: 1px solid var(--tone-line); background: var(--tone-bg); }
.pd-nsum-ico { font-size: var(--text-lg); color: var(--tone-fg); }
.pd-nsum-body { display: flex; flex-direction: column; min-width: 0; }
.pd-nsum-label { font-size: var(--font-meta); color: var(--tone-fg); font-weight: var(--weight-semibold); }
.pd-nsum-body b { font-size: var(--text-2xl); font-weight: var(--weight-bold);
  color: var(--tone-fg); line-height: var(--line-tight); }
.pd-nsum-info   { --tone-bg: var(--status-info-soft);    --tone-fg: var(--status-info);    --tone-line: var(--status-info); }
.pd-nsum-wait   { --tone-bg: var(--status-warning-soft); --tone-fg: var(--status-warning); --tone-line: var(--status-warning); }
.pd-nsum-urgent { --tone-bg: var(--status-danger-soft);  --tone-fg: var(--status-danger);  --tone-line: var(--status-danger); }
.pd-nsum-ok     { --tone-bg: var(--status-success-soft); --tone-fg: var(--status-success); --tone-line: var(--status-success); }

.pd-nlist { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; }
.pd-nitem { display: flex; align-items: center; gap: var(--space-3); min-width: 0;
  padding: var(--space-3) var(--space-2); border-top: 1px solid var(--border-soft); cursor: pointer; }
.pd-nitem:first-child { border-top: 0; }
.pd-nitem:hover { background: var(--bg-surface-soft); }
.pd-nitem.is-sel { background: var(--brand-primary-soft); box-shadow: inset 3px 0 0 var(--brand-primary); }
.pd-nico { display: inline-flex; align-items: center; justify-content: center; width: 32px; height: 32px;
  border-radius: 999px; flex: none; font-size: var(--font-body); }
.pn-action { background: var(--status-warning-soft); color: var(--status-warning); }
.pn-info   { background: var(--status-info-soft);    color: var(--status-info); }
.pn-error  { background: var(--status-danger-soft);  color: var(--status-danger); }
.pn-ok     { background: var(--status-success-soft); color: var(--status-success); }
.pd-nbody { display: flex; flex-direction: column; gap: 1px; min-width: 0; flex: 1 1 auto; }
.pd-ntitle { font-size: var(--font-body); color: var(--text-primary); font-weight: var(--weight-semibold);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pd-nitem.is-unread .pd-ntitle { color: var(--text-link); }
.pd-ndesc { font-size: var(--font-meta); color: var(--text-secondary);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pd-nmeta { display: inline-flex; align-items: center; gap: var(--space-2); flex: none; }
.pd-nwhen { font-size: var(--font-meta); color: var(--text-muted); white-space: nowrap; }

.pd-ndetail-head { display: flex; align-items: flex-start; gap: var(--space-3); min-width: 0; }
.pd-ndetail-head > span:last-child { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.pd-ndetail-title { font-size: var(--font-section-title); color: var(--text-primary); }
.pd-ngrid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-2) var(--space-4); }
.pd-nblock { display: flex; flex-direction: column; gap: 5px; min-width: 0; }
.pd-nblock-label { font-size: var(--font-meta); color: var(--text-secondary); }
.pd-nblock-box { border: 1px solid var(--border-soft); border-radius: var(--radius-md);
  background: var(--bg-surface-soft); padding: var(--space-3); font-size: var(--font-body);
  color: var(--text-primary); line-height: var(--line-normal); }
.pd-nrelated { display: flex; align-items: center; gap: var(--space-3); min-width: 0; cursor: pointer;
  border: 1px solid var(--border-soft); border-radius: var(--radius-md); padding: var(--space-2) var(--space-3); }
.pd-nrelated:hover { background: var(--bg-surface-soft); }
.pd-nrelated-text { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1 1 auto; }
.pd-nrelated-text b { font-size: var(--font-body); color: var(--text-primary);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* ---- Hộp thoại Tạo bài đăng ---- */
.pd-modal-card { width: min(820px, 94vw); }
.pd-modal-form { max-height: 68vh; overflow: auto; display: flex; flex-direction: column; gap: var(--space-4); }
.pd-fs { border: 1px solid var(--border-soft); border-radius: var(--radius-md); padding: var(--space-3);
  margin: 0; display: flex; flex-direction: column; gap: var(--space-3); min-width: 0; }
.pd-fs > legend { font-size: var(--font-meta); color: var(--brand-primary);
  font-weight: var(--weight-semibold); padding: 0 var(--space-2); }
.pd-gap-note { margin: 0; }
.pd-preview-card { display: flex; gap: var(--space-3); align-items: flex-start; min-width: 0;
  border: 1px solid var(--border-soft); border-radius: var(--radius-md); padding: var(--space-3); }
.pd-preview-body { display: flex; flex-direction: column; gap: var(--space-2); min-width: 0; }
.pd-preview-body p { margin: 0; font-size: var(--font-body); color: var(--text-secondary);
  white-space: pre-wrap; line-height: var(--line-normal); }

/* ---- Thông báo nhanh (toast) ---- */
.pd-toast { position: fixed; left: 50%; bottom: 24px; transform: translate(-50%, 12px);
  background: var(--text-primary); color: var(--text-inverse); border-radius: var(--radius-md);
  padding: 10px var(--space-4); font-size: var(--font-body); box-shadow: var(--shadow-floating);
  opacity: 0; pointer-events: none; transition: opacity .18s ease, transform .18s ease;
  z-index: 120; max-width: min(560px, 92vw); }
.pd-toast.is-on { opacity: 1; transform: translate(-50%, 0); }

/* ---- Responsive (PHẦN D) ---- */
@media (max-width: 1280px) {
  .pd-ov-grid { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
  .pd-ov-grid > .pd-card-info { grid-column: 1 / -1; }
}
@media (max-width: 1024px) {
  .post-header-actions { margin-left: 0; }
  .pd-ov-grid, .pd-manage-grid, .pd-notify-grid { grid-template-columns: minmax(0, 1fr); }
  .pd-nsum { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .pd-list-scroll { max-height: none; }
}
@media (max-width: 767px) {
  .post-shell { position: static; box-shadow: none; }
  .pd-quick { flex: 1 1 128px; min-width: 128px; }
  .pd-row-2, .pd-ngrid { grid-template-columns: minmax(0, 1fr); }
  .pd-detail-actions .btn { flex: 1 1 100%; }
  .pd-thumb-lg { width: 100%; height: 190px; }
  /* Dòng thông báo: màn hẹp thì dải thời gian/trạng thái/nút xuống dòng riêng,
     không ép ngang làm tràn khung (đo được 8px tràn ở 375px trước khi sửa). */
  .pd-nitem { flex-wrap: wrap; }
  .pd-nbody { flex: 1 1 100%; }
  .pd-nmeta { flex: 1 1 100%; flex-wrap: wrap; justify-content: flex-start; }
  .pd-ntitle, .pd-ndesc { white-space: normal; }
}

/* =====================================================================
 * WEBAPP-BAI-DANG-UI-V1-01 · CONTINUATION-OVERVIEW-UX-FIX (19/09/2026)
 * Chỉ UI/UX. Bốn việc Chủ sở hữu nêu, áp cho CẢ Admin lẫn Nhân viên:
 *   1 · vỏ dính (tab + bộ lọc) không trôi mất khi cuộn — xem thêm app.js:
 *       nhánh route 'post' nay gọi kpiTrackCareHeight() như CRM/Product/KPI
 *   2 · danh sách nhân sự CUỘN RIÊNG, không kéo dài cả trang
 *   3 · "Bài đăng gần đây" thu gọn
 *   4 · hàng điều hướng quay Trang chủ
 * LIGHT_ONLY_V1 — không thêm khối prefers-color-scheme: dark.
 * ===================================================================== */

/* ---- 4 · Hàng điều hướng đầu module ---- */
.post-nav-row { display: flex; align-items: center; gap: var(--space-2);
  flex-wrap: wrap; min-width: 0; }
.post-back { flex: none; white-space: nowrap; }
.post-crumbs { margin: 0; display: flex; flex-wrap: wrap; align-items: center;
  gap: 2px 6px; min-width: 0; font-size: var(--font-meta); color: var(--text-secondary); }
.post-crumbs .crumb-sep { color: var(--text-muted); }
.post-crumbs b { color: var(--text-primary); font-weight: var(--weight-semibold); }
.post-crumbs .crumb-link { color: var(--text-link); cursor: pointer; text-decoration: none; }
.post-crumbs .crumb-link:hover { text-decoration: underline; }
.post-crumb-mid { color: var(--text-secondary); }
/* Đã dính ⇒ giấu breadcrumb cho dải mỏng lại, NÚT quay Trang chủ thì GIỮ
   (đó mới là thao tác người dùng cần khi đang cuộn sâu). */
.post-shell.is-compact .post-crumbs { display: none; }

/* ---- 2 · Danh sách nhân viên / cộng tác viên: cuộn riêng ---- */
/* Trần chiều cao đặt theo VIEWPORT để màn cao thì thấy nhiều hơn, màn thấp không vỡ.
   Trừ đi phần khung đã chiếm (topbar + CSKH + vỏ module) qua --sticky-module-top. */
.pd-tree-scroll { overflow-y: auto; overscroll-behavior: contain; min-width: 0;
  max-height: clamp(220px, calc(100vh - var(--sticky-module-top, 69px) - 300px), 460px); }
.pd-card-tree { min-width: 0; }
/* Panel thông tin KHÔNG được dài theo danh sách — ba thẻ tự cân, không kéo nhau. */
.pd-ov-grid > .pd-card { align-self: start; }
.pd-info-stats { align-self: start; }

/* ---- 3 · "Bài đăng gần đây" thu gọn ---- */
.pd-recent-scroll { max-height: clamp(180px, 34vh, 320px); overflow-y: auto;
  overscroll-behavior: contain; }
.pd-table-compact th, .pd-table-compact td { padding-top: 6px; padding-bottom: 6px; }
.pd-table-compact tbody tr { height: auto; }
/* Đầu bảng dính trong chính khối cuộn, để cuộn 5 dòng vẫn biết cột nào là cột nào. */
.pd-recent-scroll thead th { position: sticky; top: 0; z-index: 1;
  background: var(--bg-surface-soft); }

/* ---- 1 · Vỏ dính: dải thu gọn khi đã dính, để chừa chỗ cho nội dung ---- */
.post-shell.is-compact .pd-field-label { display: none; }
.post-shell.is-compact .pd-fbar { gap: 6px; }

/* ---- Responsive ---- */
@media (max-width: 1024px) {
  /* Màn hẹp: danh sách nhân sự thấp hơn để thẻ thông tin bên dưới còn thấy được. */
  .pd-tree-scroll { max-height: clamp(200px, 40vh, 340px); }
  .pd-recent-scroll { max-height: clamp(160px, 30vh, 260px); }
}
@media (max-width: 767px) {
  /* Điện thoại: vỏ module KHÔNG dính (đã quyết ở V1), nên trần chiều cao chỉ cần
     đủ để danh sách không nuốt cả trang. Nút Trang chủ giãn full để dễ bấm. */
  .pd-tree-scroll { max-height: 300px; }
  .pd-recent-scroll { max-height: 260px; }
  .post-nav-row { gap: 6px; }
  /* Tầm chạm: .btn-xs chỉ cao 28px — quá nhỏ cho ngón tay trên điện thoại. */
  .post-back { flex: 1 1 100%; justify-content: center; min-height: 40px; }
}

/* =====================================================================
 * WEBAPP-BAI-DANG-UI-V1-01 · CONTINUATION-STAFF-TREE-INTERACTION-FIX (19/09/2026)
 * Nút xổ/thu của cây nhân sự: tầm chạm đủ lớn, trạng thái nhìn thấy được,
 * và nhóm KHÔNG có cộng tác viên thì KHÔNG có nút giả.
 * ===================================================================== */

/* Tầm chạm: 28x28 trên máy tính (trước đó chỉ là chữ trần, vùng bấm ~10px). */
.pd-tree-toggle { display: inline-flex; align-items: center; justify-content: center;
  width: 28px; height: 28px; padding: 0; flex: none; border: 0; cursor: pointer;
  border-radius: var(--radius-sm); background: transparent; color: var(--text-secondary);
  font-size: var(--font-body); line-height: 1; }
.pd-tree-toggle:hover { background: var(--bg-surface-soft); color: var(--text-primary); }
.pd-tree-toggle:focus-visible { outline: 2px solid var(--border-focus); outline-offset: 1px; }
.pd-tree-toggle[aria-expanded="true"] { color: var(--brand-primary); }
/* Nhóm rỗng: ô trống CÙNG bề rộng để mã nhân sự vẫn thẳng cột với các dòng khác.
   Không nền, không con trỏ, không bắt sự kiện — bấm vào không có gì xảy ra vì KHÔNG PHẢI nút. */
.pd-tree-toggle-empty { pointer-events: none; }

/* Thanh cuộn chỉ hiện khi cần (overflow-y: auto đã lo), và không đè lên nội dung. */
.pd-tree-scroll { scrollbar-gutter: stable; }

@media (max-width: 767px) {
  /* Điện thoại: tầm chạm rộng hơn cho ngón tay. */
  .pd-tree-toggle { width: 36px; height: 36px; }
  .pd-tree-row { padding-top: 8px; padding-bottom: 8px; }
}

/* =====================================================================
 * WEBAPP-BAI-DANG-UI-V1-01 · CONTINUATION-OVERVIEW-FINALIZATION (19/09/2026)
 * Biểu đồ vòng "Tỷ lệ trạng thái bài đăng" trong thẻ "Bài đăng của tôi".
 * Màu lấy THẲNG token trạng thái của dự án — không bảng màu mới.
 * Danh tính không bao giờ chỉ bằng màu: mỗi mảng có chú giải kèm biểu tượng + nhãn + số.
 * ===================================================================== */

.pd-chart { display: flex; flex-direction: column; gap: var(--space-2); min-width: 0;
  border-top: 1px solid var(--border-soft); padding-top: var(--space-3); margin-top: auto; }
.pd-chart-title { margin: 0; font-size: var(--font-meta); font-weight: var(--weight-semibold);
  color: var(--text-secondary); text-transform: uppercase; letter-spacing: .02em; }
.pd-chart-body { display: flex; align-items: center; gap: var(--space-3); min-width: 0; flex-wrap: wrap; }
.pd-chart-empty { justify-content: center; }

.pd-donut { width: 124px; height: 124px; flex: none; }
.pd-donut-track { stroke: var(--bg-surface-soft); }
/* Khoảng hở giữa hai mảng kề do chính hình học lo (cắt cung), cộng thêm viền nền
   để mảng không dính nhau khi in hoặc ở chế độ tương phản cao. */
.pd-arc { stroke: var(--bg-surface); stroke-width: 1; cursor: pointer;
  transition: opacity .12s ease; }
.pd-arc:hover { opacity: .82; }
.pd-arc:focus-visible { outline: 2px solid var(--border-focus); outline-offset: 2px; }
.pd-arc-wait   { fill: var(--status-warning); }
.pd-arc-info   { fill: var(--status-info); }
.pd-arc-ok     { fill: var(--status-success); }
.pd-arc-urgent { fill: var(--status-danger); }
/* Chữ giữa vòng đeo token CHỮ, không đeo màu chuỗi dữ liệu. */
.pd-donut-num { font-size: 26px; font-weight: var(--weight-bold); fill: var(--text-primary); }
.pd-donut-cap { font-size: 10px; fill: var(--text-muted); }

.pd-legends { display: flex; flex-direction: column; gap: 3px; min-width: 0; flex: 1 1 148px; }
.pd-legend { display: grid; grid-template-columns: 10px 16px minmax(0, 1fr) auto auto;
  align-items: center; gap: 6px; width: 100%; min-width: 0;
  border: 0; background: transparent; cursor: pointer; text-align: left;
  padding: 3px var(--space-2); border-radius: var(--radius-sm); font: inherit;
  font-size: var(--font-meta); color: var(--text-secondary); }
.pd-legend:hover { background: var(--bg-surface-soft); }
.pd-legend:focus-visible { outline: 2px solid var(--border-focus); outline-offset: 1px; }
.pd-legend-dot { width: 10px; height: 10px; border-radius: 3px; background: var(--tone-fg); }
.pd-legend-ico { font-style: normal; line-height: 1; }
.pd-legend-label { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pd-legend-num { color: var(--text-primary); font-weight: var(--weight-bold);
  font-variant-numeric: tabular-nums; }
.pd-legend-pct { color: var(--text-muted); font-variant-numeric: tabular-nums; min-width: 30px; text-align: right; }
.pd-legend-wait   { --tone-fg: var(--status-warning); }
.pd-legend-info   { --tone-fg: var(--status-info); }
.pd-legend-ok     { --tone-fg: var(--status-success); }
.pd-legend-urgent { --tone-fg: var(--status-danger); }

/* Ba thẻ chính cân đối: thẻ "của tôi" kéo giãn, biểu đồ đẩy xuống đáy (margin-top: auto ở trên). */
.pd-ov-grid > .pd-card-mine { align-self: stretch; }

@media (max-width: 1280px) {
  .pd-donut { width: 108px; height: 108px; }
}
@media (max-width: 767px) {
  /* Điện thoại: vòng và chú giải xếp dọc, chú giải giãn hết bề ngang cho dễ bấm. */
  .pd-chart-body { flex-direction: column; align-items: stretch; }
  .pd-donut { align-self: center; }
  .pd-legend { padding: 7px var(--space-2); }
}

/* ---- §17 · CÂN ĐỐI BA THẺ (đo 19/09/2026, không đoán) -------------------
   Chẩn đoán: hai thẻ cùng một lỗi — flex-basis LỚN HƠN bề rộng cột thật nên
   nội dung bị xuống dòng, đẩy thẻ cao gấp đôi.
     thẻ 1  lòng 272px · vòng 124 + chú giải 148 = 284  > 272  ⇒ xuống dòng ⇒ biểu đồ cao 284px
     thẻ 3  lòng 424px · 210 + 230 + 16          = 456  > 424  ⇒ hai cột xếp chồng ⇒ thân 442px
   Sửa đúng nguyên nhân (thu basis cho vừa), KHÔNG ép chiều cao bằng số cứng. */
.pd-ov-grid { grid-template-columns: minmax(0, 1.15fr) minmax(0, 1.05fr) minmax(0, 1.4fr); }
.pd-donut { width: 100px; height: 100px; }
.pd-legends { flex: 1 1 132px; }
.pd-info-kv { flex: 1 1 175px; }
.pd-info-stats { flex: 1 1 185px; }
@media (max-width: 1280px) {
  .pd-donut { width: 96px; height: 96px; }
}

/* Bốn ô trạng thái trong thẻ "Bài đăng của tôi": thẻ này hẹp nhất (lòng ~272px),
   ép 4 cột thì nhãn bị cắt chữ (đo: chỗ có 46px, cần 52–64px). Dùng lưới TỰ XẾP —
   rộng thì 4 cột, hẹp thì 2×2. Giữ nguyên ĐỦ BỐN ô và logic của chúng (FORM §9);
   chỉ đổi cách xếp, không thu nhỏ chữ để nhét cột (luật B7). */
.pd-card-mine .pd-statgrid-4 { grid-template-columns: repeat(auto-fit, minmax(118px, 1fr)); }

/* Thân thẻ "Thông tin nhân viên/CTV": đo ở 1366px thấy hai cột LẠI xếp chồng
   (lòng 358px < 175+185+16). Chỉnh basis theo từng mốc màn hình là chắp vá —
   dùng lưới TỰ XẾP để nó tự quyết theo bề rộng thật, giống 4 ô trạng thái. */
.pd-info-body { display: grid; grid-template-columns: repeat(auto-fit, minmax(158px, 1fr));
  gap: var(--space-3); align-items: start; }

/* ⚠️ THỨ TỰ CSS: quy tắc .pd-ov-grid ở khối §17 phía trên nằm SAU các @media cũ nên
   ĐÈ MẤT chúng — đo ở 1024px thấy vẫn 3 cột thay vì 1. Khai lại các mốc responsive
   ở ĐÂY, sau quy tắc đó, để chúng thắng trở lại. (Đặc hiệu bằng nhau thì quy tắc
   đứng SAU thắng, kể cả khi quy tắc trước nằm trong @media.) */
@media (max-width: 1280px) {
  .pd-ov-grid { grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
  .pd-ov-grid > .pd-card-info { grid-column: 1 / -1; }
}
@media (max-width: 1024px) {
  .pd-ov-grid { grid-template-columns: minmax(0, 1fr); }
  .pd-ov-grid > .pd-card-info { grid-column: auto; }
}

/* =====================================================================
 * WEBAPP-BAI-DANG-UI-V1-01 · CONTINUATION-MANAGE-POSTS-UX-FIX (19/09/2026)
 * Tab "Quản lý bài đăng": phân trang thay cuộn dọc dài, bỏ cột "Xem chi tiết",
 * cả dòng chọn được, danh sách rộng hơn, KHÔNG cuộn ngang ở máy tính.
 * ===================================================================== */

/* §9 · danh sách ~59% · chi tiết ~41% (trước là 55/45) */
.pd-manage-grid { grid-template-columns: minmax(0, 1.45fr) minmax(0, 1fr); }

/* §10 · KHÔNG CUỘN NGANG — bảo đảm bằng table-layout: fixed.
   Cột có bề rộng ấn định ⇒ ô CẮT CHỮ chứ không nong bảng ra, nên bảng
   không bao giờ rộng hơn khung. Không "hy vọng cột vừa" rồi đo lại. */
.pd-list-table { table-layout: fixed; width: 100%; }
.pd-list-card .pd-table-wrap { overflow-x: auto; }   /* chỉ dùng tới ở màn rất hẹp */
.pd-list-table th, .pd-list-table td { padding-left: 8px; padding-right: 8px; }
.pd-list-table th { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pd-list-table col-idx { width: 32px; }
.pd-list-table th:nth-child(1), .pd-list-table td:nth-child(1) { width: 34px; }
.pd-list-table th:nth-child(2), .pd-list-table td:nth-child(2) { width: 50px; }
.pd-list-table th:nth-child(3), .pd-list-table td:nth-child(3) { width: 54px; }
.pd-list-table th:nth-child(4), .pd-list-table td:nth-child(4) { width: 66px; }
.pd-list-table th:nth-child(5), .pd-list-table td:nth-child(5) { width: auto; min-width: 0; }
.pd-list-table th:nth-child(6), .pd-list-table td:nth-child(6) { width: 92px; }
.pd-list-table th:nth-child(7), .pd-list-table td:nth-child(7) { width: 98px; }
.pd-list-table th:nth-child(8), .pd-list-table td:nth-child(8) { width: 104px; }
/* Tiêu đề: tối đa 2 dòng rồi cắt bằng dấu ba chấm, đầy đủ ở tooltip (§8). */
.pd-list-table .pd-col-title { white-space: normal; display: -webkit-box;
  -webkit-line-clamp: 2; -webkit-box-orient: vertical; overflow: hidden;
  line-height: var(--line-tight); min-width: 0; }
.pd-list-table td { overflow: hidden; }
.pd-list-table .pd-channel, .pd-list-table .pd-status, .pd-list-table .pd-kind { min-width: 0; }
.pd-list-table .pd-channel { overflow: hidden; }

/* §6 · cả dòng là nút chọn — trạng thái chọn KHÔNG chỉ bằng màu:
   có thêm vạch trái đậm (hình khối) và aria-selected cho đọc màn hình. */
.pd-list-table tbody tr { cursor: pointer; }
.pd-list-table tbody tr:focus-visible { outline: 2px solid var(--border-focus); outline-offset: -2px; }
.pd-list-table tbody tr.is-sel { background: var(--brand-primary-soft);
  box-shadow: inset 4px 0 0 var(--brand-primary); }
.pd-list-table tbody tr.is-sel .pd-col-title { font-weight: var(--weight-semibold); color: var(--text-primary); }

/* §4 · phân trang */
.pd-pager { display: flex; align-items: center; gap: 4px; flex-wrap: wrap;
  padding-top: var(--space-2); border-top: 1px solid var(--border-soft); }
.pd-page { min-width: 32px; height: 32px; padding: 0 8px; border-radius: var(--radius-sm);
  border: 1px solid var(--border-default); background: var(--bg-surface);
  color: var(--text-secondary); font: inherit; font-size: var(--font-body); cursor: pointer; }
.pd-page:hover:not(:disabled) { background: var(--bg-surface-soft); color: var(--text-primary); }
.pd-page:focus-visible { outline: 2px solid var(--border-focus); outline-offset: 1px; }
.pd-page:disabled { opacity: .45; cursor: not-allowed; }
.pd-page.is-now { background: var(--brand-primary); border-color: var(--brand-primary);
  color: var(--text-inverse); font-weight: var(--weight-semibold); }
.pd-page-gap { padding: 0 2px; color: var(--text-muted); }
.pd-pager-info { margin-left: auto; font-size: var(--font-meta); color: var(--text-muted); white-space: nowrap; }

@media (max-width: 1024px) {
  /* Một cột: danh sách trên, chi tiết dưới. */
  .pd-manage-grid { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 767px) {
  /* Điện thoại: bảng hẹp quá thì cho cuộn ngang CỤC BỘ trong khung, không tràn cả trang. */
  .pd-list-table { table-layout: auto; min-width: 560px; }
  .pd-page { min-width: 40px; height: 40px; }   /* tầm chạm */
  .pd-pager-info { margin-left: 0; width: 100%; }
}

/* Chỉnh bề rộng cột theo SỐ ĐO thật (không ướm): nhãn "Hình ảnh" cần 86px trong ô 54px,
   "Trạng thái" cần 104px trong ô 98px, ô thời gian cần 143px trong ô 104px — đều bị cắt.
   Thời gian nay xuống HAI DÒNG (ngày / giờ) nên chỉ cần ~76px; phần dôi ra dồn cho Tiêu đề. */
.pd-list-table th:nth-child(4), .pd-list-table td:nth-child(4) { width: 58px; }
.pd-list-table th:nth-child(6), .pd-list-table td:nth-child(6) { width: 84px; }
.pd-list-table th:nth-child(7), .pd-list-table td:nth-child(7) { width: 104px; }
.pd-list-table th:nth-child(8), .pd-list-table td:nth-child(8) { width: 80px; }
.pd-col-time { white-space: normal; }
.pd-time-d, .pd-time-t { display: block; line-height: var(--line-tight); }
.pd-time-t { color: var(--text-muted); font-size: var(--font-meta); }

/* Cân lại bề rộng cột theo SỐ ĐO (thiếu: Mã 7 · Hình 10 · Loại 5 · Kênh 25 · Thời gian 11 = 58px).
   Bù bằng ba việc, không cắt bớt trường nào của FORM §8:
     1) nới danh sách lên đúng TRẦN 60% mà §9 cho phép (1.55fr : 1fr)
     2) thu đệm ngang ô từ 8px xuống 6px
     3) cấp đủ cho cột Kênh (chip "Facebook" cần 104px) — phần dôi dồn cho Tiêu đề */
.pd-manage-grid { grid-template-columns: minmax(0, 1.55fr) minmax(0, 1fr); }
.pd-list-table th, .pd-list-table td { padding-left: 6px; padding-right: 6px; }
.pd-list-table th:nth-child(1), .pd-list-table td:nth-child(1) { width: 28px; }
.pd-list-table th:nth-child(2), .pd-list-table td:nth-child(2) { width: 56px; }
.pd-list-table th:nth-child(3), .pd-list-table td:nth-child(3) { width: 56px; }
.pd-list-table th:nth-child(4), .pd-list-table td:nth-child(4) { width: 62px; }
.pd-list-table th:nth-child(6), .pd-list-table td:nth-child(6) { width: 104px; }
.pd-list-table th:nth-child(7), .pd-list-table td:nth-child(7) { width: 104px; }
.pd-list-table th:nth-child(8), .pd-list-table td:nth-child(8) { width: 92px; }

/* Chốt cuối: chip "Facebook" là chỗ cắt chữ dễ thấy nhất — cấp đủ 110px.
   Cột Hình chứa ảnh 44px + đệm, cấp 62px. Phần còn lại vẫn dồn cho Tiêu đề. */
.pd-list-table th:nth-child(3), .pd-list-table td:nth-child(3) { width: 62px; }
.pd-list-table th:nth-child(6), .pd-list-table td:nth-child(6) { width: 110px; }

/* ⛔ TÔI LẶP LẠI ĐÚNG LỖI ĐÃ GHI Ở VÒNG TRƯỚC: quy tắc .pd-manage-grid viết sau
   ĐÈ MẤT @media khai trước nó (đặc hiệu bằng nhau ⇒ quy tắc đứng SAU thắng, kể cả
   khi quy tắc trước nằm trong @media). Đo được: 1024px và 375px vẫn 2 cột thay vì 1,
   kéo theo danh sách phải cuộn ngang 113px ở 1024px và trang tràn 2px ở 375px.
   LUẬT: thêm quy tắc lưới ở cuối tệp thì PHẢI khai lại các mốc responsive SAU nó.
   Khối này phải luôn nằm CUỐI CÙNG của phụ lục Bài đăng. */
@media (max-width: 1024px) {
  .pd-manage-grid, .pd-notify-grid { grid-template-columns: minmax(0, 1fr); }
}
@media (max-width: 767px) {
  .pd-list-table { table-layout: auto; min-width: 560px; }
}

/* Ở 1366px danh sách chỉ còn 622px ⇒ cột Tiêu đề bị ép xuống 74px — quá hẹp cho
   thứ quan trọng nhất của dòng. Thu các cột PHỤ ở ngưỡng dưới 1440px để dồn cho
   Tiêu đề. Đánh đổi có chủ ý: chip Kênh/Trạng thái có thể cắt bớt vài ký tự,
   nhưng tiêu đề — thứ người dùng thực sự đọc để nhận ra bài — được ưu tiên. */
@media (max-width: 1599px) {
  .pd-list-table th:nth-child(1), .pd-list-table td:nth-child(1) { width: 24px; }
  .pd-list-table th:nth-child(2), .pd-list-table td:nth-child(2) { width: 48px; }
  .pd-list-table th:nth-child(3), .pd-list-table td:nth-child(3) { width: 54px; }
  .pd-list-table th:nth-child(4), .pd-list-table td:nth-child(4) { width: 52px; }
  .pd-list-table th:nth-child(6), .pd-list-table td:nth-child(6) { width: 96px; }
  .pd-list-table th:nth-child(7), .pd-list-table td:nth-child(7) { width: 96px; }
  .pd-list-table th:nth-child(8), .pd-list-table td:nth-child(8) { width: 78px; }
}

/* =====================================================================
 * WEBAPP-BAI-DANG-UI-V1-01 · CONTINUATION-MODULE-COMPACT-HEADER-OVERVIEW-ROLE (21/09/2026)
 * Chỉ UI. Owner UAT: phần đầu module quá cao, dải trạng thái nhanh tốn chiều cao,
 * "Bài đăng của tôi" chiếm quá nhiều bề ngang ở Tổng quan.
 *   LỚP 1  tiêu đề · 3 chip trạng thái NGANG · Tạo bài đăng · Trợ lý AI      (một hàng)
 *   LỚP 2  ← Trang chủ · breadcrumb · 3 tab                                   (một hàng, trong vỏ dính)
 * Khối này nằm CUỐI phụ lục Bài đăng — các mốc responsive khai lại NGAY SAU quy tắc lưới
 * (bài học thứ tự CSS: quy tắc viết sau đè mất @media khai trước).
 * LIGHT_ONLY_V1 — không thêm khối prefers-color-scheme: dark. Chỉ token có sẵn.
 * ===================================================================== */

/* ---- LỚP 1 · tiêu đề gọn ---- */
/* flex-wrap: wrap — hàng CHỈ xuống dòng khi thật sự thiếu chỗ (đo, không ép theo mốc cứng). */
.post-page-header { padding: var(--space-2) var(--space-4); gap: var(--space-2) var(--space-3); flex-wrap: wrap; }
.post-page-header .page-header-left { flex: 0 1 auto; gap: var(--space-2); min-width: 0; }
.post-page-header h1 { font-size: var(--text-xl); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.post-page-icon { width: 32px; height: 32px; font-size: var(--text-lg); }
.post-quick { flex: 1 1 auto; flex-wrap: nowrap; gap: var(--space-2); }
.post-header-actions { flex: none; }

/* 3 trạng thái nhanh = CHIP NGANG: [biểu tượng] nhãn SỐ — nhãn + số cùng một dòng.
   Giữ nguyên màu theo nghĩa (--tone-*) và hành vi bấm ⇒ lọc ở tab Quản lý. */
.pd-quick { min-width: 0; height: 32px; padding: 0 var(--space-3); gap: 6px;
  border-radius: var(--radius-md); flex: none; white-space: nowrap; }
.pd-quick-ico { font-size: var(--font-body); }
.pd-quick-body { flex-direction: row; align-items: baseline; gap: 6px; }
.pd-quick-label { font-size: var(--font-meta); }
.pd-quick-num { font-size: var(--text-lg); line-height: 1; font-variant-numeric: tabular-nums; }

/* ---- LỚP 2 · điều hướng + tab chung một hàng ---- */
.post-nav-tabs { display: flex; align-items: center; gap: 0 var(--space-4); min-width: 0; flex-wrap: wrap;
  border-bottom: 1px solid var(--border-soft); }
.post-nav-tabs .post-nav-row { flex: none; flex-wrap: nowrap; }
.post-nav-tabs .post-crumbs { flex-wrap: nowrap; white-space: nowrap; }
.post-nav-tabs .post-tabs { flex: 1 1 auto; border-bottom: 0; }
.post-shell { padding-top: 4px; }

/* ---- Thông báo bài đăng · 4 ô tóm tắt THÔNG BÁO cũng thành chip ngang (cùng ngôn ngữ) ---- */
.pd-nsum-card { padding: 6px var(--space-3); gap: var(--space-2); }
.pd-nsum-body { flex-direction: row; align-items: baseline; gap: 6px; }
.pd-nsum-body b { font-size: var(--text-lg); line-height: 1; font-variant-numeric: tabular-nums; }
.pd-nsum-ico { font-size: var(--font-body); }

/* ---- TỔNG QUAN · phân bổ bề ngang THEO VAI ---- */
/* Quản trị / Nhân viên có CTV: "của tôi" ~25% · danh sách nhân sự ~39,5% (ƯU TIÊN) · thông tin ~35,5%. */
.pd-ov-grid.pd-ov-admin, .pd-ov-grid.pd-ov-emp {
  grid-template-columns: minmax(0, 0.95fr) minmax(0, 1.5fr) minmax(0, 1.35fr); }
/* Thẻ "của tôi" hẹp ⇒ gọn lại: 4 ô trạng thái luôn 2×2, vòng nhỏ hơn, chú giải xuống dưới. */
.pd-ov-grid:not(.pd-ov-no-ctv) .pd-card-mine .pd-statgrid-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.pd-ov-grid:not(.pd-ov-no-ctv) .pd-card-mine { gap: var(--space-2); }
.pd-ov-grid:not(.pd-ov-no-ctv) .pd-card-mine .pd-stat { padding: 6px var(--space-2); }
.pd-ov-grid:not(.pd-ov-no-ctv) .pd-card-mine .pd-stat-value b { font-size: var(--text-lg); }
.pd-ov-grid:not(.pd-ov-no-ctv) .pd-card-mine .pd-chart-body { justify-content: center; }
.pd-ov-grid:not(.pd-ov-no-ctv) .pd-card-mine .pd-donut { width: 88px; height: 88px; }
.pd-ov-grid:not(.pd-ov-no-ctv) .pd-card-mine .pd-legends { flex: 1 1 100%; }
/* Nhân viên KHÔNG có CTV: không giữ cột trống — "của tôi" rộng ra, thẻ CTV là trạng thái rỗng gọn. */
.pd-ov-grid.pd-ov-no-ctv { grid-template-columns: minmax(0, 1.7fr) minmax(0, 1fr); }
.pd-card-tree-empty .ds-empty { margin: 0; }
/* Thẻ "của tôi" hẹp: tiêu đề KHÔNG xuống dòng (nút đổi thành "Chi tiết →", tên đầy đủ ở aria-label). */
.pd-ov-grid:not(.pd-ov-no-ctv) .pd-card-mine .pd-card-title { white-space: nowrap; }
/* Thẻ Thông tin: 4 ô trạng thái xếp DANH SÁCH DỌC (nhãn trái · số phải) — đo ở cột 172px thì
   lưới 2×2 cắt mất nhãn "Chờ duyệt"/"Sắp đăng" (cần 64px, có 56px). Không thu chữ để nhét (B7). */
.pd-card-info .pd-statgrid-2 { grid-template-columns: minmax(0, 1fr); gap: 4px; }
.pd-card-info .pd-stat { display: flex; align-items: center; justify-content: space-between;
  gap: var(--space-2); padding: 4px var(--space-2); }
.pd-card-info .pd-stat-value b { font-size: var(--text-lg); }
/* Đo ở 1366: tiêu đề "Bài đăng của tôi" thiếu 4px ⇒ thu lề trong thẻ hẹp (16 → 12px), KHÔNG thu chữ. */
.pd-ov-grid:not(.pd-ov-no-ctv) .pd-card-mine { padding: var(--space-3); }
/* Đo ở 1366: lưới tự xếp minmax(158px) rơi về 1 cột (lòng 325 < 2×158+12) ⇒ thẻ cao 636px.
   Ở bố cục 3 cột, thân thẻ Thông tin LUÔN 2 cột; nhãn dài ("Số cộng tác viên quản lý:") được xuống dòng. */
.pd-ov-grid.pd-ov-admin .pd-info-body, .pd-ov-grid.pd-ov-emp .pd-info-body {
  grid-template-columns: minmax(0, 1fr) minmax(0, 1fr); }
.pd-card-info .pd-kv > span:first-child { flex: 0 1 auto; }

/* Mốc responsive khai lại SAU quy tắc lưới ở trên (bắt buộc — xem đầu khối). */
@media (max-width: 1280px) {
  .pd-ov-grid.pd-ov-admin, .pd-ov-grid.pd-ov-emp { grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr); }
  .pd-ov-grid.pd-ov-admin > .pd-card-info, .pd-ov-grid.pd-ov-emp > .pd-card-info { grid-column: 1 / -1; }
  .pd-ov-grid.pd-ov-admin .pd-info-body, .pd-ov-grid.pd-ov-emp .pd-info-body {
    grid-template-columns: repeat(auto-fit, minmax(158px, 1fr)); }
}
@media (max-width: 1024px) {
  .pd-ov-grid.pd-ov-admin, .pd-ov-grid.pd-ov-emp, .pd-ov-grid.pd-ov-no-ctv { grid-template-columns: minmax(0, 1fr); }
  .pd-ov-grid.pd-ov-admin > .pd-card-info, .pd-ov-grid.pd-ov-emp > .pd-card-info { grid-column: auto; }
  .pd-nsum { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
@media (max-width: 767px) {
  .post-page-header { padding: var(--space-2) var(--space-3); }
  .post-page-header h1 { font-size: var(--text-lg); }
  .post-header-actions { flex: 1 1 100%; }
  .post-header-actions > * { flex: 1 1 0; justify-content: center; min-height: 40px; }
  .pd-quick { flex: 1 1 0; min-width: 0; min-height: 40px; justify-content: center; padding: 0 var(--space-2); }
  .post-nav-tabs .post-nav-row { flex: 1 1 100%; flex-wrap: wrap; }
  /* Đo ở 375: breadcrumb không-xuống-dòng dài 509px ⇒ nong cả trang. Điện thoại thì cho xuống dòng. */
  .post-nav-tabs .post-crumbs { flex-wrap: wrap; white-space: normal; }
  .post-nav-tabs .post-tabs { flex: 1 1 100%; }
  .pd-nsum { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* =====================================================================
   CRM VÒNG A — WEBAPP-CRM-VONG-A-UI-01
   Chỉ NỐI THÊM sau các khối CRM cũ. Dùng token có sẵn (--font-*, --space-*, --status-*),
   không hex viết cứng, không khối dark cục bộ (THEME_V1 = LIGHT_ONLY).
   ⚠️ Khối @media của CRM Vòng A PHẢI nằm CUỐI CÙNG của tệp — quy tắc viết sau đè quy tắc
   viết trước khi đặc hiệu bằng nhau (bài học đã cắn hai lần ở module Bài đăng).
   ===================================================================== */
/* SCA-C: quy tắc display ĐÈ thuộc tính [hidden] ⇒ huy hiệu 0 đỏ vẫn hiện. Phải khoá lại. */
.crm-tab-badge[hidden] { display: none !important; }
.crm-tab-badge { display: inline-block; min-width: 18px; padding: 0 5px; margin-left: 4px; border-radius: 9px;
  background: var(--status-danger); color: var(--text-inverse); font-size: var(--text-xs); font-weight: var(--weight-bold); line-height: 18px; text-align: center; }

/* ---- chung: mã nhân sự · trạng thái hoạt động · SLA ---- */
.crm-code { display: inline-block; min-width: 26px; padding: 1px 6px; border-radius: var(--radius-sm); text-align: center;
  background: var(--brand-primary-soft); color: var(--brand-primary-hover); font-weight: var(--weight-bold); font-size: var(--font-meta); }
.crm-code-ctv { background: var(--bg-subtle); color: var(--text-secondary); }
.crm-act { display: inline-flex; align-items: center; gap: 4px; font-size: var(--font-meta); color: var(--tone-fg); white-space: nowrap; }
.crm-sla { display: inline-flex; align-items: center; gap: 4px; font-size: var(--font-meta); color: var(--tone-fg); white-space: nowrap; }
.crm-who { display: inline-flex; align-items: center; gap: 6px; }
.crm-arrow { color: var(--text-muted); }
.crm-avatar { display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; flex: none;
  border-radius: 50%; background: var(--brand-primary-soft); color: var(--brand-primary-hover); font-weight: var(--weight-bold); }
.crm-me { display: flex; align-items: center; gap: var(--space-2); margin-bottom: var(--space-2); }
.crm-gap-box { margin-top: var(--space-2); padding: var(--space-2); border: 1px dashed var(--border-strong); border-radius: var(--radius-md);
  background: var(--bg-subtle); color: var(--text-secondary); font-size: var(--font-meta); line-height: var(--line-normal); }

/* ---- băng phạm vi ---- */
.crm-scopebar { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; padding: 8px var(--space-3);
  background: var(--bg-surface); border: 1px solid var(--border-soft); border-radius: var(--radius-lg); margin-bottom: var(--space-2); }
.crm-scope-text { font-size: var(--font-body); }
.crm-scope-segs { display: inline-flex; gap: 4px; flex-wrap: wrap; }
.crm-seg { padding: 4px 10px; border: 1px solid var(--border-soft); border-radius: 999px; background: var(--bg-surface);
  font: inherit; font-size: var(--font-meta); color: var(--text-secondary); cursor: pointer; }
.crm-seg:hover { background: var(--bg-subtle); color: var(--text-primary); }
.crm-seg.on { background: var(--brand-primary-soft); border-color: var(--brand); color: var(--brand-primary-hover); font-weight: var(--weight-medium); }
.crm-scope-acts { margin-left: auto; display: inline-flex; gap: 6px; align-items: center; }

/* ---- Tổng quan ---- */
.crm-va-ov { display: flex; flex-direction: column; gap: var(--space-3); }
.crm-ov-grid2 { display: grid; grid-template-columns: minmax(0, 62fr) minmax(300px, 38fr); gap: var(--space-3); align-items: start; }
.crm-ov-grid3 { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: var(--space-3); align-items: start; }
.crm-tree-table td, .crm-tree-table th { vertical-align: middle; }
.crm-tree-table td.num, .crm-tree-table th.num { text-align: right; }
.crm-tree-row { cursor: pointer; }
.crm-tree-row:hover { background: var(--bg-subtle); }
.crm-tree-row.on { background: var(--brand-primary-soft); }
.crm-tree-row.is-child td:nth-child(3) { padding-left: var(--space-3); }
.crm-tree-exp { width: 34px; }
.crm-exp { width: 28px; height: 28px; border: 0; background: none; color: var(--text-secondary); font-size: var(--font-body); cursor: pointer; border-radius: var(--radius-sm); }
.crm-exp:hover { background: var(--bg-surface-soft); color: var(--text-primary); }
.crm-exp-sp { display: inline-block; width: 28px; height: 28px; }
.crm-ctv-search { margin-bottom: var(--space-2); }
.crm-ctv-list { display: flex; flex-direction: column; gap: 6px; max-height: 360px; overflow: auto; }
.crm-ctv-card { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 8px; align-items: center; width: 100%; text-align: left;
  padding: 8px; border: 1px solid var(--border-soft); border-radius: var(--radius-md); background: var(--bg-surface); font: inherit; cursor: pointer; }
.crm-ctv-card:hover { background: var(--bg-subtle); }
.crm-ctv-card.on { border-color: var(--brand); background: var(--brand-primary-soft); }
.crm-ctv-main { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.crm-ctv-nums { grid-column: 1 / -1; display: flex; gap: var(--space-3); font-size: var(--font-meta); color: var(--text-secondary); }
.crm-ctv-nums .is-urgent { color: var(--status-danger); font-weight: var(--weight-bold); }
.crm-team-note { margin-top: var(--space-2); padding: var(--space-2); border-radius: var(--radius-md); background: var(--bg-subtle); font-size: var(--font-meta); }
.crm-person-dl { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 4px var(--space-2); margin: 0 0 var(--space-2); font-size: var(--font-body); }
.crm-person-dl dt { color: var(--text-secondary); }
.crm-person-dl dd { margin: 0; }
.crm-ctv-chips { display: flex; flex-wrap: wrap; gap: 4px; }
.crm-chip { display: inline-flex; align-items: center; gap: 4px; padding: 2px 8px; border: 1px solid var(--border-soft);
  border-radius: 999px; background: var(--bg-surface); font: inherit; font-size: var(--font-meta); cursor: pointer; }
.crm-chip:hover { background: var(--bg-subtle); }
.crm-chip-flat { display: inline-block; padding: 1px 6px; border-radius: var(--radius-sm); background: var(--bg-subtle); font-size: var(--font-meta); }
.crm-mini-title { font-size: var(--font-meta); color: var(--text-secondary); margin-bottom: 4px; }
.crm-mini-row { display: grid; grid-template-columns: repeat(auto-fit, minmax(96px, 1fr)); gap: 6px; }
.crm-mini { padding: 6px 8px; border-radius: var(--radius-md); background: var(--tone-bg); border: 1px solid var(--border-soft); }
.crm-mini-l { display: block; font-size: var(--font-meta); color: var(--text-secondary); }
.crm-mini b { font-size: var(--text-lg); color: var(--tone-fg); }
.crm-person-go { display: flex; gap: 8px; margin-top: var(--space-3); }
.crm-person-go .btn { flex: 1; justify-content: center; }

/* ---- danh sách + phân trang dùng chung ---- */
.crm-list-panel { padding: var(--space-2) var(--space-3) var(--space-3); }
.crm-pager { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); flex-wrap: wrap; margin-top: var(--space-2); font-size: var(--font-meta); }
.crm-per { display: inline-flex; align-items: center; gap: 6px; }
.crm-cust-table, .crm-lead-table, .crm-nt-table { table-layout: fixed; width: 100%; }
.crm-cust-table td, .crm-lead-table td, .crm-nt-table td { overflow: hidden; text-overflow: ellipsis; }
/* SCA-B · SCA-03 — ĐẦU CỘT CŨNG PHẢI CẮT, KHÔNG ĐƯỢC TRÀN.
   `table.data th` có `white-space: nowrap` nhưng KHÔNG có `overflow: hidden`, nên với
   `table-layout: fixed` chữ đầu cột dài hơn ô sẽ TRÀN RA NGOÀI và đè lên đầu cột kế —
   đo được: "Tương tác gần nhất" thừa +46px ở 1366 và +53px ở 1024, đè 1–2 cặp cột.
   Ô dữ liệu đã cắt từ dòng trên; đây là mảnh còn thiếu. Đây là BẢO ĐẢM cấu trúc:
   chữ dài bao nhiêu cũng chỉ cắt trong ô của nó, không bao giờ chồng lên cột khác. */
.crm-cust-table th, .crm-lead-table th, .crm-nt-table th { overflow: hidden; text-overflow: ellipsis; }
/* …và cho đầu cột dài XUỐNG DÒNG thay vì ăn thêm bề rộng. Quy tắc chung
   "table.data th { white-space: nowrap }" áp cho mọi bảng; ở bảng cột cố định thì
   nowrap biến một đầu cột dài
   thành: hoặc tràn đè cột bên (bệnh cũ), hoặc nuốt chữ bằng dấu ba chấm (đo được
   'Tương tác gần nhất' thiếu 67px ở 1366 · 21px ngay cả ở 1920). Xuống dòng đọc được
   trọn chữ mà KHÔNG phải cắt bề rộng của cột dữ liệu. Dấu cắt ở dòng trên giữ nguyên
   làm chốt chặn: dài tới đâu cũng chỉ nằm trong ô của nó. */
/* ⚠️ PHẢI kèm `table.data` cho ĐỦ ĐẶC HIỆU. Quy tắc chung là `table.data th` (2 phần tử
   + 1 lớp); viết `.crm-cust-table th` (1 phần tử + 1 lớp) thì THUA, nowrap vẫn thắng và
   đầu cột bị nuốt bằng ba chấm — đo được đúng như vậy ở lượt kiểm trước khi sửa dòng này.
   (Cùng bẫy đã làm chết lặng quy tắc lề `.crm-cust-table td { padding: 6px 8px }` ở trên.) */
table.data.crm-cust-table th, table.data.crm-lead-table th, table.data.crm-nt-table th {
  white-space: normal; vertical-align: bottom; line-height: 1.25;
}
/* Sàn bề rộng bảng Khách hàng: dưới mức này thì huy hiệu/nhãn bắt đầu bị cắt, nên
   khung hẹp phải CUỘN TRONG `.table-scroll` thay vì bóp cột (hợp đồng §9: 1920 nhìn rõ
   không đè · 1366 dùng được · 1024 được phép cuộn ngang TRONG khung, không cuộn cả trang). */
.crm-cust-table { min-width: 1116px; }
.crm-cust-table td.num, .crm-lead-table td.num, .crm-cust-table th.num, .crm-lead-table th.num { width: 40px; text-align: right; }
tr.row-link.on > td { background: var(--brand-primary-soft); }
tr.is-lost > td { opacity: .82; }
.crm-lost { font-size: var(--font-meta); color: var(--status-danger); }
.crm-manual { font-size: var(--font-meta); color: var(--status-warning); }

/* ---- Khách hàng: hồ sơ rút gọn ---- */
.crm-va-cust { display: flex; flex-direction: column; gap: var(--space-2); }
.crm-cd-head { display: flex; align-items: flex-start; justify-content: space-between; gap: var(--space-2); flex-wrap: wrap; }
.crm-cd-head h3 { margin: 0; font-size: var(--font-section-title); }
.crm-cd-sub { display: flex; gap: 6px; flex-wrap: wrap; margin-top: 4px; }
.crm-cd-acts { display: inline-flex; gap: 6px; flex-wrap: wrap; }
.crm-cd-tabs, .cl-d-tabs { display: flex; gap: 2px; flex-wrap: wrap; border-bottom: 1px solid var(--border-soft); margin: var(--space-2) 0; }
.crm-cd-tab, .cl-d-tab { padding: 6px 12px; border: 0; border-bottom: 2px solid transparent; background: none; font: inherit;
  font-size: var(--font-body); color: var(--text-secondary); cursor: pointer; }
.crm-cd-tab:hover, .cl-d-tab:hover { color: var(--text-primary); }
.crm-cd-tab.on, .cl-d-tab.on { color: var(--brand-primary-hover); border-bottom-color: var(--brand); font-weight: var(--weight-medium); }
.crm-cd-dl dt { white-space: nowrap; }
.crm-hist { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 8px; max-height: 320px; overflow: auto; }
.crm-hist li { padding-left: var(--space-2); border-left: 2px solid var(--border-soft); font-size: var(--font-body); }

/* ---- Lead & Chăm sóc ---- */
.crm-va-lead { display: grid; grid-template-columns: minmax(0, 61fr) minmax(320px, 39fr); gap: var(--space-3); align-items: start; }
.cl-list-col, .cl-detail-col { min-width: 0; }
.crm-quickbar { display: flex; gap: 8px; flex-wrap: wrap; }
.crm-quick { display: inline-flex; align-items: center; gap: 8px; padding: 8px 14px; border: 1px solid var(--border-soft);
  border-radius: var(--radius-lg); background: var(--bg-surface); font: inherit; color: var(--text-primary); cursor: pointer; }
.crm-quick b { font-size: var(--text-lg); color: var(--tone-fg); }
.crm-quick:hover { background: var(--bg-subtle); }
.crm-quick.on { border-color: var(--tone-fg); background: var(--tone-bg); }
.crm-quick-l { font-size: var(--font-meta); color: var(--text-secondary); }
.crm-quickbar-sm .crm-quick { padding: 4px 10px; border-radius: 999px; }
.crm-quickbar-sm .crm-quick b { font-size: var(--font-body); }
.crm-applied { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: var(--space-2); font-size: var(--font-meta); }
.crm-chip-x { display: inline-flex; align-items: center; gap: 6px; padding: 2px 8px; border: 1px solid var(--brand);
  border-radius: 999px; background: var(--brand-primary-soft); color: var(--brand-primary-hover); font: inherit; font-size: var(--font-meta); cursor: pointer; }
.crm-clear-all { border: 0; background: none; color: var(--status-danger); font: inherit; font-size: var(--font-meta); cursor: pointer; text-decoration: underline; }
.crm-manual-form { margin-bottom: var(--space-2); }
.crm-manual-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: var(--space-2); }
.crm-manual-note { margin-top: var(--space-2); font-size: var(--font-meta); color: var(--text-secondary); line-height: var(--line-normal); }
.crm-manual-acts { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; margin-top: var(--space-2); }
.fbar-input-sm { max-width: 150px; }

/* chi tiết Lead: 3 vùng — trên và dưới CỐ ĐỊNH, chỉ vùng giữa cuộn */
.cl-d3 { display: flex; flex-direction: column; max-height: calc(100dvh - 220px); }
.cl-d-fixed { flex: none; }
.cl-d-title { display: flex; align-items: center; gap: var(--space-2); }
.cl-d-title h3 { margin: 0; font-size: var(--font-section-title); }
.cl-d-sub { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; font-size: var(--font-meta); color: var(--text-secondary); }
.cl-d-mid { flex: 1 1 auto; overflow: auto; min-height: 120px; }
.cl-d-foot { flex: none; display: flex; gap: 6px; flex-wrap: wrap; padding-top: var(--space-2); margin-top: var(--space-2); border-top: 1px solid var(--border-soft); }
.cl-row { display: grid; grid-template-columns: minmax(120px, 34%) minmax(0, 1fr); gap: var(--space-2); padding: 6px 0; border-bottom: 1px dashed var(--border-soft); font-size: var(--font-body); }
.cl-row-k { color: var(--text-secondary); }
.cl-row-v { min-width: 0; }
.cl-lost-banner { margin: var(--space-2) 0; padding: 8px; border-radius: var(--radius-md); background: var(--status-danger-soft); color: var(--status-danger); font-size: var(--font-meta); }
.cl-manual-banner { margin: var(--space-2) 0; padding: 8px; border-radius: var(--radius-md); background: var(--status-warning-soft); color: var(--text-primary); font-size: var(--font-meta); }
.cl-sla-bar { height: 3px; margin-top: 4px; border-radius: 2px; background: var(--status-danger); }
.cl-status-menu { position: relative; display: inline-block; }
.cl-status-menu > summary { list-style: none; cursor: pointer; }
.cl-status-menu > summary::-webkit-details-marker { display: none; }
.cl-status-list { position: absolute; right: 0; bottom: 100%; z-index: 20; display: flex; flex-direction: column; gap: 4px; min-width: 210px;
  padding: 6px; background: var(--bg-surface); border: 1px solid var(--border-soft); border-radius: var(--radius-md); box-shadow: var(--shadow-md); }
.crm-reassign { margin-top: var(--space-2); display: flex; flex-direction: column; gap: 6px; }

/* ---- Thông báo CRM ---- */
.crm-va-nt { display: flex; flex-direction: column; gap: var(--space-2); }
.crm-nt-ico { display: inline-flex; align-items: center; justify-content: center; width: 28px; height: 28px; border-radius: 50%;
  background: var(--tone-bg); color: var(--tone-fg); }
.crm-nt-table tr.is-unread td b { color: var(--brand-primary-hover); }
.crm-nt-table th:first-child, .crm-nt-table td:first-child { width: 44px; }

/* ---- responsive (PHẢI nằm cuối khối này) ---- */
@media (max-width: 1280px) {
  .crm-va-lead { grid-template-columns: minmax(0, 1fr); }
  .cl-d3 { max-height: none; }
}
@media (max-width: 1024px) {
  .crm-ov-grid2 { grid-template-columns: minmax(0, 1fr); }
  .crm-scope-acts { margin-left: 0; }
}
@media (max-width: 767px) {
  .crm-quick { flex: 1 1 calc(50% - 8px); justify-content: space-between; min-height: 44px; }
  .crm-person-go .btn, .crm-manual-acts .btn, .cl-d-foot .btn, .cl-d-foot > details > summary { min-height: 40px; }
  .crm-ctv-list { max-height: 300px; }
  /* Điện thoại: danh sách và chi tiết là HAI màn, không chồng nhau */
  .crm-va-lead .cl-detail-col { display: none; }
  .crm-va-lead.cl-show-detail .cl-list-col { display: none; }
  .crm-va-lead.cl-show-detail .cl-detail-col { display: block; }
}
@media (max-width: 640px) {
  .crm-scopebar { align-items: flex-start; }
  .crm-pager { justify-content: center; }
  .crm-cd-acts { width: 100%; }
}
/* dải phiên CSKH đang mở (FORM mục 11) — mở thêm KHÔNG đóng cái đang mở */
.crm-care-tabs { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; margin-bottom: var(--space-2); font-size: var(--font-meta); }
.crm-care-tab { display: inline-flex; align-items: center; border: 1px solid var(--border-soft); border-radius: 999px;
  background: var(--bg-surface); overflow: hidden; }
.crm-care-tab.is-hub { padding: 4px 12px; font: inherit; font-size: var(--font-meta); color: var(--text-primary); cursor: pointer; }
.crm-care-tab.is-hub:hover { background: var(--bg-subtle); }
.crm-care-tab.on { border-color: var(--brand-primary); background: var(--brand-primary-soft); }
.crm-care-go, .crm-care-x { border: 0; background: none; font: inherit; font-size: var(--font-meta); color: var(--text-primary); cursor: pointer; padding: 4px 4px 4px 10px; }
.crm-care-x { padding: 4px 8px 4px 2px; color: var(--text-muted); }
.crm-care-x:hover { color: var(--status-danger); }
@media (max-width: 767px) { .crm-care-tabs { overflow-x: auto; flex-wrap: nowrap; } .crm-care-tab { flex: none; } }

/* =====================================================================
   CRM TỔNG QUAN — REFINEMENT (WEBAPP-CRM-VONG-A-UI-01 · continuation)
   Thu gọn khối đầu màn + dải trạng thái · cây nhân sự có phân cấp nhìn thấy ngay.
   Chỉ khoá trong phạm vi CRM (.crm-page-header, #crm-ov-strip, .crm-tree-*) — không đụng .page-header chung.
   ⚠️ Khối @media của tệp phải luôn nằm CUỐI CÙNG (quy tắc sau đè quy tắc trước khi đặc hiệu bằng nhau).
   ===================================================================== */
.crm-v12 .crm-page-header { padding: 10px 16px; gap: var(--space-2); }
.crm-v12 .crm-page-header .page-icon { width: 34px; height: 34px; font-size: 17px; border-radius: var(--radius-sm); }
.crm-v12 .crm-page-header .page-header-left { gap: 10px; }
.crm-v12 .crm-page-header h1 { font-size: var(--text-lg); line-height: 1.2; }
.crm-v12 .crm-page-header p { margin: 1px 0 0; font-size: var(--font-meta); font-weight: var(--weight-normal); }

/* dải 4 trạng thái: một hàng thấp, tận dụng chiều ngang, số nổi */
.crm-ov-strip { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 8px; }
.crm-ov-chip { display: flex; align-items: center; gap: 8px; min-height: 40px; padding: 6px 12px; cursor: pointer;
  border: 1px solid var(--border-soft); border-left: 3px solid var(--tone-fg); border-radius: var(--radius-md);
  background: var(--bg-surface); font: inherit; color: var(--text-primary); text-align: left; }
.crm-ov-chip:hover { background: var(--tone-bg); }
.crm-ov-chip.on { background: var(--tone-bg); box-shadow: inset 0 0 0 1px var(--tone-fg); }
.crm-ov-chip-dot { font-size: 11px; line-height: 1; }
.crm-ov-chip-l { flex: 1 1 auto; min-width: 0; font-size: var(--font-meta); color: var(--text-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.crm-ov-chip-n { font-size: var(--text-lg); font-weight: var(--weight-bold); color: var(--tone-fg); }

/* cây nhân sự: cha nổi · con thụt vào có nhánh nối */
.crm-tree-tools { display: flex; align-items: center; gap: 8px; margin-bottom: 8px; }
.crm-tree-tools .fbar-search { flex: 1 1 auto; }
.crm-tree-scroll { max-height: clamp(260px, 48vh, 560px); overflow: auto; border: 1px solid var(--border-soft); border-radius: var(--radius-md); }
.crm-tree-scroll thead th { position: sticky; top: 0; z-index: 1; background: var(--bg-surface); }
.crm-tree-table { table-layout: fixed; width: 100%; }
.crm-tree-table td { vertical-align: middle; }
.crm-tree-group.is-collapsed .is-child { display: none; }
.crm-tree-row.is-parent > td { background: var(--bg-subtle); border-top: 1px solid var(--border-soft); }
.crm-tree-row.is-parent .crm-tree-name b { font-size: var(--font-body); font-weight: var(--weight-bold); }
.crm-tree-row.is-child > td { background: var(--bg-surface); }
.crm-tree-row.is-child .crm-tree-name { padding-left: var(--space-3); }
.crm-child-name { color: var(--text-secondary); }
.crm-tree-row.on > td { background: var(--brand-primary-soft); }
.crm-branch { position: relative; display: inline-block; width: 16px; height: 1em; vertical-align: middle; }
.crm-branch::before { content: ''; position: absolute; left: 4px; top: -14px; bottom: 50%; border-left: 1px solid var(--border-strong); }
.crm-branch::after { content: ''; position: absolute; left: 4px; top: 50%; width: 8px; border-top: 1px solid var(--border-strong); }
.crm-tree-row.is-last .crm-branch::before { bottom: 50%; }
.crm-code.is-emp { background: var(--brand-primary-soft); color: var(--brand-primary-hover); font-weight: var(--weight-bold); }
.crm-code.is-ctv { background: var(--bg-subtle); color: var(--text-secondary); font-weight: var(--weight-medium); }
.crm-ov-team .crm-tree-scroll { max-height: clamp(220px, 36vh, 420px); }
.crm-tree-table td { padding: 6px 8px; }
.crm-tree-table th { padding: 6px 8px; }
.crm-tree-table .crm-cell-sub { line-height: 1.25; }
.crm-tree-table .crm-tree-name .crm-cell-sub { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }

/* =====================================================================
   CRM — TỐI ƯU KHÔNG GIAN (WEBAPP-CRM-VONG-A-UI-01 · continuation)
   Bỏ khối nhận diện lớn; danh tính module nằm trên hàng điều hướng của vỏ dính.
   Mục tiêu: tab sát vùng làm việc, bớt lề thừa ở CẢ BỐN tab, không đổi nghiệp vụ.
   ⚠️ Khối @media vẫn phải nằm CUỐI TỆP.
   ===================================================================== */
.crm-ident { display: inline-flex; align-items: baseline; gap: 8px; min-width: 0; }
.crm-ident-name { font-size: var(--text-lg); font-weight: var(--weight-bold); color: var(--text-primary); line-height: 1.2; }
.crm-ident-sub { font-size: var(--font-meta); color: var(--text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.crm-v12 .crm-shell { padding: 4px 0 6px; margin-bottom: var(--space-2); }
.crm-v12 .crm-nav-row { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; margin-bottom: 4px; }
.crm-v12 .crm-crumbs[hidden] { display: none; }
.crm-v12 .crm-module-tabs { margin-bottom: 4px; }
.crm-v12 #crm-work-header { padding-top: 4px; }
.crm-v12 #crm-work-header > * + * { margin-top: 6px; }
/* mật độ chung của vùng làm việc CRM: bớt lề trong, giữ nhịp đọc */
.crm-va-ov, .crm-va-cust, .crm-va-nt { gap: var(--space-2); }
.crm-va-ov .crm-card, .crm-va-cust .crm-card, .crm-va-nt .crm-card, .crm-va-lead .crm-card { padding: var(--space-2) var(--space-3); }
.crm-va-cust .crm-list-panel, .crm-va-nt .crm-list-panel, .crm-va-lead .crm-list-panel { padding: 6px var(--space-2) var(--space-2); }
.crm-scopebar { padding: 6px var(--space-2); margin-bottom: 6px; }
.crm-care-tabs { margin-bottom: 6px; }
.crm-applied { margin-bottom: 6px; }
.crm-section-title { margin-bottom: 6px; }
.crm-va-lead { gap: var(--space-2); }
.crm-cust-table td, .crm-lead-table td, .crm-nt-table td { padding: 6px 8px; }
.crm-cust-table th, .crm-lead-table th, .crm-nt-table th { padding: 6px 8px; }
.crm-pager { margin-top: 6px; }
/* dải chỉ số trong header làm việc CRM: giữ đủ 3 dòng chuẩn (NHÃN → SỐ + ĐƠN VỊ → giải thích) nhưng thấp hơn */
#crm-cust-quick .crm-metric, #nt-stats .crm-metric { padding: 5px 10px; }
#crm-cust-quick .crm-metric-label, #nt-stats .crm-metric-label { line-height: 1.2; }
#crm-cust-quick .crm-metric-hint, #nt-stats .crm-metric-hint { line-height: 1.2; }
#crm-cust-quick .crm-metric-value b, #nt-stats .crm-metric-value b { line-height: 1.15; }
.crm-scope-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.crm-scopebar { flex-wrap: wrap; row-gap: 4px; }
.crm-scope-text { flex: 0 1 auto; }

.crm-strip-5 { grid-template-columns: repeat(5, minmax(0, 1fr)); }
.crm-ov-chip-u { font-size: var(--font-meta); color: var(--text-secondary); }
.crm-ov-chip.is-static { cursor: default; }
.crm-ov-chip.is-static:hover { background: var(--bg-surface); }
/* mốc responsive của khối Tổng quan — PHẢI nằm cuối tệp (quy tắc sau đè quy tắc trước) */
@media (max-width: 1100px) { .crm-strip-5 { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 900px) { .crm-ov-strip { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
/* Điện thoại: dải trạng thái là MỘT hàng cuộn ngang (44px) — xếp 2 cột sẽ cao 148px, tức cao hơn bản cũ. */
@media (max-width: 640px) {
  .crm-ov-strip { display: flex; gap: 6px; overflow-x: auto; padding-bottom: 2px; scroll-snap-type: x proximity; }
  .crm-ov-chip { flex: 0 0 auto; min-width: 150px; scroll-snap-align: start; }
}
@media (max-width: 767px) {
  .crm-ov-chip { min-height: 44px; }
  .crm-tree-scroll { max-height: clamp(220px, 44vh, 420px); }
  .crm-tree-tools { flex-wrap: wrap; }
}

/* =====================================================================
   04_KPI_UI_REFACTOR_V2 — Tổng quan KPI · Quản lý KPI · Thông báo KPI
   Chỉ dùng token của WEBAPP_DESIGN_SYSTEM_V1. Màu nói TRẠNG THÁI, không trang trí.
   Ưu tiên TIẾT KIỆM CHIỀU CAO: dải chỉ số thấp, không dựng 4 thẻ cao.
   ===================================================================== */

/* --- dải chỉ số thấp --- */
.kpi-v2-strip { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
  background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-md);
  margin-bottom: var(--stack-gap); overflow: hidden; }
.kpi-v2-strip-cell { display: flex; align-items: center; gap: var(--space-3);
  padding: var(--space-2) var(--card-pad-sm); min-width: 0; border-left: 1px solid var(--border-soft); }
.kpi-v2-strip-cell:first-child { border-left: 0; }
.kpi-v2-strip-ico { flex: 0 0 auto; width: 30px; height: 30px; border-radius: var(--radius-sm);
  display: grid; place-items: center; font-size: var(--font-card-title); font-weight: var(--weight-bold); }
.kpi-v2-strip-ico[data-kind="info"]    { background: var(--status-info-soft);    color: var(--status-info); }
.kpi-v2-strip-ico[data-kind="success"] { background: var(--status-success-soft); color: var(--status-success); }
.kpi-v2-strip-ico[data-kind="brand"]   { background: var(--brand-primary-soft);  color: var(--brand-primary); }
.kpi-v2-strip-ico[data-kind="warn"]    { background: var(--status-danger-soft);  color: var(--status-danger); }
.kpi-v2-strip-body { min-width: 0; display: flex; flex-direction: column; }
.kpi-v2-strip-label { font-size: var(--font-meta); color: var(--text-muted); font-weight: var(--weight-semibold); }
.kpi-v2-strip-value { font-size: var(--font-card-title); color: var(--text-primary); font-weight: var(--weight-bold); }
.kpi-v2-strip-value b { font-size: var(--text-xl); }
.kpi-v2-strip-sub { font-size: var(--font-help); color: var(--text-muted); }

/* --- hàng: KPI của tôi + đội ngũ --- */
.kpi-v2-row { display: grid; grid-template-columns: minmax(280px, 0.8fr) minmax(0, 1.2fr);
  gap: var(--stack-gap); margin-bottom: var(--stack-gap); align-items: start; }
.kpi-v2-row > .panel { margin: 0; min-width: 0; }
.kpi-v2-avatar { flex: 0 0 auto; width: 34px; height: 34px; border-radius: 50%; display: grid; place-items: center;
  background: var(--brand-primary); color: var(--text-inverse); font-weight: var(--weight-bold); font-size: var(--font-meta); }
.kpi-v2-my-head { display: flex; align-items: center; gap: var(--space-2); margin-bottom: var(--space-3); }
.kpi-v2-my-who { display: flex; flex-direction: column; min-width: 0; }
.kpi-v2-my-who b { font-size: var(--font-card-title); }
.kpi-v2-my-state { margin-left: auto; }
.kpi-v2-mygrid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-2); }
.kpi-v2-mybox { background: var(--bg-surface-soft); border-radius: var(--radius-sm); padding: var(--space-2); min-width: 0; text-align: center; }
.kpi-v2-mybox-label { font-size: var(--font-meta); color: var(--text-muted); }
.kpi-v2-mybox-value { margin-top: 2px; font-size: var(--font-body); font-weight: var(--weight-semibold); }
.kpi-v2-progress { display: flex; justify-content: space-between; align-items: baseline; margin-top: var(--space-3); font-size: var(--font-body); }
.kpi-v2-progress-label { color: var(--text-secondary); font-weight: var(--weight-semibold); }
.kpi-v2-progress-bar { height: 8px; background: var(--bg-subtle); border-radius: var(--radius-sm); overflow: hidden; margin-top: var(--space-1); }
.kpi-v2-progress-bar > span { display: block; height: 100%; background: var(--brand-primary); }

/* --- cây đội ngũ --- */
.kpi-v2-team-tools { margin-left: auto; display: inline-flex; gap: var(--space-2); }
.kpi-v2-rows { height: var(--control-h-sm); font-size: var(--font-meta); width: auto; }
.kpi-v2-search { height: var(--control-h-sm); font-size: var(--font-body); width: 100%; margin-bottom: var(--space-2); }
/* Chiều cao = số dòng người dùng chọn, NHƯNG không bao giờ vượt quá nửa màn hình:
   "20 dòng" trên màn 900px từng cho khối cao 876px — bằng cả viewport, tức là mất
   luôn ý nghĩa "cuộn nội bộ". min() giữ 5 và 10 dòng y như cũ, chỉ chặn mức 20. */
.kpi-v2-tscroll { max-height: min(calc(var(--kpi-rows, 10) * 42px + 36px), 52vh); overflow-y: auto; border: 1px solid var(--border-soft); border-radius: var(--radius-sm); }
.kpi-v2-ttable { margin: 0; }
.kpi-v2-ttable thead th { position: sticky; top: 0; z-index: 1; background: var(--bg-surface-soft); }
.kpi-v2-trow { cursor: pointer; }
.kpi-v2-trow:hover td { background: var(--brand-primary-soft); }
.kpi-v2-trow.is-selected td { background: var(--brand-primary-soft); box-shadow: inset 3px 0 0 var(--brand-primary); }
.kpi-v2-trow.is-child .kpi-v2-tname { padding-left: var(--space-6); }
.kpi-v2-tname { display: flex; align-items: center; gap: var(--space-2); min-width: 0; }
.kpi-v2-tname-txt { display: flex; flex-direction: column; min-width: 0; }
.kpi-v2-tname-txt small { font-size: var(--font-meta); color: var(--text-muted); }
.kpi-v2-chev { flex: 0 0 auto; width: 28px; height: 28px; border: 0; background: transparent; cursor: pointer;
  border-radius: var(--radius-sm); color: var(--text-muted); font-size: var(--font-card-title); line-height: 1; }
.kpi-v2-chev:hover { background: var(--bg-subtle); color: var(--text-primary); }
.kpi-v2-chev.is-empty { pointer-events: none; }
.kpi-v2-dot { flex: 0 0 auto; width: 26px; height: 26px; border-radius: 50%; display: grid; place-items: center;
  background: var(--bg-subtle); color: var(--text-secondary); font-size: var(--font-meta); font-weight: var(--weight-bold); }

/* --- khối chi tiết: MỘT lớp tại một thời điểm --- */
.kpi-v2-detail { margin: 0; }
.kpi-v2-detail-head { display: flex; align-items: center; gap: var(--space-2); margin-bottom: var(--space-2); }
.kpi-v2-detail-who { display: flex; flex-direction: column; min-width: 0; }
.kpi-v2-detail-who b { font-size: var(--font-section-title); }
.kpi-v2-detail-who small { font-size: var(--font-meta); color: var(--text-muted); }
.kpi-v2-export { margin-left: auto; }
.kpi-v2-dtabs { margin-bottom: var(--space-3); }
.kpi-v2-dbody { min-height: 120px; }
.kpi-v2-dcards { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: var(--space-3); margin-bottom: var(--stack-gap); }
.kpi-v2-dcard { background: var(--bg-surface-soft); border-radius: var(--radius-md); padding: var(--card-pad-sm); min-width: 0;
  border-left: 3px solid var(--border-strong); }
.kpi-v2-dcard[data-kind="success"] { border-left-color: var(--status-success); }
.kpi-v2-dcard[data-kind="warn"]    { border-left-color: var(--status-warning); }
.kpi-v2-dcard[data-kind="info"]    { border-left-color: var(--status-info); }
.kpi-v2-dcard[data-kind="muted"]   { border-left-color: var(--border-strong); }
.kpi-v2-dcard-label { font-size: var(--font-meta); color: var(--text-muted); font-weight: var(--weight-semibold); }
.kpi-v2-dcard-value { font-size: var(--font-card-title); color: var(--text-primary); margin-top: 2px; }
.kpi-v2-dcard-value b { font-size: var(--text-xl); font-weight: var(--weight-extrabold); }
.kpi-v2-dcard-sub { font-size: var(--font-help); color: var(--text-muted); margin-top: 2px; }
.kpi-v2-dstate { background: var(--bg-surface-soft); border-left: 3px solid var(--border-strong);
  border-radius: var(--radius-sm); padding: var(--space-2) var(--space-3); }
.kpi-v2-dstate-head { font-size: var(--font-meta); color: var(--text-muted); font-weight: var(--weight-semibold); text-transform: uppercase; }
.kpi-v2-dstate p { margin: var(--space-1) 0 0; font-size: var(--font-body); color: var(--text-secondary); line-height: var(--line-normal); }
.kpi-v2-rules { margin-top: var(--stack-gap); background: var(--bg-surface); border: 1px solid var(--border-default);
  border-radius: var(--radius-md); padding: var(--card-pad-sm); }
.kpi-v2-rules > summary { cursor: pointer; font-size: var(--font-body); font-weight: var(--weight-semibold); }

/* --- QUẢN LÝ KPI: trục SẢN PHẨM --- */
.kpi-pm-toolbar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2);
  background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-md);
  padding: var(--space-2) var(--card-pad-sm); margin-bottom: var(--stack-gap); }
.kpi-pm-sync { font-size: var(--font-help); color: var(--text-muted); margin-right: auto; }
.kpi-pm-grid { display: grid; grid-template-columns: minmax(230px, 0.75fr) minmax(240px, 1fr) minmax(0, 1.4fr);
  gap: var(--stack-gap); align-items: start; }
.kpi-pm-col { margin: 0; min-width: 0; }
.kpi-pm-sub { margin-top: var(--space-3); }
.kpi-pm-tree { max-height: 420px; overflow-y: auto; }
.kpi-pm-famrow { display: flex; align-items: center; gap: var(--space-2); width: 100%; border: 0; background: transparent;
  cursor: pointer; padding: var(--space-1) var(--space-1); border-radius: var(--radius-sm); text-align: left; }
.kpi-pm-famrow:hover { background: var(--bg-subtle); }
.kpi-pm-famname { font-size: var(--font-body); font-weight: var(--weight-semibold); color: var(--text-primary); }
.kpi-pm-count { margin-left: auto; font-size: var(--font-meta); color: var(--text-muted);
  background: var(--bg-subtle); border-radius: var(--radius-sm); padding: 0 var(--space-2); }
.kpi-pm-models { list-style: none; margin: 0 0 var(--space-2); padding: 0 0 0 var(--space-5); }
.kpi-pm-model { display: flex; align-items: baseline; gap: var(--space-2); width: 100%; border: 0; background: transparent;
  cursor: pointer; padding: var(--space-1) var(--space-2); border-radius: var(--radius-sm); text-align: left; }
.kpi-pm-model:hover { background: var(--bg-subtle); }
.kpi-pm-model.is-selected { background: var(--brand-primary-soft); box-shadow: inset 3px 0 0 var(--brand-primary); }
.kpi-pm-mname { font-size: var(--font-body); color: var(--text-primary); }
.kpi-pm-mcode { margin-left: auto; font-size: var(--text-xs); color: var(--text-muted); font-family: ui-monospace, SF Mono, Consolas, monospace; }
.kpi-pm-none { font-size: var(--font-help); color: var(--text-muted); padding: var(--space-1) var(--space-2); }
.kpi-pm-head { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); margin-bottom: var(--space-3); }
.kpi-pm-head b { font-size: var(--font-card-title); }
.kpi-pm-stats { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-2); }
.kpi-pm-stat { background: var(--bg-surface-soft); border-radius: var(--radius-sm); padding: var(--space-2); }
.kpi-pm-stat-label { font-size: var(--font-meta); color: var(--text-muted); }
.kpi-pm-stat-value { margin-top: 2px; font-size: var(--font-body); font-weight: var(--weight-semibold); }
.kpi-pm-tracks { display: flex; flex-direction: column; gap: var(--space-2); }
.kpi-pm-track { display: flex; align-items: center; gap: var(--space-2); width: 100%; text-align: left; cursor: pointer;
  background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-sm); padding: var(--space-2); }
.kpi-pm-track:hover { border-color: var(--border-focus); }
.kpi-pm-track.is-selected { border-color: var(--brand-primary); background: var(--brand-primary-soft); }
.kpi-pm-track-name { display: flex; flex-direction: column; min-width: 0; font-size: var(--font-body); font-weight: var(--weight-semibold); }
.kpi-pm-track-name small { font-size: var(--font-meta); font-weight: var(--weight-normal); color: var(--text-muted); }
.kpi-pm-track-val { margin-left: auto; }
.kpi-pm-version { margin-top: var(--space-3); border-top: 1px solid var(--border-soft); padding-top: var(--space-2); }
.kpi-pm-vrow { display: flex; flex-wrap: wrap; gap: var(--space-3); font-size: var(--font-body); color: var(--text-secondary); }
.kpi-pm-vbtns { display: flex; flex-wrap: wrap; gap: var(--space-2); margin: var(--space-2) 0; }
.kpi-pm-emp-grid { display: grid; grid-template-columns: minmax(220px, 0.7fr) minmax(0, 1.3fr); gap: var(--stack-gap); align-items: start; }
.kpi-pm-emp-stats { margin-bottom: var(--space-2); }
.kpi-pm-emp-body { margin: 0; }

/* --- THÔNG BÁO KPI --- */
.kpi-nt-stats { margin-bottom: var(--space-2); }
.kpi-nt-bar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); margin-bottom: var(--stack-gap); }
.kpi-nt-chip { display: inline-flex; align-items: center; gap: var(--space-1); cursor: pointer;
  background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-sm);
  padding: var(--space-1) var(--space-3); font-size: var(--font-body); color: var(--text-secondary); height: var(--control-h-sm); }
.kpi-nt-chip.is-active { border-color: var(--brand-primary); background: var(--brand-primary-soft); color: var(--brand-primary); font-weight: var(--weight-semibold); }
.kpi-nt-q { width: auto; min-width: 200px; margin: 0 0 0 auto; }
.kpi-nt-grid { display: grid; grid-template-columns: minmax(0, 1.6fr) minmax(260px, 0.9fr); gap: var(--stack-gap); align-items: start; }
.kpi-nt-list, .kpi-nt-detail { margin: 0; min-width: 0; }
.kpi-nt-table tr.is-selected td { background: var(--brand-primary-soft); box-shadow: inset 3px 0 0 var(--brand-primary); }
.kpi-nt-sev { display: inline-grid; place-items: center; width: 24px; height: 24px; border-radius: 50%;
  font-size: var(--font-meta); font-weight: var(--weight-bold); }
.kpi-nt-sev[data-sev="high"] { background: var(--status-danger-soft);  color: var(--status-danger); }
.kpi-nt-sev[data-sev="mid"]  { background: var(--status-warning-soft); color: var(--status-warning); }
.kpi-nt-sev[data-sev="done"] { background: var(--status-success-soft); color: var(--status-success); }
.kpi-nt-sev[data-sev="info"] { background: var(--status-info-soft);    color: var(--status-info); }
.kpi-nt-dhead { border-radius: var(--radius-sm); padding: var(--space-2) var(--space-3); margin-bottom: var(--space-3);
  display: flex; flex-direction: column; gap: 2px; background: var(--bg-surface-soft); border-left: 3px solid var(--border-strong); }
.kpi-nt-dhead[data-sev="high"] { background: var(--status-danger-soft);  border-left-color: var(--status-danger); }
.kpi-nt-dhead[data-sev="mid"]  { background: var(--status-warning-soft); border-left-color: var(--status-warning); }
.kpi-nt-dhead[data-sev="done"] { background: var(--status-success-soft); border-left-color: var(--status-success); }
.kpi-nt-actions { display: flex; flex-wrap: wrap; gap: var(--space-2); margin: var(--space-3) 0 var(--space-2); }


/* --- 04_KPI_UI_V2_ROLE_TEAM_SCOPE_FIX_01 (19/09/2026) — khối nhân sự theo vai ---
   Tiêu đề nói rõ khối là gì ("KPI nhân viên" / "KPI cộng tác viên"), dòng phụ nói
   phạm vi, và "Đang xem" cho biết bấm dòng đã có tác dụng gì. Chỉ dùng token. */
.kpi-v2-team-sub { display: block; width: 100%; order: 3; font-size: var(--font-meta);
  font-weight: var(--weight-regular); color: var(--text-secondary); margin-top: 2px; }
.kpi-v2-team .panel-title { flex-wrap: wrap; }
.kpi-v2-trend-inline { margin-left: auto; flex: 0 0 auto; }
.kpi-v2-watching { margin: var(--space-2) 0 0; font-size: var(--font-meta); color: var(--text-secondary); }
.kpi-v2-watching b { color: var(--text-primary); }
/* Công tắc nghiệm thu "Dữ liệu thử" + nhãn THỬ trên dòng (04_KPI_UAT_SHOW_TEST_DATA_TOGGLE_01).
   Chỉ vai Quản trị thấy công tắc; nhãn đủ để phân biệt, không cần màu mạnh. */
.kpi-v2-uat {
  display: inline-flex; align-items: center; gap: 6px; white-space: nowrap;
  font-size: var(--font-meta); color: var(--text-secondary); cursor: pointer;
}
.kpi-v2-uat input { margin: 0; cursor: pointer; }
.kpi-v2-testtag {
  margin-left: 6px; padding: 0 6px; border-radius: var(--radius-pill, 999px);
  font-size: var(--text-xs); font-weight: var(--weight-semibold); letter-spacing: .02em;
  background: var(--status-warning-soft); color: var(--status-warning);
  border: 1px solid var(--status-warning); vertical-align: middle;
}

/* --- 04_KPI_UI_V2_COMPACT_TWO_TIER_SUMMARY_INFO_01 (19/09/2026) ---
   Ba vùng nén lại. Các quy tắc dưới đây khai SAU phần gốc nên chúng THẮNG;
   ⛔ đừng sửa giá trị ở khối gốc phía trên, sửa ở đây để còn đọc được lịch sử. */

/* Vỏ KPI: tách làm hai tầng thì phải siết khe, nếu không vỏ lại cao hơn bản một hàng.
   Đo được: khe 8 → 6 và lề 8/10 → 6/8 lấy lại 8px mà mắt không thấy chật. */
.kpi-shell { padding: 6px 0 8px; gap: 6px; }

/* A · HAI TẦNG — cả hai đều thấp. Tầng 2 (tab) là hàng riêng, sát tầng 1. */
.kpi-shell-bar { min-height: 32px; }
.kpi-shell .kpi-nav { align-self: flex-start; padding: 3px; gap: 3px; }
.kpi-shell .kpi-nav .tab { padding: 6px 14px; font-size: var(--font-body); }
.kpi-context-who { font-size: var(--font-card-title); }

/* B · DẢI 4 CHỈ SỐ — MỘT hàng cho mỗi ô: [biểu tượng] [nhãn] [giá trị].
   Bản cũ xếp nhãn và giá trị theo CỘT nên ô cao gấp đôi. */
.kpi-v2-strip-cell { gap: var(--space-2); padding: 4px var(--space-3); }
.kpi-v2-strip-ico { width: 22px; height: 22px; font-size: var(--font-meta); }
.kpi-v2-strip-label { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.kpi-v2-strip-value { margin-left: auto; font-size: var(--font-body); white-space: nowrap; }

/* C · DẢI THÔNG TIN MỘT DÒNG — thay băng cao cũ. Giải thích dài nằm trong
   <details>, MẶC ĐỊNH ĐÓNG: mở ra là lựa chọn của người đọc, không phải mặc định. */
.kpi-infostrip {
  background: var(--status-info-soft); border: 1px solid var(--status-info);
  border-radius: var(--radius-sm); margin-bottom: var(--stack-gap);
}
.kpi-infostrip > summary {
  display: flex; align-items: center; gap: var(--space-2);
  padding: 4px var(--space-3); cursor: pointer; list-style: none;
  font-size: var(--font-meta); color: var(--text-primary);
}
.kpi-infostrip > summary::-webkit-details-marker { display: none; }
.kpi-infostrip-ico { flex: 0 0 auto; color: var(--status-info); font-weight: var(--weight-bold); }
.kpi-infostrip-text { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kpi-infostrip-more {
  margin-left: auto; flex: 0 0 auto; color: var(--status-info);
  font-weight: var(--weight-semibold); text-decoration: underline;
}
.kpi-infostrip[open] .kpi-infostrip-more::after { content: ' ▴'; }
.kpi-infostrip:not([open]) .kpi-infostrip-more::after { content: ' ▾'; }
.kpi-infostrip-body {
  padding: 0 var(--space-3) var(--space-2);
  font-size: var(--font-meta); color: var(--text-secondary);
}
.kpi-infostrip-body p { margin: 0 0 var(--space-2); }
.kpi-infostrip-body p:last-child { margin-bottom: 0; }

/* Thanh lọc KPI phải giữ MỘT HÀNG. Đo tại 1440 (có thanh bên): hàng rộng 1109px,
   các ô chiếm 222+200+200+289 + 2 nút 176 + 5 khe = 1137 ⇒ vỡ đúng 28px.
   Siết bề rộng ô xuống 170px lấy lại ~90px. ⛔ Khoá theo #kpi-filterbar —
   lớp .fbar còn dùng chung với CRM và Product, không được đụng của họ. */
#kpi-filterbar .fbar-select { max-width: 170px; min-width: 0; }
/* ⚠️ .kpi-page .fbar-src .fbar-select đặt min-width: 200px — trong CSS min-width THẮNG
   max-width, nên chỉ hạ max-width là vô tác dụng (đã đo: ô vẫn 200px). Phải hạ cả hai. */
#kpi-filterbar .fbar-time .fbar-select { min-width: 0; max-width: 200px; }
#kpi-filterbar .fbar-main { gap: var(--space-2); }

/* Tiến độ theo lộ trình trong tab Tổng quan — dòng thấp, không phải thẻ. */
.kpi-v2-tracks { margin-top: var(--space-3); border: 1px solid var(--border-soft); border-radius: var(--radius-sm); overflow: hidden; }
.kpi-v2-trackrow { display: flex; align-items: center; gap: var(--space-3);
  padding: 4px var(--space-3); border-top: 1px solid var(--border-soft); font-size: var(--font-meta); }
.kpi-v2-trackrow:first-child { border-top: 0; }
.kpi-v2-trackname { flex: 1 1 auto; min-width: 0; color: var(--text-primary); font-weight: var(--weight-semibold);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.kpi-v2-trackact { flex: 0 0 auto; color: var(--text-secondary); }
.kpi-v2-trackpct { flex: 0 0 auto; min-width: 46px; text-align: right; color: var(--text-muted); }
/* --- responsive: khối responsive của KPI V2 phải nằm CUỐI CÙNG của phụ lục này --- */
@media (max-width: 1280px) {
  .kpi-pm-grid { grid-template-columns: minmax(220px, 0.9fr) minmax(0, 1.1fr); }
  .kpi-pm-col-wide { grid-column: 1 / -1; }
}
@media (max-width: 1024px) {
  .kpi-v2-row, .kpi-nt-grid, .kpi-pm-grid, .kpi-pm-emp-grid { grid-template-columns: minmax(0, 1fr); }
  .kpi-v2-strip { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .kpi-v2-strip-cell:nth-child(3) { border-left: 0; }
  .kpi-nt-q { margin-left: 0; width: 100%; }
}
@media (max-width: 640px) {
  .kpi-v2-strip { grid-template-columns: minmax(0, 1fr); }
  .kpi-v2-strip-cell { border-left: 0; border-top: 1px solid var(--border-soft); }
  .kpi-v2-strip-cell:first-child { border-top: 0; }
  .kpi-v2-mygrid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .kpi-pm-stats { grid-template-columns: minmax(0, 1fr); }
  .kpi-v2-detail-head { flex-wrap: wrap; }
  .kpi-v2-export { margin-left: 0; }
  .kpi-v2-tscroll { max-height: 320px; }
}

/* Dải đã thấp và mỗi ô chỉ còn MỘT hàng, nên ở 1024px vẫn đủ chỗ cho 4 cột.
   Đo trước khi chốt: vùng nội dung 977px ⇒ ~244px/ô, đủ cho [22px] + nhãn + giá trị.
   ⛔ Quy tắc này phải nằm SAU khối @media 1024 ở trên, nếu không nó bị đè.
   ≤640px vẫn xếp MỘT cột (quy tắc cũ, không đụng). */
@media (min-width: 641px) {
  .kpi-v2-strip { grid-template-columns: repeat(4, minmax(0, 1fr)); }
  .kpi-v2-strip-cell { border-top: 0; border-left: 1px solid var(--border-soft); }
  .kpi-v2-strip-cell:first-child { border-left: 0; }
}

/* ======================================================================
   04_KPI_UI_V2_EMPLOYEE_SCROLL_READONLY_MODEL_DETAIL — CHI TIẾT MODEL CHỈ-XEM
   Chỉ dùng token canonical. Không hex viết cứng, không bảng màu mới.
   ⛔ Khối @media của phụ lục này phải nằm CUỐI CÙNG (luật đã cắn bốn lần).
   ====================================================================== */
.kpi-mdl-head { display: flex; gap: var(--space-3); align-items: center; padding: var(--space-2) 0 var(--space-3); }
.kpi-mdl-thumb { width: 64px; height: 64px; flex: 0 0 64px; border-radius: var(--radius-sm);
  object-fit: cover; background: var(--bg-surface-soft); border: 1px solid var(--border-soft); }
.kpi-mdl-thumb.is-empty { display: flex; align-items: center; justify-content: center;
  font-size: 24px; color: var(--text-muted); }
.kpi-mdl-head-txt { min-width: 0; }
.kpi-mdl-name { display: block; font-size: var(--text-lg); line-height: 1.3; }
.kpi-mdl-meta { display: flex; flex-wrap: wrap; gap: var(--space-2); align-items: center;
  margin-top: 2px; font-size: var(--font-meta); color: var(--text-secondary); }

.kpi-mdl-block { border-top: 1px solid var(--border-soft); padding-top: var(--space-2); margin-top: var(--space-2); }
.kpi-mdl-block:first-child { border-top: 0; margin-top: 0; }
.kpi-mdl-block-title { display: flex; align-items: center; gap: var(--space-2);
  font-size: var(--font-meta); font-weight: 600; color: var(--text-secondary);
  text-transform: uppercase; letter-spacing: .02em; margin-bottom: var(--space-2); }
.kpi-mdl-ro { font-size: var(--text-xs); font-weight: 600; letter-spacing: .02em;
  color: var(--text-muted); border: 1px solid var(--border-soft);
  border-radius: var(--radius-pill); padding: 1px 6px; }

/* Thông số: lưới tự chia theo bề rộng THẬT, không ép số cột theo mốc màn hình. */
.kpi-mdl-specs { display: grid; grid-template-columns: repeat(auto-fit, minmax(210px, 1fr)); gap: 2px var(--space-3); }
.kpi-mdl-spec { display: flex; gap: var(--space-2); align-items: baseline;
  min-width: 0; padding: 3px 0; border-bottom: 1px dotted var(--border-soft); }
.kpi-mdl-spec-k { flex: 0 0 auto; max-width: 52%; font-size: var(--font-meta); color: var(--text-secondary); }
.kpi-mdl-spec-k i { font-style: normal; color: var(--status-warn); margin-left: 2px; }
.kpi-mdl-spec-v { flex: 1 1 0; min-width: 0; font-size: var(--font-meta);
  font-weight: 600; color: var(--text-primary); text-align: right;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.kpi-mdl-more > summary { cursor: pointer; font-size: var(--font-meta); color: var(--brand-primary);
  padding: var(--space-2) 0 0; }
.kpi-mdl-more[open] > summary { margin-bottom: var(--space-2); }
.kpi-mdl-none { font-size: var(--font-meta); color: var(--text-secondary); padding: var(--space-2) 0; }

/* Lộ trình: nút chọn, KHÔNG phải nút ghi. */
.kpi-mdl-tracks { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: var(--space-2); }
.kpi-mdl-track { display: flex; flex-direction: column; gap: 2px; align-items: flex-start;
  text-align: left; padding: var(--space-2); border: 1px solid var(--border-soft);
  border-radius: var(--radius-sm); background: var(--bg-surface); cursor: pointer; min-width: 0; }
.kpi-mdl-track:hover { border-color: var(--brand-primary); }
.kpi-mdl-track.is-selected { border-color: var(--brand-primary); background: var(--brand-primary-soft); }
.kpi-mdl-track-n { font-size: var(--font-meta); font-weight: 600; color: var(--text-primary); }
.kpi-mdl-track-s { font-size: var(--text-xs); color: var(--text-muted); }

.kpi-mdl-detail .kpi-mdl-mstable th { white-space: nowrap; }
.kpi-mdl-vrow { display: flex; flex-wrap: wrap; gap: var(--space-3);
  font-size: var(--font-meta); color: var(--text-secondary); padding: var(--space-2) 0 0; }

/* ---- responsive: PHẢI nằm cuối khối này ---- */
@media (max-width: 1024px) {
  .kpi-mdl-spec-v { white-space: normal; text-align: left; }
  .kpi-mdl-spec { flex-wrap: wrap; gap: 0 var(--space-2); }
}
@media (max-width: 640px) {
  .kpi-mdl-head { gap: var(--space-2); }
  .kpi-mdl-thumb { width: 48px; height: 48px; flex-basis: 48px; }
  .kpi-mdl-specs, .kpi-mdl-tracks { grid-template-columns: minmax(0, 1fr); }
}

/* =====================================================================
   CRM → TRUNG TÂM CHAT — WEBAPP-CRM-CHAT-CENTER-UI-V1-01
   Bố cục 3 vùng: danh sách hội thoại · hội thoại · ngữ cảnh CRM.
   Chỉ dùng token. Khối @media của phần này nằm CUỐI khối (luật thứ tự CSS).
   ===================================================================== */
/* Khối CSKH nhỏ phía trên: CHỈ ẩn phần hiển thị khi đang ở tab Trung tâm chat. */
body.crm-chat-mode #global-care,
body.crm-chat-mode #global-care-reopen { display: none !important; }

.cch {
  display: grid; grid-template-columns: minmax(250px, 285px) minmax(0, 1fr) minmax(250px, 285px);
  gap: var(--space-2); min-height: 520px; position: relative;
}
.cch > section, .cch > aside {
  min-width: 0; min-height: 0; background: var(--bg-surface); border: 1px solid var(--border-soft);
  border-radius: var(--radius-lg); display: flex; flex-direction: column; overflow: hidden;
}
.cch-icon-btn {
  display: inline-flex; align-items: center; justify-content: center; width: 30px; height: 30px; flex: 0 0 auto;
  border: 1px solid var(--border-soft); border-radius: var(--radius-md); background: var(--bg-surface);
  color: var(--text-secondary); font-size: var(--font-body); cursor: pointer;
}
.cch-icon-btn:hover:not(:disabled) { border-color: var(--brand-primary); color: var(--brand-primary); }
.cch-icon-btn.on { background: var(--brand-primary-soft); border-color: var(--brand-primary); color: var(--brand-primary); }
.cch-icon-btn:disabled { opacity: .5; cursor: not-allowed; }

/* A · danh sách hội thoại */
.cch-list-h { display: flex; align-items: center; gap: var(--space-2); padding: 10px 12px 6px; font-size: var(--font-card-title); }
.cch-list-h .cch-icon-btn { margin-left: auto; }
.cch-count { font-size: var(--font-badge); font-weight: var(--weight-semibold); padding: 1px 8px; border-radius: 999px;
  background: var(--brand-primary); color: var(--text-inverse); }
.cch-search { display: flex; gap: 6px; padding: 0 12px 6px; }
.cch-search .fbar-input { flex: 1 1 auto; min-width: 0; height: 32px; }
.cch-more { display: flex; flex-wrap: wrap; gap: 6px; padding: 0 12px 6px; }
.cch-more .fbar-select { flex: 1 1 130px; min-width: 0; height: 30px; }
.cch-quick { display: flex; flex-wrap: wrap; gap: 4px; padding: 0 12px 8px; border-bottom: 1px solid var(--border-soft); }
.cch-quick .crm-quick { padding: 3px 9px; border-radius: 999px; gap: 6px; font-size: var(--font-meta); }
.cch-rows { flex: 1 1 auto; min-height: 0; overflow-y: auto; }
.cch-item {
  display: flex; gap: 10px; width: 100%; padding: 9px 12px; border: 0; border-bottom: 1px solid var(--border-soft);
  border-left: 3px solid transparent; background: var(--bg-surface); text-align: left; cursor: pointer; color: var(--text-primary);
}
.cch-item:hover { background: var(--bg-surface-soft); }
.cch-item.on { background: var(--brand-primary-soft); border-left-color: var(--brand-primary); }
.cch-item-main { display: flex; flex-direction: column; gap: 2px; min-width: 0; flex: 1 1 auto; }
.cch-item-top { display: flex; align-items: baseline; gap: 6px; min-width: 0; }
.cch-name { flex: 1 1 auto; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; font-size: var(--font-body); }
.cch-ch, .cch-time { flex: 0 0 auto; font-size: var(--font-meta); color: var(--text-secondary); }
.cch-prev { font-size: var(--font-meta); color: var(--text-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.cch-item.is-unread .cch-prev { color: var(--text-primary); font-weight: var(--weight-semibold); }
.cch-item-own { display: flex; align-items: center; gap: 4px; font-size: var(--font-meta); color: var(--text-secondary); min-width: 0; white-space: nowrap; overflow: hidden; }
.cch-own-name { overflow: hidden; text-overflow: ellipsis; }
.cch-kind { margin-left: auto; font-size: var(--font-badge); padding: 0 6px; border-radius: 999px; background: var(--status-success-soft); color: var(--status-success); }
.cch-dot { width: 8px; height: 8px; border-radius: 50%; flex: 0 0 auto; background: var(--text-muted); }
.cch-dot.tone-ok { background: var(--status-success); }
.cch-dot.tone-ai { background: var(--status-ai); }
.cch-dot.tone-wait { background: var(--status-warning); }
.cch-dot.tone-urgent { background: var(--status-danger); }
.cch-dot.tone-info { background: var(--status-info); }
.cch-pager { display: flex; align-items: center; justify-content: space-between; gap: 6px; flex-wrap: wrap;
  padding: 6px 12px; border-top: 1px solid var(--border-soft); font-size: var(--font-meta); }
.cch-pager .pd-pager { display: inline-flex; gap: 2px; }

.cch-av {
  display: inline-flex; align-items: center; justify-content: center; flex: 0 0 auto; width: 38px; height: 38px;
  border-radius: 50%; font-size: var(--font-meta); font-weight: var(--weight-bold);
  background: var(--status-info-soft); color: var(--status-info);
}
.cch-av.tone-ok { background: var(--status-success-soft); color: var(--status-success); }
.cch-av.tone-ai { background: var(--status-ai-soft); color: var(--status-ai); }
.cch-av.tone-wait { background: var(--status-warning-soft); color: var(--status-warning); }
.cch-av.tone-urgent { background: var(--status-danger-soft); color: var(--status-danger); }
.cch-av-sm { width: 22px; height: 22px; font-size: var(--font-badge); }
.cch-av-lg { width: 46px; height: 46px; font-size: var(--font-body); }

/* B · hội thoại */
.cch-sessions { display: flex; align-items: center; gap: 4px; padding: 6px 8px; border-bottom: 1px solid var(--border-soft);
  background: var(--bg-surface-soft); min-width: 0; }
.cch-sess { display: inline-flex; align-items: center; min-width: 0; max-width: 200px; border: 1px solid var(--border-soft);
  border-radius: var(--radius-md); background: var(--bg-surface); }
.cch-sess.on { border-color: var(--brand-primary); box-shadow: inset 0 -2px 0 var(--brand-primary); }
.cch-sess-go { display: inline-flex; align-items: center; gap: 6px; min-width: 0; padding: 3px 6px; border: 0; background: transparent;
  font-size: var(--font-meta); color: var(--text-primary); cursor: pointer; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.cch-sess-x { border: 0; background: transparent; color: var(--text-muted); cursor: pointer; padding: 0 6px; font-size: var(--font-meta); }
.cch-sess-x:hover { color: var(--status-danger); }
.cch-sess-more-wrap { position: relative; }
.cch-sess-more { height: 28px; padding: 0 8px; border: 1px solid var(--border-soft); border-radius: var(--radius-md);
  background: var(--bg-surface); font-size: var(--font-meta); cursor: pointer; }
.cch-sess-menu { position: absolute; top: 32px; left: 0; z-index: 6; display: flex; flex-direction: column; gap: 4px; padding: 6px;
  background: var(--bg-surface); border: 1px solid var(--border-default); border-radius: var(--radius-md); box-shadow: var(--shadow-md); }
.cch-sessions > .cch-icon-btn { margin-left: auto; }

.cch-head { display: flex; align-items: center; gap: 10px; padding: 8px 12px; border-bottom: 1px solid var(--border-soft); flex-wrap: wrap; }
.cch-head-main { flex: 1 1 220px; min-width: 0; display: flex; flex-direction: column; gap: 3px; }
.cch-head-l1 { display: flex; align-items: center; gap: 6px; flex-wrap: nowrap; min-width: 0; overflow: hidden; }
.cch-head-l1 > * { flex: 0 0 auto; }
.cch-head-l1 > .cch-head-name { flex: 1 1 auto; min-width: 0; }
.cch-head-l2 { align-items: center; }
.cch-head-name { font-size: var(--font-card-title); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }
.cch-head-l2 { display: flex; flex-wrap: wrap; gap: 2px 10px; font-size: var(--font-meta); color: var(--text-secondary); }
.cch-admin { color: var(--status-ai); font-weight: var(--weight-semibold); }
.cch-owner, .cch-sla { white-space: nowrap; }
.cch-sla b { color: var(--text-secondary); }
.cch-sla.tone-ok b { color: var(--status-success); }
.cch-sla.tone-wait b { color: var(--status-warning); }
.cch-sla.tone-urgent b { color: var(--status-danger); }
.cch-head-acts { display: flex; gap: 6px; align-items: center; margin-left: auto; }
.cch-back, .cch-info-btn { display: none; }
.cch-state { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; padding: 6px 12px; border-bottom: 1px solid var(--border-soft); }
.cch-view { margin-left: auto; display: inline-flex; gap: 2px; }
.cch-stream { flex: 1 1 auto; min-height: 0; overflow-y: auto; display: flex; flex-direction: column; gap: 8px; padding: 12px 16px;
  background: var(--bg-surface-soft); }
.cch-stream .cc-msg { max-width: 72%; }
.cch-date { align-self: center; font-size: var(--font-meta); color: var(--text-secondary); }
.cch-date span { padding: 2px 10px; border-radius: 999px; background: var(--bg-subtle); }
.cch-empty { margin: auto; text-align: center; }
.cch-last { margin-top: 6px; color: var(--text-primary); }
.cch-ai { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; padding: 6px 12px; border-top: 1px solid var(--border-soft);
  background: var(--status-ai-soft); }
.cch-ai-l { font-weight: var(--weight-semibold); color: var(--status-ai); font-size: var(--font-meta); }
.cch-ai-chip { padding: 2px 10px; border: 1px solid var(--status-ai); border-radius: 999px; background: var(--bg-surface);
  color: var(--status-ai); font-size: var(--font-meta); cursor: pointer; }
.cch-ai-chip:disabled { opacity: .55; cursor: not-allowed; }
.cch-ai-note { font-size: var(--font-meta); }
.cch-compose { padding: 6px 12px 10px; border-top: 1px solid var(--border-soft); display: flex; flex-direction: column; gap: 6px; }
.cch-modes { display: flex; align-items: center; gap: 2px; flex-wrap: wrap; }
.cch-mode-hint { margin-left: 8px; font-size: var(--font-meta); }
.cch-input-row { display: flex; align-items: flex-end; gap: 6px; }
.cch-input-row textarea { flex: 1 1 auto; min-width: 0; min-height: 38px; max-height: 120px; resize: vertical; padding: 8px 10px;
  border: 1px solid var(--border-default); border-radius: var(--radius-md); font: inherit; font-size: var(--font-body); }
.cch-input-row .btn-primary { min-width: 84px; }

/* C · ngữ cảnh CRM */
.cch-info { overflow-y: auto !important; padding: 0 0 8px; }
.cch-info-back, .cch-info-close { display: none; }
.cch-sec { padding: 8px 12px; border-bottom: 1px solid var(--border-soft); }
.cch-sec-h { display: flex; align-items: center; gap: 6px; margin-bottom: 6px; font-size: var(--font-body); }
.cch-sec-acts { margin-left: auto; display: inline-flex; gap: 4px; flex-wrap: wrap; justify-content: flex-end; }
.cch-who { display: flex; align-items: center; gap: 8px; margin-bottom: 6px; }
.cch-kv { display: grid; grid-template-columns: 96px minmax(0, 1fr); gap: 3px 8px; margin: 0; font-size: var(--font-meta); }
.cch-kv dt { color: var(--text-secondary); }
.cch-kv dd { margin: 0; min-width: 0; overflow-wrap: anywhere; }
.cch-tags { display: flex; flex-wrap: wrap; gap: 4px; }
.cch-tag { padding: 1px 8px; border-radius: 999px; background: var(--brand-primary-soft); color: var(--brand-primary); font-size: var(--font-meta); }
.cch-note { margin-top: 6px; font-size: var(--font-meta); }
.cch-hist { margin: 0; padding-left: 16px; display: flex; flex-direction: column; gap: 4px; font-size: var(--font-meta); }
.cch-gap { font-size: var(--font-meta); color: var(--text-secondary); padding: 4px 8px; border: 1px dashed var(--border-default);
  border-radius: var(--radius-md); margin-top: 4px; }

/* ---- responsive: PHẢI nằm cuối khối này ---- */
@media (max-width: 1100px) {
  .cch { grid-template-columns: minmax(250px, 300px) minmax(0, 1fr); }
  .cch-info { display: none !important; }
  .cch.info-open .cch-info { display: flex !important; position: absolute; top: 0; right: 0; bottom: 0; width: min(340px, 92%);
    z-index: 7; box-shadow: var(--shadow-floating); }
  .cch.info-open .cch-info-close { display: inline-flex; position: sticky; top: 4px; margin: 4px 8px 0 auto; }
  .cch-info-btn { display: inline-flex; }
  .cch-stream .cc-msg { max-width: 88%; }
}
@media (max-width: 640px) {
  .cch { grid-template-columns: minmax(0, 1fr); min-height: 0; }
  .cch > section, .cch > aside { display: none !important; }
  .cch[data-view="list"] .cch-list, .cch[data-view="chat"] .cch-center, .cch[data-view="info"] .cch-info { display: flex !important; position: static; width: auto; box-shadow: none; }
  .cch-rows { max-height: 62vh; }
  .cch-stream { max-height: 58vh; min-height: 240px; }
  .cch-back { display: inline-flex; }
  .cch-info-btn { display: inline-flex; }
  .cch-info-close { display: none !important; }
  .cch-info-back { display: inline-flex; margin: 8px 12px 0; }
  .cch-head-l1 { flex-wrap: wrap; }
  .cch-head-l1 > .cch-head-name { flex: 1 1 100%; white-space: normal; }
  .cch-head-acts { width: 100%; margin-left: 0; }
  .cch-head-acts .btn { min-height: 40px; flex: 1 1 auto; justify-content: center; }
  .cch-sess { max-width: 150px; }
  .cch-sessions { overflow-x: auto; }
  .cch-mode-hint { margin-left: 0; width: 100%; }
  .cch-stream .cc-msg { max-width: 92%; }
}


/* =====================================================================
   GLOBAL CSKH DOCK — COMPACT V1 (WEBAPP-GLOBAL-CSKH-DOCK-COMPACT-V1-01)
   MỘT bộ luật cho khối "Trung tâm chăm sóc khách hàng trực tiếp" ở MỌI module.
   Thẻ hội thoại: MỘT hàng, tối đa 4 thẻ (+ nút "+N cuộc khác") ⇒ chiều cao khối KHÔNG đổi theo
   số hội thoại. Hàng hẹp hơn bề ngang thì cuộn ngang TRONG khối, không bao giờ xuống hàng 2.
   Chỉ dùng token. Khối @media của phần này nằm CUỐI khối (luật thứ tự CSS).
   ===================================================================== */
.global-care[data-state="COMPACT"] #global-care-cards,
.global-care[data-state="EXPANDED"] #global-care-cards {
  display: flex; flex-wrap: nowrap; align-items: stretch; gap: var(--space-2);
  margin-top: var(--space-2); max-height: none; overflow-x: auto; overflow-y: hidden;
  padding: 0 0 2px; scrollbar-width: thin;
}
#global-care-cards > .care-card {
  flex: 1 1 170px; min-width: 160px; padding: 8px 12px;
  display: flex; flex-direction: column; gap: 3px;
}
#global-care-cards > .care-card:hover { transform: none; }
#global-care-cards > .empty { flex: 1 1 auto; padding: 4px 0; text-align: left; }
#global-care-cards .care-card-head { min-width: 0; }
#global-care-cards .care-card-name {
  flex: 1 1 auto; min-width: 0; font-size: var(--font-body);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
#global-care-cards .care-card-channel { flex: 0 0 auto; white-space: nowrap; }
#global-care-cards .care-card-line {
  display: flex; align-items: center; gap: 6px; min-width: 0;
  white-space: nowrap; overflow: hidden;
}
#global-care-cards .care-card-status { margin-top: 0; flex: 0 1 auto; min-width: 0; padding: 1px 6px; overflow: hidden; text-overflow: ellipsis; }
#global-care-cards .care-card-meta,
#global-care-cards .care-card-time {
  margin-top: 0; min-width: 0; overflow: hidden; text-overflow: ellipsis; font-size: var(--font-meta);
}
#global-care-cards .care-card-meta { flex: 1 1 70px; }
#global-care-cards .care-card-foot { display: flex; align-items: baseline; gap: 6px; min-width: 0; }
#global-care-cards .care-card-foot .care-card-preview { flex: 1 1 auto; min-width: 0; }
#global-care-cards .care-card-time { flex: 0 0 auto; color: var(--text-muted); }
#global-care-cards .care-card-preview {
  margin-top: 0; font-size: var(--font-meta); line-height: 1.4;
  display: -webkit-box; -webkit-line-clamp: 1; -webkit-box-orient: vertical; overflow: hidden;
}
.care-more {
  flex: 0 0 auto; align-self: stretch; padding: 0 var(--space-3);
  border: 1px dashed var(--border-default); border-radius: var(--radius-md);
  background: var(--bg-surface-soft); color: var(--brand-primary);
  font-size: var(--font-meta); font-weight: var(--weight-semibold); white-space: nowrap; cursor: pointer;
}
.care-more:hover, .care-more:focus-visible { border-color: var(--brand-primary); background: var(--brand-primary-soft); }

/* 5 chỉ số của trạng thái MỞ RỘNG: MỘT hàng thấp, không xuống dòng. */
.global-care[data-state="EXPANDED"] #global-care-metrics {
  display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: var(--space-2); margin-top: var(--space-2);
}
.global-care[data-state="EXPANDED"] .care-metric { padding: 6px 10px; align-items: center; }
.global-care[data-state="EXPANDED"] .care-metric-label {
  font-size: var(--font-meta); white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.global-care[data-state="EXPANDED"] .care-metric-value { font-size: var(--text-lg); }
.global-care[data-state="EXPANDED"] { padding: 10px 18px 12px; }
.global-care[data-state="EXPANDED"] .global-care-title h2 { font-size: var(--text-lg); }

/* NƠI HIỂN THỊ (PRESENTATION-SCOPE-V1-02): khối CSKH CHỈ vẽ ở Trang chủ. Luật đặt ở MỘT chỗ
   (body[data-care-view] do applyGlobalCarePresentation() ghi) — không vá từng module. */
body:not([data-care-view="summary"]) #global-care,
body:not([data-care-view="summary"]) #global-care-reopen,
body:not([data-care-view="summary"]) #global-care-sheet-backdrop { display: none !important; }

/* ---- responsive: PHẢI nằm cuối khối này ---- */
@media (max-width: 1180px) {
  .global-care[data-state="EXPANDED"] #global-care-metrics { grid-template-columns: repeat(5, minmax(0, 1fr)); }
}
@media (min-width: 641px) and (max-width: 1024px) {
  /* Máy tính bảng: giữ quyết định cũ — COMPACT chỉ còn tiêu đề + dòng tóm tắt, không thẻ. */
  .global-care[data-state="COMPACT"] #global-care-cards { display: none; }
  .global-care[data-state="EXPANDED"] #global-care-metrics { grid-template-columns: repeat(5, minmax(0, 1fr)); }
}
@media (max-width: 900px) {
  #global-care-cards > .care-card { flex: 0 0 220px; }
}
@media (max-width: 640px) {
  .global-care[data-state="EXPANDED"] #global-care-metrics {
    display: flex; overflow-x: auto; gap: var(--space-2); scrollbar-width: thin;
  }
  .global-care[data-state="EXPANDED"] .care-metric { flex: 0 0 auto; }
  .global-care[data-state="EXPANDED"] #global-care-cards { display: flex; overflow-x: auto; max-height: none; }
  #global-care-cards > .care-card { flex: 0 0 240px; }
}

/* =====================================================================
   CÔNG VIỆC · CHẠY THẬT TRÊN TASK API V1 (WEBAPP-TASK-UI-RUNTIME-V1-01)
   Chỉ các thành phần MỚI của panel chi tiết: dải báo xung đột phiên bản, dòng thông báo
   kết quả, danh sách người phối hợp/CTV, khối thao tác mở tại chỗ. Bố cục hai cột và
   danh sách giữ nguyên baseline. Chỉ dùng token; không cỡ chữ dưới 12.5px.
   Khối @media (nếu có) phải nằm CUỐI khối này — luật thứ tự CSS.
   ===================================================================== */
.cw-conflict {
  display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap;
  margin: var(--space-2) 0; padding: var(--space-2) var(--space-3);
  border: 1px solid var(--status-warning); border-radius: var(--radius-sm);
  background: var(--status-warning-soft); color: var(--text-primary); font-size: var(--text-sm);
}
.cw-flash {
  margin: var(--space-2) 0; padding: var(--space-2) var(--space-3);
  border: 1px solid var(--status-success); border-radius: var(--radius-sm);
  background: var(--status-success-soft); color: var(--text-primary); font-size: var(--text-sm);
}
.cw-flash.is-err { border-color: var(--status-danger); background: var(--status-danger-soft); }
.cw-parts { list-style: none; margin: var(--space-2) 0 0; padding: 0; display: grid; gap: var(--space-2); }
.cw-part {
  display: flex; align-items: center; justify-content: space-between; gap: var(--space-2);
  padding: var(--space-2) var(--space-3); border: 1px solid var(--border-soft);
  border-radius: var(--radius-sm); background: var(--bg-surface);
}
.cw-part-who { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.cw-part-who .scv-sub { font-size: var(--text-sm); }
.cw-part-acts { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-2); }
.cw-panel {
  margin: var(--space-2) 0; padding: var(--space-3);
  border: 1px solid var(--border-strong); border-radius: var(--radius-sm); background: var(--bg-app);
}
.cw-panel .scv-foot { margin-top: var(--space-2); }

/* WEBAPP-CALENDAR-UI-CUTOVER-V1-01 — ba lớp MỚI của workspace Lịch (đọc canonical /api/calendar/*).
   Mọi thứ khác dùng lại .cw-* / .scv-* / .tag* đã có. Chỉ token; không cỡ chữ dưới 12.5px. */
.cw-time .cw-sub2 { display: block; font-size: var(--text-sm); color: var(--text-secondary); white-space: nowrap; }
.cw-people {
  display: grid; gap: var(--space-1); max-height: 220px; overflow: auto;
  padding: var(--space-2); border: 1px solid var(--border-soft); border-radius: var(--radius-sm); background: var(--bg-surface);
}
.cw-people .check { margin: 0; }

/* ==========================================================================
   WEBAPP-NOTIFICATION-CENTER-GLOBAL-INBOX-V1-01 · TRUNG TÂM THÔNG BÁO
   Một workspace: đầu trang → 4 thẻ → bộ lọc → danh sách | chi tiết. Mọi luật SCOPE trong `.nc` / `.nc-*`.
   Chỉ dùng token sẵn có; `--nc-metric` là token CỤC BỘ duy nhất (số thẻ 22px — thang chung nhảy 20 → 28).
   Khối responsive nằm CUỐI khối này (luật thứ tự CSS). Đặt TRƯỚC phụ lục Quảng cáo (bộ kiểm Ads cắt tới hết tệp).
   ========================================================================== */
.nc { --nc-metric: 22px; display: flex; flex-direction: column; gap: var(--space-3); min-width: 0; }
.nc .panel { margin: 0; }
.nc-head { display: flex; flex-direction: row; align-items: center; gap: var(--space-4); padding: var(--space-3) var(--space-4); }
.nc-head-ico { width: 44px; height: 44px; flex: 0 0 44px; border-radius: var(--radius-md); background: var(--status-danger-soft); display: grid; place-items: center; font-size: var(--text-2xl); }
.nc-head-txt { min-width: 0; flex: 1 1 auto; }
.nc-head-txt h1 { margin: 0; font-size: var(--text-xl); font-weight: 700; color: var(--text-primary); }
.nc-head-txt p { margin: 2px 0 0; font-size: var(--font-body); color: var(--text-secondary); }
.nc-head-side { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; justify-content: flex-end; }
.nc-updated { display: inline-flex; align-items: center; gap: var(--space-2); padding: 6px var(--space-3); border-radius: 999px; background: var(--status-success-soft); color: var(--text-primary); font-size: var(--font-meta); white-space: nowrap; }
.nc-dot { width: 8px; height: 8px; border-radius: 50%; background: var(--status-success); }
.nc-refresh { width: 32px; height: 32px; border-radius: 50%; border: 1px solid var(--border-soft); background: var(--bg-surface); color: var(--text-secondary); cursor: pointer; font-size: var(--text-lg); }
.nc-refresh:hover { color: var(--brand-primary); border-color: var(--brand-primary); }
.nc-refresh:disabled { opacity: .5; cursor: progress; }

/* ---- 4 thẻ tóm tắt ---- */
.nc-cards { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-3); }
.nc-card { display: flex; align-items: center; gap: var(--space-3); padding: var(--space-3) var(--space-4); min-height: 72px; background: var(--bg-surface);
  border: 1px solid var(--border-soft); border-left: 3px solid var(--nc-accent, var(--border-default)); border-radius: var(--radius-md);
  box-shadow: var(--shadow-sm); cursor: pointer; text-align: left; font: inherit; color: inherit; min-width: 0; }
.nc-card:hover:not(:disabled) { box-shadow: var(--shadow-md); }
.nc-card:disabled { cursor: help; opacity: .85; }
.nc-card.is-on { background: var(--nc-soft); }
.nc-card-ico { width: 40px; height: 40px; flex: 0 0 40px; border-radius: var(--radius-md); background: var(--nc-soft); color: var(--nc-accent); display: grid; place-items: center; font-weight: 700; font-size: var(--text-lg); }
.nc-card-txt { display: flex; flex-direction: column; min-width: 0; flex: 1 1 auto; }
.nc-card-lbl { font-size: var(--font-label); color: var(--text-secondary); }
.nc-card-val { font-size: var(--nc-metric); font-weight: 700; color: var(--nc-accent); line-height: 1.2; }
.nc-card-go { color: var(--text-muted); font-size: var(--text-xl); }
.nc-c-amber { --nc-accent: var(--status-warning); --nc-soft: var(--status-warning-soft); }
.nc-c-blue  { --nc-accent: var(--status-info);    --nc-soft: var(--status-info-soft); }
.nc-c-red   { --nc-accent: var(--status-danger);  --nc-soft: var(--status-danger-soft); }
.nc-c-green { --nc-accent: var(--status-success); --nc-soft: var(--status-success-soft); }

/* ---- bộ lọc ---- */
.nc-filters { display: flex; flex-direction: row; align-items: center; gap: var(--space-3); padding: var(--space-2) var(--space-3); flex-wrap: wrap; }
.nc-chips { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; flex: 1 1 0; min-width: 0; }
.nc-chip { padding: 5px 10px; border-radius: 999px; border: 1px solid var(--border-soft); background: var(--bg-surface); color: var(--text-primary);
  font: inherit; font-size: var(--font-body); cursor: pointer; white-space: nowrap; }
.nc-chip:hover:not(:disabled) { border-color: var(--brand-primary); }
.nc-chip.is-on { background: var(--brand-primary); border-color: var(--brand-primary); color: var(--text-inverse); }
.nc-chip:disabled { color: var(--text-disabled); cursor: help; background: var(--bg-subtle); }
.nc-chip-n { opacity: .85; }
.nc-sep { width: 1px; height: 22px; background: var(--border-soft); margin: 0 var(--space-1); }
.nc-search { display: flex; align-items: center; gap: var(--space-2); padding: 0 var(--space-3); border: 1px solid var(--border-soft); border-radius: var(--radius-sm);
  background: var(--bg-surface); min-width: 180px; flex: 0 1 220px; color: var(--text-muted); }
.nc-search input { border: 0; outline: 0; padding: 7px 0; font: inherit; font-size: var(--font-body); width: 100%; background: transparent; color: var(--text-primary); }
.nc-search:focus-within { border-color: var(--border-focus); }

/* ---- danh sách | chi tiết ---- */
.nc-split { display: grid; grid-template-columns: minmax(0, 1.45fr) minmax(0, 1fr); gap: var(--space-3); align-items: start; }
.nc-list, .nc-detail { padding: 0; min-width: 0; overflow: hidden; }
.nc-list-head, .nc-detail-head { display: flex; align-items: center; gap: var(--space-2); padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--border-soft); }
.nc-list-head h2, .nc-detail-head h2 { margin: 0; font-size: var(--text-lg); font-weight: 700; flex: 1 1 auto; }
.nc-sort select { border: 1px solid var(--border-soft); border-radius: var(--radius-sm); padding: 5px var(--space-2); font: inherit; font-size: var(--font-meta); background: var(--bg-surface); color: var(--text-primary); }
.nc-items { max-height: calc(100vh - 360px); min-height: 180px; overflow-y: auto; }
.nc-item { display: grid; grid-template-columns: 40px 88px minmax(0, 1fr) auto; align-items: center; gap: var(--space-3); width: 100%; padding: var(--space-3) var(--space-4);
  border: 0; border-bottom: 1px solid var(--border-soft); border-left: 3px solid transparent; background: var(--bg-surface); text-align: left; font: inherit; color: inherit; cursor: pointer; }
.nc-item:hover { background: var(--bg-surface-soft); }
.nc-item.is-selected { background: var(--brand-primary-soft); border-left-color: var(--brand-primary); }
.nc-item:focus-visible { outline: 2px solid var(--border-focus); outline-offset: -2px; }
.nc-ico { width: 40px; height: 40px; border-radius: var(--radius-md); display: grid; place-items: center; font-size: var(--text-lg); font-weight: 700; }
.nc-src-crm { background: var(--status-success-soft); color: var(--status-success); }
.nc-src-product { background: var(--status-ai-soft); color: var(--status-ai); }
.nc-src-ai { background: var(--status-info-soft); color: var(--status-info); }
.nc-src-system { background: var(--status-danger-soft); color: var(--status-danger); }
.nc-src-calendar { background: var(--status-warning-soft); color: var(--status-warning); }
.nc-item-src { font-size: var(--font-meta); color: var(--text-secondary); }
.nc-item-main { display: flex; flex-direction: column; min-width: 0; gap: 2px; }
.nc-item-title { font-size: var(--text-md); font-weight: 600; color: var(--text-primary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nc-item-sum { font-size: var(--font-meta); color: var(--text-secondary); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nc-item-side { display: flex; flex-direction: column; align-items: flex-end; gap: 4px; }
.nc-item-time { font-size: var(--font-meta); color: var(--text-muted); white-space: nowrap; }
.nc-tag { display: inline-block; padding: 2px var(--space-2); border-radius: 999px; font-size: var(--font-badge); font-weight: 600; white-space: nowrap; }
.nc-item-side .nc-tag + .nc-tag, .nc-detail-tags .nc-tag + .nc-tag { margin-left: 4px; }
.nc-tag-danger { background: var(--status-danger-soft); color: var(--status-danger); }
.nc-tag-warn { background: var(--status-warning-soft); color: var(--status-warning); }
.nc-tag-caution { background: var(--bg-surface); color: var(--status-warning); box-shadow: inset 0 0 0 1px var(--status-warning); }
.nc-tag-info { background: var(--bg-subtle); color: var(--text-secondary); }
.nc-empty { display: flex; flex-direction: column; align-items: center; gap: var(--space-2); padding: var(--space-6) var(--space-4); color: var(--text-secondary); font-size: var(--font-body); text-align: center; }
.nc-empty span { font-size: var(--text-2xl); }
.nc-muted { color: var(--text-muted); font-size: var(--font-meta); font-weight: 400; }
.nc-note { margin: 0; color: var(--status-warning); font-size: var(--font-meta); }

.nc-back { display: none; }
.nc-nav { display: flex; gap: var(--space-1); }
.nc-navbtn { width: 30px; height: 30px; border-radius: var(--radius-sm); border: 1px solid var(--border-soft); background: var(--bg-surface); cursor: pointer; font-size: var(--text-lg); color: var(--text-secondary); }
.nc-navbtn:disabled { opacity: .4; cursor: default; }
.nc-detail-title { display: grid; grid-template-columns: 40px minmax(0, 1fr) auto; gap: var(--space-3); align-items: start; padding: var(--space-4) var(--space-4) 0; }
.nc-detail-title h3 { margin: 2px 0; font-size: var(--text-lg); font-weight: 700; color: var(--text-primary); }
.nc-detail-sum { margin: var(--space-3) var(--space-4); font-size: var(--font-body); color: var(--text-primary); line-height: 1.5; }
.nc-kvs { margin: 0 var(--space-4); border-top: 1px solid var(--border-soft); padding-top: var(--space-2); }
.nc-kv { display: grid; grid-template-columns: 170px minmax(0, 1fr); gap: var(--space-2); padding: 5px 0; font-size: var(--font-body); }
.nc-k { color: var(--text-secondary); display: inline-flex; gap: var(--space-2); }
.nc-k span { color: var(--text-muted); width: 16px; text-align: center; }
.nc-v { color: var(--text-primary); min-width: 0; overflow-wrap: anywhere; }
.nc-info { margin: var(--space-3) var(--space-4); padding: var(--space-2) var(--space-3); border-radius: var(--radius-sm); background: var(--status-info-soft); color: var(--status-info); font-size: var(--font-meta); }
.nc-actions { display: flex; gap: var(--space-2); flex-wrap: wrap; margin: 0 var(--space-4) var(--space-3); }
.nc-actions .btn:disabled { cursor: help; }
.nc-hist { margin: 0 var(--space-4) var(--space-4); }
.nc-hist h4 { margin: var(--space-2) 0; font-size: var(--text-md); font-weight: 700; }
.nc-timeline { list-style: none; margin: 0; padding: 0 0 0 var(--space-3); border-left: 2px solid var(--border-soft); }
.nc-timeline li { display: grid; grid-template-columns: 120px minmax(0, 1fr); gap: var(--space-2); padding: 3px 0; font-size: var(--font-meta); position: relative; }
.nc-timeline li::before { content: ''; position: absolute; left: calc(-1 * var(--space-3) - 5px); top: 9px; width: 8px; height: 8px; border-radius: 50%; background: var(--brand-primary); }
.nc-tl-time { color: var(--text-muted); }
.nc-tl-txt { color: var(--text-primary); overflow-wrap: anywhere; }

/* ---- chuông: xem nhanh ---- */
.nc-bell-pop { position: absolute; right: 0; top: calc(100% + 6px); width: 380px; max-width: calc(100vw - 24px); background: var(--bg-surface); border: 1px solid var(--border-soft);
  border-radius: var(--radius-md); box-shadow: var(--shadow-floating); z-index: 60; overflow: hidden; }
.nc-bell-head { display: flex; justify-content: space-between; align-items: center; padding: var(--space-3) var(--space-4); border-bottom: 1px solid var(--border-soft); font-size: var(--text-md); }
.nc-bell-list { max-height: 360px; overflow-y: auto; }
.nc-bell-item { display: grid; grid-template-columns: 34px minmax(0, 1fr) auto; gap: var(--space-2); align-items: center; width: 100%; padding: var(--space-2) var(--space-4);
  border: 0; border-bottom: 1px solid var(--border-soft); background: var(--bg-surface); text-align: left; font: inherit; color: inherit; cursor: pointer; }
.nc-bell-item:hover { background: var(--bg-surface-soft); }
.nc-bell-item .nc-ico { width: 34px; height: 34px; font-size: var(--text-md); }
.nc-bell-empty { padding: var(--space-4); color: var(--text-secondary); font-size: var(--font-body); text-align: center; }
.nc-bell-all { width: 100%; padding: var(--space-3); border: 0; background: var(--bg-surface-soft); color: var(--brand-primary); font: inherit; font-weight: 600; cursor: pointer; }

/* ---- responsive (luôn CUỐI khối) ---- */
@media (max-width: 1180px) {
  .nc-item { grid-template-columns: 40px minmax(0, 1fr) auto; }
  .nc-item-src { display: none; }
  .nc-kv { grid-template-columns: 140px minmax(0, 1fr); }
}
@media (max-width: 900px) {
  .nc-split { grid-template-columns: minmax(0, 1fr); }
  .nc-split .nc-detail { display: none; }
  .nc-split.is-detail .nc-list { display: none; }
  .nc-split.is-detail .nc-detail { display: block; }
  .nc-back { display: inline-block; }
  .nc-items { max-height: none; }
  .nc-cards { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .nc-search { flex: 1 1 100%; min-width: 0; }
}
@media (max-width: 640px) {
  .nc-head { flex-wrap: wrap; }
  .nc-head-side { width: 100%; justify-content: flex-start; }
  .nc-head-txt p { display: none; }
  .nc-card { min-height: 60px; padding: var(--space-2) var(--space-3); }
  .nc-card-ico { width: 32px; height: 32px; flex-basis: 32px; }
  .nc-chips { flex-wrap: nowrap; overflow-x: auto; padding-bottom: 2px; }
  .nc-item { grid-template-columns: 34px minmax(0, 1fr); padding: var(--space-3); }
  .nc-item .nc-ico { width: 34px; height: 34px; }
  .nc-item-side { grid-column: 2; flex-direction: row; align-items: center; justify-content: space-between; }
  .nc-kv { grid-template-columns: minmax(0, 1fr); gap: 0; }
  .nc-detail-title { grid-template-columns: 34px minmax(0, 1fr); }
  .nc-detail-tags { grid-column: 2; }
  .nc-timeline li { grid-template-columns: minmax(0, 1fr); }
  .nc-actions .btn { flex: 1 1 100%; min-height: 40px; }
}

/* ==========================================================================
   WEBAPP-NOTIFICATION-CENTER-V2-COMPLETE-01 · THÔNG BÁO V2 — 3 workspace
   Bổ sung cho khối V1 ngay trên (chỉ bộ chọn MỚI, scope `.nc-*`). Chỉ token sẵn có.
   Khối responsive của V2 nằm CUỐI khối này. Đặt TRƯỚC phụ lục Quảng cáo.
   ========================================================================== */
.nc-ws { display: flex; gap: var(--space-1); border-bottom: 1px solid var(--border-soft); overflow-x: auto; scrollbar-width: thin; }
.nc-ws-tab { display: inline-flex; align-items: center; gap: var(--space-2); padding: var(--space-2) var(--space-4); border: 0; border-bottom: 2px solid transparent;
  background: transparent; color: var(--text-secondary); font: inherit; font-size: var(--text-md); font-weight: 600; cursor: pointer; white-space: nowrap; margin-bottom: -1px; }
.nc-ws-tab:hover { color: var(--text-primary); }
.nc-ws-tab.is-on { color: var(--brand-primary); border-bottom-color: var(--brand-primary); }
.nc-ws-tab:focus-visible { outline: 2px solid var(--border-focus); outline-offset: -2px; }
.nc-ws-n { min-width: 20px; padding: 0 6px; border-radius: 999px; background: var(--status-danger); color: var(--text-inverse); font-size: var(--font-badge); line-height: 18px; text-align: center; }
.nc-card.is-static { cursor: default; }
.nc-tag-ok { background: var(--status-success-soft); color: var(--status-success); }
.nc-count { font-size: var(--font-badge); font-weight: 700; color: var(--text-secondary); background: var(--bg-subtle); border-radius: 999px; padding: 1px 6px; }
.nc-item.is-unread .nc-item-title { font-weight: 700; }
.nc-unread-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: var(--brand-primary); margin-right: 6px; vertical-align: middle; }
.nc-item-role { display: block; font-size: var(--font-meta); }
.nc-list-tools { display: flex; align-items: center; gap: var(--space-3); }
.nc-readall { font-size: var(--font-meta); white-space: nowrap; }
.nc-flash { padding: var(--space-2) var(--space-3); border-radius: var(--radius-sm); background: var(--status-success-soft); color: var(--status-success); font-size: var(--font-body); }
.nc-flash.is-bad { background: var(--status-danger-soft); color: var(--status-danger); }
.nc-seg { display: inline-flex; border: 1px solid var(--border-soft); border-radius: var(--radius-sm); overflow: hidden; flex: 0 0 auto; }
.nc-seg-btn { padding: 6px var(--space-3); border: 0; border-right: 1px solid var(--border-soft); background: var(--bg-surface); color: var(--text-secondary);
  font: inherit; font-size: var(--font-body); font-weight: 600; cursor: pointer; white-space: nowrap; }
.nc-seg-btn:last-child { border-right: 0; }
.nc-seg-btn.is-on { background: var(--brand-primary); color: var(--text-inverse); }
.nc-seg-btn:focus-visible { outline: 2px solid var(--border-focus); outline-offset: -2px; }
.nc-create { flex: 0 0 auto; white-space: nowrap; }
.nc-ann-bar .nc-search, .nc-digest-bar .nc-search { flex: 0 1 220px; min-width: 160px; }
.nc-ann-body { margin: var(--space-3) var(--space-4); padding: var(--space-3); background: var(--bg-surface-soft); border-radius: var(--radius-sm);
  font-size: var(--font-body); line-height: 1.55; color: var(--text-primary); white-space: normal; overflow-wrap: anywhere; }
.nc-ann-stats { display: grid; grid-template-columns: repeat(auto-fit, minmax(110px, 1fr)); gap: var(--space-2); margin: var(--space-3) var(--space-4) var(--space-2); }
.nc-ann-stats > div { display: flex; flex-direction: column; gap: 2px; padding: var(--space-2) var(--space-3); border: 1px solid var(--border-soft); border-radius: var(--radius-sm); font-size: var(--font-meta); }
.nc-ann-stats b { font-size: var(--text-lg); color: var(--text-primary); }
.nc-detail > .nc-note { margin: 0 var(--space-4) var(--space-2); color: var(--text-secondary); }
.nc-ann-recips { margin: 0 var(--space-4) var(--space-3); }
.nc-ann-recips h4, .nc-dg-sec h4, .nc-dg-refs h4 { margin: var(--space-2) 0; font-size: var(--text-md); display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
.nc-recip-list { max-height: 220px; overflow-y: auto; border: 1px solid var(--border-soft); border-radius: var(--radius-sm); }
.nc-recip { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2); padding: 6px var(--space-3); border-bottom: 1px solid var(--border-soft); font-size: var(--font-body); }
.nc-recip:last-child { border-bottom: 0; }
.nc-recip-name { min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nc-ai-gap { font-size: var(--font-meta); color: var(--text-secondary); flex: 1 1 260px; min-width: 0; }
.nc-dg-meta { display: flex; flex-wrap: wrap; gap: var(--space-1) var(--space-4); margin: var(--space-3) var(--space-4) 0; font-size: var(--font-meta); color: var(--text-secondary); }
.nc-dg-sec { margin: var(--space-3) var(--space-4); padding-top: var(--space-2); border-top: 1px solid var(--border-soft); font-size: var(--font-body); }
.nc-dg-sec p { margin: var(--space-2) 0 0; }
.nc-facts { display: grid; grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); gap: var(--space-2); }
.nc-fact { display: flex; flex-direction: column; align-items: flex-start; gap: 2px; padding: var(--space-2) var(--space-3); border: 1px solid var(--border-soft);
  border-radius: var(--radius-sm); background: var(--bg-surface); font: inherit; text-align: left; cursor: pointer; }
.nc-fact:hover:not(:disabled) { border-color: var(--brand-primary); }
.nc-fact:disabled { cursor: help; background: var(--bg-subtle); }
.nc-fact-v { font-size: var(--text-xl); font-weight: 700; color: var(--text-primary); }
.nc-fact-l { font-size: var(--font-meta); color: var(--text-secondary); }
.nc-dg-refs { margin-top: var(--space-2); padding: var(--space-2) var(--space-3); border: 1px dashed var(--border-default); border-radius: var(--radius-sm); max-height: 240px; overflow-y: auto; }
.nc-dg-refs ul, .nc-rules { margin: 0; padding-left: 1.2em; display: flex; flex-direction: column; gap: 4px; }
.nc-dg-ai { background: var(--bg-surface-soft); border-radius: var(--radius-sm); padding: var(--space-2) var(--space-3); }
.nc-compose { width: min(640px, calc(100vw - 32px)); }
.nc-compose textarea { width: 100%; resize: vertical; font: inherit; }
.nc-compose .row[hidden], .nc-compose input[hidden] { display: none; }   /* lớp chung .modal-form .row đè thuộc tính hidden */
.nc-radios { display: flex; flex-wrap: wrap; gap: var(--space-2) var(--space-4); font-size: var(--font-body); }
.nc-radios label, .nc-check { display: inline-flex; align-items: center; gap: 6px; font-weight: 400; }
.nc-people { max-height: 200px; overflow-y: auto; border: 1px solid var(--border-soft); border-radius: var(--radius-sm); margin-top: var(--space-1); }
.nc-person { display: flex; align-items: center; gap: var(--space-2); padding: 6px var(--space-3); border-bottom: 1px solid var(--border-soft); font-size: var(--font-body); font-weight: 400; }
.nc-person[hidden] { display: none; }
.nc-preview { padding: var(--space-2) var(--space-3); border-radius: var(--radius-sm); background: var(--brand-primary-soft); color: var(--text-primary); font-size: var(--font-body); font-weight: 600; }
.nc-preview.is-bad { background: var(--status-danger-soft); color: var(--status-danger); }
.nc-compose .modal-actions { display: flex; justify-content: flex-end; gap: var(--space-2); flex-wrap: wrap; }
.nc-bell-item.is-unread .nc-item-title { font-weight: 700; }

@media (max-width: 900px) {
  .nc-ann-bar, .nc-digest-bar { align-items: stretch; }
  .nc-ann-bar .nc-seg, .nc-digest-bar .nc-seg { overflow-x: auto; max-width: 100%; }
  .nc-ann-bar .nc-search, .nc-digest-bar .nc-search { flex: 1 1 100%; }
  .nc-ai-gap { flex-basis: 100%; }
}
@media (max-width: 640px) {
  .nc-ws-tab { padding: var(--space-2) var(--space-3); }
  .nc-create, .nc-digest-bar .btn { flex: 1 1 100%; min-height: 40px; }
  .nc-seg-btn { padding: 8px var(--space-2); }
  .nc-list-tools { flex-wrap: wrap; justify-content: flex-end; }
  .nc-compose .modal-actions .btn { flex: 1 1 100%; min-height: 40px; }
}

/* ==========================================================================
   WEBAPP-NOTIFICATION-CENTER-V3-COMPACT-VISUAL-POLISH-01 · THÔNG BÁO V3 — VỎ GỌN CHUNG
   Một nhịp cho cả 3 workspace: đầu trang gọn → 3 workspace nổi bật → 1 hàng ô số → 1 hàng điều khiển → danh sách | chi tiết.
   Mọi luật scope dưới `.nc`. Chỉ token; `--nc-title` / `--nc-metric` là token CỤC BỘ (18px / 19px — thang chung nhảy 17 → 20).
   Luật này đứng SAU khối V1/V2 ⇒ khai lại các mốc responsive cần giữ ở CUỐI khối (luật thứ tự CSS).
   ========================================================================== */
.nc { --nc-title: 18px; --nc-metric: 19px; gap: var(--space-2); }
.nc .nc-head { padding: var(--space-2) var(--space-3); gap: var(--space-3); }
.nc .nc-head-ico { width: 32px; height: 32px; flex: 0 0 32px; font-size: var(--text-lg); border-radius: var(--radius-sm); }
.nc .nc-head-txt { display: flex; align-items: baseline; gap: var(--space-3); min-width: 0; }
.nc .nc-head-txt h1 { font-size: var(--nc-title); line-height: 1.3; white-space: nowrap; }
.nc .nc-head-txt p { margin: 0; font-size: var(--font-meta); color: var(--text-muted); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; min-width: 0; }
.nc .nc-head-side { flex-wrap: nowrap; gap: var(--space-2); }
.nc .nc-updated { font-size: var(--font-meta); white-space: nowrap; }
.nc .nc-refresh { width: 30px; height: 30px; }

/* ---- 3 workspace: cấp 2, nổi hơn ô số / bộ lọc ---- */
.nc .nc-ws { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-2); border-bottom: 0; overflow: visible; }
.nc .nc-ws-tab { display: flex; align-items: center; gap: var(--space-2); height: 46px; margin: 0; padding: 0 var(--space-3);
  border: 1px solid var(--border-soft); border-radius: var(--radius-md); background: var(--bg-surface); color: var(--text-primary);
  font-size: var(--text-lg); font-weight: 600; box-shadow: var(--shadow-sm); min-width: 0; }
.nc .nc-ws-ico { width: 30px; height: 30px; flex: 0 0 30px; border-radius: var(--radius-sm); background: var(--bg-subtle); display: grid; place-items: center; font-size: var(--text-md); }
.nc .nc-ws-lbl { flex: 1 1 auto; min-width: 0; text-align: left; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.nc .nc-ws-tab:hover { border-color: var(--brand-primary); color: var(--text-primary); }
.nc .nc-ws-tab.is-on { background: var(--brand-primary-soft); border-color: var(--brand-primary); color: var(--brand-primary); font-weight: 700;
  box-shadow: inset 0 -3px 0 var(--brand-primary); }
.nc .nc-ws-tab.is-on .nc-ws-ico { background: var(--brand-primary); color: var(--text-inverse); }

/* ---- 1 hàng ô số gọn (cấp 3) ---- */
.nc .nc-stats { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-2); }
.nc .nc-stat { display: flex; align-items: center; gap: var(--space-2); height: 40px; min-width: 0; padding: 0 var(--space-3);
  border: 1px solid var(--border-soft); border-radius: var(--radius-sm); background: var(--nc-soft); color: var(--text-primary); font: inherit; text-align: left; }
.nc button.nc-stat { cursor: pointer; }
.nc button.nc-stat:hover { border-color: var(--nc-accent); }
.nc .nc-stat.is-on { border-color: var(--nc-accent); box-shadow: inset 0 0 0 1px var(--nc-accent); }
.nc .nc-stat:focus-visible { outline: 2px solid var(--border-focus); outline-offset: 1px; }
.nc .nc-stat-ico { width: 24px; height: 24px; flex: 0 0 24px; border-radius: 50%; background: var(--bg-surface); color: var(--nc-accent); display: grid; place-items: center; font-weight: 700; font-size: var(--font-meta); }
.nc .nc-stat-lbl { flex: 1 1 auto; min-width: 0; font-size: var(--font-meta); color: var(--text-secondary); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.nc .nc-stat-val { font-size: var(--nc-metric); font-weight: 700; color: var(--nc-accent); line-height: 1; }

/* ---- 1 hàng điều khiển — mọi điều khiển cùng chiều cao --control-h ---- */
.nc .nc-ctl { flex-wrap: nowrap; gap: var(--space-2); padding: var(--space-1) var(--space-2); }
.nc .nc-ctl .nc-chips { flex: 1 1 auto; flex-wrap: nowrap; overflow-x: auto; min-width: 0; scrollbar-width: thin; }
.nc .nc-ctl .nc-chips { gap: 6px; scrollbar-width: none; }
.nc .nc-ctl .nc-chips::-webkit-scrollbar { display: none; }
.nc .nc-ctl .nc-chips.is-overflow { -webkit-mask-image: linear-gradient(to right, black calc(100% - 48px), transparent); mask-image: linear-gradient(to right, black calc(100% - 48px), transparent); }
.nc .nc-ctl .nc-chip { flex: 0 0 auto; display: inline-flex; align-items: center; gap: 6px; height: var(--control-h); padding: 0 10px; white-space: nowrap; font-size: var(--font-meta); }
.nc .nc-ctl .nc-chip .nc-chip-n { padding: 0 6px; border-radius: 999px; background: var(--bg-subtle); color: var(--text-secondary); font-weight: 600; line-height: 18px; opacity: 1; }
.nc .nc-ctl .nc-chip.is-on .nc-chip-n { background: var(--bg-surface); color: var(--brand-primary); }
.nc .nc-ctl .nc-search { flex: 0 1 220px; min-width: 150px; height: var(--control-h); }
.nc .nc-ctl .nc-search input { padding: 0; height: 100%; }
.nc .nc-select { height: var(--control-h); max-width: 190px; padding: 0 var(--space-2); border: 1px solid var(--border-soft); border-radius: var(--radius-sm);
  background: var(--bg-surface); color: var(--text-primary); font: inherit; font-size: var(--font-meta); }
.nc .nc-select:focus { outline: 2px solid var(--border-focus); outline-offset: -1px; }
.nc .nc-sort { display: inline-flex; align-items: center; flex: 0 0 auto; }
.nc .sr-only { position: absolute; width: 1px; height: 1px; padding: 0; margin: -1px; overflow: hidden; clip: rect(0 0 0 0); white-space: nowrap; border: 0; }
.nc .nc-selects { display: flex; gap: var(--space-2); flex: 1 1 auto; min-width: 0; }
.nc .nc-selects .nc-select { flex: 0 1 150px; min-width: 104px; max-width: 170px; }
.nc .nc-ctl .nc-seg-btn { gap: 4px; }
.nc .nc-ann-bar .nc-search { flex: 0 1 190px; min-width: 130px; }
.nc .nc-ctl .nc-seg { height: var(--control-h); }
.nc .nc-ctl .nc-seg-btn { display: inline-flex; align-items: center; height: 100%; padding: 0 var(--space-3); font-size: var(--font-meta); }
.nc .nc-ctl .nc-create { flex: 0 0 auto; display: inline-flex; align-items: center; height: var(--control-h); padding: 0 var(--space-3); white-space: nowrap; }
.nc .nc-ai-badge { display: inline-flex; align-items: center; gap: 6px; height: 28px; margin-left: auto; padding: 0 var(--space-3); border-radius: 999px;
  background: var(--status-warning-soft); color: var(--text-secondary); font-size: var(--font-meta); white-space: nowrap; cursor: help; }
.nc .nc-ai-badge b { color: var(--status-warning); }

/* ---- danh sách | chi tiết chiếm phần lớn diện tích ---- */
.nc .nc-split { grid-template-columns: minmax(0, 58fr) minmax(0, 42fr); gap: var(--space-2); }
.nc .nc-list-head, .nc .nc-detail-head { padding: var(--space-2) var(--space-3); min-height: 44px; }
.nc .nc-items { max-height: calc(100vh - 300px); min-height: 0; }
.nc .nc-empty { flex-direction: row; justify-content: center; gap: var(--space-2); padding: var(--space-4) var(--space-3); color: var(--text-muted); font-size: var(--font-body); }
.nc .nc-empty span { font-size: var(--text-lg); }
.nc .nc-tech { margin-top: var(--space-2); }
.nc .nc-tech summary { cursor: pointer; font-size: var(--font-meta); color: var(--text-muted); }
.nc .nc-tech p { font-size: var(--font-meta); color: var(--text-muted); overflow-wrap: anywhere; }

@media (max-width: 1180px) {
  .nc .nc-head-txt p { display: none; }
  .nc .nc-ctl { flex-wrap: wrap; }
  .nc .nc-ctl .nc-chips { flex: 1 1 100%; }
  .nc .nc-ctl .nc-search { flex: 1 1 200px; }
  .nc .nc-ann-bar { flex-wrap: wrap; }
  .nc .nc-ann-bar .nc-selects { order: 5; flex: 1 1 100%; }
}
@media (max-width: 900px) {
  .nc .nc-split { grid-template-columns: minmax(0, 1fr); }
  .nc .nc-ws { display: flex; overflow-x: auto; scrollbar-width: none; }
  .nc .nc-ws-tab { flex: 0 0 auto; }
  .nc .nc-stats { display: flex; overflow-x: auto; scrollbar-width: none; }
  .nc .nc-ws::-webkit-scrollbar, .nc .nc-stats::-webkit-scrollbar, .nc .nc-selects::-webkit-scrollbar { display: none; }
  .nc .nc-selects { scrollbar-width: none; }
  .nc .nc-stat { flex: 0 0 auto; min-width: 158px; }
  .nc .nc-ctl { flex-wrap: wrap; }
  .nc .nc-ctl .nc-chips { flex: 1 1 100%; }
  .nc .nc-ctl .nc-search { flex: 1 1 160px; }
  .nc .nc-selects { overflow-x: auto; }
  .nc .nc-select { flex: 0 0 auto; }
}
@media (max-width: 640px) {
  .nc .nc-head { flex-wrap: nowrap; }
  .nc .nc-head-side { width: auto; }
  .nc .nc-updated { display: none; }
  .nc .nc-head-txt h1 { font-size: var(--text-lg); overflow: hidden; text-overflow: ellipsis; }
  .nc .nc-head-side .tag { white-space: nowrap; }
  .nc .nc-head-ico { display: none; }
  .nc .nc-list-head { flex-wrap: wrap; row-gap: 2px; }
  .nc .nc-list-head h2 { white-space: nowrap; font-size: var(--text-md); }
  .nc .nc-list-tools { margin-left: auto; }
  .nc .nc-ws-tab { height: 40px; font-size: var(--text-md); }
  .nc .nc-ws-ico { width: 26px; height: 26px; flex-basis: 26px; }
  .nc .nc-ai-badge { margin-left: 0; }
  .nc .nc-digest-bar { flex-wrap: wrap; }
  .nc .nc-digest-bar .nc-seg { flex: 1 1 100%; overflow-x: auto; }
}

/* ==========================================================================
   WEBAPP-NOTIFICATION-CENTER-V4-HORIZONTAL-COMPACT-CONTROLS-01 · THÔNG BÁO V4 — ĐIỀU KHIỂN GỌN NGANG
   Điều khiển / workspace / ô số / bộ lọc: RỘNG THEO NỘI DUNG, gom TRÁI, khoảng cách ngắn (flex 0 0 auto — không flex:1,
   không lưới 1fr). Chỉ danh sách | chi tiết mới được chiếm cả chiều ngang. Scope dưới `.nc`; chỉ token.
   Đứng SAU khối V3 ⇒ khai lại các mốc responsive cần đổi ở CUỐI khối này.
   ========================================================================== */
.nc .nc-ws { display: flex; flex-wrap: nowrap; justify-content: flex-start; gap: 6px; }
.nc .nc-ws-tab { flex: 0 0 auto; width: max-content; min-width: 150px; max-width: 280px; height: 40px; padding: 0 var(--space-3) 0 var(--space-2); }
.nc .nc-ws-lbl { flex: 0 0 auto; font-size: var(--nc-ws-font); }
.nc .nc-ws-n { flex: 0 0 auto; margin-left: 0; }
.nc { --nc-ws-font: 14px; }
.nc .nc-ws-tab { gap: 6px; }
.nc .nc-ws-ico { width: 26px; height: 26px; flex-basis: 26px; }

.nc .nc-stats { display: flex; flex-wrap: nowrap; justify-content: flex-start; gap: 6px; }
.nc .nc-stat { flex: 0 0 auto; width: max-content; min-width: 120px; max-width: 230px; gap: var(--space-2); }
.nc .nc-stat-lbl { flex: 0 1 auto; }
.nc .nc-stat-val { margin-left: var(--space-1); }

.nc .nc-ctl { justify-content: flex-start; gap: 6px; }
.nc .nc-ctl .nc-chips { flex: 0 1 auto; }
.nc .nc-ctl .nc-search { flex: 0 1 200px; min-width: 150px; }
.nc .nc-ctl .nc-seg { flex: 0 0 auto; }
.nc .nc-selects { flex: 0 1 auto; gap: 6px; }
.nc .nc-selects .nc-select { flex: 0 0 auto; width: auto; min-width: 0; max-width: 170px; }
.nc .nc-ann-bar .nc-search { flex: 0 1 170px; min-width: 130px; }
.nc .nc-ann-bar .nc-seg-btn { padding: 0 var(--space-2); }
.nc .nc-ctl .nc-create { margin-left: 0; }
.nc .nc-ai-badge { margin-left: 0; }

@media (max-width: 1180px) {
  .nc .nc-ctl .nc-chips { flex: 0 1 100%; }
  .nc .nc-ctl .nc-search { flex: 0 1 220px; }
  .nc .nc-ann-bar .nc-selects { flex: 0 1 auto; order: 0; }
}
@media (max-width: 900px) {
  .nc .nc-ws { overflow-x: auto; }
  .nc .nc-stats { overflow-x: auto; }
  .nc .nc-stat { min-width: 120px; }
  .nc .nc-ctl .nc-search { flex: 0 1 220px; }
  .nc .nc-selects { flex: 0 1 100%; overflow-x: auto; }
}
@media (max-width: 640px) {
  .nc .nc-ws-tab { min-width: 0; height: 38px; }
  .nc .nc-ctl .nc-search { flex: 1 1 160px; }
  .nc .nc-ctl .nc-create, .nc .nc-digest-bar .nc-create { flex: 0 0 auto; }
  /* điện thoại: hộp thư → bộ lọc (cuộn ngang) → [tìm + Tạo thông báo] cùng một hàng — tránh 4 tầng */
  .nc .nc-ann-bar .nc-seg { order: 0; }
  .nc .nc-ann-bar .nc-selects { order: 1; }
  .nc .nc-ann-bar .nc-search { order: 2; flex: 1 1 140px; }
  .nc .nc-ann-bar .nc-create { order: 3; }
}

/* ==========================================================================
   WEBAPP-P0-02-LIVE-DEMO-BOUNDARY-V1-01 · RANH GIỚI THẬT / THỬ
   Hai khối dùng chung cho MỌI module có dữ liệu mẫu:
     .demo-banner     — băng "DỮ LIỆU MẪU · THỬ" (chỉ hiện ở phạm vi THỬ)
     .nodata-panel    — trạng thái "chưa có nguồn dữ liệu THẬT" (phạm vi THẬT)
   Đặt TRƯỚC phụ lục Quảng cáo vì bộ kiểm module 09 cắt CSS "từ mốc Quảng cáo
   tới hết tệp" — thêm ở cuối tệp sẽ rơi vào lát của họ (bài học đã ghi ở §79).
   ========================================================================== */
.demo-banner { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap;
  margin: 0 0 var(--space-3); padding: var(--space-2) var(--space-3);
  border: 1px solid var(--status-warning); border-left-width: 4px; border-radius: var(--radius-md);
  background: var(--status-warning-soft); color: var(--text-primary); font-size: var(--text-sm); }
.demo-banner b { font-weight: 600; }
.demo-banner .demo-banner-tag { flex: 0 0 auto; padding: 1px var(--space-2); border-radius: var(--radius-sm);
  background: var(--status-warning); color: #fff; font-size: var(--text-sm); font-weight: 600; letter-spacing: .02em; }
.nodata-panel { max-width: 780px; margin: var(--space-6) auto; padding: var(--space-6);
  border: 1px solid var(--border-default); border-radius: var(--radius-lg); background: var(--bg-surface); }
.nodata-panel h2 { margin: 0 0 var(--space-2); font-size: var(--text-lg); }
.nodata-panel p { margin: 0 0 var(--space-3); color: var(--text-secondary); font-size: var(--text-sm); line-height: 1.55; }
.nodata-panel ul { margin: 0 0 var(--space-4); padding-left: var(--space-5); color: var(--text-secondary); font-size: var(--text-sm); }
.nodata-panel li { margin-bottom: var(--space-1); }
.nodata-panel .nodata-actions { display: flex; gap: var(--space-2); flex-wrap: wrap; }

/* ==========================================================================
   WEBAPP-AI-ADS-ADMIN-V1-01 · 09 — AI QUẢNG CÁO
   Mọi luật dưới đây SCOPE trong `.ads-*` (hoặc cấp ba của thanh bên) — không
   luật nào chạm component dùng chung. KHÔNG token màu/chữ riêng: chỉ dùng token
   canonical ở :root. Nhận diện nhà cung cấp bằng KÝ HIỆU CHỮ + một màu viền,
   KHÔNG nhúng logo thương hiệu bên thứ ba.
   ========================================================================== */

/* --- 0 · THANH BÊN: C02 (20/09/2026) đã GỠ cấp thứ ba.
     Thanh bên chỉ còn MỘT dòng "AI Quảng cáo" (một .nav-child bình thường); bốn màn
     hình điều hướng bằng tab BÊN TRONG module. Các lớp .nav-subparent/.nav-caret/
     .nav-grandchildren/.nav-grandchild đã xoá vì không còn phần tử nào dùng.
     ⛔ Đừng dựng lại ở đây: thanh bên là VỎ ỨNG DỤNG, không phải phụ lục của module. --- */

/* --- 1 · VỎ MODULE: đầu trang + vỏ DÍNH (dùng đúng công thức offset chung) --- */
.ads-page-header { display: flex; align-items: center; gap: var(--space-4); flex-wrap: wrap; }
.ads-page-header .page-header-left { flex: 1 1 260px; min-width: 0; }
.ads-page-icon { background: var(--status-ai-soft); color: var(--status-ai); }
.ads-header-actions { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }

.ads-shell-sentinel { height: 1px; margin-bottom: -1px; }
.ads-shell {
  position: sticky; top: var(--sticky-module-top); z-index: var(--sticky-z-module);
  background: var(--bg-app); padding: var(--space-2) 0 var(--space-3);
  display: flex; flex-direction: column; gap: var(--space-2);
  box-shadow: var(--sticky-edge);
}
.ads-nav-row { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; }
.ads-crumbs { color: var(--text-secondary); font-size: var(--font-meta); }
.ads-tabs { display: flex; align-items: center; gap: var(--space-5); margin: 0; flex-wrap: wrap;
  border-bottom: 1px solid var(--border-soft); }
.ads-tabs .tab { flex: none; white-space: nowrap; display: inline-flex; align-items: center; gap: 6px; }

/* --- 2 · THANH CÔNG CỤ: chọn tài khoản · trạng thái đồng bộ COMPACT · hành động --- */
.ads-toolbar { display: flex; align-items: flex-end; justify-content: space-between; gap: var(--space-3); flex-wrap: wrap; }
.ads-toolbar-left, .ads-toolbar-right { display: flex; align-items: flex-end; gap: var(--space-2); flex-wrap: wrap; }
.ads-field { display: flex; flex-direction: column; gap: 2px; }
.ads-field > span { font-size: var(--font-meta); color: var(--text-secondary); font-weight: var(--weight-semibold); }
.ads-field select {
  height: var(--control-h); padding: 0 var(--control-pad-x); border-radius: var(--control-radius);
  border: 1px solid var(--border-strong); background: var(--bg-surface); color: var(--text-primary);
  font-size: var(--font-body); min-width: 150px;
}
.ads-field-acc select { min-width: 230px; }
/* Trạng thái tài khoản: MỘT DÒNG. FORM §6/§14 cấm thẻ trạng thái lớn chiếm diện tích. */
.ads-sync {
  height: var(--control-h); display: inline-flex; align-items: center; gap: 8px;
  padding: 0 var(--space-3); border-radius: 999px; cursor: pointer;
  border: 1px solid var(--border-strong); background: var(--bg-surface);
  font-size: var(--font-meta); color: var(--text-secondary); font-weight: var(--weight-semibold);
}
.ads-sync:hover { background: var(--bg-surface-soft); color: var(--text-primary); }
.ads-dot { width: 8px; height: 8px; border-radius: 999px; flex: none; }
.ads-dot-ok   { background: var(--status-success); }
.ads-dot-warn { background: var(--status-warning); }
.ads-dot-bad  { background: var(--status-danger); }
.ads-dot-off  { background: var(--text-disabled); }

/* --- 3 · KÝ HIỆU NHÀ CUNG CẤP (chữ, không phải logo) --- */
.ads-mark {
  width: 20px; height: 20px; border-radius: 6px; display: inline-grid; place-items: center;
  font-size: var(--text-sm); font-weight: var(--weight-bold); line-height: 1; flex: none;
  border: 1px solid var(--border-strong); background: var(--bg-subtle); color: var(--text-secondary);
}
.ads-mark-lg { width: 32px; height: 32px; border-radius: 9px; font-size: var(--text-xl); }
.ads-mark.apv-fb { background: var(--brand-primary-soft); color: var(--brand-primary-hover); border-color: var(--border-focus); }
.ads-mark.apv-tt { background: var(--bg-subtle); color: var(--text-primary); border-color: var(--border-strong); }
.ads-mark.apv-gg { background: var(--status-warning-soft); color: var(--status-warning); border-color: var(--status-warning); }

/* --- 4 · TỔNG QUAN: thẻ nền tảng --- */
.ads-panel { display: flex; flex-direction: column; gap: var(--section-gap); padding-top: var(--space-3); }
.ads-sec { gap: var(--space-3); }
.ads-sec-note { font-size: var(--font-meta); color: var(--text-muted); font-weight: var(--weight-medium); }
.ads-demo-badge { white-space: nowrap; cursor: help; }
.ads-gap { margin: 0; }
.ads-note { margin: 0; font-size: var(--font-help); color: var(--text-muted); line-height: var(--line-normal); }
.ads-h4 { margin: var(--space-4) 0 var(--space-2); font-size: var(--font-card-title); color: var(--text-primary); }
.ads-muted { color: var(--text-disabled); }
.ads-ul { margin: var(--space-2) 0; padding-left: 20px; color: var(--text-secondary); font-size: var(--font-body); }
.ads-ul li { margin-bottom: 4px; }

.ads-pcards { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-3); }
.ads-pcard {
  text-align: left; cursor: pointer; display: flex; flex-direction: column; gap: var(--space-3);
  background: var(--bg-surface); border: 1px solid var(--border-soft); border-radius: var(--radius-lg);
  padding: var(--card-pad); box-shadow: var(--shadow-sm); transition: box-shadow .15s, border-color .15s;
}
.ads-pcard:hover { box-shadow: var(--shadow-md); border-color: var(--border-strong); }
.ads-pcard-head { display: flex; align-items: center; gap: var(--space-2); }
.ads-pcard-title { flex: 1; min-width: 0; display: flex; flex-direction: column; }
.ads-pcard-title b { font-size: var(--font-card-title); color: var(--text-primary); }
.ads-pcard-sub { font-size: var(--font-meta); color: var(--text-muted); }
.ads-pcard-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-2) var(--space-3); }
.ads-pcard-grid > div { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.ads-pcard-lbl { font-size: var(--font-meta); color: var(--text-secondary); }
.ads-pcard-grid b { font-size: var(--font-card-title); color: var(--text-primary); font-weight: var(--weight-bold); }
.ads-pcard-foot { display: flex; align-items: center; justify-content: space-between; gap: var(--space-2);
  font-size: var(--font-meta); color: var(--text-muted); border-top: 1px solid var(--border-soft); padding-top: var(--space-2); }

.ads-delta { font-size: var(--font-meta); font-weight: var(--weight-semibold); }
.ads-delta-up   { color: var(--status-success); }
.ads-delta-down { color: var(--status-danger); }
.ads-delta-flat { color: var(--text-muted); }

.ads-spark { display: inline-flex; align-items: flex-end; gap: 2px; height: 26px; }
.ads-spark i { width: 4px; background: var(--brand-primary-soft); border-top: 2px solid var(--brand-primary); border-radius: 2px 2px 0 0; }

.ads-kpi-row { grid-template-columns: repeat(5, minmax(0, 1fr)); }
.ads-data-actions { display: flex; gap: var(--space-2); flex-wrap: wrap; }

/* --- 5 · MÀN NHÀ CUNG CẤP: hàng KPI COMPACT (không phải dashboard phân tích) --- */
.ads-kpi-compact {
  display: flex; align-items: stretch; gap: var(--space-2); flex-wrap: wrap;
  background: var(--bg-surface); border: 1px solid var(--border-soft); border-radius: var(--radius-lg);
  padding: var(--space-3) var(--card-pad); box-shadow: var(--shadow-sm);
}
.ads-kpi-c { display: flex; flex-direction: column; gap: 1px; min-width: 130px; flex: 1 1 130px;
  padding-right: var(--space-3); border-right: 1px solid var(--border-soft); }
.ads-kpi-c:last-of-type { border-right: 0; }
.ads-kpi-c-lbl { font-size: var(--font-meta); color: var(--text-secondary); font-weight: var(--weight-semibold); }
.ads-kpi-c-val { font-size: var(--text-xl); font-weight: var(--weight-bold); color: var(--text-primary); line-height: var(--line-tight); }
.ads-kpi-c-d { min-height: 14px; }
.ads-kpi-c-badge { display: flex; align-items: center; margin-left: auto; }

/* --- 6 · PHÂN TÍCH & BÁO CÁO: THU GỌN MẶC ĐỊNH (FORM §8) --- */
.ads-analytics { padding: var(--space-3) var(--card-pad); }
.ads-analytics-sum { cursor: pointer; display: flex; align-items: center; justify-content: space-between;
  gap: var(--space-3); flex-wrap: wrap; list-style: none; }
.ads-analytics-sum::-webkit-details-marker { display: none; }
.ads-analytics-sum::after { content: '▸ Mở rộng'; font-size: var(--font-meta); color: var(--text-link); font-weight: var(--weight-semibold); }
.ads-analytics[open] .ads-analytics-sum::after { content: '▾ Thu gọn'; }
.ads-analytics-body { padding-top: var(--space-4); display: flex; flex-direction: column; gap: var(--space-3); }
.ads-an-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-4); }
.ads-an-grid > .ads-an-box:last-child { grid-column: 1 / -1; }
.ads-an-box { border: 1px solid var(--border-soft); border-radius: var(--radius-md); padding: var(--card-pad-sm);
  display: flex; flex-direction: column; gap: var(--space-2); min-width: 0; }
.ads-an-title { font-size: var(--font-meta); font-weight: var(--weight-bold); color: var(--text-secondary);
  text-transform: uppercase; letter-spacing: .4px; }
.ads-bars { display: flex; align-items: flex-end; gap: 3px; height: 110px; }
.ads-bar { flex: 1; display: flex; align-items: flex-end; height: 100%; }
.ads-bar i { width: 100%; background: var(--brand-primary-soft); border-top: 2px solid var(--brand-primary); border-radius: 3px 3px 0 0; }
.ads-alloc { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: 6px; }
.ads-alloc li { display: grid; grid-template-columns: minmax(0, 1fr) 120px 40px; gap: var(--space-2); align-items: center;
  font-size: var(--font-body); color: var(--text-secondary); }
.ads-alloc-name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ads-alloc-bar { background: var(--bg-subtle); border-radius: 999px; height: 8px; overflow: hidden; }
.ads-alloc-bar i { display: block; height: 100%; background: var(--brand-primary); }
.ads-alloc-val { text-align: right; font-variant-numeric: tabular-nums; }

/* --- 7 · VÙNG LÀM VIỆC: cây chiến dịch (chính) + AI bên phải --- */
.ads-work { display: grid; grid-template-columns: minmax(0, 1fr) 320px; gap: var(--space-4); align-items: start; }
.ads-tree-panel { min-width: 0; }
.ads-side { position: sticky; top: calc(var(--sticky-module-top) + 130px); display: flex; flex-direction: column; gap: var(--space-3); }
.ads-actionbar { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
.ads-actionbar-sp { flex: 1 1 auto; }
.ads-tree-legend { border-left: 3px solid var(--border-soft); padding-left: var(--space-2); }
.ads-ext-btn { opacity: .72; }
.ads-ext-lock { margin-left: 5px; font-size: var(--text-xs); }

/* --- 8 · BẢNG CÂY: Chiến dịch › Nhóm › Quảng cáo --- */
.ads-table { min-width: 1080px; }
.ads-table td { vertical-align: top; }
.ads-cell-sub { font-size: var(--font-meta); color: var(--text-muted); margin-top: 2px; }
.ads-link { text-align: left; }
.ads-row-ops { display: flex; gap: 4px; flex-wrap: wrap; }
.ads-ai-cell { max-width: 260px; font-size: var(--font-meta); color: var(--text-secondary); }
.ads-budget { font-variant-numeric: tabular-nums; }
.ads-budget-per { font-size: var(--text-xs); color: var(--text-muted); margin-left: 3px; }
.ads-ctr { font-size: var(--font-meta); color: var(--text-secondary); }

.ads-tree .ads-c-check { width: 34px; }
.ads-tree .ads-c-name { min-width: 300px; }
.ads-c-name { display: flex; align-items: flex-start; gap: 6px; }
.ads-name { display: flex; flex-direction: column; min-width: 0; }
.ads-twist {
  border: 1px solid var(--border-soft); background: var(--bg-surface); color: var(--text-secondary);
  width: 20px; height: 20px; border-radius: 5px; cursor: pointer; line-height: 1; flex: none;
  display: grid; place-items: center; font-size: var(--text-xs); margin-top: 1px;
}
.ads-twist:hover { border-color: var(--brand-primary); color: var(--brand-primary); }
.ads-twist-sp { width: 20px; flex: none; }
.ads-ent { font-size: var(--font-body); line-height: 20px; flex: none; }
.ads-thumb { width: 26px; height: 20px; border-radius: 4px; display: grid; place-items: center; flex: none;
  background: var(--bg-subtle); border: 1px solid var(--border-soft); font-size: var(--text-xs); }
/* Đường nối phân cấp: thụt vào + một nét dọc, để nhìn ra cấp mà không cần đọc chữ. */
.ads-lv1 { padding-left: 18px; position: relative; }
.ads-lv2 { padding-left: 38px; position: relative; }
.ads-tline { position: absolute; left: 8px; top: -8px; bottom: -8px; width: 1px; background: var(--border-strong); }
.ads-lv2 .ads-tline { left: 28px; }
.ads-r-camp > td { background: var(--bg-surface); }
.ads-r-camp.is-open > td { background: var(--brand-primary-soft); }
.ads-r-group > td { background: var(--bg-surface-soft); }
.ads-r-ad > td { background: var(--bg-surface); }
.ads-r-ad .ads-name { color: var(--text-secondary); }
.ads-draft-tag { margin-left: 6px; }

/* --- 9 · KHỐI AI --- */
.ads-ai-panel .ads-ai-ctx { margin: 0; font-size: var(--font-meta); color: var(--text-muted); }
.ads-ai-list { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--space-2); }
.ads-ai-item { display: flex; gap: var(--space-2); padding: var(--space-2) var(--space-3);
  border: 1px solid var(--border-soft); border-left-width: 3px; border-radius: var(--radius-md); background: var(--bg-surface-soft); }
.ads-ai-icon { flex: none; line-height: var(--line-normal); }
.ads-ai-body { min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.ads-ai-body b { font-size: var(--font-body); color: var(--text-primary); }
.ads-ai-body p { margin: 0; font-size: var(--font-meta); color: var(--text-secondary); line-height: var(--line-normal); }
.ads-ai-action { font-size: var(--font-meta); color: var(--text-link); font-weight: var(--weight-semibold); }
.ads-ai-good { border-left-color: var(--status-success); }
.ads-ai-warn { border-left-color: var(--status-warning); }
.ads-ai-bad  { border-left-color: var(--status-danger); }
.ads-ai-info { border-left-color: var(--status-info); }
.ads-ai-gap  { border-left-color: var(--border-strong); }
.ads-ai-compact .ads-ai-body p { font-size: var(--text-sm); }

/* --- 10 · HỘP THOẠI (thêm tài khoản · cấu hình · xuất · kiểm tra) --- */
.ads-modal { max-width: 720px; width: 100%; }
.ads-modal-wide { max-width: 1040px; }
.ads-modal-body { display: flex; flex-direction: column; gap: var(--space-3); max-height: 66vh; overflow: auto; }
.ads-modal-actions { display: flex; gap: var(--space-2); flex-wrap: wrap; justify-content: flex-end; }
.ads-steps { display: flex; gap: var(--space-2); flex-wrap: wrap; }
.ads-step { font-size: var(--font-meta); padding: 4px 10px; border-radius: 999px;
  background: var(--bg-subtle); color: var(--text-muted); white-space: nowrap; }
.ads-step.is-now  { background: var(--brand-primary); color: var(--text-inverse); font-weight: var(--weight-semibold); }
.ads-step.is-done { background: var(--status-success-soft); color: var(--status-success); }
.ads-field-b { display: flex; flex-direction: column; gap: 4px; }
.ads-field-b > span { font-size: var(--font-label); font-weight: var(--weight-semibold); color: var(--text-primary); }
.ads-field-b input, .ads-field-b select {
  height: var(--control-h); padding: 0 var(--control-pad-x); border-radius: var(--control-radius);
  border: 1px solid var(--border-strong); background: var(--bg-surface); color: var(--text-primary); font-size: var(--font-body);
}
.ads-req { color: var(--status-danger); }
.ads-checks { display: flex; flex-direction: column; gap: 6px; font-size: var(--font-body); color: var(--text-secondary); }
.ads-fake-connect { padding: var(--space-3) 0; }
.ads-cfg-tabs { flex-wrap: wrap; }
.ads-cfg-add { display: flex; gap: var(--space-2); flex-wrap: wrap; margin-top: var(--space-3); }
.ads-check-sum { display: flex; gap: var(--space-2); flex-wrap: wrap; }
.ads-fmt { display: flex; flex-direction: column; gap: var(--space-2); }
.ads-fmt-opt { display: grid; grid-template-columns: 20px auto 1fr; gap: 6px var(--space-2); align-items: center;
  border: 1px solid var(--border-soft); border-radius: var(--radius-md); padding: var(--space-2) var(--space-3); cursor: pointer; }
.ads-fmt-opt .ads-note { grid-column: 2 / -1; }
.ads-fmt-opt.is-off { opacity: .7; cursor: not-allowed; background: var(--bg-surface-soft); }
.ads-ent-head { display: flex; gap: var(--space-2); flex-wrap: wrap; }
.ads-ent-grid { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-3); }
.ads-ent-grid > div { display: flex; flex-direction: column; border: 1px solid var(--border-soft);
  border-radius: var(--radius-md); padding: var(--space-2) var(--space-3); }
.ads-ent-grid span { font-size: var(--font-meta); color: var(--text-secondary); }
.ads-ent-grid b { font-size: var(--font-card-title); color: var(--text-primary); }

/* ==========================================================================
   WEBAPP-AI-ADS-ADMIN-V1-01 · CONTINUATION 01 — GỌN CHIỀU CAO
   Mục tiêu: giảm chiều cao vùng đầu và các dải tổng hợp, KHÔNG làm chật chữ.
   Vẫn chỉ dùng token canonical ở :root; vẫn scope trong `.ads-*`.
   ========================================================================== */

/* --- 1 · ĐẦU MODULE: MỘT HÀNG THẤP (thay khối .page-header cao) --- */
.ads-head {
  display: flex; align-items: baseline; gap: var(--space-2); flex-wrap: wrap;
  padding: var(--space-2) 0 var(--space-1);
}
.ads-head-icon { font-size: var(--text-xl); line-height: 1; align-self: center; }
.ads-head-title {
  margin: 0; font-size: var(--font-section-title); font-weight: var(--weight-bold);
  color: var(--text-primary); line-height: var(--line-tight);
}
.ads-head-sub {
  font-size: var(--font-meta); color: var(--text-muted); min-width: 0;
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.ads-head-spacer { flex: 1 1 auto; }
.ads-head .ads-demo-badge, .ads-head .ads-assistant-btn { align-self: center; }
.ads-head .ads-assistant-btn { padding: 4px 10px; font-size: var(--font-meta); }

/* --- 2 · VỎ DÍNH + TAB + THANH CÔNG CỤ: thấp hơn --- */
.ads-shell { padding: 4px 0 6px; gap: 4px; }
.ads-tabs { gap: var(--space-4); }
.ads-tabs .tab { padding: 6px 2px; }
.ads-crumbs { font-size: var(--font-meta); }
.ads-nav-row { gap: var(--space-2); }
.ads-toolbar { align-items: center; gap: var(--space-2); }
/* Nhãn NẰM CÙNG HÀNG với ô chọn — không chiếm một hàng riêng (FORM §2C). */
.ads-field-inline { flex-direction: row; align-items: center; gap: 6px; }
.ads-field-inline > span { white-space: nowrap; }
.ads-toolbar .ads-field select, .ads-toolbar .ads-sync { height: var(--control-h-sm); }
.ads-toolbar .btn-sm { height: var(--control-h-sm); display: inline-flex; align-items: center; }

/* --- 3 · GHI CHÚ V1: một dòng, mở ra khi cần --- */
.ads-v1note {
  background: var(--status-info-soft); border: 1px solid var(--border-soft);
  border-left: 3px solid var(--status-info); border-radius: var(--radius-md);
  padding: 6px var(--space-3); font-size: var(--font-meta); color: var(--text-secondary);
}
.ads-v1note > summary {
  cursor: pointer; list-style: none; display: flex; align-items: center;
  gap: 6px; flex-wrap: wrap; line-height: var(--line-normal);
}
.ads-v1note > summary::-webkit-details-marker { display: none; }
.ads-v1note-more { color: var(--text-link); font-weight: var(--weight-semibold); margin-left: auto; white-space: nowrap; }
.ads-v1note[open] .ads-v1note-more { visibility: hidden; }
.ads-v1note-body { padding-top: var(--space-2); line-height: var(--line-normal); }

/* --- 4 · ĐẦU KHỐI dùng chung cho mọi section --- */
.ads-sec { padding: var(--space-3) var(--card-pad); gap: var(--space-2); }
.ads-sec-head { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
.ads-sec-title { font-weight: var(--weight-bold); font-size: var(--font-card-title); color: var(--text-primary); }
.ads-sec-head .ads-sec-note { margin-right: auto; }

/* --- 5 · THẺ NỀN TẢNG: thấp hơn, 4 ô số một hàng --- */
.ads-pcard { padding: var(--space-3); gap: var(--space-2); }
.ads-pcard-head { gap: 6px; flex-wrap: wrap; }
.ads-pcard-head > b { font-size: var(--font-body); color: var(--text-primary); }
.ads-pcard-head .ads-pcard-sub { margin-right: auto; }
.ads-pcard-grid { grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-2); }
.ads-pcard-grid b { font-size: var(--font-body); }
.ads-pcard-trend { align-items: flex-start; gap: 2px; }
.ads-pcard .ads-spark { height: 16px; }
.ads-pcard .ads-spark i { width: 3px; }

/* --- 6 · DẢI KPI TOÀN NỀN TẢNG: dải thấp, không phải thẻ dashboard --- */
.ads-kpi-total { margin-top: var(--space-1); padding: var(--space-2) var(--space-3); box-shadow: none;
  border-color: var(--border-soft); background: var(--bg-surface-soft); }
.ads-kpi-total .ads-kpi-c-val { font-size: var(--font-card-title); }

/* --- 7 · CHIP LỌC (ưu tiên chiến dịch · mức nhận xét AI) --- */
.ads-chips { display: flex; gap: 6px; flex-wrap: wrap; }
.ads-chip {
  display: inline-flex; align-items: center; gap: 5px; cursor: pointer;
  height: var(--control-h-sm); padding: 0 10px; border-radius: 999px;
  border: 1px solid var(--border-strong); background: var(--bg-surface);
  color: var(--text-secondary); font-size: var(--font-meta); font-weight: var(--weight-semibold);
}
.ads-chip:hover { background: var(--bg-surface-soft); color: var(--text-primary); }
.ads-chip.is-on { background: var(--brand-primary); border-color: var(--brand-primary); color: var(--text-inverse); }
.ads-chip b { font-variant-numeric: tabular-nums; opacity: .85; }

/* --- 8 · BỘ LỌC: một hàng trên máy tính, thu gọn ở màn hẹp --- */
.ads-filters { border: 1px solid var(--border-soft); border-radius: var(--radius-md); padding: 6px var(--space-3); }
.ads-filters > summary {
  cursor: pointer; list-style: none; font-size: var(--font-meta);
  font-weight: var(--weight-semibold); color: var(--text-secondary);
}
.ads-filters > summary::-webkit-details-marker { display: none; }
.ads-filters > summary::after { content: ' ▾'; }
.ads-filters[open] > summary::after { content: ' ▴'; }
.ads-filters-on { color: var(--brand-primary); }
.ads-lf-row { display: flex; align-items: flex-end; gap: var(--space-2); flex-wrap: wrap; padding-top: var(--space-2); }
.ads-lf-row .ads-field { flex: 1 1 150px; }
.ads-lf-row .ads-field select, .ads-lf-row .ads-field input {
  height: var(--control-h-sm); width: 100%; min-width: 0;
  padding: 0 var(--control-pad-x); border-radius: var(--control-radius);
  border: 1px solid var(--border-strong); background: var(--bg-surface);
  color: var(--text-primary); font-size: var(--font-body);
}
.ads-lf-clear { align-self: flex-end; }

/* --- 9 · PHÂN TRANG --- */
.ads-pager { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; padding-top: var(--space-1); }
.ads-pager-info { font-size: var(--font-meta); color: var(--text-muted); }
.ads-pager-nav { display: flex; align-items: center; gap: 3px; margin-left: auto; flex-wrap: wrap; }
.ads-page {
  min-width: 26px; height: 26px; padding: 0 7px; cursor: pointer;
  border: 1px solid var(--border-soft); background: var(--bg-surface);
  border-radius: var(--radius-sm); color: var(--text-secondary);
  font-size: var(--font-meta); font-weight: var(--weight-semibold);
}
.ads-page:hover:not(:disabled) { border-color: var(--brand-primary); color: var(--brand-primary); }
.ads-page.is-now { background: var(--brand-primary); border-color: var(--brand-primary); color: var(--text-inverse); }
.ads-page:disabled { opacity: .45; cursor: default; }
.ads-page-gap { color: var(--text-disabled); padding: 0 2px; }
.ads-perpage { display: inline-flex; align-items: center; gap: 6px; font-size: var(--font-meta); color: var(--text-muted); }
.ads-perpage select {
  height: 26px; border-radius: var(--control-radius); border: 1px solid var(--border-strong);
  background: var(--bg-surface); color: var(--text-primary); font-size: var(--font-meta); padding: 0 6px;
}

/* --- 10 · MỨC ƯU TIÊN --- */
.ads-pri {
  display: inline-flex; align-items: center; gap: 4px; white-space: nowrap;
  font-size: var(--font-meta); font-weight: var(--weight-semibold);
  padding: 2px 8px; border-radius: 999px; border: 1px solid transparent;
}
.ads-pri-urgent { background: var(--status-danger-soft);  color: var(--status-danger);  border-color: var(--status-danger-soft); }
.ads-pri-review { background: var(--status-warning-soft); color: var(--status-warning); border-color: var(--status-warning-soft); }
.ads-pri-opp    { background: var(--status-success-soft); color: var(--status-success); border-color: var(--status-success-soft); }
.ads-pri-info   { background: var(--status-info-soft);    color: var(--status-info);    border-color: var(--status-info-soft); }
.ads-pri-normal { background: var(--bg-subtle);           color: var(--text-secondary); border-color: var(--border-soft); }

/* --- 11 · BẢNG GỌN --- */
.ads-table-sm th { padding: 6px 8px; }
.ads-table-sm td { padding: 7px 8px; }
.ads-camp-table { min-width: 1180px; }
.ads-note-link { display: block; margin-top: 3px; font-size: var(--font-meta); text-align: left; }

/* --- 12 · KHỐI AI --- */
.ads-ai-panel .ads-ai-list { gap: 6px; }
.ads-ai-item { padding: 6px var(--space-3); }
.ads-ai-head { display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }
.ads-ai-head > b { font-size: var(--font-body); }
.ads-ai-pri, .ads-ai-global { font-size: var(--text-xs); padding: 1px 7px; }
.ads-ai-global { cursor: help; }
.ads-ai-foot { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
.ads-ai-sum { display: flex; gap: 6px; flex-wrap: wrap; }
.ads-ai-compact .ads-ai-item { padding: 6px var(--space-2); }
.ads-ai-compact .ads-ai-head > b { font-size: var(--font-meta); }
.ads-ai-compact .ads-ai-body p { font-size: var(--text-xs); line-height: var(--line-normal); }

/* --- 13 · VÙNG LÀM VIỆC màn nhà cung cấp --- */
.ads-side { top: calc(var(--sticky-module-top) + 96px); }
.ads-kpi-compact { padding: var(--space-2) var(--space-3); }
.ads-kpi-c-val { font-size: var(--font-card-title); }

/* ==========================================================================
   WEBAPP-AI-ADS-ADMIN-V1-01 · CONTINUATION 04 — KHU DỮ LIỆU + BÁM ẢNH BASELINE
   Vẫn chỉ dùng token canonical; vẫn scope trong `.ads-*`; vẫn KHÔNG hex/rgba
   (phụ lục này nằm cuối tệp nên rơi vào lát cắt CSS của bộ kiểm CRM/KPI).
   ========================================================================== */

/* --- 1 · KHU DỮ LIỆU: thanh thao tác + bảng, KHÔNG thẻ lớn --- */
.ads-sec-head .btn-xs { margin-left: 0; }
.ads-check-line {
  display: flex; align-items: center; gap: 6px; flex-wrap: wrap;
  padding: 6px var(--space-3); border: 1px solid var(--border-soft);
  border-radius: var(--radius-md); background: var(--bg-surface-soft);
}
.ads-check-lbl { font-size: var(--font-meta); color: var(--text-secondary); font-weight: var(--weight-semibold); }
.ads-check-line .btn-link { margin-left: auto; font-size: var(--font-meta); }
.ads-empty-row {
  padding: var(--space-3); text-align: center; color: var(--text-muted);
  font-size: var(--font-meta); border: 1px dashed var(--border-soft); border-radius: var(--radius-md);
}
.ads-check-note { max-width: 320px; }

/* --- 2 · HỘP THOẠI XUẤT DỮ LIỆU: chọn phạm vi theo phân cấp --- */
.ads-ex-scope { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: var(--space-2) var(--space-3); }
.ads-ex-scope .ads-field > span { font-size: var(--font-meta); color: var(--text-secondary); font-weight: var(--weight-semibold); }
.ads-ex-scope select {
  height: var(--control-h-sm); width: 100%; min-width: 0;
  padding: 0 var(--control-pad-x); border-radius: var(--control-radius);
  border: 1px solid var(--border-strong); background: var(--bg-surface);
  color: var(--text-primary); font-size: var(--font-body);
}
.ads-ex-scope select:disabled { background: var(--bg-subtle); color: var(--text-disabled); }

/* --- 3 · HIỆU SUẤT: cột sóng + nhãn chữ (ảnh baseline) --- */
.ads-perf { display: inline-flex; align-items: center; gap: 6px; white-space: nowrap; }
.ads-bars { display: inline-flex; align-items: flex-end; gap: 2px; height: 14px; }
.ads-bars i { width: 3px; border-radius: 1px; background: var(--border-strong); }
.ads-bars i:nth-child(1) { height: 5px; }
.ads-bars i:nth-child(2) { height: 8px; }
.ads-bars i:nth-child(3) { height: 11px; }
.ads-bars i:nth-child(4) { height: 14px; }
.ads-bars i.on { background: var(--status-success); }

/* --- 4 · KHOẢNG NGÀY THẬT cạnh ô chọn kỳ --- */
.ads-range-dates {
  font-size: var(--font-meta); color: var(--text-muted); white-space: nowrap;
  padding: 0 var(--space-2); cursor: help;
}

/* --- 5 · BIỂU ĐỒ SO SÁNH NỀN TẢNG (SVG nội tuyến, 0 thư viện) --- */
.ads-chart { display: flex; flex-direction: column; gap: var(--space-2); }
.ads-chart-legend { display: flex; align-items: center; gap: var(--space-3); flex-wrap: wrap; font-size: var(--font-meta); color: var(--text-secondary); }
.ads-chart-key { display: inline-flex; align-items: center; gap: 6px; }
.ads-chart-key i { width: 14px; height: 3px; border-radius: 2px; display: inline-block; }
.ads-chart-legend .ads-note { margin-left: auto; }
.ads-chart-svg { width: 100%; height: auto; max-height: 220px; }

/* ==========================================================================
   WEBAPP-AI-ADS-ADMIN-V1-01 · CONTINUATION 05 — CÂN LẠI TỶ LỆ THỊ GIÁC
   Chủ sở hữu: "compact" KHÔNG có nghĩa là thu nhỏ mọi thứ. Bỏ khoảng trắng thừa,
   nhưng GIỮ phân cấp rõ · chữ đủ lớn · thẻ đủ thoáng · vùng chính nổi bật.
   Vòng C01 đã nén quá tay; vòng này trả lại tỷ lệ theo 4 ảnh baseline.
   ⚠️ Khối này nối SAU nên ĐÈ các luật của C01/C04 ở trên — cố ý.
   Vẫn chỉ dùng token canonical; vẫn 0 hex · 0 rgba · 0 chữ dưới sàn 12.5px.
   ========================================================================== */

/* --- 1 · ĐẦU MODULE: đủ lớn để thấy đây là MODULE CHÍNH --- */
.ads-head {
  align-items: center;
  gap: var(--space-3);
  padding: var(--space-3) 0 var(--space-2);
}
.ads-head-icon {
  width: 40px; height: 40px; flex: none;
  display: grid; place-items: center;
  border-radius: var(--radius-md);
  background: var(--status-ai-soft); color: var(--status-ai);
  font-size: var(--text-xl); line-height: 1;
}
.ads-head-text { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.ads-head-title { font-size: var(--font-page-title); line-height: var(--line-tight); }
.ads-head-sub {
  font-size: var(--font-body); color: var(--text-secondary);
  white-space: normal; overflow: visible; text-overflow: clip;
}
.ads-head .ads-assistant-btn { padding: 6px 12px; font-size: var(--font-button); }

/* --- 2 · TIÊU ĐỀ KHỐI: rõ hơn, thẻ thoáng hơn --- */
.ads-sec { padding: var(--card-pad); gap: var(--space-3); }
.ads-sec-title { font-size: var(--font-section-title); }

/* --- 3 · THẺ NỀN TẢNG: trở lại dạng CARD rõ ràng như baseline --- */
.ads-pcards { gap: var(--space-4); }
.ads-pcard {
  padding: var(--card-pad); gap: var(--space-3);
  border-radius: var(--radius-lg);
}
.ads-pcard-head { gap: var(--space-2); align-items: center; flex-wrap: nowrap; }
.ads-pcard-name { display: flex; flex-direction: column; min-width: 0; flex: 1 1 auto; }
.ads-pcard-head .ads-pcard-name > b { font-size: var(--font-card-title); color: var(--text-primary); }
.ads-pcard-sub { font-size: var(--font-meta); color: var(--text-muted); }
.ads-pcard .ads-mark-lg { width: 34px; height: 34px; border-radius: var(--radius-md); font-size: var(--text-xl); }
.ads-pcard-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-3); }
.ads-pcard-cell { display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.ads-pcard-grid .ads-pcard-val {
  font-size: var(--text-2xl); font-weight: var(--weight-bold);
  color: var(--text-primary); line-height: var(--line-tight);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ads-pcard-lbl { font-size: var(--font-meta); color: var(--text-secondary); }
.ads-pcard-foot {
  display: flex; align-items: center; justify-content: space-between; gap: var(--space-2);
  border-top: 1px solid var(--border-soft); padding-top: var(--space-2);
}
.ads-pcard-trend { display: inline-flex; align-items: center; gap: 6px; }
.ads-pcard-trend-lbl { font-size: var(--font-meta); color: var(--text-muted); }
.ads-pcard .ads-spark { height: 24px; }
.ads-pcard .ads-spark i { width: 4px; }

/* --- 4 · KPI TOÀN NỀN TẢNG: thẻ compact-medium, KHÔNG phải dải tí hon --- */
.ads-kpi-total {
  display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: var(--space-3);
  margin-top: var(--space-1);
}
.ads-kpi-card {
  display: flex; flex-direction: column; gap: 2px;
  background: var(--bg-surface-soft); border: 1px solid var(--border-soft);
  border-radius: var(--radius-md); padding: var(--space-3) var(--card-pad);
}
.ads-kpi-total .ads-kpi-card-val {
  font-size: var(--text-2xl); font-weight: var(--weight-bold);
  color: var(--text-primary); line-height: var(--line-tight);
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.ads-kpi-card-lbl { font-size: var(--font-meta); color: var(--text-secondary); }
.ads-kpi-card-d { min-height: 16px; }

/* --- 5 · KPI GỌN Ở MÀN NHÀ CUNG CẤP: to hơn một bậc, vẫn một hàng --- */
.ads-kpi-compact { padding: var(--space-3) var(--card-pad); gap: var(--space-3); }
.ads-kpi-c { min-width: 150px; flex: 1 1 150px; gap: 2px; }
.ads-kpi-c-val { font-size: var(--text-xl); }

/* --- 6 · BẢNG: dễ đọc, không thành lưới dữ liệu kỹ thuật --- */
.ads-table-sm th { padding: 10px var(--space-3); font-size: var(--font-table-head); }
.ads-table-sm td { padding: 11px var(--space-3); font-size: var(--font-table-cell); }
.ads-table thead th { border-bottom: 2px solid var(--border-default); }
.ads-cell-sub { font-size: var(--font-meta); margin-top: 3px; }
/* Cho cột rộng hơn để tên chiến dịch không phải xuống dòng liên tục */
.ads-camp-table { min-width: 1360px; }
.ads-tree { min-width: 1240px; }
/* Vạch kẻ mềm + kẻ xen kẽ + nổi khi rê chuột — CHỈ cho bảng danh sách, KHÔNG cho cây
   (cây đã dùng nền để phân cấp Chiến dịch / Nhóm / Quảng cáo). */
.ads-camp-table tbody tr:nth-child(even) > td { background: var(--bg-surface-soft); }
.ads-camp-table tbody tr:hover > td { background: var(--brand-primary-soft); }
.ads-camp-table tbody td { border-bottom: 1px solid var(--border-soft); }
.ads-pri { font-size: var(--font-meta); padding: 3px 10px; }
.ads-table .tag { font-size: var(--font-meta); padding: 3px 10px; }
.ads-note-link { font-size: var(--font-meta); margin-top: 5px; }

/* --- 7 · KHỐI AI: từng nhận xét thoáng và rõ hơn --- */
.ads-ai-panel .ads-ai-list { gap: var(--space-2); }
.ads-ai-item { padding: var(--space-3) var(--card-pad); gap: var(--space-3); border-left-width: 4px; }
.ads-ai-icon { font-size: var(--text-xl); line-height: 1.1; }
.ads-ai-head { gap: var(--space-2); }
.ads-ai-head > b { font-size: var(--font-card-title); line-height: var(--line-tight); }
.ads-ai-body { gap: 4px; }
.ads-ai-body p { font-size: var(--font-body); line-height: var(--line-normal); }
.ads-ai-pri, .ads-ai-global { font-size: var(--font-meta); padding: 3px 10px; }
.ads-ai-action { font-size: var(--font-meta); }
.ads-ai-foot { gap: var(--space-3); padding-top: 2px; }
/* Khối AI GỌN ở màn nhà cung cấp vẫn phải nhỏ hơn khối AI đầy đủ, nhưng không tí hon */
.ads-ai-compact .ads-ai-item { padding: var(--space-2) var(--space-3); }
.ads-ai-compact .ads-ai-head > b { font-size: var(--font-body); }
.ads-ai-compact .ads-ai-body p { font-size: var(--font-meta); }
.ads-ai-compact .ads-ai-icon { font-size: var(--font-card-title); }

/* --- 8 · CHIP LỌC + PHÂN TRANG: cao hơn một chút cho dễ bấm --- */
.ads-chip { height: var(--control-h); padding: 0 var(--space-3); font-size: var(--font-body); }
.ads-page { min-width: 30px; height: 30px; font-size: var(--font-body); }
.ads-pager { padding-top: var(--space-2); }
.ads-pager-info { font-size: var(--font-body); }

/* ==========================================================================
   WEBAPP-AI-ADS-UI-ALIGN-V1-02 — BÁM BỐ CỤC 4 ẢNH BASELINE
   Ảnh baseline là nguồn sự thật THỊ GIÁC của FORM này. Bố cục màn Tổng quan:
     hàng 1  tên module + hành động       hàng 2  bốn tab
     hàng 3  BỐN THẺ NGANG                hàng 4  biểu đồ (trái) + AI (phải)
     hàng 5  Tất cả chiến dịch            hàng 6  Nền tảng + Dữ liệu (khu phụ)
   ⚠️ Khối này nối SAU nên đè các luật trước — cố ý.
   Vẫn chỉ token canonical; 0 hex · 0 rgba · 0 chữ dưới sàn 12.5px.
   ========================================================================== */

/* --- 1 · HÀNG 1: tên module bên trái, hành động bên phải --- */
/* Đầu trang màn nhà cung cấp: ô biểu tượng mang màu nhận diện của chính nhà cung cấp */
.ads-head-icon-pv { font-size: var(--text-xl); font-weight: var(--weight-bold); border: 1px solid var(--border-strong); }
.ads-head-icon-pv.apv-fb { background: var(--brand-primary-soft); color: var(--brand-primary-hover); border-color: var(--border-focus); }
.ads-head-icon-pv.apv-tt { background: var(--bg-subtle); color: var(--text-primary); border-color: var(--border-strong); }
.ads-head-icon-pv.apv-gg { background: var(--status-warning-soft); color: var(--status-warning); border-color: var(--status-warning); }
.ads-head-actions { display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap; }
.ads-head-actions .ads-field-inline > span { font-size: var(--font-meta); color: var(--text-secondary); }
.ads-head-actions select { height: var(--control-h-sm); min-width: 130px; }
.ads-head-actions .ads-field-acc select { min-width: 210px; }
.ads-head-actions .ads-sync { height: var(--control-h-sm); }
.ads-head .ads-demo-badge { margin-left: var(--space-2); }

/* Dải công cụ chỉ còn dùng ở màn nhà cung cấp, và chỉ MỘT dòng bên phải */
#ads-toolbar[hidden] { display: none; }
.ads-toolbar { justify-content: flex-end; }
.ads-toolbar .ads-toolbar-right { margin-left: auto; }

/* --- 2 · HÀNG 3: BỐN THẺ NGANG CÙNG CẤP (yêu cầu quan trọng nhất) --- */
.ads-pcards-4 { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--space-3); }
.ads-pcards-4 .ads-pcard { cursor: pointer; }
.ads-pcards-4 .ads-pcard-total { cursor: default; }
.ads-pcard-total { background: var(--brand-primary-soft); border-color: var(--border-focus); }
.ads-mark-total { background: var(--brand-primary); color: var(--text-inverse); border-color: var(--brand-primary); }
/* Bốn thẻ trên một hàng ⇒ mỗi thẻ hẹp hơn, hạ cỡ số xuống một bậc cho khỏi tràn */
/* Bốn thẻ trên một hàng ⇒ mỗi thẻ hẹp hơn: hạ cỡ số để SỐ HIỆN ĐỦ, không bị cắt "…".
   Vẫn là phần tử to nhất trong thẻ (15px đậm so với nhãn 12.5px thường). */
.ads-pcards-4 .ads-pcard-grid .ads-pcard-val { font-size: var(--font-card-title); }
.ads-pcards-4 .ads-pcard-lbl { font-size: var(--text-sm); line-height: var(--line-tight); }
.ads-pcards-4 .ads-pcard-name > b { line-height: var(--line-tight); }
.ads-pcards-4 .ads-pcard-head { flex-wrap: wrap; row-gap: 4px; }
.ads-pcards-4 .ads-pcard-foot { flex-wrap: wrap; row-gap: 4px; }
.ads-pcards-4 .ads-pcard { padding: var(--space-3); gap: var(--space-2); }
.ads-pcards-4 .ads-pcard .ads-mark-lg { width: 30px; height: 30px; font-size: var(--font-card-title); }
.ads-pcards-4 .ads-pcard-name > b { font-size: var(--font-body); }
.ads-pcards-4 .ads-pcard-head .tag { font-size: var(--text-sm); padding: 2px 8px; }

/* --- 3 · HÀNG 4: biểu đồ (trái ~60%) + AI (phải ~40%) CÙNG HÀNG --- */
.ads-ov-row { display: grid; grid-template-columns: minmax(0, 1.5fr) minmax(0, 1fr); gap: var(--space-4); align-items: start; }
.ads-ov-chart { min-width: 0; }
.ads-ov-chart .ads-chart-svg { max-height: 260px; }
.ads-ov-ai { min-width: 0; display: flex; }
.ads-ov-ai > .ads-ai-panel { flex: 1 1 auto; min-width: 0; }
/* Danh sách nhận xét cuộn trong khối để hai cột cân nhau — vẫn giữ đủ lọc và phân trang */
.ads-ov-ai .ads-ai-list { max-height: 360px; overflow-y: auto; padding-right: 2px; }
.ads-ov-ai .ads-ai-item { padding: var(--space-2) var(--space-3); }
.ads-ov-ai .ads-ai-head > b { font-size: var(--font-body); }
.ads-ov-ai .ads-ai-body p { font-size: var(--font-meta); }
.ads-ov-ai .ads-chips { gap: 4px; }
.ads-ov-ai .ads-chip { height: var(--control-h-sm); padding: 0 10px; font-size: var(--font-meta); }

/* --- 4 · HÀNG 6: khu phụ hai cột, KHÔNG tranh chỗ với vùng chính --- */
.ads-ov-side { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-4); align-items: start; }
.ads-ov-side > .ads-sec { min-width: 0; }

/* --- 5 · Bảng chiến dịch: giữ 11 cột nhưng nhẹ mắt hơn --- */
.ads-camp-table { min-width: 1280px; }
.ads-camp-table .ads-ai-cell { max-width: 200px; }

/* --- 6 · Màn nhà cung cấp: KPI 5 thẻ ngang như ảnh baseline --- */
.ads-kpi-compact {
  display: grid; grid-template-columns: repeat(5, minmax(0, 1fr));
  gap: var(--space-3); align-items: stretch;
}
.ads-kpi-c {
  min-width: 0; flex: none; border-right: 0;
  background: var(--bg-surface-soft); border: 1px solid var(--border-soft);
  border-radius: var(--radius-md); padding: var(--space-3);
  display: flex; flex-direction: column; gap: 2px;
}
.ads-kpi-c-val { font-size: var(--text-xl); }
.ads-kpi-c-badge { display: none; }

/* ---- responsive: PHẢI nằm cuối khối này ---- */
@media (max-width: 1280px) {
  .ads-work { grid-template-columns: minmax(0, 1fr); }
  .ads-side { position: static; }
}
@media (max-width: 1024px) {
  .ads-shell { position: static; box-shadow: none; }
  .ads-pcards { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ads-kpi-row { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ads-an-grid { grid-template-columns: minmax(0, 1fr); }
  .ads-ent-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ads-kpi-total { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .ads-pcards-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ads-ov-row { grid-template-columns: minmax(0, 1fr); }
  .ads-ov-ai .ads-ai-list { max-height: none; }
  .ads-kpi-compact { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .ads-head-sub { display: none; }
  .ads-ex-scope { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ads-range-dates { display: none; }
}
@media (max-width: 640px) {
  .ads-pcards, .ads-kpi-row, .ads-ent-grid { grid-template-columns: minmax(0, 1fr); }
  .ads-kpi-total { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ads-pcards-4, .ads-ov-side { grid-template-columns: minmax(0, 1fr); }
  .ads-kpi-compact { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ads-head-icon { width: 32px; height: 32px; }
  .ads-toolbar-left, .ads-toolbar-right { width: 100%; }
  .ads-field select, .ads-field-acc select { min-width: 0; width: 100%; }
  .ads-kpi-c { border-right: 0; }
  .ads-alloc li { grid-template-columns: minmax(0, 1fr) 70px 36px; }
  .ads-ex-scope { grid-template-columns: minmax(0, 1fr); }
  .ads-check-line .btn-link { margin-left: 0; }
  .ads-pcard-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  /* Dải chip là MỘT hàng cuộn ngang — xếp 2 cột thì cao hơn bản cũ (bài học CRM §63). */
  .ads-chips { flex-wrap: nowrap; overflow-x: auto; padding-bottom: 2px; }
  .ads-chip { flex: none; }
  .ads-lf-row .ads-field { flex: 1 1 100%; }
  .ads-pager-nav { margin-left: 0; }
  .ads-head-title { font-size: var(--font-card-title); }
}

/* ==========================================================================
   WEBAPP-AI-ADS-PROVIDER-MASTER-DETAIL-V1-03 — BA MÀN NHÀ CUNG CẤP
   MASTER (cây bên trái, 8 cột) → DETAIL (panel bên phải).
   Ảnh Owner là nguồn sự thật thị giác của vòng này.
   ⚠️ Khối này nối SAU nên đè các luật trước — cố ý.
   ⛔ Khối @media của phụ lục PHẢI nằm CUỐI CÙNG (luật đã cắn năm lần).
   Vẫn chỉ token canonical; 0 hex · 0 rgba · 0 chữ dưới sàn 12.5px.
   ========================================================================== */

/* --- 1 · KHUNG MASTER → DETAIL --- */
/* FORM §16: Master 65–70% · Detail 30–35%. 27% cũ làm panel tụt về mức tối thiểu
   và hàng TAB phải cuộn ngang ngay từ 1400px. */
.ads-work { grid-template-columns: minmax(0, 1fr) minmax(320px, 33%); gap: var(--space-4); }
.ads-tree-head { display: flex; align-items: center; flex-wrap: wrap; gap: var(--space-2); }
.ads-tree-head .ads-actionbar { margin-left: auto; margin-bottom: 0; }

/* Danh sách chính chỉ còn 8 cột ⇒ không cần bảng rộng 1240px nữa (ảnh không có cuộn ngang) */
.ads-tree { table-layout: fixed; min-width: 640px; }
.ads-tree .ads-c-name { min-width: 0; }
.ads-tree td, .ads-tree th { overflow: hidden; }
.ads-tree .ads-c-name .ads-cell-sub { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }
.ads-tree .ads-c-name { display: flex; align-items: center; gap: var(--space-2); }
.ads-tree .ads-c-ops { width: 46px; text-align: center; }
.ads-tree .ads-c-warn { white-space: nowrap; }
.ads-tree .ads-c-res b { display: block; font-size: var(--font-body); }
.ads-tree .ads-c-res .ads-cell-sub { display: block; }

/* --- 2 · PHÂN CẤP BA TẦNG (FORM §6) --- */
/* Tầng 0 · Chiến dịch: không thụt, chữ đậm, nền rõ hơn hai tầng dưới. */
.ads-r-camp > td { background: var(--bg-surface); border-top: 1px solid var(--border-strong); }
.ads-r-camp .ads-pick-name { font-weight: var(--weight-bold); font-size: var(--font-body); }
/* Tầng 1 · Nhóm quảng cáo: thụt 28px + đường cây + móc nối. */
/* Lề gốc của ô TÊN khai tường minh ⇒ độ thụt = padding cấp con − 10px, đọc được ngay. */
.ads-tree td.ads-c-name { padding-left: 10px; }
.ads-tree td.ads-c-name.ads-lv1 { padding-left: 38px; position: relative; }   /* thụt 28px */
/* Tầng 2 · Quảng cáo: thụt tiếp, có hình đại diện nhỏ, chữ nhẹ nhất. */
.ads-tree td.ads-c-name.ads-lv2 { padding-left: 66px; position: relative; }   /* thụt 56px */
.ads-tline { position: absolute; top: -10px; bottom: -10px; left: 24px; width: 1px; background: var(--border-strong); }
.ads-lv2 .ads-tline { left: 52px; }
.ads-telbow { position: absolute; top: 50%; left: 24px; width: 10px; height: 1px; background: var(--border-strong); }
.ads-lv2 .ads-telbow { left: 52px; }
.ads-r-group > td { background: var(--bg-surface-soft); }
.ads-r-group .ads-pick-name { font-weight: var(--weight-medium); font-size: var(--font-body); }
.ads-r-ad > td { background: var(--bg-surface); }
.ads-r-ad .ads-pick-name { font-weight: var(--weight-normal); font-size: var(--font-meta); color: var(--text-secondary); }
.ads-r-camp.is-open > td { background: var(--brand-primary-soft); }
/* Dòng ĐANG CHỌN: viền trái đậm + nền nhạt, đọc được cả khi không phân biệt được màu. */
.ads-r.is-sel > td { background: var(--brand-primary-soft); }
.ads-r.is-sel > td:first-child { box-shadow: inset 3px 0 0 0 var(--brand-primary); }

.ads-thumb-camp { background: var(--brand-primary-soft); border: 1px solid var(--border-focus); }
.ads-thumb-group { background: var(--status-info-soft); border: 1px solid var(--border-strong); }

/* Tên dòng là NÚT CHỌN (master → detail), nhưng trông như chữ thường. */
.ads-pickrow {
  display: flex; flex-direction: column; align-items: flex-start; gap: 0;
  background: none; border: 0; padding: 0; margin: 0; cursor: pointer;
  text-align: left; min-width: 0; font: inherit; color: var(--text-primary);
}
.ads-pickrow:hover .ads-pick-name { color: var(--brand-primary); text-decoration: underline; }
.ads-pickrow:focus-visible { outline: 2px solid var(--border-focus); outline-offset: 2px; border-radius: var(--radius-sm); }
.ads-pick-name { display: block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

/* --- 3 · THAO TÁC DÒNG "⋯" --- */
.ads-row-menu { position: relative; display: inline-block; }
.ads-row-menu > summary { list-style: none; min-width: 30px; text-align: center; cursor: pointer; }
.ads-row-menu > summary::-webkit-details-marker { display: none; }
.ads-row-menu[open] > summary { background: var(--status-info-soft); border-color: var(--border-focus); }
.ads-row-menu-list {
  position: absolute; right: 0; z-index: 5; min-width: 168px;
  display: flex; flex-direction: column; align-items: stretch; gap: var(--space-1);
  background: var(--bg-surface-raised); border: 1px solid var(--border-strong);
  border-radius: var(--radius-md); box-shadow: var(--shadow-md); padding: var(--space-2);
}
.ads-row-menu-list .btn { text-align: left; white-space: nowrap; }

/* --- 4 · PANEL CHI TIẾT (FORM §5 · §7 · §8) --- */
.ads-detail { display: flex; flex-direction: column; gap: var(--space-2); }
.ads-detail-head { display: flex; align-items: center; gap: var(--space-2); }
.ads-detail-head .ads-sec-title { flex: 1 1 auto; min-width: 0; }
.ads-detail-x {
  flex: none; width: 26px; height: 26px; border-radius: var(--radius-sm); cursor: pointer;
  background: var(--bg-surface); border: 1px solid var(--border-soft);
  color: var(--text-secondary); font-size: var(--font-card-title); line-height: 1;
}
.ads-detail-x:hover { border-color: var(--border-focus); color: var(--brand-primary); }
.ads-detail-ent {
  display: flex; align-items: center; gap: var(--space-2); flex-wrap: wrap;
  background: var(--bg-surface-soft); border: 1px solid var(--border-soft);
  border-radius: var(--radius-md); padding: var(--space-2) var(--space-3);
}
.ads-detail-icon {
  flex: none; width: 34px; height: 34px; border-radius: var(--radius-md); display: grid; place-items: center;
  background: var(--brand-primary-soft); border: 1px solid var(--border-focus); font-size: var(--font-card-title);
}
.ads-detail-icon-group { background: var(--status-info-soft); }
.ads-detail-icon-ad { background: var(--status-ai-soft); border-color: var(--border-strong); }
.ads-detail-name { flex: 1 1 140px; min-width: 0; display: flex; flex-direction: column; }
.ads-detail-name > b { font-size: var(--font-card-title); }
.ads-detail-t {
  display: flex; align-items: center; justify-content: space-between; gap: var(--space-2);
  font-size: var(--font-label); font-weight: var(--weight-semibold); color: var(--text-primary);
  border-bottom: 1px solid var(--border-soft); padding-bottom: var(--space-1); margin-top: var(--space-2);
}
.ads-kvs { display: flex; flex-direction: column; }
.ads-kv {
  display: grid; grid-template-columns: minmax(0, 118px) minmax(0, 1fr);
  gap: var(--space-2); padding: 5px 0; border-bottom: 1px solid var(--border-soft);
}
.ads-kv:last-child { border-bottom: 0; }
.ads-kv-k { font-size: var(--font-meta); color: var(--text-secondary); }
.ads-kv-v { font-size: var(--font-meta); color: var(--text-primary); word-break: break-word; }
.ads-kv-v .ads-cell-sub { display: inline; }
.ads-detail-ai { list-style: none; margin: 0; padding: 0; display: flex; flex-direction: column; gap: var(--space-2); }
.ads-detail-ai > li {
  display: grid; grid-template-columns: 18px minmax(0, 1fr); gap: var(--space-2);
  font-size: var(--font-meta); color: var(--text-primary); line-height: var(--line-normal);
}
.ads-detail-dot { line-height: var(--line-normal); }
.ads-detail-acts { display: flex; flex-wrap: wrap; gap: var(--space-2); margin-top: var(--space-2); }
.ads-detail-acts .btn { flex: 1 1 auto; justify-content: center; }
.ads-detail-none { display: flex; flex-direction: column; gap: var(--space-3); }
.ads-detail-hint {
  background: var(--bg-surface-soft); border: 1px dashed var(--border-strong);
  border-radius: var(--radius-md); padding: var(--space-3);
}
.ads-detail-hint > b { font-size: var(--font-card-title); }
/* Panel dính phải VỪA khung nhìn, nếu không hàng hành động ở đáy không với tới được. */
.ads-detail { max-height: 76vh; overflow-y: auto; }
.ads-detail-none .ads-ai-panel { max-height: 70vh; overflow-y: auto; }

/* ---- responsive: PHẢI nằm cuối khối này ---- */
@media (max-width: 1280px) {
  .ads-work { grid-template-columns: minmax(0, 1fr) minmax(300px, 32%); }
  .ads-kv { grid-template-columns: minmax(0, 104px) minmax(0, 1fr); }
}
@media (max-width: 1024px) {
  /* Hẹp thì xếp dọc: danh sách trước, chi tiết ngay dưới — vẫn là master → detail. */
  .ads-work { grid-template-columns: minmax(0, 1fr); }
  .ads-side { position: static; }
  .ads-tree-head .ads-actionbar { margin-left: 0; }
  /* Xếp dọc thì panel KHÔNG dính nữa ⇒ bỏ trần, để cuộn trang như mọi khối khác. */
  .ads-detail, .ads-detail-none .ads-ai-panel { max-height: none; overflow-y: visible; }
}
@media (max-width: 640px) {
  .ads-tree td.ads-c-name.ads-lv1 { padding-left: 30px; }
  .ads-tree td.ads-c-name.ads-lv2 { padding-left: 50px; }
  .ads-tline { left: 18px; }
  .ads-lv2 .ads-tline { left: 38px; }
  .ads-telbow { left: 18px; width: 8px; }
  .ads-lv2 .ads-telbow { left: 38px; }
  .ads-detail-acts .btn { flex: 1 1 100%; min-height: 40px; }
  .ads-row-menu-list { right: auto; left: 0; }
}

/* ==========================================================================
   WEBAPP-AI-ADS-PROVIDER-MASTER-DETAIL-V1-03-C02 — BÁM HAI ẢNH OWNER
   ẢNH A = Quản trị/Giám đốc · ẢNH B = Nhân viên chính thức.
   Thêm: chip khoảng ngày ở hàng 1 · dải công cụ của danh sách (có ô tìm kiếm) ·
         TAB trong panel chi tiết · bảng con của panel.
   ⚠️ Khối này nối SAU nên đè các luật trước — cố ý.
   Vẫn chỉ token canonical; 0 hex · 0 rgba · 0 chữ dưới sàn 12.5px.
   ========================================================================== */

/* --- 1 · HÀNG 1: chip khoảng ngày (chỗ HIỂN THỊ, không phải ô điều khiển) --- */
.ads-date-chip {
  display: inline-flex; align-items: center; gap: var(--space-1);
  height: var(--control-h-sm); padding: 0 10px;
  border: 1px solid var(--border-soft); border-radius: var(--radius-sm);
  background: var(--bg-surface-soft); color: var(--text-secondary);
  font-size: var(--font-meta); white-space: nowrap;
}

/* --- 2 · DẢI CÔNG CỤ CỦA DANH SÁCH --- */
.ads-list-bar { display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2); margin-bottom: var(--space-2); }
.ads-search { display: flex; align-items: center; gap: var(--space-1); flex: 1 1 240px; min-width: 180px; max-width: 420px;
  height: var(--control-h-sm); padding: 0 10px;
  border: 1px solid var(--border-strong); border-radius: var(--radius-sm); background: var(--bg-surface); }
.ads-search:focus-within { border-color: var(--border-focus); }
.ads-search-ic { flex: none; color: var(--text-muted); font-size: var(--font-meta); }
.ads-search input {
  flex: 1 1 auto; min-width: 0; border: 0; outline: none; background: none;
  font: inherit; font-size: var(--font-meta); color: var(--text-primary); height: 100%;
}
.ads-search-note { margin: 0 0 var(--space-2); }

/* --- 3 · TAB TRONG PANEL CHI TIẾT (ẢNH A có 5 tab, ẢNH B có 4) --- */
.ads-dtabs {
  display: flex; gap: var(--space-1); flex-wrap: nowrap; overflow-x: auto;
  border-bottom: 1px solid var(--border-soft); padding-bottom: 0; margin-top: var(--space-2);
}
.ads-dtab {
  flex: none; cursor: pointer; background: none; border: 0; border-bottom: 2px solid transparent;
  padding: var(--space-2) 7px; font: inherit; font-size: var(--font-meta);
  color: var(--text-secondary); white-space: nowrap;
}
.ads-dtab:hover { color: var(--brand-primary); }
.ads-dtab.is-on { color: var(--brand-primary); border-bottom-color: var(--brand-primary); font-weight: var(--weight-semibold); }
.ads-detail-body { display: flex; flex-direction: column; gap: var(--space-1); }
.ads-detail-ai-r { display: inline-flex; align-items: center; gap: var(--space-2); }

/* --- 4 · BẢNG CON TRONG PANEL (tab Nhóm quảng cáo · Quảng cáo) --- */
.ads-mini { display: flex; flex-direction: column; gap: var(--space-1); }
.ads-mini-row {
  display: grid; grid-template-columns: 24px minmax(0, 1fr) auto; gap: var(--space-2);
  align-items: center; text-align: left; cursor: pointer; font: inherit;
  background: var(--bg-surface); border: 1px solid var(--border-soft);
  border-radius: var(--radius-sm); padding: var(--space-2);
}
.ads-mini-row:hover { border-color: var(--border-focus); }
.ads-mini-row.is-sel { background: var(--brand-primary-soft); border-color: var(--brand-primary); }
.ads-mini-ic { font-size: var(--font-meta); }
.ads-mini-main { min-width: 0; display: flex; flex-direction: column; }
.ads-mini-main > b { font-size: var(--font-meta); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.ads-mini-num { display: none; }
.ads-mini-row .tag { justify-self: end; }

/* --- 5 · PANEL LÀ FLEX CỘT: chỉ THÂN cuộn, mọi thứ khác KHÔNG co --- */
.ads-detail { overflow: hidden; }
.ads-detail > .ads-detail-head,
.ads-detail > .ads-detail-ent,
.ads-detail > .ads-dtabs,
.ads-detail > .ads-detail-acts,
.ads-detail > .ads-demo-badge { flex: none; }
.ads-detail > .ads-detail-body {
  flex: 1 1 auto; min-height: 0; overflow-y: auto; padding-right: 2px;
}

/* ---- responsive: PHẢI nằm cuối khối này ---- */
@media (min-width: 1281px) {
  /* Panel rộng hơn thì mới đủ chỗ cho hai ô số của bảng con. */
  .ads-mini-row { grid-template-columns: 24px minmax(0, 1fr) auto 58px 68px; }
  .ads-mini-num { display: flex; flex-direction: column; align-items: flex-end; font-size: var(--font-meta); }
}
@media (max-width: 1024px) {
  .ads-search { flex: 1 1 100%; max-width: none; }
}
@media (max-width: 640px) {
  .ads-list-bar .btn { flex: 1 1 auto; min-height: 40px; }
  .ads-date-chip { width: 100%; justify-content: center; }
}


/* ===== WEBAPP-AI-MANAGEMENT-FINAL-SHARED-SIDEBAR-AGENT-POLISH-V1-05 =====
   Shared visual polish giai đoạn cuối. Cover sidebar active fix + Agent 3-layer surface
   + typography readability + tech text cleanup + badges. Zero backend. */

/* --- Agent 3-layer surface (§5) — không còn white+white+white --- */
.ai-agents-col.list   { background: #f8fafc; }                 /* LEFT blue-gray soft */
.ai-agents-col.detail { background: var(--bg-surface); }        /* CENTER white */
.ai-agents-col.chat   { background: #faf5ff; border-color: #ede9fe; } /* RIGHT violet very-soft */
.ai-agents-col.list .ai-agents-col-head,
.ai-agents-col.list .ai-agents-list-search { background: rgba(255,255,255,.55); }
.ai-agents-col.chat .ai-agents-chat-head { background: rgba(255,255,255,.55); }
.ai-agents-col.chat .ai-agents-chat-body { background: rgba(255,255,255,.35); }

/* Agent list item polish (§6, §7) */
.ai-agents-list-item {
  padding: 10px var(--space-3);
  border-radius: var(--radius-sm);
  border: 1px solid transparent;
}
.ai-agents-list-item:hover { background: rgba(255,255,255,.75); border-color: var(--border-soft); }
.ai-agents-list-item.active {
  background: var(--brand-primary-soft);
  border-color: var(--brand-primary);
  box-shadow: inset 3px 0 0 var(--brand-primary);
}
.ai-agents-list-name { font-size: 14px; font-weight: 600; }
.ai-agents-list-meta { font-size: 12.5px; color: var(--text-secondary); }

/* Agent detail header polish (§9) — bỏ raw code khỏi mặt chính */
.ai-agents-detail-title { font-size: 15px; font-weight: 700; }
.ai-agents-detail-sub   { font-size: 12.5px; color: var(--text-secondary); }
.ai-agents-detail-sub code { display: none; }  /* raw ai_role code CHỈ ở tooltip */

/* Internal tabs polish (§8) */
.ai-agents-detail-tabs {
  gap: 2px;
  padding: 0 var(--space-4);
  overflow-x: auto;
  scrollbar-width: thin;
}
.ai-agents-detail-tab {
  padding: 10px var(--space-3);
  font-size: 13px;
  font-weight: 600;
  border-bottom: 3px solid transparent;
  margin-bottom: -1px;
  white-space: nowrap;
  color: var(--text-secondary);
}
.ai-agents-detail-tab:hover { color: var(--text-primary); background: rgba(59,130,246,.06); }
.ai-agents-detail-tab.active { color: var(--brand-primary); border-bottom-color: var(--brand-primary); background: transparent; }

/* Metric cards polish (§10) */
.ai-agents-metric {
  background: var(--bg-surface-soft);
  border: 1px solid var(--border-soft);
  padding: var(--space-3);
  border-radius: var(--radius-sm);
}
.ai-agents-metric .l { font-size: 12px; text-transform: none; letter-spacing: 0; color: var(--text-muted); font-weight: 500; }
.ai-agents-metric .v { font-size: 19px; font-weight: 700; color: var(--text-primary); margin-top: 4px; }

/* Chat panel polish (§14) — visual đẹp, disabled state không xấu */
.ai-agents-chat-title { font-size: 14px; font-weight: 700; color: var(--text-primary); }
.ai-agents-chat-title code { display: none; }
.ai-agents-chat-sub   { font-size: 12.5px; color: var(--text-secondary); }
.ai-agents-chat-sub code { display: none; }
.ai-agents-chat-msg   { font-size: 13px; line-height: 1.45; }
.ai-agents-chat-input textarea:disabled {
  background: rgba(255,255,255,.6);
  color: var(--text-muted);
  border-color: #ddd6fe;
}
.ai-agents-chat-input button:disabled {
  opacity: .55;
  background: #a5b4fc;
  border-color: #a5b4fc;
  color: #fff;
}

/* + Thêm Agent AI polish (§12, §13) — disabled state đẹp */
#ai-agents-add {
  padding: 8px 14px;
  font-size: 13px;
  font-weight: 600;
  border-radius: var(--radius-sm);
}
#ai-agents-add:disabled {
  opacity: .55;
  background: var(--brand-primary);
  border-color: var(--brand-primary);
  color: #fff;
  cursor: not-allowed;
}

/* BACKEND_GAP compact badge pattern (§11) — dùng chung, không paragraph kỹ thuật */
.ai-backend-gap {
  padding: var(--space-2) var(--space-3);
  font-size: 12.5px;
  line-height: 1.4;
  gap: var(--space-2);
  background: var(--bg-subtle);
  border: 1px solid var(--border-soft);
  color: var(--text-secondary);
}
.ai-backend-gap code { display: none; }  /* Ẩn code kỹ thuật trên mặt chính; tooltip vẫn giữ */
.ai-backend-gap b { color: var(--text-primary); font-weight: 600; }

/* Header workspace slot — status pill mềm hơn cho Agent workspace */
.ai-admin .page-header .ai-header-slot { align-items: center; gap: var(--space-2); }
.ai-header-status { padding: 5px 10px; font-size: 12px; }

/* --- Responsive V1-05 --- */
@media (max-width: 1280px) {
  .ai-agents-col.chat { background: #ffffff; border-top: 1px solid var(--border-soft); }
}
@media (max-width: 900px) {
  .ai-agents-detail-tab { padding: 10px var(--space-2); font-size: 12.5px; }
}
