/* ===== Achau Work Command Center — Clickflow-style design system (v17) =====
   Visual language matched to Clickflow: pure-black icon rail, white canvas,
   near-black CTA buttons, blue/green/red functional status colors, 6px radii,
   system font stack, uppercase status chips. */
:root{
  /* Canvas — true white content area like Clickflow */
  --bg:#ffffff; --bg-subtle:#f8f8f8; --panel:#ffffff;
  --border:#e8e8e8; --border-strong:#d7d7d7;
  /* các họ màu phụ của ClickUp, cho ô vuông Space và tab view */
  --cu-blue:#0091ff; --cu-purple:#6647f0; --cu-deep-blue:#4a2fff; --cu-pink:#ff02f0;
  --cu-orange:#fc6d2d; --cu-green:#078d3b; --cu-red:#f0382d; --cu-yellow:#ffc800;
  /* --text-3 nâng 8c8c8c → 767676: 8c trên nền trắng chỉ đạt 3.9:1, dưới AA 4.5:1
     cho cỡ chữ 11-12px mà token này hay gánh (meta, hint). 767676 = 4.54:1, vừa đủ. */
  --text:#292d34; --text-2:#656f7d; --text-3:#767676;
  --hover:#f4f5f7;
  /* Viền gradient + quầng sáng ô nhập Bộ não AI. Hai đầu pastel, KHÚC GIỮA trùng màu
     nền viền thường — màu chỉ chạm hai góc chéo, thân viền đọc như border bình thường.
     Đây là chỗ ClickUp Brain khác hẳn: quầng sáng nằm ở bóng đổ, không nằm ở nét viền. */
  --brain-edge-1:#f0a6d8; --brain-edge-mid:#ececec; --brain-edge-2:#8fd9e8;
  --brain-halo-1:rgba(240,166,216,.34); --brain-halo-2:rgba(143,217,232,.30);
  /* Accent — chuyển sang tím ClickUp #7b68ee (thay xanh) cho link/focus/active/nút chọn;
     CTA vẫn đen (đã đúng chất ClickUp). --primary dùng cho fill/border/focus-ring (chỉ
     cần 3:1 theo WCAG cho thành phần UI); --primary-text ĐẬM HƠN dành riêng cho CHỮ
     (link, badge text) — #7b68ee trên nền trắng chỉ 4.15:1, hụt AA cho text thường. */
  /* Bản sao ClickUp 14/08/2026: màu nhấn đổi từ tím #7b68ee (token CŨ của ClickUp)
     sang XANH #0091ff — chính là --Core-Accents-Blue đọc thẳng từ stylesheet đang
     chạy của clickup.com. --primary-text đậm hơn một bậc vì #0091ff trên nền trắng
     chỉ 3.0:1, hụt AA 4.5:1 cho chữ thường; #0077d6 đạt 4.6:1. */
  --primary:#0091ff; --primary-text:#0077d6; --primary-hover:#0077d6; --primary-weak:#edf6fd; --primary-ring:rgba(0,145,255,.22);
  --cta:#202020; --cta-hover:#000000;
  /* Icon rail (pure black) — the signature Clickflow surface */
  --rail:#000000; --rail-2:#0a0a0a; --rail-line:#242424;
  /* rail-muted 6e→8a: chữ nhóm 10px in hoa trên rail đen chỉ đạt ~4:1 với 6e6e6e. */
  --rail-text:#b0b0b0; --rail-text-strong:#ffffff; --rail-muted:#8a8a8a;
  --rail-hover:rgba(255,255,255,.08); --rail-active:rgba(255,255,255,.12); --rail-accent:#ffffff;
  /* Status — sampled directly from the live Clickflow app (To Do gray / In Progress blue / Complete green) */
  --st-backlog:#8c8c8c; --st-open:#87909e; --st-progress:#1090e0; --st-pending:#f59e0b;
  --st-done:#008844; --st-completed:#12a06a; --st-verified:#7b68ee; --st-returned:#e5484d; --st-blocked:#e2445c;
  /* Achievement accent (KPI/OKR): bản đạt-chuẩn-contrast của bộ st trên nền sáng.
     --st-pending #f59e0b trên track #ececef chỉ 1.8:1 (fail 3:1 non-text) và 2.2:1
     làm chữ; --st-returned #e5484d làm chữ 3.5:1 (fail 4.5:1). Cùng họ màu chữ
     badge-flag/#b06000 và badge-danger/#b8283f đã dùng bên dưới. */
  --ach-good:#008844; --ach-warn:#b06000; --ach-bad:#b8283f;
  /* Tiền vào/ra (Figma "Thu Chi — ĐỀ XUẤT UI/UX" 171:146) — CHỈ dùng cho CHỮ SỐ tiền,
     thanh/nền vẫn dùng --st-done/--st-blocked. Lý do: đo trên nền trắng --st-blocked
     #e2445c chỉ 4.03:1 (fail AA 4.5:1 cho chữ), và --st-done #008844 trên --panel tối
     #1a1a1a chỉ 3.82:1. Bộ dưới đây: 5.45:1 / 5.41:1 sáng, 5.19:1 / 6.36:1 tối. */
  --money-in:#007a3d; --money-out:#c92a3f;
  --pr-urgent:#f50000; --pr-high:#f8ae00; --pr-medium:#6fddff; --pr-low:#d8d8d8;
  /* DESIGN.md "Luật Một Bậc Bo" + "Luật 44": ba bậc bo góc, không có bậc thứ tư;
     vùng bấm chính ≥44px. Bậc mặc định nâng 6→8px và --row-h 40→44px theo hướng
     "ấm hơn, dễ chạm hơn" chủ dự án chốt 12/08/2026 — đổi mật độ lấy vùng bấm,
     vì một đích bấm 30px hỏng lặng lẽ: không ai báo lỗi, họ chỉ bấm trượt. */
  --radius:8px; --radius-sm:6px; --radius-lg:10px; --row-h:44px;
  --shadow:0 1px 2px rgba(0,0,0,.04);
  --shadow-md:0 8px 24px -6px rgba(0,0,0,.18), 0 2px 6px -2px rgba(0,0,0,.08);
  --shadow-rail:0 0 0 1px rgba(0,0,0,.04);
  /* Bản sao ClickUp 14/08/2026: ĐẢO quyết định 03/08 «app không tải webfont nào».
     ClickUp dùng Plus Jakarta Sans; chủ dự án chốt nhận lại một request Google Fonts
     để khớp mặt chữ. Link <link> nằm ở 4 template (index/saas/voucher/invite);
     bỏ link đi thì stack dưới đây tự rơi về Inter rồi system font, không vỡ. */
  --font:"Plus Jakarta Sans","Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Helvetica,Arial,sans-serif;
  --mono:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
}
*{box-sizing:border-box}
/* Base fallback for every inline Lucide icon: without an explicit width/height, an SVG that
   only declares a viewBox collapses to 0×0 in a plain <span>. Every icon-bearing container
   normally gets its own sizing rule (.nav-item svg, .btn svg, …) which — being a more specific
   selector — always wins over this; this is only a safety net for spots that don't. Found via
   audit: the activity-log row-icon span had no class and its icon was silently invisible. */
svg{width:16px;height:16px}
html,body{margin:0;padding:0}
html{
  /* iOS xoay ngang máy rồi xoay lại sẽ TỰ phóng to cỡ chữ ("text inflation"), làm
     bố cục sau khi xoay khác trước khi xoay. 100% tắt hẳn hành vi đó. */
  -webkit-text-size-adjust:100%; text-size-adjust:100%;
}
body{
  font-family:var(--font);
  font-size:13px; line-height:1.5;
  color:var(--text); background:var(--bg);
  -webkit-font-smoothing:antialiased; text-rendering:optimizeLegibility;
  font-feature-settings:"cv02","cv03","cv04","ss01";
}
button{font-family:inherit}
a{color:inherit;text-decoration:none}
/* numeric displays align in columns — an ops-console detail */
.stat .v,.co-mini .n,.gd-counts .n,.ts-total-v,.kpi-vals .cur,.score .n,.chip .cv,.wl-count{
  font-variant-numeric:tabular-nums;font-feature-settings:"tnum"}
::-webkit-scrollbar{width:10px;height:10px}
::-webkit-scrollbar-thumb{background:#cdd4e0;border-radius:8px;border:2px solid var(--bg)}
::-webkit-scrollbar-thumb:hover{background:#b6bece}

:focus-visible{outline:2px solid var(--primary);outline-offset:1px;border-radius:4px}
@media (prefers-reduced-motion:reduce){
  *{animation-duration:.001ms!important;transition-duration:.001ms!important}
}

/* ===== Dark mode ===== */
[data-theme="dark"]{
  --bg:#0b0b0b; --bg-subtle:#141414; --panel:#1a1a1a; --hover:#232323;
  --border:#2e2e2e; --border-strong:#404040;
  --text:#f0f0f0; --text-2:#a8a8a8; --text-3:#8a8a8a;
  /* Nền tối: khúc giữa hạ về đúng --border, pastel hai đầu tối lại kẻo cháy sáng;
     halo mờ hơn vì bóng màu trên nền đen nổi mạnh hơn nhiều so với nền trắng. */
  --brain-edge-1:#8c5f86; --brain-edge-mid:#2e2e2e; --brain-edge-2:#3f6b78;
  --brain-halo-1:rgba(200,120,180,.20); --brain-halo-2:rgba(110,190,210,.16);
  /* #a599f5 trên nền #0b0b0b đạt 7.94:1 — an toàn cho cả chữ, nên dark theme không cần
     token --primary-text riêng như bản sáng (primary tự nó đã đủ đậm/sáng để làm chữ). */
  --primary:#a599f5; --primary-text:#a599f5; --primary-hover:#b6acf7; --primary-weak:#241f3d; --primary-ring:rgba(165,153,245,.28);
  --cta:#f0f0f0; --cta-hover:#ffffff;
  /* Nền tối: track thanh tiến độ tối nên bộ sáng-hơn mới đủ tương phản. */
  --ach-good:#12a06a; --ach-warn:#f59e0b; --ach-bad:#ff6b7f;
  /* Tiền vào/ra trên nền tối: bản sáng #007a3d chỉ 1.5:1 trên --panel #1a1a1a. */
  --money-in:#12a06a; --money-out:#ff6b7f;
  /* Nền đỏ mờ dùng chung cho .grp-tre/.kpi-card.kpi-bad. Trước là rgba(239,68,68,.09-.14)
     — kênh R/G/B gốc (239,68,68) tự nó đã sáng ~0.47, nên script dò tương phản (đọc
     backgroundColor thẳng, KHÔNG hoà alpha vào nền phía sau — cách duy nhất nó phân biệt
     được "chữ trắng trong nút xanh" với "chữ trắng trên nền trắng") chấm nền là gần bằng
     màu chữ đỏ nhạt (~0.47 so với chữ 0.60), dù mắt nhìn thật ra nền hoà với thẻ tối vẫn
     rất sẫm. Hạ kênh màu gốc xuống nâu-đỏ sẫm (127,29,29) — nền "đo được" tụt còn ~0.23,
     cách chữ ≥0.31; tương phản thật (hoà lên --bg/--panel) vẫn 6.1–5.3:1, dư AA 4.5:1. */
  --danger-wash:rgba(127,29,29,.22);
  --rail:#000000; --rail-2:#0a0a0a; --rail-line:#242424;
  --shadow:0 1px 2px rgba(0,0,0,.5);
  --shadow-md:0 16px 40px -10px rgba(0,0,0,.7),0 2px 10px -2px rgba(0,0,0,.5);
}
/* CTA buttons flip to light in dark mode (still "the opposite of canvas", Clickflow-authentic) */
[data-theme="dark"] .btn-primary,[data-theme="dark"] .cmdk-pill kbd{color:#0a0a0a}
/* re-map the most visible hardcoded light surfaces so dark reads cleanly */
[data-theme="dark"] .row{border-bottom-color:#1c2740}
[data-theme="dark"] .kanban .kcard-cells,[data-theme="dark"] .peek-sub,[data-theme="dark"] .kr,
[data-theme="dark"] .report-item,[data-theme="dark"] .gd-kpi,[data-theme="dark"] .gd-kr,
[data-theme="dark"] .peek-rel-row,[data-theme="dark"] .notif-item,[data-theme="dark"] .cmd-detail,
[data-theme="dark"] .r-expand,[data-theme="dark"] .peek-cmt-h{border-color:#243049}
[data-theme="dark"] .badge-muted,[data-theme="dark"] .subchip,[data-theme="dark"] .peek-tag,
[data-theme="dark"] .due,[data-theme="dark"] .v-pending,[data-theme="dark"] .sp-draft,
[data-theme="dark"] .grp-count,[data-theme="dark"] .nav-item .count,[data-theme="dark"] .wl-count,
[data-theme="dark"] .cell-h,[data-theme="dark"] .mine-co,[data-theme="dark"] .row-tag.more{
  background:#1c2740;color:var(--text-2)}
[data-theme="dark"] .grp-h,[data-theme="dark"] .list-head,[data-theme="dark"] .tbl th,
[data-theme="dark"] .cal-wd,[data-theme="dark"] .tl-head,[data-theme="dark"] .tl-corner,
[data-theme="dark"] .tl-daycol.tl-today,[data-theme="dark"] .cal-cell.cal-blank{background:var(--bg-subtle)}
[data-theme="dark"] .chk{background:var(--panel);border-color:var(--border-strong)}
[data-theme="dark"] .toast{background:#1c2740}
[data-theme="dark"] .cmd-pre,[data-theme="dark"] .peek-ai-body,[data-theme="dark"] .peek-cmt,
[data-theme="dark"] .peek-kpi,[data-theme="dark"] .peek-3l-row,[data-theme="dark"] .gd-obj,
[data-theme="dark"] .chip,[data-theme="dark"] .auto-pill,[data-theme="dark"] .wl-chip,
[data-theme="dark"] .ext-link,[data-theme="dark"] .intg-ic{background:var(--bg-subtle);border-color:var(--border)}
[data-theme="dark"] .stat .v.good{color:#34d399}
[data-theme="dark"] .login-wrap{background:linear-gradient(180deg,#0b1018,#0f1626)}
[data-theme="dark"] .theme-toggle .sun{display:none}
.theme-toggle .moon{display:none}
[data-theme="dark"] .theme-toggle .moon{display:inline-flex}

/* ===== Buttons ===== */
.btn{
  display:inline-flex;align-items:center;gap:6px;justify-content:center;
  height:34px;padding:0 14px;border-radius:var(--radius);
  border:1px solid var(--border-strong);background:var(--panel);color:var(--text);
  font-size:13px;font-weight:500;cursor:pointer;white-space:nowrap;
  transition:background .12s,border-color .12s,box-shadow .12s;
}
.btn:hover{background:var(--hover);border-color:var(--border-strong)}
.btn:active{transform:translateY(.5px)}
.btn:disabled{opacity:.5;cursor:not-allowed}
.btn svg{width:15px;height:15px}
.btn-primary{background:var(--cta);border-color:var(--cta);color:#fff}
.btn-primary:hover{background:var(--cta-hover);border-color:var(--cta-hover)}
.btn-sm{height:30px;padding:0 10px;font-size:12px}
.btn-xs{height:26px;padding:0 8px;font-size:12px;border-radius:var(--radius-sm)}
.btn-ghost{border-color:transparent;background:transparent}
.btn-ghost:hover{background:var(--hover)}
.btn-danger{color:#b91c1c}
/* Nút chính của hành động KHÔNG hoàn tác (hộp confirmModal). Phải đứng SAU
   .btn-danger, nếu không quy tắc đó thắng `color` và cho chữ đỏ sẫm trên nền CTA. */
.btn-primary.btn-danger{background:#b91c1c;border-color:#b91c1c;color:#fff}
.btn-primary.btn-danger:hover{background:#991b1b;border-color:#991b1b}
.btn-block{width:100%}

/* ===== Login ===== */
.login-wrap{min-height:100vh;min-height:100dvh;display:flex;align-items:center;justify-content:center;
  background:linear-gradient(180deg,#f7f8fb,#eef1f8);padding:20px}
.login-card{width:100%;max-width:380px;background:var(--panel);border:1px solid var(--border);
  border-radius:10px;box-shadow:var(--shadow-md);padding:32px 28px}
.login-brand{display:flex;align-items:center;gap:10px;margin-bottom:22px}
.login-brand .sq{width:30px;height:30px;border-radius:7px;background:var(--primary);
  color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:15px}
.login-title{font-size:18px;font-weight:600;letter-spacing:-.2px}
.login-sub{font-size:12px;color:var(--text-2);margin:2px 0 22px}
.field{margin-bottom:14px}
.field label{display:block;font-size:12px;font-weight:550;color:var(--text-2);margin-bottom:6px}
.input{width:100%;height:40px;padding:0 12px;border:1px solid var(--border-strong);
  border-radius:var(--radius);font-size:13px;background:var(--panel);color:var(--text)}
.input:focus{border-color:var(--primary);outline:none;box-shadow:0 0 0 3px var(--primary-weak)}
textarea.input{height:auto;min-height:64px;padding:8px 11px;resize:vertical;line-height:1.5}
select.input{cursor:pointer;appearance:none;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24' fill='none' stroke='%235c5c66' stroke-width='2'><polyline points='6 9 12 15 18 9'/></svg>");
  background-repeat:no-repeat;background-position:right 9px center;padding-right:30px}
.login-err{background:#fef2f2;border:1px solid #fecaca;color:#b91c1c;font-size:12px;
  padding:8px 11px;border-radius:var(--radius);margin-bottom:14px}
.login-hint{margin-top:16px;font-size:12px;color:var(--text-3);text-align:center;line-height:1.6}

/* ===== App shell ===== */
/* 100dvh KHÔNG phải là làm đẹp: trên Safari/Chrome mobile, 100vh tính theo viewport
   khi thanh địa chỉ ĐANG ẨN, tức luôn CAO HƠN phần thật sự nhìn thấy. Hậu quả đo được:
   đáy khung (thanh hành động, nút Lưu) nằm khuất dưới thanh địa chỉ, và mỗi lần cuộn
   làm thanh đó ẩn/hiện thì chiều cao khung đổi theo — layout giật lên giật xuống.
   Giữ dòng 100vh phía trên làm dự phòng cho trình duyệt cũ chưa hiểu dvh. */
.app{display:flex;height:100vh;height:100dvh;overflow:hidden}
/* ===== Vỏ ClickUp: rail đen 64px + cột điều hướng TRẮNG + thanh trên 56px ===== */
.appwrap{display:flex;flex-direction:column;height:100vh;min-height:0}
.appwrap>.app{flex:1;min-height:0;height:auto}
.topbar{height:56px;flex:0 0 56px;display:flex;align-items:center;gap:12px;padding:0 14px;
  background:var(--panel);border-bottom:1px solid var(--border);position:relative;z-index:60}
.topbar .tb-ws{display:flex;align-items:center;gap:9px;height:34px;padding:0 11px 0 8px;
  border-radius:8px;background:var(--hover);font-weight:700;font-size:15px;color:var(--text);
  border:none;cursor:pointer;max-width:280px}
.topbar .tb-ws .sq{width:22px;height:22px;border-radius:6px;display:grid;place-items:center;
  color:#fff;font-size:12px;font-weight:800;flex:0 0 22px}
.topbar .tb-ws .nm{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Ô tìm căn giữa tuyệt đối theo cửa sổ, không theo dòng flex — đúng như ClickUp,
   và không bị đẩy lệch khi tên công ty dài ngắn khác nhau. */
.topbar .tb-search{position:absolute;left:50%;transform:translateX(-50%);width:min(520px,38vw);
  height:34px;display:flex;align-items:center;gap:10px;padding:0 12px;border:1px solid var(--border);
  border-radius:999px;background:var(--panel);color:var(--text-3);font-size:13.5px;cursor:pointer}
.topbar .tb-search svg{width:16px;height:16px;flex:0 0 16px}
.topbar .tb-search kbd{margin-left:auto;border:1px solid var(--border);border-radius:4px;
  padding:2px 5px;font:600 11px/1 var(--font);color:var(--text-3)}
.topbar .tb-right{margin-left:auto;display:flex;align-items:center;gap:8px}
@media(max-width:1080px){.topbar .tb-search{display:none}}
.rail{width:64px;flex:0 0 64px;background:var(--rail);display:flex;flex-direction:column;
  align-items:center;gap:6px;padding:10px 0}
.rail .rail-logo{width:38px;height:38px;border-radius:11px;display:grid;place-items:center;
  background:linear-gradient(150deg,#2b2b45,#0d0d0d);box-shadow:inset 0 0 0 1px rgba(255,255,255,.12);
  color:#fff;font-weight:800;font-size:15px;margin-bottom:8px}
.rail .rail-item{width:38px;height:38px;border-radius:10px;display:grid;place-items:center;
  color:var(--rail-muted);background:none;border:none;cursor:pointer;transition:background .12s,color .12s}
.rail .rail-item svg{width:18px;height:18px}
.rail .rail-item:hover{background:var(--rail-hover);color:var(--rail-text)}
.rail .rail-item.active{background:var(--rail-active);color:#fff}
.rail .rail-sp{flex:1}
@media(max-width:900px){.rail{display:none}}
/* Ô vuông Space 18px trên mỗi mục điều hướng — dấu nhận biết của ClickUp. */
.nav-item .navsq{width:18px;height:18px;flex:0 0 18px;border-radius:5px;display:grid;
  place-items:center;color:#fff;font-size:10px;font-weight:800;line-height:1}
.sidebar{width:300px;flex:0 0 300px;background:var(--panel);color:var(--text);
  display:flex;flex-direction:column;height:100vh;height:100dvh;position:relative}
.main{flex:1;display:flex;flex-direction:column;overflow:hidden;background:var(--bg)}

/* Sidebar — command rail */
.ws-header{padding:14px 12px 8px;position:relative}
.ws-btn{width:100%;display:flex;align-items:center;gap:10px;padding:7px 8px;border-radius:var(--radius);
  cursor:pointer;border:1px solid transparent;background:transparent;transition:background .12s}
.ws-btn:hover{background:var(--rail-hover)}
.ws-btn .sq{width:28px;height:28px;border-radius:8px;color:#fff;display:flex;align-items:center;
  justify-content:center;font-weight:700;font-size:11px;flex:0 0 28px;
  box-shadow:inset 0 0 0 1px rgba(255,255,255,.14),0 1px 2px rgba(0,0,0,.3)}
.ws-meta{min-width:0;text-align:left;flex:1}
.ws-name{font-weight:600;font-size:13.5px;color:var(--rail-text-strong);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ws-role{font-size:11px;color:var(--rail-muted)}
.ws-caret{color:var(--rail-muted);flex:0 0 auto}

.switcher{position:absolute;top:52px;left:12px;right:12px;z-index:60;background:var(--panel);
  border:1px solid var(--border-strong);border-radius:8px;box-shadow:var(--shadow-md);
  padding:5px;max-height:60vh;overflow:auto}
.switcher .sw-item{display:flex;align-items:center;gap:9px;padding:7px 8px;border-radius:var(--radius);
  cursor:pointer}
.switcher .sw-item:hover{background:var(--hover)}
.switcher .sw-item.active{background:var(--primary-weak)}
.switcher .sq{width:22px;height:22px;border-radius:5px;color:#fff;display:flex;align-items:center;
  justify-content:center;font-weight:700;font-size:11px;flex:0 0 22px}
.sw-all .sq{background:#1c1c1e}
/* Thêm/Ngừng dùng công ty — HÀNH ĐỘNG, không phải lựa chọn công ty. Đường kẻ +
   chữ nhạt hơn để mắt tách được hai nhóm mà không cần đọc: bên trên bấm là ĐỔI
   chỗ làm việc, bên dưới bấm là MỞ một hộp thoại.
   Màu đỏ chỉ nằm trên Ô VUÔNG, không tô cả dòng: một dòng đỏ nguyên trong danh
   sách đọc như một cảnh báo đang xảy ra chứ không như một nút bấm được.
   Dùng `--text-2`/`--text` (có thật ở CẢ hai chủ đề, dòng 11 và 88) chứ không
   bịa `--text-dim`: một biến không tồn tại thì `color` không áp, chữ thừa hưởng
   màu cha, và ở chủ đề tối đó đúng là kiểu "chữ chìm vào nền" vừa phải đi sửa
   mấy lượt. Đỏ lấy đúng `#b91c1c` của `.btn-danger` thay vì một biến mới. */
.switcher .sw-sep{height:1px;background:var(--border);margin:5px 2px}
.switcher .sw-item.sw-act .sw-name{color:var(--text-2)}
.switcher .sw-item.sw-act:hover .sw-name{color:var(--text)}
.sw-name{font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}

.nav{flex:1;overflow:auto;padding:6px 8px}
.nav-sec{display:flex;align-items:center;gap:4px;width:100%;font-size:11px;font-weight:700;
  letter-spacing:.7px;text-transform:uppercase;color:var(--rail-muted);padding:14px 8px 5px;
  border:none;background:none;cursor:pointer;text-align:left;font-family:inherit}
.nav-sec:hover{color:var(--rail-text)}
.nav-sec-t{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.nav-sec-caret{flex:0 0 auto;font-size:9px;line-height:1;color:var(--rail-muted);transition:transform .15s}
.nav-group.collapsed .nav-sec-caret{transform:rotate(-90deg)}
.nav-group.collapsed .nav-items{display:none}
/* Cột điều hướng nay là NỀN TRẮNG (chỉ rail 64px còn đen), nên mọi mực ở đây đổi
   từ họ --rail-* sang họ --text-*. Chiều cao mục 44→34px theo ClickUp; Luật 44 vẫn
   giữ cho vùng bấm trên màn cảm ứng (khối @media ở cuối tệp nâng lại 44px). */
.nav-item{display:flex;align-items:center;gap:10px;padding:0 8px;min-height:34px;border-radius:var(--radius-sm);
  cursor:pointer;color:var(--text);font-weight:500;font-size:14.5px;border:none;background:none;width:100%;
  text-align:left;position:relative;transition:background .12s,color .12s}
.nav-item:hover{background:var(--hover);color:var(--text)}
.nav-item.active{background:#eceef1;color:var(--text);font-weight:600}
.nav-item.active svg{color:var(--text)}
.nav-item svg{width:16px;height:16px;flex:0 0 16px;stroke-width:1.8;color:var(--text-3);transition:color .12s}
.nav-item:hover svg{color:var(--text-2)}
.nav-item .count{margin-left:auto;font-size:11px;color:var(--text-2);background:var(--hover);
  padding:1px 7px;border-radius:20px;font-weight:600}

.side-user{border-top:1px solid var(--border);padding:11px 10px;display:flex;align-items:center;gap:10px}
.avatar{width:28px;height:28px;border-radius:50%;background:var(--primary);color:#fff;
  display:flex;align-items:center;justify-content:center;font-weight:600;font-size:11px;flex:0 0 28px}
.side-user .avatar{box-shadow:inset 0 0 0 1px rgba(255,255,255,.16)}
.side-user .meta{min-width:0;flex:1}
.side-user .u-name{font-size:12px;font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.side-user .u-role{font-size:11px;color:var(--text-3)}
.side-user .icon-btn{background:transparent;border-color:var(--border);color:var(--text-3)}
.side-user .icon-btn:hover{background:var(--rail-hover);color:var(--rail-text-strong)}

/* Header bar — never let overflow wrap/overlap; crumbs truncate before anything breaks */
.header{min-height:52px;flex:0 0 auto;border-bottom:1px solid var(--border);display:flex;
  align-items:center;padding:8px 18px;gap:12px;background:var(--panel);flex-wrap:wrap;row-gap:6px}
.crumbs{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--text-2);
  min-width:110px;flex:2 1 180px;white-space:nowrap;overflow:hidden}
.crumbs .sep{color:var(--text-3);flex:0 0 auto;margin:0 2px}
.crumbs .crumb-link{color:var(--primary-text);cursor:pointer;text-decoration:none;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.crumbs .crumb-link:hover{text-decoration:underline;color:var(--primary-hover)}
.crumbs span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.crumbs .cur{color:var(--text);font-weight:600;letter-spacing:-.1px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.header-actions{margin-left:auto;display:flex;align-items:center;gap:8px;flex:0 1 auto;
  flex-wrap:wrap;justify-content:flex-end;row-gap:6px}
.hamburger{display:none}

/* View toggle — Clickflow-style flat tabs with a bottom-border indicator (not a segmented pill) */
.seg{display:inline-flex;flex-wrap:wrap;border:none;border-radius:0;overflow:visible;gap:0;
  border-bottom:1px solid var(--border)}
.seg button{height:30px;padding:0 8px;border:none;background:transparent;cursor:pointer;
  font-size:12px;font-weight:500;color:var(--text-2);display:flex;align-items:center;gap:5px;
  border-bottom:2px solid transparent;margin-bottom:-1px;transition:color .12s,border-color .12s;
  white-space:nowrap}
.seg button:hover{color:var(--text)}
.seg button + button{border-left:none}
.seg button.active{background:transparent;color:var(--text);font-weight:600;border-bottom-color:var(--text)}
.seg svg{width:14px;height:14px}
/* Mỗi loại view một ô vuông màu riêng, như ClickUp — biểu tượng đơn sắc
   khiến sáu tab trông như một dãy chữ, mắt phải đọc mới phân biệt được. */
.seg .segsq{width:18px;height:18px;flex:0 0 18px;border-radius:5px;display:grid;place-items:center;
  margin-right:2px}
.seg .segsq svg{width:11px;height:11px;color:#fff;stroke-width:2.2}

.content{flex:1;overflow:auto;padding:20px 24px 40px}
.page-title{font-size:19px;font-weight:700;letter-spacing:-.4px;margin:0 0 3px}
.page-sub{font-size:12px;color:var(--text-2);margin:0 0 18px}
.section-h{font-size:11px;font-weight:700;letter-spacing:.5px;text-transform:uppercase;color:var(--text-3);
  margin:24px 0 11px;display:flex;align-items:center;gap:8px}

/* ===== Cards / dashboard ===== */
/* UIUX fix: the generic ".card" wrapper (Social Growth's #1 layout primitive —
   context header, list rows, detail panels, settings sections: 300+ call
   sites) had NO rule at all in this file (verified back to the initial
   commit) — every el(..,{class:"card"}) rendered with zero border/background/
   radius/shadow, relying on whatever ad hoc inline style the call site
   happened to add. Matches the sibling card-family classes below
   (.stat/.co-card/.kpi-card/.panel-card) so "card" finally looks like one. */
.card{background:var(--panel);border:1px solid var(--border);border-radius:8px;
  padding:14px 16px;box-shadow:var(--shadow)}
/* Generic drag affordance for any .card used as a draggable/droppable tile
   outside the .kcard/.kcol kanban family (e.g. the Social Calendar's
   draggable day items + drop-target day cells) — same visual language as
   .kcard.drag / .kcol.dragover below, so drag feedback isn't kanban-only. */
.card.drag{opacity:.4}
.card.dragover{outline:2px dashed var(--primary);outline-offset:-3px}
.grid{display:grid;gap:14px}
/* auto-fit (not auto-fill): auto-fill reserves phantom empty tracks past the
   item count, splitting the row's width across them too — cards stay pinned
   near the 155px min even when the row has plenty of spare width. auto-fit
   collapses those empty tracks so the real cards stretch to fill. */
.stat-grid{grid-template-columns:repeat(auto-fit,minmax(200px,1fr))}
.stat{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:14px 16px;
  box-shadow:var(--shadow);transition:box-shadow .14s,border-color .14s}
.stat:hover{box-shadow:var(--shadow-md);border-color:var(--border-strong)}
.stat .k{font-size:11px;font-weight:600;letter-spacing:.2px;color:var(--text-2);text-transform:uppercase;display:flex;align-items:center;gap:6px}
.stat .v{font-size:26px;font-weight:750;letter-spacing:-.6px;margin-top:6px}
.stat .v.warn{color:var(--st-progress)}
.stat .v.bad{color:var(--st-blocked)}
.stat .v.good{color:var(--st-done)}
/* Figma Trang chủ 111:62 — thẻ cần hành động nhuộm cả card; giá trị 0 làm mờ */
.stat.stat-bad{background:#fef2f2;border-color:var(--st-blocked)}
.stat.stat-warn{background:#fffbeb;border-color:var(--st-progress)}
.stat.stat-dim .v{color:var(--text-3);font-weight:600}
[data-theme="dark"] .stat.stat-bad{background:rgba(239,68,68,.09)}
/* Kênh gốc (245,158,11) tự nó đọc ~0.66 sáng (script đo backgroundColor không hoà
   alpha vào nền phía sau — xem giải thích --danger-wash phía trên) — trùng khít độ
   sáng của CẢ HAI chữ bên trong thẻ: .stat .k dùng --text-2 (~0.66) và .stat .v.warn
   dùng --ach-warn (~0.66, xem đo 2026-08-03 ở dưới), nên "Báo cáo gửi (hôm nay)" đọc
   ra chữ trùng nền dù mắt nhìn thẻ vẫn tối. Hạ kênh gốc xuống nâu hổ phách sẫm để nền
   đo được tụt về ~0.31 (cách cả hai chữ ≥0.34); tương phản thật (hoà lên --bg) vẫn
   7.3:1 (.k) và 8.1:1 (.v.warn). */
[data-theme="dark"] .stat.stat-warn{background:rgba(120,72,10,.22)}
/* Figma Goal 156:517 — goal rủi ro (health badge-danger) nhuộm cả card, cùng ngữ nghĩa stat-bad */
.co-card.goal-risk{background:#fef2f2;border-color:var(--st-blocked)}
[data-theme="dark"] .co-card.goal-risk{background:rgba(239,68,68,.09)}
/* Skeleton thẻ số Trang chủ (Figma 107:2) */
.skel-stat{gap:12px}

.co-grid{grid-template-columns:repeat(auto-fill,minmax(270px,1fr));align-items:stretch}
.co-card{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:15px;
  cursor:pointer;box-shadow:var(--shadow);transition:box-shadow .12s,transform .12s,border-color .12s;
  min-height:180px;display:flex;flex-direction:column}
.co-card:hover{box-shadow:var(--shadow-md);border-color:var(--border-strong);transform:translateY(-1px)}
.co-top{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.co-top .sq{width:34px;height:34px;border-radius:8px;color:#fff;display:flex;align-items:center;
  justify-content:center;font-weight:700;font-size:13px;flex:0 0 34px}
.co-name{font-weight:600;font-size:14px}
.co-code{font-size:11px;color:var(--text-3)}
.co-mini{display:flex;gap:14px;margin-bottom:10px}
.co-mini .m .n{font-size:17px;font-weight:700}
.co-mini .m .l{font-size:11px;color:var(--text-3)}
.progress{height:6px;border-radius:6px;background:#ececef;overflow:hidden}
.progress > span{display:block;height:100%;border-radius:6px}
.co-foot{display:flex;align-items:center;gap:8px;margin-top:10px;font-size:12px;color:var(--text-2);
  flex-wrap:wrap}

/* Badges — Clickflow-style: 6px radius, uppercase functional-status chips */
.badge{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-weight:700;
  padding:2px 8px;border-radius:6px;line-height:1.6;white-space:nowrap;
  text-transform:uppercase;letter-spacing:.3px}
.badge .dot{width:7px;height:7px;border-radius:50%;background:currentColor}
.badge-flag{background:#fff4e5;color:#8a5400}
.badge-ok{background:#e7f6ee;color:#1a7d4f}
.badge-muted{background:rgba(0,0,0,.06);color:var(--text-2)}
/* badge-err / badge-warn: 22 chỗ trong app.js dùng hai lớp này (trạng thái lỗi
   webhook, request log 4xx/5xx, mức rủi ro lệnh AI, chiến dịch Marketing+) nhưng
   CSS chưa bao giờ định nghĩa chúng — badge rơi về mỗi `.badge` gốc, tức chữ đen
   IN HOA không nền, đọc như văn bản thường chứ không phải cảnh báo. Dùng lại đúng
   cặp màu đã đo tương phản của badge-danger (lỗi) và badge-flag (cảnh báo) thay vì
   bịa màu mới. */
.badge-err{background:#fdecec;color:#b8283f}
[data-theme="dark"] .badge-err{background:rgba(226,68,92,.18);color:#ff6b7f}
.badge-warn{background:#fff4e5;color:#8a5400}
[data-theme="dark"] .badge-warn{background:rgba(176,96,0,.22);color:#f0b357}
/* UIUX fix: badge text contrast measured against WCAG 2.1 AA (4.5:1, these
   badges are 10.5px bold — under the 18.66px-bold "large text" cutoff, so
   they need the full ratio, not the 3:1 large-text one). Original colors
   (kept as comments) measured BELOW 4.5:1 against their own badge
   background: badge-flag #b06000 -> 4.27:1, badge-ai #5237c9 (đổi từ #0880ea theo palette tím) -> 6.69:1,
   badge-danger (below) #e2445c -> 3.53:1 light / 3.58:1 dark. Same hue
   family, darkened just enough to clear 4.5:1 with margin; --primary/
   --st-blocked themselves are untouched (used everywhere else — buttons,
   links, focus rings — outside this pass's scope). */
.badge-ai{background:var(--primary-weak);color:#5237c9}
[data-theme="dark"] .badge-ai{color:var(--primary-text)}
.btn-ai{background:var(--primary-weak);border-color:var(--primary-weak);color:#5237c9}
.btn-ai:hover{background:var(--primary);border-color:var(--primary);color:#fff}
[data-theme="dark"] .btn-ai{color:var(--primary-text)}
[data-theme="dark"] .btn-ai:hover{color:#fff}

/* ===== Task board (list) ===== */
.board{background:var(--panel);border:1px solid var(--border);border-radius:8px;overflow:hidden}
.grp{border-bottom:1px solid var(--border)}
.grp:last-child{border-bottom:none}
/* Đầu nhóm theo ClickUp: viên thuốc ĐẶC màu trạng thái, không phải chấm tròn + chữ.
   Nền nhóm trả về trắng — dải xám cũ chia bảng thành từng khối rời, ClickUp để trôi
   liền một mạch và chỉ dùng viên thuốc làm mốc mắt. */
.grp-h{display:flex;align-items:center;gap:10px;padding:14px 14px 8px;cursor:pointer;background:var(--panel);
  user-select:none}
.grp-h:hover{background:var(--panel)}
.grp-h .chev{color:var(--text-3);transition:transform .15s}
.grp-h.collapsed .chev{transform:rotate(-90deg)}
.grp-dot{display:none}
.grp-name{display:inline-flex;align-items:center;height:24px;padding:0 10px;border-radius:var(--radius-sm);
  color:#fff;font-weight:800;font-size:11.5px;text-transform:uppercase;letter-spacing:.3px}

.grp-count{font-size:13px;color:var(--text-3);background:none;padding:0;font-weight:600}
.grp-add{margin-left:auto;color:var(--text-3);opacity:0;transition:opacity .1s}
.grp-h:hover .grp-add{opacity:1}

.list-head{display:flex;align-items:center;padding:6px 14px;font-size:11px;font-weight:600;
  text-transform:uppercase;letter-spacing:.3px;color:var(--text-3);border-bottom:1px solid var(--border);
  background:var(--panel)}
.row{display:flex;align-items:center;gap:10px;min-height:var(--row-h);padding:6px 14px;
  border-bottom:1px solid #f0f0f2;transition:background .1s}
.row:last-child{border-bottom:none}
.row:hover{background:var(--hover)}
/* Hàng trễ hạn: tín hiệu mức hàng (heuristic #8) — nền hồng nhạt + vạch đỏ trái,
   chip ngày .due.overdue vẫn là con số cụ thể. */
.row-overdue{background:#fff8f8;box-shadow:inset 3px 0 0 var(--st-blocked)}
.row-overdue:hover{background:#fef2f2}
[data-theme="dark"] .row-overdue{background:rgba(239,68,68,.07)}
[data-theme="dark"] .row-overdue:hover{background:rgba(239,68,68,.12)}
/* Đếm việc trễ trên header nhóm — cạnh .grp-count */
.grp-tre{font-size:11px;font-weight:600;color:#dc2626;background:#fef2f2;padding:1px 7px;border-radius:20px}
/* Xem giải thích --danger-wash ở khối biến [data-theme="dark"] — chỉ báo trễ hạn
   cần nổi nhất bảng nên KHÔNG chấp nhận mức "tạm đọc được", phải đủ AA 4.5:1 thật. */
[data-theme="dark"] .grp-tre{background:var(--danger-wash);color:#f87171}
/* Nút mở/gập cụm ô lọc ít dùng (Hick) */
.filter-more-btn{color:var(--text-2);border-style:dashed}
.row .pri{flex:0 0 16px;display:flex;align-items:center;justify-content:center}
.pri-bars{display:flex;align-items:flex-end;gap:1.5px;height:12px}
.pri-bars i{width:3px;border-radius:1px;background:#d5d5d8;display:block}
.pri-bars i.on{background:var(--c)}
.pri-sq{width:13px;height:13px;border-radius:3px;display:flex;align-items:center;justify-content:center}
.row .r-title{flex:1;min-width:0;font-size:13px;font-weight:500;display:flex;align-items:center;gap:8px}
.row .r-title .t{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tag-ai{font-size:9.5px;font-weight:700;background:var(--primary-weak);color:var(--primary-text);
  padding:1px 5px;border-radius:4px;letter-spacing:.3px;flex:0 0 auto}
.r-assignee{display:flex;align-items:center;gap:6px;flex:0 0 auto;width:150px;min-width:0;color:var(--text-2);font-size:12px}
.r-assignee .avatar{width:20px;height:20px;font-size:9px}
.r-assignee .an{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.due{font-size:12px;color:var(--text-2);flex:0 0 auto;display:inline-flex;align-items:center;gap:4px;
  padding:2px 7px;border-radius:5px;background:#f1f1f3;width:96px;justify-content:center}
.due.overdue{background:#fef2f2;color:#dc2626;font-weight:600}
.due.none{color:var(--text-3);background:transparent}

/* Three check cells */
.cells{display:flex;align-items:center;gap:6px;flex:0 0 auto}
.cell{width:96px;display:flex;align-items:center;justify-content:center}
.chk{width:18px;height:18px;border:1.6px solid var(--border-strong);border-radius:5px;cursor:pointer;
  display:flex;align-items:center;justify-content:center;background:var(--panel);transition:all .12s;flex:0 0 18px;
  position:relative}
/* WCAG 2.2 target size: nới vùng bấm lên 24px mà không đổi hình vẽ 18px */
.chk::after{content:"";position:absolute;inset:-3px}
.chk:hover:not(:disabled){border-color:var(--primary)}
.chk.on{background:var(--st-done);border-color:var(--st-done);color:#fff}
.chk.on.mgr{background:var(--primary);border-color:var(--primary)}
.chk:disabled{cursor:not-allowed;opacity:.55}
.chk svg{width:12px;height:12px}
.ai-cell{display:flex;align-items:center;gap:5px}
.verdict{font-size:11px;font-weight:600;padding:2px 7px;border-radius:5px;white-space:nowrap}
.v-pending{background:#f1f1f3;color:var(--text-2)}
.v-pass{background:#f0fdf4;color:#15803d}
.v-warn{background:#fff7ed;color:#c2410c}
.v-fail{background:#fef2f2;color:#dc2626}
.icon-btn{width:24px;height:24px;border:1px solid var(--border-strong);border-radius:5px;background:var(--panel);
  cursor:pointer;display:flex;align-items:center;justify-content:center;color:var(--text-2);flex:0 0 24px}
.icon-btn:hover{background:var(--hover);color:var(--primary-text)}
.icon-btn svg{width:13px;height:13px}
/* Hàng thao tác trong bảng (Nhân sự…): 24px sát ngưỡng tối thiểu WCAG 2.2,
   nới 28px cho cụm 3 nút đứng cạnh nhau đỡ bấm nhầm. */
.icon-btn-lg{width:28px;height:28px;flex:0 0 28px;border-radius:6px}
.icon-btn-lg svg{width:14px;height:14px}
.cell-h{width:96px;text-align:center}

.r-expand{padding:2px 14px 12px 56px;background:var(--bg-subtle);border-bottom:1px solid #f0f0f2;
  font-size:12px;color:var(--text-2);display:grid;gap:6px}
.r-expand .lab{font-weight:600;color:var(--text);font-size:11px}
.r-expand .box{background:var(--panel);border:1px solid var(--border);border-radius:6px;padding:8px 10px}

/* ===== Kanban — Clickflow board: white canvas, chip column headers ===== */
.kanban{display:flex;gap:12px;overflow-x:auto;padding-bottom:8px;align-items:flex-start}
.kcol{flex:0 0 276px;width:276px;background:transparent;border:none;border-radius:8px;
  display:flex;flex-direction:column;max-height:100%}
.kcol-h{display:flex;align-items:center;gap:7px;font-weight:700;font-size:11px;
  text-transform:uppercase;letter-spacing:.3px;padding:5px 10px;border-radius:6px;
  background:rgba(0,0,0,.045);width:fit-content;margin-bottom:10px}
/* Figma CRM 157:280: badge đếm nằm CẠNH tên cột (không đẩy phải) — chỗ phải
   dành cho tổng tiền cột (marginLeft:auto inline trong crmPipeline). */
.kcol-h .grp-count{font-weight:700}
.kcards{padding:0 2px 10px;display:flex;flex-direction:column;gap:8px;overflow:auto}
.kcard{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:10px 11px;
  box-shadow:none;cursor:grab;transition:box-shadow .12s,border-color .12s}
.kcard:hover{box-shadow:var(--shadow-md);border-color:var(--border-strong)}
/* DESIGN.md "Luật Không Viền Một Bên": dải 3px cạnh trái đổi thành viền đậm đủ
   bốn cạnh. Nghĩa giữ nguyên (thẻ này được nhấn), hình thì hết đọc như tab. */
.kcard-accent{border-color:var(--border-strong)}
.kcard.drag{opacity:.4}
.kcol.dragover{outline:2px dashed var(--primary);outline-offset:-3px;border-radius:8px}
.kcard-title{font-size:12px;font-weight:550;margin-bottom:8px;display:flex;gap:6px;align-items:flex-start}
.kcard-meta{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.kcard-cells{display:flex;align-items:center;justify-content:space-between;gap:6px;margin-top:9px;padding-top:9px;border-top:1px solid #f0f0f2}
.qadd-trigger{display:flex;align-items:center;gap:6px;width:100%;padding:7px 8px;background:transparent;
  border:1px dashed transparent;border-radius:6px;color:var(--text-3);font-size:12px;font-weight:500;
  cursor:pointer;text-align:left;transition:background .12s,border-color .12s,color .12s}
.qadd-trigger:hover{background:var(--hover);border-color:var(--border);color:var(--text-2)}
.qadd-trigger svg{opacity:.7;flex:0 0 auto}
.qadd-input{width:100%;height:30px;font-size:12px}
.kanban-qadd{padding:0 2px;flex:0 0 auto}
/* Hàng tạo tại chỗ ở cuối mỗi nhóm. Cơ chế đã có sẵn (quickAddRow) — pass này chỉ
   đổi dáng cho khớp ClickUp: cao 40px, kéo hết chiều ngang, viền dưới liền mạch
   với các dòng việc phía trên thay vì thụt vào như một nút lẻ. */
.list-qadd{padding:0}
.list-qadd .qadd-trigger{min-height:40px;padding:0 14px;border:none;border-bottom:1px solid #f0f0f2;
  border-radius:0;font-size:14px;gap:9px}
.list-qadd .qadd-trigger:hover{background:var(--hover);border-color:transparent;
  border-bottom:1px solid #f0f0f2;color:var(--text)}
.kchk{display:flex;align-items:center;gap:3px;font-size:11px;font-weight:700;letter-spacing:.2px;color:var(--text-3);
  background:var(--bg-subtle);padding:2px 6px;border-radius:5px;transition:background .12s,color .12s;white-space:nowrap}
.kchk svg{width:10px;height:10px}
.kchk.kchk-on{color:#15803d;background:#f0fdf4}
.kchk.kchk-on.mgr{color:var(--primary-text);background:var(--primary-weak)}
[data-theme="dark"] .kchk{background:rgba(255,255,255,.06)}
[data-theme="dark"] .kchk.kchk-on{background:rgba(41,151,100,.18)}
[data-theme="dark"] .kchk.kchk-on.mgr{background:rgba(8,128,234,.18)}

/* ===== Tables ===== */
.tbl{width:100%;border-collapse:collapse;background:var(--panel);border:1px solid var(--border);border-radius:8px;
  overflow:hidden;font-size:12px}
.tbl th{text-align:left;font-size:11px;text-transform:uppercase;letter-spacing:.3px;color:var(--text-3);
  font-weight:600;padding:9px 12px;border-bottom:1px solid var(--border);background:var(--bg-subtle)}
.tbl td{padding:9px 12px;border-bottom:1px solid #f0f0f2}
.tbl tr:last-child td{border-bottom:none}
.tbl tr:hover td{background:var(--hover)}
.tbl .tbl-user{display:flex;align-items:center;gap:8px}

/* ===== KPI / OKR ===== */
.kpi-grid{grid-template-columns:repeat(auto-fill,minmax(260px,1fr))}
.kpi-card{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:14px;box-shadow:var(--shadow)}
/* KPI trượt chuẩn (<30%) nổi như .stat-bad Trang chủ; KPI chưa đo chìm xám —
   card đạt chuẩn giữ nền trắng yên tĩnh để rủi ro là thứ duy nhất hút mắt. */
.kpi-card.kpi-bad{background:#fef2f2;border-color:var(--st-blocked)}
/* Xem giải thích --danger-wash ở khối biến [data-theme="dark"]: kênh gốc (239,68,68)
   đọc ~0.47, gần trùng DIV.muted "kỳ đo" và SPAN.tgt "/ chỉ tiêu" bên trong thẻ (cả
   hai dùng --text-3 ~0.54) — 12 chỗ bị chấm chữ chìm nền dù cùng một thẻ .kpi-bad. */
[data-theme="dark"] .kpi-card.kpi-bad{background:var(--danger-wash)}
.kpi-card.kpi-dim .kpi-vals .cur{color:var(--text-3)}
.kpi-name{font-weight:600;font-size:13px}
.kpi-vals{display:flex;align-items:baseline;gap:6px;margin:8px 0 4px}
.kpi-vals .cur{font-size:20px;font-weight:700}
.kpi-vals .tgt{font-size:12px;color:var(--text-3)}
/* float bị flex cha nuốt ⇒ % dính sát tên KPI ("Doanh thu tháng64%"); hàng cha giờ
   tự dàn space-between nên pill chỉ cần đứng yên. */
.kpi-ach{font-size:12px;font-weight:700;flex:0 0 auto}
.okr{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:15px;margin-bottom:14px;
  box-shadow:var(--shadow)}
.okr-h{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.okr-title{font-weight:600;font-size:14px;flex:1}
.kr{display:flex;align-items:center;gap:12px;padding:8px 0;border-top:1px solid #f0f0f2}
.kr-title{flex:1;font-size:12px}
.kr-prog{width:130px}
.kr-pct{font-size:12px;font-weight:600;width:42px;text-align:right}

/* ===== AI Report ===== */
.airep{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:16px;margin-bottom:14px;
  box-shadow:var(--shadow)}
.airep-h{display:flex;align-items:flex-start;gap:10px;margin-bottom:8px}
.airep-title{font-weight:600;font-size:14.5px;flex:1}
.airep-period{font-size:12px;color:var(--text-3)}
.chips{display:flex;flex-wrap:wrap;gap:8px;margin:10px 0}
.chip{background:var(--bg-subtle);border:1px solid var(--border);border-radius:7px;padding:6px 10px;font-size:12px}
.chip .cv{font-weight:700;font-size:14px;display:block}
.chip .cl{color:var(--text-3);font-size:11px}
.tpl-chip{background:var(--panel);border:1px solid var(--border-strong);border-radius:20px;padding:4px 12px;font-size:12px;
  font-weight:500;color:var(--text-2);cursor:pointer;white-space:nowrap;transition:background .12s,border-color .12s,color .12s}
.tpl-chip:hover{background:var(--hover)}
.tpl-chip.active{background:var(--primary-weak);border-color:var(--primary);color:var(--primary-text);font-weight:600}
.recs{margin:8px 0 0;padding-left:18px;font-size:12px;color:var(--text-2)}
.recs li{margin:3px 0}
.risk-low{background:#f0fdf4;color:#15803d}
.risk-medium{background:#fff7ed;color:#c2410c}
.risk-high{background:#fef2f2;color:#dc2626}
.risk-critical{background:#fef2f2;color:#991b1b}

/* ===== Integrations ===== */
.intg-grid{grid-template-columns:repeat(auto-fit,minmax(215px,1fr))}
.intg{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:13px;box-shadow:var(--shadow)}
.intg-top{display:flex;align-items:center;gap:9px;margin-bottom:9px}
.intg-ic{width:32px;height:32px;border-radius:8px;background:var(--bg-subtle);border:1px solid var(--border);
  display:flex;align-items:center;justify-content:center;color:var(--text-2);flex:0 0 32px}
.intg-ic svg{width:17px;height:17px}
.intg-name{font-weight:600;font-size:13px}
.intg-cat{font-size:11px;color:var(--text-3)}
/* UI/UX pass Kết nối (Figma 257:166): mô tả 1 dòng; connector chưa nối dim nhẹ;
   card cần uỷ quyền lại là tín hiệu đỏ duy nhất của trang; chip lọc nhóm. */
.intg-desc{font-size:12px;color:var(--text-2);margin:0 0 8px;display:-webkit-box;
  -webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.intg-dim{opacity:.8}
.intg-dim:hover,.intg-dim:focus-within{opacity:1}
.intg-alert{border-color:#fca5a5;background:#fffafa}
[data-theme="dark"] .intg-alert{border-color:rgba(239,68,68,.55);background:rgba(239,68,68,.06)}
/* CTA card ≥24px (Fitts) — btn-xs 22px chỉ giữ cho chỗ khác */
.intg-actions .btn{height:26px}
.intg-chipbar{display:flex;flex-wrap:wrap;gap:6px;margin:0 0 12px}
.intg-chip{font-size:12px;font-weight:500;color:var(--text-2);background:var(--bg-subtle);
  border:1px solid var(--border);border-radius:999px;padding:3px 10px;cursor:pointer;height:24px;
  transition:background .12s,border-color .12s,color .12s}
.intg-chip:hover{border-color:var(--border-strong);color:var(--text)}
.intg-chip.on{background:var(--primary-weak);border-color:var(--primary);color:var(--primary-text);font-weight:600}
[data-theme="dark"] .intg-chip{background:var(--bg-subtle)}
[data-theme="dark"] .intg-chip.on{background:rgba(123,104,238,.18)}

/* ===== Daily report ===== */
.two-col{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.panel-card{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:16px;
  box-shadow:var(--shadow)}
.status-pill{display:inline-flex;align-items:center;gap:6px;font-size:11px;font-weight:700;padding:3px 10px;
  border-radius:6px;text-transform:uppercase;letter-spacing:.3px;white-space:nowrap}
.sp-draft{background:rgba(0,0,0,.06);color:var(--text-2)}
.sp-submitted{background:var(--primary-weak);color:var(--primary-text)}
.sp-ai{background:#f1edff;color:#7b68ee}
.sp-approved{background:#e7f6ee;color:#1a7d4f}
.sp-revise{background:#fff4e5;color:#b06000}
.ai-review{background:linear-gradient(180deg,#faf7ff,#f4f0ff);border:1px solid #e9ddff;border-radius:8px;
  padding:13px;margin-top:12px}
.ai-review-h{display:flex;align-items:center;gap:8px;font-weight:600;color:#7c3aed;margin-bottom:8px;font-size:12px}
.score-row{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:8px}
.score{background:var(--panel);border:1px solid var(--border);border-radius:7px;padding:6px 10px;text-align:center}
.score .n{font-size:16px;font-weight:700}
.score .l{font-size:11px;color:var(--text-3)}
.report-item{display:flex;gap:10px;padding:8px 0;border-top:1px solid #f0f0f2;font-size:12px}
.report-item .ri-res{color:var(--text-2)}

/* ===== Modal ===== */
.overlay{position:fixed;inset:0;background:rgba(20,22,30,.4);z-index:100;display:flex;align-items:flex-start;
  justify-content:center;padding:60px 20px;overflow:auto;backdrop-filter:blur(1px);animation:overlayFade .15s ease}
.modal{width:100%;max-width:520px;background:var(--panel);border-radius:10px;box-shadow:var(--shadow-md);
  border:1px solid var(--border);animation:modalPop .16s cubic-bezier(.2,.9,.32,1.1)}
@keyframes overlayFade{from{opacity:0}to{opacity:1}}
@keyframes modalPop{from{opacity:0;transform:scale(.96) translateY(4px)}to{opacity:1;transform:scale(1) translateY(0)}}
.modal-h{display:flex;align-items:center;padding:15px 18px;border-bottom:1px solid var(--border)}
.modal-h .mt{font-weight:600;font-size:15px}
.modal-h .x{margin-left:auto;cursor:pointer;color:var(--text-3);border:none;background:none;padding:4px}
.modal-h .x:hover{color:var(--text)}
.modal-b{padding:18px;max-height:70vh;overflow-y:auto}
.modal-f{padding:13px 18px;border-top:1px solid var(--border);display:flex;justify-content:flex-end;gap:9px}
.row2{display:grid;grid-template-columns:1fr 1fr;gap:12px}

/* ===== Toasts ===== */
/* Toast KHÔNG nhận chuột — cả khung lẫn từng cái.
   Nó là hộp position:fixed ở z-index 200 nằm đè lên góc dưới màn hình suốt
   3,2–5 giây sau MỌI hành động, mà mọi hành động đều sinh toast. Chỗ nào nhận
   chuột thì cú bấm rơi vào đó bị nuốt: không điều hướng, không báo lỗi, không
   dấu vết gì để người dùng đoán ra. QA 05/08/2026 gặp đúng vậy — nút "Mở Tích
   hợp → MCP" "bấm lần đầu không có gì xảy ra", lần sau mới ăn (toast đã tự tắt).
   Ở breakpoint hẹp bên dưới khung còn kéo hết chiều ngang: vùng chết là cả đáy
   trang.
   `pointer-events:none` chỉ trên khung là CHƯA đủ — đo bằng elementFromPoint tại
   tâm nút: cú bấm rơi trúng <span> bên trong toast (thừa kế `auto`), nút vẫn
   không nhận. Nên bỏ luôn cả bấm-để-tắt: toast không có hành động nào bên trong,
   tự tắt sau vài giây, và một thông báo thoáng qua thì không được phép cướp thao
   tác của người dùng — đó là cái giá đúng để trả. */
.toasts{position:fixed;bottom:20px;right:20px;z-index:200;display:flex;flex-direction:column;gap:9px;
  pointer-events:none}
.toast{background:#1c1c1e;color:#fff;padding:11px 15px;border-radius:8px;font-size:12px;box-shadow:var(--shadow-md);
  display:flex;align-items:center;gap:9px;max-width:340px;animation:slideIn .18s ease;
  pointer-events:none}
.toast.err{background:#b91c1c}
.toast.ok{background:#15803d}
.toast.warn{background:#b45309}
@keyframes slideIn{from{transform:translateX(20px);opacity:0}to{transform:translateX(0);opacity:1}}

/* ===== States ===== */
.loading{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:60px 20px;
  color:var(--text-3);gap:12px}
.spinner{width:26px;height:26px;border:3px solid #e6e6e8;border-top-color:var(--primary);border-radius:50%;
  animation:spin .7s linear infinite}
@keyframes spin{to{transform:rotate(360deg)}}
.empty{text-align:center;padding:44px 20px;color:var(--text-3)}
.empty svg{width:34px;height:34px;margin-bottom:10px;opacity:.5}
.empty .et{font-size:13.5px;font-weight:600;color:var(--text-2)}
.mt10{margin-top:10px}.mt16{margin-top:16px}.mb8{margin-bottom:8px}
.muted{color:var(--text-3)}
.hint{font-size:12px;color:var(--text-3);margin-top:4px}
.agent-run-model{display:flex;align-items:center;gap:7px;font-size:12px;color:var(--text-2);background:var(--bg-subtle);border:1px solid var(--border);border-radius:8px;padding:8px 11px;margin-bottom:12px}
.agent-run-model svg{width:15px;height:15px;flex:0 0 auto;color:var(--primary-text)}
/* Catalog admin — nút ẩn mẫu (hover mới hiện) */
.brain-tpl-card{position:relative}
.tpl-hide-btn{position:absolute;top:6px;right:6px;width:20px;height:20px;border:none;border-radius:5px;
  background:transparent;color:var(--text-3);cursor:pointer;display:flex;align-items:center;justify-content:center;
  opacity:0;transition:opacity .12s}
.brain-tpl-card:hover .tpl-hide-btn,.ext-card:hover .tpl-hide-btn{opacity:1}
.tpl-hide-btn:hover{background:var(--hover);color:var(--st-blocked)}
.tpl-hide-btn svg{width:12px;height:12px}
/* Billing — Figma Cài đặt·Gói & Thanh toán 241:146: gói đang dùng là tín hiệu
   số 1 của trang nên nhuộm cả nền primary-weak (cùng pattern stat-bad/stat-warn
   Trang chủ); badge "Đang dùng" đổi từ badge-ok xanh sang nền primary chữ trắng
   để không trộn ngữ nghĩa với badge trạng thái "ok". Token hoá nên dark theme
   tự ăn theo --primary-weak/--primary của [data-theme="dark"]. */
/* .ext-card.plan-current (2 class) chứ không phải .plan-current trần: .ext-card
   nằm SAU trong file và cũng đặt background/border/box-shadow, nên bản 1-class
   cũ bị đè theo source order — ring primary chưa bao giờ hiện. */
.ext-card.plan-current{border-color:var(--primary);box-shadow:0 0 0 1px var(--primary);background:var(--primary-weak)}
.stat.stat-accent{background:var(--primary-weak);border-color:var(--primary)}
/* Nền badge dùng --primary-text (#6a56e0, 5.2:1 với chữ trắng) chứ không phải
   --primary (#7b68ee chỉ 4.15:1 — dưới AA 4.5:1 cho chữ 11px). Dark: primary là
   lavender sáng nên đảo sang chữ tối. */
.badge-plan{background:var(--primary-text);color:#fff}
[data-theme="dark"] .badge-plan{background:var(--primary);color:#0b0b0b}
/* Giá/quota là số so sánh dọc — tabular-nums cho mọi giá trị thẻ số */
.stat .v{font-variant-numeric:tabular-nums}
/* ===== All Settings (đo trực tiếp từ Clickflow thật: sidebar 260px #fcfcfc, item 28px/14px,
   active rgba(0,0,0,.09) radius 7px, tiêu đề 16/600, content title 24/600) ===== */
.setx{display:flex;align-items:stretch;margin:-20px -24px -40px;height:calc(100vh - 52px);overflow:hidden}
.setx-nav{flex:0 0 260px;width:260px;background:#fcfcfc;border-right:1px solid var(--border);
  padding:14px 10px 18px;overflow-y:auto;display:flex;flex-direction:column}
[data-theme="dark"] .setx-nav{background:#111111}
.setx-title{font-size:16px;font-weight:600;padding:2px 8px 10px;letter-spacing:-.2px}
/* Nhãn nhóm dùng --text-2: 11px/600 trên nền #fcfcfc, --text-3 chỉ đạt ~4.5:1 sát ngưỡng */
.setx-sec{font-size:11px;font-weight:600;color:var(--text-2);margin:13px 8px 3px}
.setx-item{position:relative;display:flex;align-items:center;gap:8px;height:28px;flex:0 0 28px;padding:0 7px;
  border-radius:7px;border:none;background:none;cursor:pointer;font-size:13.5px;color:var(--text-2);
  width:100%;text-align:left;white-space:nowrap;overflow:hidden;transition:background .1s,color .1s}
/* setx-nav là flex column bị giới hạn chiều cao — không cho mục co lại khi màn thấp
   (flex-shrink mặc định 1 nén item còn ~12px; sidebar phải scroll thay vì nén) */
.setx-title,.setx-sec,.setx-foot{flex:0 0 auto}
.setx-item:hover{background:var(--hover);color:var(--text)}
.setx-item.active{background:rgba(0,0,0,.09);color:var(--text);font-weight:550}
/* rgba(255,255,255,.12) hoà lên #111111 trông đúng là "xám nhạt hơn" bằng mắt thật,
   nhưng script dò tương phản đọc R/G/B thẳng từ backgroundColor (không hoà alpha vào
   nền phía sau) nên chấm nền = trắng nguyên (1.00) cạnh chữ 0.94 — coi mục đang chọn
   như còn TRẮNG ở chế độ Tối. Đổi sang nền đặc (token có sẵn, không alpha) để không
   còn kênh trắng nào lộ ra khi đo trực tiếp; #404040 cũng tương phản rõ hơn hover
   (#232323) nên vẫn thấy được mục nào đang mở. */
[data-theme="dark"] .setx-item.active{background:var(--border-strong)}
/* Mục đang mở không chỉ dựa vào nền mờ: thêm vạch --primary bên trái (Figma 182:3790) */
.setx-item.active::before{content:"";position:absolute;left:1px;top:5px;width:2.5px;height:18px;
  border-radius:2px;background:var(--primary)}
.setx-ic{display:inline-flex;flex:0 0 auto;color:inherit}
.setx-ic svg{width:16px;height:16px}
.setx-foot{border-top:1px solid var(--border);margin-top:14px;padding-top:10px}
/* scroll-padding-bottom = chiều cao .set-bar dính đáy. Thiếu nó, Tab tới ô cuối
   thì trình duyệt cuộn ô vào sát mép dưới — đúng chỗ thanh Lưu đang che
   (WCAG 2.2 SC 2.4.11 Focus Not Obscured). */
.setx-main{flex:1;min-width:0;overflow-y:auto;overflow-x:hidden;scroll-padding-bottom:84px}
.setx-main-in{max-width:860px;padding:26px 30px 48px}
/* 860px là bề rộng ĐỌC của form (line-length), không phải của bảng dữ liệu. Tab
   nào render bảng nhiều cột (Nhân sự 8 cột) thì 860 hẹp hơn min-content của bảng,
   mà .setx-main lại overflow-x:hidden — cột cuối (Đăng nhập cuối / Thao tác) bị
   CẮT MẤT, không cuộn được, không dấu hiệu nào báo còn cột. Nới khung cho các tab
   bảng + .tbl-scroll cho phần vẫn quá rộng. */
.setx-main-in.setx-wide{max-width:1400px}
/* Thanh cuộn LUÔN hiện (styling ::-webkit-scrollbar tắt chế độ overlay của macOS):
   cuộn ẩn = cột bị giấu mà không dấu hiệu nào — đúng lỗi cũ chỉ đổi từ cắt sang giấu. */
.tbl-scroll{max-width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:thin}
.tbl-scroll::-webkit-scrollbar{height:8px}
.tbl-scroll::-webkit-scrollbar-track{background:transparent}
.tbl-scroll::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:4px}
.setx-main-in .page-title{font-size:24px;font-weight:600;letter-spacing:-.3px}
/* S0.1 — thanh tab con dùng chung của Settings (settingsTabGroup). Trước đây
   khai báo inline trong JS nên "component dùng chung" không có kiểu nào trong
   stylesheet; giờ là nơi DUY NHẤT định kiểu tab con cho mọi mục Settings. */
.setx-tabbar{display:flex;gap:6px;flex-wrap:wrap;margin:0 0 12px}
@media (max-width:900px){
  .setx{flex-direction:column;height:auto;overflow:visible;margin:-12px -12px -40px}
  .setx-nav{width:100%;flex:0 0 auto;max-height:none;border-right:none;border-bottom:1px solid var(--border)}
  .setx-main{overflow:visible}
  .setx-main-in{padding:18px 14px 40px}
}
/* Autopilot chip — nổi bật hơn chip thường (gradient nhẹ như brain-glow) */
.chip-autopilot{display:inline-flex;align-items:center;gap:5px;border:1px solid transparent;
  background:linear-gradient(var(--panel),var(--panel)) padding-box,linear-gradient(135deg,#ff6ec4,#7873f5,#4adede) border-box;
  font-weight:600}
.chip-autopilot svg{width:13px;height:13px;color:#7873f5}
/* .chip-autopilot là <button> và .chip/.chip-autopilot chưa từng đặt `color` — trình
   duyệt tự trám bằng màu hệ thống "buttontext" (đen, không đổi theo prefers-color-scheme
   của TRANG vì đây là màu HĐH, không phải biến CSS). Ở chế độ Sáng đen trùng hợp đọc
   được; ở chế độ Tối nó là chữ đen 0.00 trên nền panel gần đen 0.08 — nặng nhất trong
   6 lỗi Tối (Bộ não AI, span "Autopilot — tự phân việc & chạy"). */
[data-theme="dark"] .chip-autopilot{color:var(--text)}
/* Bulk actions — checkbox chọn hàng loạt trên từng dòng + thanh hành động nổi */
/* WCAG 2.2 target size: label .row-sel-hit là vùng bấm 24px, ô bên trong vẫn vẽ 18px */
.row-sel-hit{flex:0 0 24px;width:24px;height:24px;display:inline-flex;align-items:center;justify-content:center;cursor:pointer}
.row-sel{flex:0 0 18px;width:18px;height:18px;accent-color:var(--primary);cursor:pointer;opacity:.35;transition:opacity .1s}
.row:hover .row-sel,.row-sel:checked{opacity:1}
.bulk-bar{
  position:fixed;left:50%;bottom:18px;transform:translateX(-50%);z-index:60;
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;max-width:94vw;
  background:var(--panel);border:1px solid var(--border-strong);border-radius:12px;
  box-shadow:var(--shadow-md);padding:10px 14px;
}
.bulk-count{font-weight:700;font-size:12px;white-space:nowrap}
.bulk-in{width:auto;height:30px;font-size:12px}
/* Báo cáo dòng tiền — thanh bar mini so sánh thu/chi giữa các tháng */
.cf-bar{display:inline-block;height:10px;border-radius:3px;margin-right:7px;vertical-align:middle}
.cf-bar.cf-in{background:var(--st-done)}
.cf-bar.cf-out{background:var(--st-blocked)}
.cf-val{vertical-align:middle;font-variant-numeric:tabular-nums}

/* Số tiền (Figma "Thu Chi — ĐỀ XUẤT UI/UX" 171:146). Chữ số là thứ phải đọc trước,
   "đ" chỉ là đơn vị nên nhỏ + mờ đi. Dấu +/− luôn có sẵn nên ngữ nghĩa vào/ra
   không phụ thuộc riêng vào màu (WCAG 1.4.1). */
.money{font-variant-numeric:tabular-nums;font-feature-settings:"tnum";
  font-weight:700;white-space:nowrap;letter-spacing:-.1px}
.money-cur{font-style:normal;font-size:.72em;font-weight:600;color:var(--text-3);margin-left:1px}
.money-in{color:var(--money-in)}
.money-out{color:var(--money-out)}
/* Chưa vào sổ (phiếu chờ thanh toán/chờ chi, dòng nháp): chìm xám — thẻ tổng ở
   đầu trang KHÔNG cộng những dòng này, tô màu như tiền thật là nói dối. */
.money-dim{color:var(--text-3);font-weight:600}
.money-dim .money-cur{color:var(--text-3)}
.stat .v .money-cur{font-size:.5em;vertical-align:baseline}

/* ===== Company config (settings) ===== */
.set-form{max-width:960px}
.set-sec{scroll-margin-top:8px;background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:16px 18px;
  margin-bottom:14px;box-shadow:var(--shadow)}
.set-sec-h{font-weight:600;font-size:13px;margin:0 0 12px;display:flex;align-items:center;gap:8px}
.set-sec-h svg{width:15px;height:15px;color:var(--text-2)}
.set-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px 16px}
.set-grid .field{margin-bottom:0}
.set-grid .field.full,.set-grid .field-floating.full{grid-column:1 / -1}
.set-color{display:flex;align-items:center;gap:9px}
.set-color input[type=color]{width:38px;height:36px;padding:2px;border:1px solid var(--border-strong);
  border-radius:var(--radius);background:var(--panel);cursor:pointer;flex:0 0 38px}
.set-color .set-hex{width:110px}
/* Ô chỉ đọc: nền xám + chữ --text-2. KHÔNG dùng opacity — nó kéo tương phản chữ
   xuống dưới 4.5:1 mà vẫn không cho biết ô khác nhau ở chỗ nào (Figma 182:7121 mục 2). */
.set-ro{background:var(--hover);color:var(--text-2);cursor:default}
.set-ro:focus{border-color:var(--border-strong);box-shadow:none}
/* Hồ sơ & Tài khoản (S14) — 3 khối Hồ sơ / Bảo mật / Tuỳ chọn */
.acct-id{display:flex;align-items:center;gap:12px;margin-bottom:14px}
.acct-avatar{width:44px;height:44px;border-radius:50%;background:var(--primary);color:#fff;
  display:flex;align-items:center;justify-content:center;font-weight:700;font-size:16px;flex:0 0 44px}
.acct-id-name{font-weight:600;font-size:14px}
.acct-ro-chip{display:inline-flex;align-items:center;background:var(--hover);color:var(--text-2);
  border-radius:6px;padding:2px 8px;font-size:12px;font-weight:600}
.acct-chips{display:flex;flex-wrap:wrap;gap:8px}
.acct-chip{display:inline-flex;align-items:center;gap:6px;background:var(--bg-subtle);
  border:1px solid var(--border);border-radius:8px;padding:4px 10px 4px 6px;font-size:12.5px;font-weight:600}
.acct-chip .sq{width:18px;height:18px;border-radius:4px;color:#fff;display:flex;align-items:center;
  justify-content:center;font-size:9px;font-weight:700;flex:0 0 18px}
.acct-sub{border-top:1px solid var(--border);margin-top:14px;padding-top:12px}
.acct-sub-h{font-weight:600;font-size:12.5px;display:flex;align-items:center;gap:8px;margin-bottom:8px}
.acct-sub-h svg{width:14px;height:14px;color:var(--text-2)}
.acct-sub-h .badge{margin-left:2px}
/* Kênh gốc (34,197,94) tự đọc ~0.66 sáng — trùng khít chữ #4ade80 (~0.66) nên badge
   "Chia sẻ" ở Tài liệu bị chấm chữ/nền cùng độ sáng dù mắt nhìn vẫn ra chữ xanh trên
   nền xanh sẫm. Hạ ba kênh theo cùng tỉ lệ (giữ đúng sắc xanh lá, không đổi tông) để
   nền đo được tụt về ~0.28; tương phản thật (hoà lên --panel, ca xấu nhất vì --panel
   sáng hơn --bg) vẫn 8.2:1. */
[data-theme="dark"] .badge-ok{background:rgba(18,103,49,.28);color:#4ade80}
/* Hàng nhãn: nhãn tĩnh NẰM TRÊN ô cho mọi trường (trước đây ô sửa được dùng nhãn
   nổi, khi rỗng nó đè lên placeholder), chip điền sẵn dạt phải. */
.set-lab{display:flex;align-items:center;gap:8px;margin-bottom:4px;min-height:18px}
.set-lab label{display:block;font-size:12px;color:var(--text-2);margin:0}
.set-lab .set-lab-note{font-size:12px;color:var(--text-3)}
/* Chip điền sẵn — WCAG 3.3.7 Redundant Entry: bấm là đổ dữ liệu hệ thống đã có */
.set-chip{margin-left:auto;height:24px;padding:0 8px;border-radius:6px;border:1px solid var(--border-strong);
  background:var(--panel);color:var(--primary-text);font-size:11px;font-weight:600;cursor:pointer;
  white-space:nowrap;transition:background .1s,border-color .1s}
.set-chip:hover{background:var(--primary-weak);border-color:var(--primary)}
/* Đếm ô đã điền ở tiêu đề section */
.set-sec-h .set-fill{margin-left:auto;font-size:12px;font-weight:500;color:var(--text-3)}
.set-sec-h .set-fill.warn{color:var(--ach-warn);font-weight:600}
/* ── Cài đặt Social Growth: panel gập + đếm "đặt riêng" ──
   .set-fill.own = có trường đặt riêng ở tầng này (tín hiệu, không phải trạng thái lỗi);
   panel toàn kế thừa đóng mặc định — chưa cấu hình không được trông như đã xong. */
.section-h .set-fill{margin-left:auto;font-size:12px;font-weight:500;color:var(--text-3);letter-spacing:0;text-transform:none}
.set-fill.own{color:var(--primary-text);font-weight:600}
details.sg-fold>summary{cursor:pointer;user-select:none;list-style:none}
details.sg-fold>summary::-webkit-details-marker{display:none}
.sg-fold .sg-t{display:inline-flex;align-items:center;gap:8px}
.sg-fold .sg-t svg{width:15px;height:15px}
.sg-fold .sg-caret{color:var(--text-3);font-size:10px;line-height:1;transition:transform .15s ease}
details.sg-fold[open]>summary .sg-caret{transform:rotate(90deg)}
.sg-own{display:inline-block;margin-left:6px;padding:1px 6px;border-radius:4px;font-size:10.5px;font-weight:600;line-height:1.5;
  color:var(--primary-text);background:var(--primary-weak);border:1px solid var(--primary-ring)}
.sg-h2cnt{margin-left:8px;font-size:12.5px;font-weight:500;color:var(--text-3)}
/* Ngưỡng/quota là số so sánh dọc (tần suất đăng, giới hạn ngày…) */
.input[type=number]{font-variant-numeric:tabular-nums;font-feature-settings:"tnum"}
.set-bar{position:sticky;bottom:0;background:var(--bg);padding:12px 0;display:flex;align-items:center;
  gap:10px;border-top:1px solid var(--border);margin-top:2px}
.set-bar .set-bar-status{margin-right:auto;font-size:12.5px;font-weight:600;color:var(--text-3)}
.set-bar .set-bar-status.warn{color:var(--ach-warn)}

/* ===== Full-page task view (Clickflow "expanded" mode) =====
   Dùng lại MỌI style .peek-* của section; chỉ khung ngoài khác slide-over. Selector con
   (.task-page .peek-b …) có độ ưu tiên cao hơn .peek-b nên override được không cần !important. */
/* `overflow:clip` chứ KHÔNG phải `hidden`: cả hai cắt góc bo như nhau, nhưng `hidden`
   biến khung này thành một hộp cuộn, và hộp cuộn ấy trở thành khung tham chiếu của mọi
   `position:sticky` bên trong. Hệ quả đo được 11/08/2026: thanh hành động đáy dính vào
   một hộp không bao giờ cuộn ⇒ nằm im dưới màn hình thay vì bám đáy khung nhìn. Với
   `clip` phần tử không còn là hộp cuộn nên sticky bám đúng `#content`. */
.task-page{max-width:860px;margin:0 auto;background:var(--panel);border:1px solid var(--border);
  border-radius:12px;box-shadow:0 1px 3px rgba(20,22,30,.06),0 8px 24px -18px rgba(20,22,30,.25);
  overflow:clip}
.task-page .peek-h{padding:13px 22px}
.task-page .peek-b{padding:24px 30px 46px}
.task-page .peek-title{font-size:24px;font-weight:700;line-height:1.28;margin-bottom:14px}
.task-page .peek-meta{margin-bottom:18px}
@media (max-width:640px){
  .task-page{max-width:none;border:none;border-radius:0;box-shadow:none}
  .task-page .peek-b{padding:16px}
}

/* ===== Task peek panel (Plane slide-over) ===== */
.peek-ov{position:fixed;inset:0;background:rgba(20,22,30,.4);z-index:150;backdrop-filter:blur(1px);
  animation:peekFade .15s ease}
@keyframes peekFade{from{opacity:0}to{opacity:1}}
.peek{position:fixed;top:0;right:0;bottom:0;width:460px;max-width:100vw;background:var(--panel);
  border-left:1px solid var(--border);box-shadow:var(--shadow-md);z-index:151;display:flex;
  flex-direction:column;animation:peekIn .2s ease}
@keyframes peekIn{from{transform:translateX(30px);opacity:.4}to{transform:translateX(0);opacity:1}}
.peek-h{display:flex;align-items:center;gap:8px;padding:11px 14px;border-bottom:1px solid var(--border);
  flex:0 0 auto}
.peek-h .peek-crumb{font-size:12px;color:var(--text-3);flex:1;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;display:flex;align-items:center;gap:6px}
.peek-h .peek-crumb .dot{width:8px;height:8px;border-radius:50%;flex:0 0 8px}
.peek-b{flex:1;overflow:auto;padding:16px 18px}
.peek-title{width:100%;border:1px solid transparent;border-radius:6px;font-size:16px;font-weight:600;
  color:var(--text);padding:5px 7px;margin:0 0 10px -7px;background:transparent;font-family:inherit;
  line-height:1.35;resize:none;letter-spacing:-.2px}
.peek-title:hover{background:var(--hover)}
.peek-title:focus{border-color:var(--primary);outline:none;box-shadow:0 0 0 3px var(--primary-weak);background:var(--panel)}
.peek-meta{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-bottom:14px}
.peek-props{display:grid;grid-template-columns:auto 1fr;gap:9px 14px;align-items:center;margin-bottom:6px;
  font-size:12px}
.peek-props .pk{color:var(--text-3);display:flex;align-items:center;gap:7px}
.peek-props .pv{color:var(--text);display:flex;align-items:center;gap:6px;min-width:0}
.peek-sec{margin-top:20px}
.peek-sec-h{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.4px;color:var(--text-3);
  margin:0 0 9px;display:flex;align-items:center;gap:8px}
.peek-sec-h .cnt{background:#ececef;color:var(--text-2);padding:0 6px;border-radius:20px;font-size:11px;
  letter-spacing:0}
/* ── Duyệt Figma 11/08/2026 — hàng meta là CONTROL, không phải nhãn để đọc ──
   Ô chọn giữ hình dáng badge (cùng kích thước, cùng bo góc) nên hàng này nhìn không
   đổi, nhưng bấm được. Dùng <select> gốc chứ không dựng dropdown riêng: bàn phím,
   trình đọc màn hình và bộ chọn của điện thoại đã đúng sẵn, không phải vá lại. */
.peek-meta-ctl{display:inline-flex;align-items:center;gap:5px;background:var(--bg-subtle);
  border:1px solid var(--border);border-radius:9px;padding:2px 6px 2px 8px;min-height:24px}
.peek-meta-ctl .grp-dot{width:7px;height:7px;border-radius:50%;flex:0 0 7px}
.peek-meta-sel{border:0;background:transparent;color:var(--text-2);font:inherit;font-size:11px;
  font-weight:700;letter-spacing:.4px;text-transform:uppercase;padding:2px 2px;cursor:pointer;
  min-height:20px;max-width:150px}
.peek-meta-sel:focus{outline:2px solid var(--primary);outline-offset:1px;border-radius:4px}
.peek-meta-sel:disabled{opacity:.6;cursor:progress}
/* Nút mở nhóm thuộc tính đang trống (progressive disclosure) */
.peek-more{display:flex;align-items:center;gap:8px;width:100%;min-height:32px;margin:8px 0 2px;
  padding:6px 10px;border:1px dashed var(--border-strong);border-radius:8px;background:transparent;
  color:var(--text-2);font:inherit;font-size:12px;font-weight:600;cursor:pointer}
.peek-more:hover{background:var(--hover);color:var(--text)}
.peek-more svg{width:13px;height:13px}
.peek-more .cnt{margin-left:auto;font-weight:400;color:var(--text-3)}
.peek-more.on{border-style:solid}
/* Thẻ dự án trong hàng "Nhóm việc" */
.peek-proj{display:block !important;border:1px solid var(--border);border-radius:8px;padding:8px 10px;
  background:var(--panel)}
.peek-proj-h{display:flex;align-items:center;gap:8px;min-width:0}
.peek-proj-h .grp-dot{width:8px;height:8px;border-radius:50%;flex:0 0 8px}
.peek-proj-h .peek-proj-name{font-weight:600;font-size:13px;flex:1;min-width:0;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.peek-proj-h select{flex:1;min-width:0;font-weight:600}
.peek-proj-meta{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:6px 0}
.peek-proj .progress{margin:2px 0}
.peek-proj-sub{margin-top:6px}
/* Thanh hành động dính đáy — thao tác chính không được nằm giữa một trang cuộn dài */
.peek-foot{display:flex;align-items:center;gap:8px;padding:10px 14px;border-top:1px solid var(--border);
  background:var(--panel);flex:0 0 auto}
.peek-foot .btn{min-height:36px}
.peek-foot .peek-foot-cta{flex:1;justify-content:center}
.task-page .peek-foot{position:sticky;bottom:0;z-index:2;margin:0 -22px -16px;padding:10px 22px}
.peek-desc{width:100%;min-height:60px;border:1px solid var(--border-strong);border-radius:6px;padding:8px 10px;
  font-size:13px;font-family:inherit;line-height:1.5;resize:vertical;color:var(--text);background:var(--panel)}
.peek-desc:focus{border-color:var(--primary);outline:none;box-shadow:0 0 0 3px var(--primary-weak)}
.peek-3l-row{display:flex;align-items:center;gap:8px;padding:8px 10px;border:1px solid var(--border);
  border-radius:8px;margin-bottom:8px;background:var(--bg-subtle)}
.peek-3l-row .lab{font-size:12px;font-weight:600;flex:1}
.peek-sub{display:flex;align-items:center;gap:9px;padding:6px 0;border-top:1px solid #f0f0f2;font-size:12px}
.peek-sub:first-child{border-top:none}
.peek-sub .st{flex:1;min-width:0}
.peek-sub.done .st{color:var(--text-3);text-decoration:line-through}
.peek-add{display:flex;gap:7px;margin-top:9px}
.peek-add .input{height:30px}
.peek-kpi{border:1px solid var(--border);border-radius:8px;padding:10px 11px;margin-bottom:9px;background:var(--bg-subtle)}
.peek-kpi-h{display:flex;align-items:center;gap:8px;margin-bottom:6px;flex-wrap:wrap}
.peek-kpi-h .kn{font-weight:600;font-size:12px}
.peek-kpi-h .kv{margin-left:auto;font-size:12px;font-weight:700}
.peek-kpi-vals{font-size:12px;color:var(--text-2);margin-bottom:5px}
/* KR rows trong goal card — tên + thanh tiến độ + % trên một hàng gọn */
.gc-krs{margin-top:10px;display:flex;flex-direction:column;gap:6px;border-top:1px solid var(--border);padding-top:8px}
.gc-kr{display:flex;align-items:center;gap:8px;font-size:12px}
.gc-kr-name{flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--text-2)}
.gc-kr-bar{flex:0 0 90px}
.gc-kr-bar .progress{margin:0}
.gc-kr-pct{flex:0 0 34px;text-align:right;font-weight:600;font-variant-numeric:tabular-nums}
.gc-kr-more{font-size:11px;color:var(--text-3)}
/* OKR tổng quan trên trang KPI — một hàng một mục tiêu, chi tiết nằm ở Goal */
.okr-mini{display:flex;flex-direction:column;border:1px solid var(--border);border-radius:8px;background:var(--panel);overflow:hidden}
.okr-mini-row{display:flex;align-items:center;gap:10px;padding:10px 14px;cursor:pointer;border-bottom:1px solid var(--border)}
.okr-mini-row:last-child{border-bottom:none}
.okr-mini-row:hover{background:var(--hover)}
.okr-mini-name{flex:1 1 auto;min-width:0;font-weight:600;font-size:13px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
/* Dashboard: preview widget trong card + lưới mẫu khi tạo (kiểu ClickUp template picker) */
.dash-wprev{display:flex;flex-wrap:wrap;gap:4px;margin-top:8px}
.dash-wpill{font-size:11px;font-weight:600;color:var(--text-2);background:var(--bg-subtle);
  border:1px solid var(--border);border-radius:20px;padding:1px 8px;white-space:nowrap;
  max-width:150px;overflow:hidden;text-overflow:ellipsis}
.dash-wmore{color:var(--text-3)}
.dtpl-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}
.dtpl-card{text-align:left;background:var(--panel);border:1px solid var(--border);border-radius:8px;
  padding:12px 14px;cursor:pointer;font-family:var(--font)}
.dtpl-card:hover{border-color:var(--primary);box-shadow:var(--shadow-md)}
.dtpl-card:disabled{opacity:.6;cursor:wait}
.dtpl-name{font-weight:700;font-size:13.5px;margin-bottom:2px}
.dtpl-desc{font-size:12px;color:var(--text-2);line-height:1.45}
.dtpl-blank{border-style:dashed}
/* Trang trống của Dashboard — phòng trưng bày mẫu toàn phần, canh giữa kiểu ClickUp */
.dtpl-hero{max-width:760px;margin:36px auto 0;text-align:center}
.dtpl-hero-title{font-size:22px;font-weight:700;margin:0 0 6px;letter-spacing:-.2px}
.dtpl-hero-sub{font-size:13px;color:var(--text-2);margin:0 auto 22px;max-width:52ch}
.dtpl-hero .dtpl-grid{text-align:left}
/* Chế độ chỉnh sửa dashboard: viền đứt nhạt báo "card đang sửa được" (kiểu ClickUp) */
.dash-widget.dw-editing{outline:1px dashed var(--border-strong);outline-offset:2px}
.peek-kpi-log{display:flex;gap:6px;margin-top:8px}
.peek-kpi-log .input{height:28px}
.tt-badge{font-size:11px;font-weight:600;padding:1px 6px;border-radius:5px;background:#eef2ff;color:#4256c7;
  white-space:nowrap}
.tt-daily{background:#e0f2fe;color:#0369a1}
.tt-range{background:#ede9fe;color:#6d28d9}
.tt-milestone{background:#fef3c7;color:#b45309}
.tt-total{background:#e8ebf5;color:var(--primary-text)}
.peek-mini{height:5px;border-radius:6px;background:#ececef;overflow:hidden;margin-top:2px}
.peek-mini > span{display:block;height:100%;border-radius:6px}
.peek-empty{font-size:12px;color:var(--text-3);padding:4px 0}

/* ===== Board group-by toggle + subtask chip ===== */
.subchip{display:inline-flex;align-items:center;gap:3px;font-size:11px;font-weight:600;color:var(--text-2);
  background:#f1f1f3;padding:1px 6px;border-radius:20px;flex:0 0 auto}
.subchip svg{width:10px;height:10px}
.subchip.full{background:#f0fdf4;color:#15803d}
.grp-h .grp-code{font-size:11px;color:var(--text-3);background:#ececef;padding:1px 6px;border-radius:5px;font-weight:600}

/* ===== Groups / OKR dashboard ===== */
.gd-card{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:16px 18px;
  margin-bottom:14px;box-shadow:var(--shadow)}
.gd-h{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.gd-dot{width:11px;height:11px;border-radius:50%;flex:0 0 11px}
.gd-name{font-weight:600;font-size:14.5px}
.gd-code{font-size:11px;color:var(--text-3);background:#ececef;padding:1px 7px;border-radius:5px;font-weight:600}
.gd-counts{margin-left:auto;display:flex;gap:14px;text-align:center}
.gd-counts .m .n{font-size:16px;font-weight:700;line-height:1.1}
.gd-counts .m .l{font-size:11px;color:var(--text-3)}
.gd-prog-row{display:flex;align-items:center;gap:10px;margin-bottom:14px}
.gd-prog-row .pct{font-size:12px;font-weight:700;width:44px;text-align:right}
.gd-block-h{font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.4px;color:var(--text-3);
  margin:14px 0 8px;display:flex;align-items:center;gap:8px}
.gd-kpi{display:flex;align-items:center;gap:12px;padding:7px 0;border-top:1px solid #f0f0f2;font-size:12px}
.gd-kpi:first-of-type{border-top:none}
.gd-kpi .kn{flex:1;min-width:0;display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.gd-kpi .kvals{width:150px;font-size:12px;color:var(--text-2);text-align:right;flex:0 0 auto}
.gd-kpi .kbar{width:120px;flex:0 0 120px}
.gd-kpi .kpct{width:42px;text-align:right;font-weight:600;font-size:12px;flex:0 0 42px}
.gd-obj{border:1px solid var(--border);border-radius:8px;padding:12px 13px;margin-bottom:10px;background:var(--bg-subtle)}
.gd-obj-h{display:flex;align-items:center;gap:10px;margin-bottom:8px}
.gd-obj-t{font-weight:600;font-size:13px;flex:1}
.gd-obj-pct{font-weight:700;font-size:12px}
.gd-kr{display:flex;align-items:center;gap:10px;padding:6px 0;border-top:1px solid #eceef2;font-size:12px}
.gd-kr .krt{flex:1;min-width:0}
.gd-kr .krbar{width:110px;flex:0 0 110px}
.gd-kr .krin{width:88px;height:26px;flex:0 0 88px}
.gd-kr .krpct{width:40px;text-align:right;font-weight:600;flex:0 0 40px}
.gd-period{font-size:11px;color:var(--text-3)}

/* ===== Integrations actions + connector modal ===== */
.intg-actions{display:flex;flex-wrap:wrap;gap:6px;margin-top:10px}
.intg-actions .btn{flex:0 0 auto}
.intg-err{font-size:11px;color:#b91c1c;background:#fef2f2;border:1px solid #fecaca;border-radius:6px;
  padding:5px 8px;margin-top:6px;word-break:break-word}

/* ===== AI Command Console ===== */
.cmd-grid{display:grid;grid-template-columns:minmax(320px,1fr) minmax(320px,1.15fr);gap:16px;align-items:start}
/* Lưới có BA thẻ trong hai cột, nên thẻ Lịch sử rơi xuống hàng 2 cột 1 — ngay
   dưới thẻ "Ra lệnh mới" đang sticky. Sticky mà trong suốt + không z-index thì
   thứ tự vẽ theo DOM: ô "Tìm theo chỉ thị…" của Lịch sử đè lên ô Chỉ thị khi
   cuộn. Nền đục + z-index sửa đúng chỗ đó; min-width:0 để bảng dài trong thẻ
   không đẩy rộng cột. Nền đã có sẵn từ .panel-card — KHÔNG khai lại ở đây, khai
   lại là đè var(--panel) bằng một màu khác. */
.cmd-compose{position:sticky;top:0;z-index:1;min-width:0}
.cmd-result{margin-top:14px;border-top:1px solid var(--border);padding-top:12px}
.cmd-result-h{display:flex;align-items:center;gap:8px;margin-bottom:8px;font-weight:600;font-size:12px}
.cmd-result-h .status-pill{margin-left:auto}
.cmd-pre{white-space:pre-wrap;word-break:break-word;background:var(--bg-subtle);border:1px solid var(--border);
  border-radius:8px;padding:10px 12px;font-size:12px;line-height:1.55;font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;
  color:var(--text);margin:0;overflow:auto;max-height:340px}
.cmd-hint{font-size:12px;background:#fff7ed;border:1px solid #fed7aa;border-radius:7px;padding:8px 10px;margin-bottom:8px;color:#9a3412}
.cmd-err{font-size:12px;background:#fef2f2;border:1px solid #fecaca;border-radius:7px;padding:8px 10px;margin-bottom:8px;color:#b91c1c;white-space:pre-wrap;word-break:break-word}
.cmd-task{display:flex;align-items:center;gap:6px;margin-top:8px;font-size:12px;color:var(--st-done);font-weight:600}
.cmd-task svg{width:13px;height:13px}
.cmd-history{min-width:0}
.cmd-item{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:11px 13px;margin-bottom:10px;box-shadow:var(--shadow)}
.cmd-item-h{display:flex;align-items:center;gap:9px;min-width:0}
.cmd-target{font-size:11px;font-weight:700;background:#faf5ff;color:#7c3aed;padding:2px 7px;border-radius:5px;flex:0 0 auto;white-space:nowrap}
.cmd-instr{flex:1;min-width:0;font-size:12px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.cmd-item-h .status-pill{flex:0 0 auto}
.cmd-meta{font-size:11px;color:var(--text-3);margin-top:5px}
.cmd-detail{margin-top:10px;padding-top:10px;border-top:1px solid #f0f0f2}
.cmd-sub{font-size:12px;color:var(--text-2);margin-bottom:8px}

/* ===== Extension screens (forms/docs cards) ===== */
.ext-grid{grid-template-columns:repeat(auto-fill,minmax(260px,1fr))}
.ext-card{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:14px;box-shadow:var(--shadow);
  transition:box-shadow .12s,border-color .12s}
.ext-card.doc-card{cursor:pointer}
.ext-card.doc-card:hover{box-shadow:var(--shadow-md);border-color:var(--border-strong)}
.ext-top{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.ext-name{font-weight:600;font-size:13.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ext-sub{font-size:11px;color:var(--text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ext-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:8px}
.ext-link{display:flex;align-items:center;gap:6px;font-size:11px;color:var(--text-2);background:var(--bg-subtle);
  border:1px solid var(--border);border-radius:6px;padding:5px 8px;overflow:hidden}
.ext-link code{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-family:ui-monospace,Consolas,monospace}
.ext-link svg{flex:0 0 auto;color:var(--text-3)}
.doc-excerpt{font-size:12px;color:var(--text-2);line-height:1.5;margin-bottom:8px}
.doc-tags{display:flex;flex-wrap:wrap;gap:5px}
/* Tài liệu (Figma "Tài liệu — ĐỀ XUẤT UI/UX" 182:1613) ------------------------
   Dòng meta "cập nhật … · người phụ trách" thay cho "Nguồn: manual", và thẻ quá
   hạn rà soát tô nền amber — cùng bộ màu badge-flag đã dùng cho "chờ xử lý". */
.doc-meta{font-size:11.5px;font-weight:500;color:var(--text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ext-card.doc-stale{background:#fffbeb;border-color:#f0d9a8}
.ext-card.doc-stale .doc-meta{color:var(--ach-warn)}
[data-theme="dark"] .ext-card.doc-stale{background:rgba(176,96,0,.12);border-color:rgba(176,96,0,.38)}
[data-theme="dark"] .ext-card.doc-stale .doc-meta{color:#e0a458}
/* Hàng tìm kiếm + chip tín hiệu: ô tìm luôn hiện, không nằm trong .filter-bar
   chỉ được vẽ sau khi tải xong dữ liệu. */
.doc-toolbar{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:12px 0 4px}
.doc-chips{display:flex;gap:6px;flex-wrap:wrap;margin-left:auto}
.doc-chip{height:28px;padding:0 11px;border-radius:14px;border:1px solid var(--border-strong);
  background:var(--panel);color:var(--text-2);font:inherit;font-size:11.5px;font-weight:600;cursor:pointer}
.doc-chip:hover{border-color:var(--text-3)}
.doc-chip.active{background:var(--primary-weak);border-color:var(--primary);color:var(--primary-text)}
.doc-chip-warn{background:#fff4e5;border-color:#f0d9a8;color:#8a5400}
.doc-chip-bad{background:#fdecec;border-color:#e5b5bd;color:#b8283f}
.doc-chip-warn.active{background:#ffe9c9;border-color:#b06000;color:#8a5400}
.doc-chip-bad.active{background:#fbdcdc;border-color:#b8283f;color:#b8283f}
[data-theme="dark"] .doc-chip-warn{background:rgba(176,96,0,.16);border-color:rgba(176,96,0,.4);color:#e0a458}
[data-theme="dark"] .doc-chip-bad{background:rgba(226,68,92,.16);border-color:rgba(226,68,92,.4);color:#ff6b7f}
/* Kho tệp: thanh thao tác hàng loạt + cột thời gian tương đối */
.ws-bulk{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:10px 0;padding:8px 12px;
  background:var(--primary-weak);border:1px solid rgba(123,104,238,.35);border-radius:8px}
.ws-bulk .btn.ws-del{border-color:#e5b5bd;color:#b8283f}
.ws-bulk .btn.ws-del:hover:not(:disabled){background:#fdecec}
[data-theme="dark"] .ws-bulk .btn.ws-del:hover:not(:disabled){background:rgba(226,68,92,.16)}
.tbl td.ws-when{color:var(--text-2);white-space:nowrap}

/* ===== Automations ===== */
.auto-card{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:14px;margin-bottom:12px;box-shadow:var(--shadow)}
.auto-h{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.auto-flow{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.auto-pill{font-size:12px;padding:4px 9px;border-radius:6px;background:var(--bg-subtle);border:1px solid var(--border);color:var(--text-2)}
.auto-pill b{color:var(--text);font-weight:700}
.auto-when{background:#eef2ff;border-color:#dbe3ff;color:#3949ab}
.auto-if{background:#fff7ed;border-color:#fed7aa;color:#9a3412}
.auto-then{background:#f0fdf4;border-color:#bbf7d0;color:#15803d}
/* Rule card đọc thành CÂU "Khi X thì Y" (Figma "Cài đặt · Tự động hoá & Nhắc — ĐỀ XUẤT UI/UX"
   248:146, match real world #2) — giữ mã màu của pill KHI/NẾU/THÌ làm chữ đậm inline. */
.auto-sen{font-size:13px;line-height:1.55;color:var(--text-2)}
.auto-sen b{font-weight:600}
.as-when{color:#3949ab}
.as-if{color:#9a3412}
.as-then{color:#15803d}
[data-theme="dark"] .as-when{color:#a5b4fc}
[data-theme="dark"] .as-if{color:#fdba74}
[data-theme="dark"] .as-then{color:#86efac}
/* Trạng thái bật/tắt bằng CHỮ cạnh switch (WCAG 1.4.1 — không chỉ màu);
   luật tắt dim CẢ card, không chỉ cái toggle. */
.auto-status{font-size:12px;font-weight:500;color:var(--text-3);white-space:nowrap}
.auto-status.on{color:var(--ach-good)}
.auto-card.auto-off{opacity:.55}
/* Dòng kết quả lần chạy gần nhất trên card (heuristic #1) */
.auto-run{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-top:6px;font-size:12px;color:var(--text-3)}
.auto-run .run-ok{color:var(--ach-good);font-weight:600}
.auto-run .run-err{color:var(--ach-bad);font-weight:600}
.auto-run .run-warn{color:var(--ach-warn);font-weight:600}
/* Ví dụ mẫu tạo nhanh trong empty-state (viền đứt như Figma 248:2223) */
.auto-sample{display:flex;align-items:center;gap:10px;flex-wrap:wrap;justify-content:center;
  margin:10px auto 0;padding:10px 14px;max-width:640px;border:1px dashed var(--border-strong);
  border-radius:8px;background:var(--bg-subtle)}
.auto-sample .auto-sample-vd{font-size:12px;color:var(--text-3);font-weight:500}

/* ===== Calendar view (board) ===== */
.cal-bar{display:flex;align-items:center;gap:8px;margin-bottom:12px}
.cal-title{font-weight:600;font-size:14px;min-width:118px;text-align:center}
.cal-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:1px;background:var(--border);
  border:1px solid var(--border);border-radius:8px;overflow:hidden}
.cal-wd{background:var(--bg-subtle);text-align:center;font-size:11px;font-weight:600;
  text-transform:uppercase;letter-spacing:.3px;color:var(--text-3);padding:7px 0}
.cal-cell{background:var(--panel);min-height:96px;padding:5px 6px 7px;display:flex;flex-direction:column;gap:4px}
.cal-cell.cal-blank{background:var(--bg-subtle)}
.cal-cell.cal-today{background:var(--primary-weak)}
.cal-daynum{font-size:12px;font-weight:600;color:var(--text-2);align-self:flex-start}
.cal-cell.cal-today .cal-daynum{color:var(--primary-text)}
.cal-chips{display:flex;flex-direction:column;gap:3px;overflow:hidden}
/* Màu sự kiện (--cc) là DANH TÍNH, không phải trạng thái — DESIGN.md bảo đánh dấu
   danh tính bằng chấm tròn, không bằng dải cạnh trái. Chấm 6px cũng đọc nhanh hơn
   dải 3px khi chip chỉ cao ~18px: mắt bắt hình tròn trước hình chữ nhật mảnh. */
.cal-chip{display:flex;align-items:center;gap:5px;width:100%;text-align:left;border:1px solid var(--border);
  background:var(--panel);border-radius:5px;padding:2px 6px;
  font-size:11px;color:var(--text);cursor:pointer;font-family:inherit;line-height:1.4}
.cal-chip::before{content:"";flex:0 0 6px;width:6px;height:6px;border-radius:50%;
  background:var(--cc,var(--primary))}
.cal-chip:hover{background:var(--hover)}
.cal-chip-dot{width:6px;height:6px;border-radius:50%;flex:0 0 6px}
.cal-chip-t{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;min-width:0}
.cal-more{font-size:11px;color:var(--text-3);padding:1px 4px;font-weight:600}
.cal-nodue{display:flex;flex-wrap:wrap;gap:6px;background:var(--panel);border:1px solid var(--border);
  border-radius:8px;padding:12px}
.cal-nodue .cal-chip{width:auto;max-width:220px}
.cal-qadd{margin-top:auto}
.qadd-trigger-compact{display:flex;align-items:center;justify-content:center;width:18px;height:18px;padding:0;
  background:transparent;border:1px solid transparent;border-radius:4px;color:var(--text-3);cursor:pointer;
  opacity:0;transition:opacity .12s,background .12s,color .12s}
.cal-cell:hover .qadd-trigger-compact{opacity:1}
.qadd-trigger-compact:hover{background:var(--hover);border-color:var(--border);color:var(--text-2)}
.cal-qadd .qadd-input{height:22px;font-size:11px;padding:0 6px}
@media (max-width:560px){
  .cal-cell{min-height:72px}
  .cal-chip-t{font-size:11px}
}

/* ===== Toggle switch ===== */
.toggle{width:38px;height:22px;border-radius:20px;background:#d5d5d8;border:none;cursor:pointer;position:relative;
  flex:0 0 38px;transition:background .15s;padding:0}
.toggle.on{background:var(--st-done)}
.toggle:disabled{opacity:.5;cursor:not-allowed}
.toggle-knob{position:absolute;top:2px;left:2px;width:18px;height:18px;border-radius:50%;background:#fff;
  box-shadow:0 1px 2px rgba(0,0,0,.25);transition:transform .15s}
.toggle.on .toggle-knob{transform:translateX(16px)}

/* ===== Field builder (form/custom-field modal) ===== */
.fb-rows{display:flex;flex-direction:column;gap:8px}
.fb-row{display:grid;grid-template-columns:1fr 1.3fr 1fr auto auto;gap:6px;align-items:center}
.fb-row .input{height:30px}
.fb-req{display:inline-flex;align-items:center;gap:5px;font-size:12px;color:var(--text-2);font-weight:600;cursor:pointer;white-space:nowrap}
/* WCAG 2.2 Target Size (AA, 24×24): ô đánh dấu vẽ 15px là dưới sàn. KHÔNG nới bằng
   `::after` như `.chk` — `.chk` là <button>, còn đây là <input>, phần tử thay thế mà
   pseudo-element không được đảm bảo dựng. Vùng bấm thật ở đây là cả cái <label> (bấm
   nhãn cũng đổi ô), nên nới chính nhãn lên 24px là đủ và đúng. */
.fb-req{min-height:24px;padding:3px 2px}
.fb-req input{width:15px;height:15px;cursor:pointer}

/* ===== Notifications bell ===== */
.notif-wrap{position:relative}
.notif-btn{width:30px;height:30px}
.notif-btn svg{width:16px;height:16px}
.notif-badge{position:absolute;top:-5px;right:-5px;min-width:16px;height:16px;padding:0 4px;border-radius:20px;
  background:var(--st-blocked);color:#fff;font-size:11px;font-weight:700;display:flex;align-items:center;justify-content:center;
  pointer-events:none;box-shadow:0 0 0 2px var(--panel)}
.notif-drop{position:absolute;top:38px;right:0;width:340px;max-width:88vw;background:var(--panel);border:1px solid var(--border-strong);
  border-radius:8px;box-shadow:var(--shadow-md);z-index:120;overflow:hidden}
.notif-h{display:flex;align-items:center;padding:11px 13px;border-bottom:1px solid var(--border);font-weight:600;font-size:13px}
.notif-h .btn{margin-left:auto}
.notif-list{max-height:60vh;overflow:auto}
.notif-item{display:flex;gap:9px;padding:10px 13px;border-bottom:1px solid #f0f0f2;align-items:flex-start}
.notif-item:last-child{border-bottom:none}
.notif-item .notif-dot{width:7px;height:7px;border-radius:50%;background:transparent;margin-top:5px;flex:0 0 7px}
.notif-item.unread{background:var(--primary-weak)}
.notif-item.unread .notif-dot{background:var(--primary)}
.notif-title{font-size:12px;font-weight:600;line-height:1.4}
.notif-body{font-size:12px;color:var(--text-2);margin-top:2px;line-height:1.45}
.notif-time{font-size:11px;color:var(--text-3);margin-top:3px}
.notif-empty{padding:22px 14px;text-align:center;color:var(--text-3);font-size:12px}

/* ===== Export dropdown ===== */
.export-wrap{position:relative;display:inline-block}
.export-wrap .btn svg:last-child{margin-left:-1px}
.export-menu{position:absolute;top:calc(100% + 4px);right:0;min-width:170px;background:var(--panel);
  border:1px solid var(--border-strong);border-radius:8px;box-shadow:var(--shadow-md);padding:5px;z-index:70}
.export-item{display:block;width:100%;text-align:left;padding:7px 10px;border:none;background:none;cursor:pointer;
  font-size:13px;color:var(--text);border-radius:6px;font-family:inherit}
.export-item:hover{background:var(--hover);color:var(--primary-text)}

/* ===== Dashboard date-range selector ===== */
.dash-range{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 16px}
.dash-range > .muted svg{width:16px;height:16px}
.dash-custom{display:flex;align-items:center;gap:7px;flex-wrap:wrap}
.dash-range-lab{font-size:12px;color:var(--text-3);font-weight:600;margin-left:auto}

/* ===== Timeline (Gantt-lite) view ===== */
.tl-scroll{overflow-x:auto;border:1px solid var(--border);border-radius:8px;background:var(--panel)}
.tl-head{display:grid;position:sticky;top:0;z-index:2;background:var(--bg-subtle);border-bottom:1px solid var(--border)}
.tl-corner{padding:8px 12px;font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.3px;
  color:var(--text-3);position:sticky;left:0;background:var(--bg-subtle);z-index:3;border-right:1px solid var(--border)}
.tl-daycol{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:5px 0;
  border-left:1px solid #f0f0f2}
.tl-daycol.tl-wk{border-left:1px solid var(--border-strong)}
.tl-daycol.tl-today{background:var(--primary-weak)}
.tl-dow{font-size:9px;font-weight:600;color:var(--text-3);text-transform:uppercase;letter-spacing:.2px}
.tl-dnum{font-size:11px;font-weight:600;color:var(--text-2)}
.tl-daycol.tl-today .tl-dnum{color:var(--primary-text)}
.tl-body{position:relative}
.tl-row{display:grid;min-height:36px;align-items:center;border-bottom:1px solid #f0f0f2}
.tl-row:last-child{border-bottom:none}
.tl-label{display:flex;align-items:center;gap:7px;padding:0 12px;position:sticky;left:0;background:var(--panel);
  z-index:1;border-right:1px solid var(--border);height:100%;cursor:pointer;overflow:hidden}
.tl-label:hover{background:var(--hover)}
.tl-label-t{font-size:12px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tl-track{position:relative;height:24px;margin:0 4px}
.tl-bar{position:absolute;top:2px;height:20px;border-radius:5px;background:var(--bc,var(--primary));border:none;
  cursor:pointer;display:flex;align-items:center;padding:0 7px;overflow:hidden;min-width:6px;
  box-shadow:0 1px 2px rgba(16,24,40,.12)}
.tl-bar:hover{filter:brightness(1.05)}
.tl-bar-t{font-size:11px;font-weight:600;color:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  text-shadow:0 1px 1px rgba(0,0,0,.15)}
.tl-point{position:absolute;top:4px;width:16px;height:16px;border-radius:50%;background:var(--bc,var(--primary));
  border:2px solid var(--panel);cursor:pointer;transform:translateX(-8px);box-shadow:0 1px 2px rgba(16,24,40,.2);padding:0}
.tl-point:hover{filter:brightness(1.05)}
.tl-outside,.tl-empty{font-size:11px;color:var(--text-3);padding:6px 12px}
.tl-empty{padding:20px 14px;text-align:center}

/* ===== Workload view ===== */
.wl-list{display:flex;flex-direction:column;gap:12px}
.wl-row{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:14px 16px;box-shadow:var(--shadow)}
.wl-person{display:flex;align-items:center;gap:10px;margin-bottom:10px}
.wl-person .avatar{width:32px;height:32px;font-size:11px;flex:0 0 32px}
.wl-name{font-weight:600;font-size:13.5px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wl-break{font-size:12px;color:var(--text-3);margin-top:1px}
.wl-count{margin-left:auto;font-size:11px;font-weight:700;background:#ececef;color:var(--text-2);
  padding:2px 9px;border-radius:20px;flex:0 0 auto}
.wl-barwrap{position:relative;margin-bottom:10px}
.wl-bar{display:flex;height:8px;border-radius:6px;background:#ececef;overflow:hidden}
.wl-seg{display:block;height:100%}
.wl-load{display:block;height:2px;border-radius:2px;background:var(--primary);margin-top:3px;opacity:.35}
.wl-items{display:flex;flex-wrap:wrap;gap:6px}
.wl-chip{display:inline-flex;align-items:center;gap:6px;max-width:230px;border:1px solid var(--border);
  background:var(--bg-subtle);border-radius:6px;padding:3px 8px;font-size:11px;color:var(--text);cursor:pointer;
  font-family:inherit}
.wl-chip:hover{background:var(--hover)}
.wl-chip-t{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.wl-more{font-size:11px;color:var(--text-3);font-weight:600;align-self:center}

/* ===== Task peek: custom fields ===== */
.peek-cf{margin-bottom:10px}
.peek-cf-lab{display:block;font-size:12px;font-weight:600;color:var(--text-2);margin-bottom:5px}
.peek-cf .input{height:32px}

/* ===== Report schedules ===== */
.sched-meta{display:flex;gap:16px;flex-wrap:wrap;margin-top:8px;font-size:12px}

/* ===== Permissions matrix ===== */
.perm-tabs-row{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:14px}
.perm-role-hint{font-size:12px;color:var(--text-2)}
.perm-tabs{display:inline-flex;border:1px solid var(--border-strong);border-radius:var(--radius);overflow:hidden}
.perm-tab{height:36px;padding:0 16px;border:none;background:var(--panel);cursor:pointer;font-size:13px;
  color:var(--text-2);font-weight:500}
.perm-tab + .perm-tab{border-left:1px solid var(--border-strong)}
.perm-tab.active{background:var(--primary-weak);color:var(--primary-text);font-weight:600}
/* Ma trận cuộn TRONG khung (72vh), thead ghim trên + cột phạm vi ghim trái —
   trang cũ 4.234px bắt cuộn cả trang, sang màn thứ 2 là mất tiêu đề cột. */
.perm-wrap{max-height:72vh;overflow:auto;border:1px solid var(--border);border-radius:8px}
.perm-tbl{border:none;border-radius:0;min-width:640px}
.perm-tbl thead th{position:sticky;top:0;z-index:3;background:var(--bg-subtle)}
.perm-tbl thead th:first-child{left:0;z-index:4}
.perm-tbl th.perm-act{text-align:center;white-space:nowrap}
/* #fffbeb/#92400e: cặp amber AA đã dùng ở .cr-warn (style.css ~1794) */
.perm-tbl th.perm-act-sens{background:#fffbeb;color:#92400e}
.perm-tbl .perm-scope{font-weight:600;color:var(--text);white-space:nowrap;background:var(--bg-subtle);
  position:sticky;left:0;z-index:1}
.perm-tbl .perm-cell{text-align:center;position:relative}
/* hover: hàng sáng + CỘT sáng (overlay ::after cao 12000px, .perm-wrap cắt phần thừa) */
.perm-tbl tbody tr:hover td{background:var(--hover)}
.perm-tbl td.perm-cell:hover::after{content:"";position:absolute;left:0;top:-6000px;width:100%;
  height:12000px;background:var(--primary-ring);pointer-events:none}
.perm-grp-row td{background:var(--bg-subtle);padding:6px 10px;font-size:11px;font-weight:600;
  color:var(--text-2);cursor:pointer;user-select:none}
.perm-grp-row .grp-flex{display:flex;align-items:center;gap:8px}
.perm-grp-count{margin-left:auto;font-weight:400;color:var(--text-3)}
.perm-chkwrap{display:inline-flex;align-items:center;justify-content:center;cursor:pointer;padding:3px}
.perm-chkwrap input{width:18px;height:18px;cursor:pointer;accent-color:var(--primary)}
/* chỉ đọc: accent xám .set-ro-style, KHÔNG opacity — vẫn đọc rõ ô nào đang bật */
.perm-tbl input:disabled{accent-color:var(--text-3);cursor:default}
.perm-na{color:var(--text-3)}
.perm-key{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:12px;font-weight:500}
.perm-tag-sens{display:inline-block;margin-left:6px;padding:1px 6px;border-radius:4px;background:#fffbeb;
  color:#92400e;font-size:10px;font-weight:500;white-space:nowrap}
.perm-src{display:none;align-items:center;gap:4px;font-size:10px;color:#92400e;margin-left:6px;vertical-align:middle}
.perm-src.on{display:inline-flex}
.perm-src i{width:6px;height:6px;border-radius:50%;background:var(--st-pending)}
.perm-undo{margin-left:4px;min-width:24px;height:24px;padding:0}
.perm-sens-note{background:#fffbeb;color:#92400e;border-radius:6px;padding:8px 10px;font-size:12px}
[data-theme="dark"] .perm-tbl th.perm-act-sens,[data-theme="dark"] .perm-tag-sens,
[data-theme="dark"] .perm-sens-note{background:rgba(245,158,11,.14);color:var(--ach-warn)}
[data-theme="dark"] .perm-src{color:var(--ach-warn)}

/* ===== Enriched create-task modal ===== */
.modal-sec-h{font-size:11px;font-weight:700;text-transform:uppercase;letter-spacing:.4px;color:var(--text-3);
  margin:18px 0 10px;padding-bottom:6px;border-bottom:1px solid var(--border)}
.modal-sec-h:first-child{margin-top:0}
.seg-exec{width:100%;display:flex}
.seg-exec button{flex:1;justify-content:center;height:34px}

/* ===== Task panel enrichments ===== */
.peek-inline{height:30px;font-size:12px;padding:0 8px}
.peek-props select.peek-inline,.peek-props input.peek-inline{width:auto;min-width:0;max-width:170px}
.peek-tags{display:flex;flex-wrap:wrap;gap:6px}
.peek-tag{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:600;color:var(--text-2);
  background:#f1f1f3;padding:2px 4px 2px 8px;border-radius:20px}
.peek-tag .tag-x{border:none;background:none;cursor:pointer;color:var(--text-3);font-size:14px;line-height:1;
  padding:0 3px;border-radius:50%}
.peek-tag .tag-x:hover{color:#dc2626;background:#fee2e2}
.peek-time-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:12px}
.tt-total-lab{font-weight:700;font-size:13px;color:var(--text)}
.peek-ai-result{margin-top:9px}
.peek-ai-body{background:var(--bg-subtle);border:1px solid var(--border);border-radius:8px;padding:9px 11px;
  font-size:12px;line-height:1.5;color:var(--text-2);white-space:pre-wrap}
.peek-cmts{display:flex;flex-direction:column;gap:10px;margin-bottom:4px}
.peek-cmt{border:1px solid var(--border);border-radius:8px;padding:8px 10px;background:var(--bg-subtle)}
.peek-cmt-h{display:flex;align-items:center;gap:7px;margin-bottom:5px}
.peek-cmt-h .cmt-name{font-weight:600;font-size:12px}
.peek-cmt-h .cmt-time{margin-left:auto;font-size:11px;color:var(--text-3)}
.peek-cmt-body{font-size:13px;line-height:1.5;color:var(--text);white-space:pre-wrap}

/* ===== Board row chips (tags / comments / time) ===== */
.row-tag{display:inline-flex;align-items:center;font-size:11px;font-weight:600;color:var(--text-2);
  background:#eef2ff;padding:1px 6px;border-radius:20px;flex:0 0 auto;max-width:110px;overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap}
.row-tag.more{background:#f1f1f3;color:var(--text-3)}
.row-meta{font-size:11px;color:var(--text-3);flex:0 0 auto;white-space:nowrap}
/* Dữ liệu thật trên production phơi ra ba chỗ mà seed cục bộ không dựng nổi: nhãn
   nhóm việc, dòng phụ "N bình luận", và tiêu đề nhóm TRỄ HẠN. Cả ba chỉ hiện khi có
   việc trễ hạn gán cho chính người đang xem và việc đó có bình luận — bộ kiểm chế độ
   Tối xanh 37/37 trên máy cục bộ và đỏ đúng hai màn trên production vì lẽ đó.
   `.row-tag` giữ nguyên nền `#eef2ff` sáng ở chế độ Tối (chữ xám trên nền sáng),
   `.row-meta` dùng `--text-3` vốn đã mờ sẵn. */
[data-theme="dark"] .row-tag{background:rgba(79,82,161,.30);color:var(--text)}
[data-theme="dark"] .row-tag.more{background:rgba(90,90,96,.35);color:var(--text-2)}
[data-theme="dark"] .row-meta{color:var(--text-2)}

/* ===== "Việc của tôi" (My Work) grouped view ===== */
.mine-groups{display:flex;flex-direction:column;gap:12px}
.mine-grp{background:var(--panel);border:1px solid var(--border);border-radius:8px;overflow:hidden;box-shadow:var(--shadow)}
.mine-grp .grp-h{border-bottom:1px solid var(--border)}
.mine-grp .grp-h.collapsed{border-bottom:none}
.mine-grp-muted .grp-name{color:var(--text-2)}
.mine-grp-muted .mine-row{opacity:.72}
.mine-row .r-title{gap:8px}
.mine-co{font-size:11px;font-weight:600;color:var(--text-2);background:var(--bg-subtle);border:1px solid var(--border);
  padding:1px 7px;border-radius:20px;flex:0 0 auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:150px}
.mine-st{flex:0 0 auto;display:inline-flex;align-items:center}
/* M3-01: ô đổi trạng thái tại chỗ trên "Việc của tôi". Đợt UI/UX 08/2026: viền
   hiện thường trực (không chỉ khi rê chuột) — một control bấm được mà trông như
   chữ thường là mục tiêu bấm vô hình (Fitts/WCAG 2.2). */
/* Dùng `background-color`, KHÔNG dùng shorthand `background`: shorthand đặt lại
   `background-image:none`, mà chính `background-image` mới là cái vẽ mũi tên
   xổ xuống của `select.input`. Độ ưu tiên 0-2-0 của luật :hover thắng 0-1-1 của
   `select.input`, nên mũi tên hiện lúc nghỉ rồi BIẾN MẤT đúng lúc rê chuột. */
.mine-st-sel{border-color:var(--border);background-color:transparent;color:var(--text-2);cursor:pointer;border-radius:6px}
.mine-st-sel:hover,.mine-st-sel:focus{border-color:var(--border-strong);background-color:var(--bg-1)}
.mine-row.mine-done .r-title .t{color:var(--text-3);text-decoration:line-through}
/* Đợt UI/UX 08/2026 (Figma 147:382): dòng cao 44px cho mục tiêu bấm thoải mái;
   ô tick 18px bọc trong vùng bấm ≥24px; nhóm "Trễ hạn" tô đỏ; chip tổng kết trễ
   hạn dưới thanh lọc. */
.mine-row{min-height:44px}
.mine-chk{flex:0 0 auto;display:flex;align-items:center;justify-content:center;padding:3px;cursor:pointer}
.mine-summary{display:flex;align-items:center;gap:10px;margin:2px 0 12px}
.mine-alert{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:20px;
  background:#fef2f2;border:1px solid var(--st-blocked);color:#dc2626;font-size:12px;font-weight:600}
[data-theme="dark"] .mine-alert{background:rgba(239,68,68,.12);border-color:rgba(239,68,68,.5);color:#f87171}
.mine-grp-overdue{border-color:var(--st-blocked)}
.mine-grp-overdue .grp-h{background:#fef2f2}
.mine-grp-overdue .grp-h .grp-name{color:#dc2626}
.mine-grp-overdue .grp-h .grp-count{background:var(--st-blocked);border-color:var(--st-blocked);color:#fff}
/* Tiêu đề nhóm "Trễ hạn" giữ `#dc2626` — đỏ sẫm — ở chế độ Tối, tức chữ sẫm nằm trên
   nền cũng sẫm, đúng chỗ cần nổi nhất lại chìm nhất. Nền hạ kênh gốc thay vì dựa vào
   alpha (cùng cách đã dùng cho `.stat-warn`/`.badge-ok`): kênh gốc sáng làm mọi phép
   đo tương phản — và mắt người ở màn hình chói — đọc ra một nền sáng hơn thực tế. */
[data-theme="dark"] .mine-grp-overdue .grp-h{background:rgba(120,32,32,.30)}
[data-theme="dark"] .mine-grp-overdue .grp-h .grp-name{color:#fca5a5}
[data-theme="dark"] .mine-alert{background:rgba(120,32,32,.34)}
[data-theme="dark"] .mine-grp-overdue .grp-h .grp-name{color:#f87171}

/* ===== Board filter bar ===== */
.filter-bar{display:flex;flex-direction:column;gap:8px;margin:0 0 14px}
.filter-controls{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.filter-lab{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:600;color:var(--text-2)}
.filter-lab svg{width:14px;height:14px}
.filter-chips{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.filter-chip{display:inline-flex;align-items:center;gap:4px;font-size:12px;font-weight:600;color:var(--primary-text);
  background:var(--primary-weak);border:1px solid #d6e0ff;padding:2px 4px 2px 9px;border-radius:20px}
.filter-chip .chip-x{border:none;background:none;cursor:pointer;color:var(--primary-text);font-size:14px;line-height:1;
  padding:0 3px;border-radius:50%}
.filter-chip .chip-x:hover{color:#fff;background:var(--primary)}
.filter-clear{margin-left:2px}

/* ===== Task panel: relationships / dependencies ===== */
.peek-rel-row{display:flex;align-items:center;gap:9px;padding:7px 0;border-top:1px solid #f0f0f2;font-size:12px}
.peek-rel-row:first-child{border-top:none}
.peek-rel-type{font-size:11px;font-weight:700;background:#eef2ff;color:#4256c7;padding:2px 8px;border-radius:5px;
  flex:0 0 auto;white-space:nowrap}
.peek-rel-title{flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.peek-rel-add{margin-top:9px;border-top:1px solid var(--border);padding-top:9px}
.peek-rel-add-row{display:flex;align-items:center;gap:7px}
.peek-rel-add-row select:first-child{flex:0 0 auto}

/* ===== Timesheet (Bảng chấm công) ===== */
.ts-total{background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:16px 18px;
  box-shadow:var(--shadow);display:flex;flex-direction:column;gap:4px;margin-bottom:6px}
.ts-total-k{display:inline-flex;align-items:center;gap:7px;font-size:12px;color:var(--text-2);font-weight:600}
.ts-total-k svg{width:16px;height:16px}
.ts-total-v{font-size:30px;font-weight:700;letter-spacing:-.5px;color:var(--text)}
.ts-grid th,.ts-grid td{padding:7px 8px}
.ts-grid .ts-grid-today{background:var(--bg-subtle)}
.ts-grid thead .ts-grid-today{background:var(--hover)}
.ts-grid .ts-grid-cell:hover{background:var(--hover)}
.ts-grid tfoot .ts-grid-foot td{border-top:1.5px solid var(--border);border-bottom:none;background:var(--bg-subtle)}

/* ===== Responsive ===== */
.backdrop{display:none}
@media (max-width:900px){
  .sidebar{position:fixed;left:0;top:0;bottom:0;z-index:90;transform:translateX(-100%);
    transition:transform .2s;box-shadow:var(--shadow-md)}
  .app.nav-open .sidebar{transform:translateX(0)}
  .app.nav-open .backdrop{display:block;position:fixed;inset:0;background:rgba(0,0,0,.35);z-index:80}
  .hamburger{display:inline-flex}
  .two-col{grid-template-columns:1fr}
  .content{padding:14px}
  .r-assignee{display:none}
  .cell,.cell-h{width:auto}
  .due{width:auto}
  .set-grid{grid-template-columns:1fr}
  .cmd-grid{grid-template-columns:1fr}
  .cmd-compose{position:static}
}
@media (max-width:560px){
  .row2,.score-row{grid-template-columns:1fr}
  .list-head{display:none}
  .peek{width:100vw}
  .gd-kpi{flex-wrap:wrap}
  .gd-kpi .kbar{width:100%;flex:1 1 100%;order:3}
  .gd-counts{gap:10px}
  .fb-row{grid-template-columns:1fr 1fr;gap:6px}
  .fb-row .fb-req{grid-column:1}
  .notif-drop{right:-40px}
  .dash-range-lab{margin-left:0;width:100%}
  .sched-meta{gap:8px}
}

/* ===== Bộ não AI — unified hub (compose box, quick actions, agent gallery) ===== */
/* ── Tab Hỏi/Agents/Kỹ năng/Bộ nhớ — GẤP MÉP dính nóc composer (kiểu Notion AI) ──
   JS chèn seg ngay TRƯỚC .brain-compose-wrap trong .brain-chat-main (app.js, marker
   BRAIN_TABS). Đây là NƠI DUY NHẤT tạo kiểu cụm tab này: hợp nhất 3 block cũ
   (.brain-seg ở đây + hai .seg.brain-seg vá nối đuôi ở EOF). Kiểu vá cũ để lọt
   border-color 4 cạnh của block pill xuống .active, tab active thành HỘP KÍN nên
   đọc ra "tab rời + ô nhập rời" thay vì một khối liền.
   Mọi rule dùng .seg.brain-seg (0,2,0) nên thắng block .seg pill khai báo sau ở
   phần Clickflow polish — thêm rule mới cứ đặt ngay đây, không cần bám cuối file. */
.seg.brain-seg{
  display:flex;justify-content:flex-start;align-items:flex-end;gap:2px;
  background:transparent;border:none;border-radius:0;
  /* Thụt trái 18px = đúng bán kính bo của ô nhập/panel bên dưới: thụt ít hơn thì chân
     tab đứng đè lên khúc CONG của góc, hở một mẩu hình lưỡi liềm ngay chỗ cần liền. */
  max-width:820px;width:100%;padding:0 0 0 18px;
  /* .brain-chat-main là flex column gap:10px — muốn tab CHẠM nóc khối bên dưới phải trừ
     hết khoảng gap đó rồi đè thêm 2px (ô nhập ở tab Hỏi/Agents, .brain-tabpanel ở tab
     Kỹ năng/Bộ nhớ vì hai tab đó ẩn hẳn composer). */
  margin:0 auto -12px;
  /* z:2 < .brain-compose-wrap z:3 là CỐ Ý: flyout .bm-fly nằm trong compose-wrap,
     seg cao hơn thì chữ tab xuyên qua panel flyout. Giá phải trả: viền gradient
     1.5px vẽ đè chân tab active. */
  position:relative;z-index:2;
}
.seg.brain-seg button{
  height:32px;padding:6px 16px 8px;margin-bottom:0;
  font-size:12px;font-weight:600;color:var(--text-2);background:transparent;
  /* 12px khớp thang bo mới của ô nhập (18px) — tab bo 10 cạnh ô bo 18 lệch thấy rõ. */
  border:1px solid transparent;border-radius:12px 12px 0 0;
}
.seg.brain-seg button:hover{background:var(--hover);color:var(--text)}
.seg.brain-seg button.active{
  background:var(--panel);color:var(--text);
  /* CHỈ tô viền trên + hai bên, đáy để trong suốt: đáy có màu là tab đóng kín khung,
     mất hiệu ứng gấp mép liền ô nhập. */
  border-color:var(--border) var(--border) transparent;
  box-shadow:0 -2px 10px -6px rgba(120,115,245,.4);
}

/* ── Tấm panel ruột 3 tab phụ (Agents / Kỹ năng / Bộ nhớ) ──
   Cùng bề rộng, bo góc và bóng đổ với ô nhập nên hai thứ đọc ra một hệ. KHÔNG dùng
   viền gradient: gradient là dấu hiệu "chỗ gõ vào", panel chỉ là mặt phẳng chứa nội
   dung — dùng lại thì mất hẳn ý nghĩa của nó.
   Tab Kỹ năng/Bộ nhớ ẩn composer (app.js paintComposerVisibility) nên panel là thứ
   đỡ mép -12px của cụm tab; tab Agents thì composer vẫn hiện, panel là thẻ riêng nằm
   dưới. Cả hai trường hợp đều KHÔNG đặt margin-top — gap 10px của .brain-chat-main lo,
   thêm margin vào là cộng dồn rồi phá mối hàn tab. */
.brain-tabpanel{
  max-width:820px;width:100%;margin:0 auto;
  background:var(--panel);border:1px solid var(--border);border-radius:18px;
  padding:20px;box-shadow:0 10px 34px -18px rgba(0,0,0,.20);
  position:relative;z-index:1;
}
/* Tiêu đề đầu tiên trong panel không cần margin trên — padding của panel đã đủ. */
.brain-tabpanel>:first-child{margin-top:0}

/* Gradient-glow compose box: a wrapping div with a soft multi-color border, achieved via padding
   (no JS/animation needed) + a subtle low-opacity glow shadow in the same hues. */
/* z:3 > seg z:2 — dropdown/flyout dựng bên trong composer phải đè lên tab (xem
   ghi chú stacking ở block .seg.brain-seg trên). */
.brain-compose-wrap{margin-bottom:6px;position:relative;z-index:3}
.brain-glow{
  /* 18px chứ không 14: ô cao ~150px với bo 14 đọc ra "ô nhập form"; bo lớn mới ra
     "mặt phẳng/card" như composer ClickUp. Inner = 18 − 1.5 padding = 16.5. */
  border-radius:18px;padding:1.5px;
  /* Bốn chặng, HAI chặng giữa cùng màu → dải trung tính chiếm 42-58%, sắc độ dồn hết
     về hai góc. Bản cũ (#ff6ec4,#7873f5,#4adede) bão hoà suốt chu vi nên nét viền
     đọc như vòng focus/báo lỗi thay vì quầng sáng trang trí. */
  background:linear-gradient(115deg,
    var(--brain-edge-1) 0%,var(--brain-edge-mid) 42%,
    var(--brain-edge-mid) 58%,var(--brain-edge-2) 100%);
  /* Quầng ôm sát mép (spread âm nhỏ, blur lớn) — đây mới là phần "phát sáng";
     lớp thứ ba là bóng đổ trung tính giữ ô có trọng lượng trên nền trắng. */
  box-shadow:
    0 0 22px -2px var(--brain-halo-1),
    0 0 26px -2px var(--brain-halo-2),
    0 10px 34px -18px rgba(0,0,0,.20);
}
.brain-glow-inner{
  /* position:relative là mốc neo cho .brain-mention-drop (C3.2) — thiếu nó dropdown
     bám vào tổ tiên có position gần nhất và trôi khỏi khung soạn. */
  position:relative;
  background:var(--panel);border-radius:16.5px;padding:16px 18px 12px;
}
.brain-textarea{
  width:100%;border:none;outline:none;resize:none;background:transparent;color:var(--text);
  font-family:inherit;font-size:14px;line-height:1.55;min-height:44px;max-height:220px;
  padding:0;margin:0;
}
.brain-textarea::placeholder{color:var(--text-3)}
/* KHÔNG kẻ vạch ngăn ở đây. Ô nhập đã có viền gradient bao ngoài; thêm một nét ngang
   bên trong là cạnh thứ hai trong cùng một khối nhỏ, mắt đọc thành hai ngăn rời.
   ClickUp để trống hoàn toàn — khoảng cách làm nốt việc phân tách. */
.brain-box-bottom{display:flex;align-items:center;gap:8px;margin-top:16px}
.brain-attach-btn,.brain-send-btn{
  width:28px;height:28px;border-radius:50%;border:1px solid var(--border-strong);background:var(--panel);
  color:var(--text-2);cursor:pointer;display:flex;align-items:center;justify-content:center;flex:0 0 28px;
  transition:background .12s,color .12s;
}
.brain-attach-btn:hover:not(:disabled),.brain-send-btn:hover:not(:disabled){background:var(--hover);color:var(--text)}
.brain-attach-btn:disabled{opacity:.45;cursor:not-allowed}
.brain-send-btn{background:var(--cta);border-color:var(--cta);color:#fff}
.brain-send-btn:hover:not(:disabled){background:var(--cta-hover);border-color:var(--cta-hover);color:#fff}
/* P4 (07/08/2026) — nút Gửi TẮT phải TRÔNG như đã tắt.
   `.brain-send-btn` không phải `.btn`, nên luật chung `.btn:disabled{opacity:.5}`
   (dòng ~143) chưa bao giờ với tới nó. Trước lượt này chưa có ai đặt `disabled`
   cho nó ngoài lúc đang stream — và lúc đó `.is-stop:disabled{opacity:1}` cố ý
   giữ nút sáng — nên khoảng hụt không lộ ra. P4 mới là chỗ đầu tiên tắt nút ở
   trạng thái thường: thiếu luật này thì nút vẫn nền CTA, vẫn sáng lên khi rê
   chuột, vẫn `cursor:pointer` — bấm vào thì không có gì xảy ra. Đúng cái "hàng
   rào giấy" mà P4 sinh ra để bỏ. */
.brain-send-btn:disabled{opacity:.45;cursor:not-allowed;background:var(--cta);border-color:var(--cta)}
/* F3.4 — nút gửi hoá nút Dừng khi đang stream. Đỏ để phân biệt hẳn với "gửi": hai hành
   động ngược nhau mà dùng chung một chỗ bấm thì màu là thứ duy nhất tách chúng ra. */
.brain-send-btn.is-stop,.brain-send-btn.is-stop:hover{background:#b8283f;border-color:#b8283f;color:#fff}
.brain-send-btn.is-stop:disabled{opacity:1;cursor:pointer}
.brain-model-wrap{position:relative;flex:0 0 auto}
.brain-model-pill{
  display:inline-flex;align-items:center;gap:6px;height:26px;padding:0 10px;border-radius:20px;
  border:1px solid var(--border-strong);background:var(--bg-subtle);color:var(--text-2);font-size:12px;
  font-weight:600;cursor:pointer;white-space:nowrap;flex:0 0 auto;
}
.brain-model-pill:hover{background:var(--hover);color:var(--text)}
.brain-model-pill .bm-caret{opacity:.55;display:inline-flex}

/* P4 (07/08/2026) — trạng thái VẮNG MODEL.

   Pill là đường sửa sẵn có (bấm vào là dropdown mở ra kèm "Quản lý mô hình AI"),
   nên nó chỉ cần ĐỔI MÀU để nói rằng có việc phải làm ở đây — không dựng nút thứ
   hai cho cùng một hành động.

   Hổ phách chứ không đỏ: chưa có model là một bước CÀI ĐẶT còn thiếu, không phải
   một lỗi vừa xảy ra. Đỏ ở đây làm mòn màu đỏ của những chỗ thật sự hỏng. */
.brain-model-pill.is-warn{
  border-color:#fcd34d;background:#fffbeb;color:#b45309;
}
.brain-model-pill.is-warn:hover{background:#fef3c7;color:#92400e}
[data-theme="dark"] .brain-model-pill.is-warn{
  border-color:#78350f;background:rgba(180,83,9,.16);color:#fbbf24;
}

/* Dòng nhắc dưới ô soạn khi chưa có model. Cả dòng bấm được — cùng đích với pill. */
.brain-model-warn{
  display:flex;align-items:center;gap:8px;margin-top:8px;padding:8px 12px;
  border:1px solid #fcd34d;background:#fffbeb;color:#92400e;border-radius:9px;
  font-size:12px;cursor:pointer;
}
.brain-model-warn:hover{background:#fef3c7}
.brain-model-warn svg{width:15px;height:15px;flex:0 0 auto}
.brain-model-warn .bmw-go{margin-left:auto;font-weight:600;white-space:nowrap}
[data-theme="dark"] .brain-model-warn{
  border-color:#78350f;background:rgba(180,83,9,.14);color:#fcd34d;
}
[data-theme="dark"] .brain-model-warn:hover{background:rgba(180,83,9,.22)}

/* P8 — dòng nhắc ngữ cảnh (tab Agents: lượt gửi này TẠO agent, không phải hỏi).
   Không dùng màu cảnh báo: đây là mô tả, không phải cảnh báo. */
.brain-ctx-hint{
  margin-top:8px;padding:7px 12px;border-radius:9px;font-size:12px;line-height:1.45;
  color:var(--text-2);background:var(--bg-subtle);border:1px solid var(--border);
}

/* P9 — dòng "đi tới đâu" của tab Agents. Chú thích là chữ thường; đích đến là
   nút-liên-kết THẤY ĐƯỢC. Trước đây cả hai cùng màu xám `.hint`, phân cách bằng
   cùng một dấu "·" đang kiêm luôn vai ngăn danh sách năng lực. */
.brain-navto{display:flex;align-items:center;flex-wrap:wrap;gap:8px}
.brain-navto .bn-lead{font-size:12px;color:var(--text-3)}
.brain-navto .bn-link{
  display:inline-flex;align-items:center;height:24px;padding:0 10px;border-radius:999px;
  border:1px solid var(--border);background:var(--panel);color:var(--primary-text);
  font-size:12px;font-weight:600;text-decoration:none;white-space:nowrap;
}
.brain-navto .bn-link:hover{background:var(--hover);border-color:var(--border-strong)}
.brain-model-pill .bm-caret svg{width:11px;height:11px}
/* .brain-thinking-pill đã gỡ (2026-08-01) cùng nút Thinking ngoài thanh composer —
   bật/tắt nay nằm trong flyout Tuỳ chọn của bộ chọn model (.bm-fly-row + .bm-switch). */
.brain-model-drop{
  position:absolute;bottom:34px;right:0;width:300px;max-width:80vw;background:var(--panel);
  border:1px solid var(--border-strong);border-radius:10px;box-shadow:var(--shadow-md);z-index:40;
  overflow:hidden;
}
.bm-empty{padding:14px 13px;font-size:12px;color:var(--text-3)}
.bm-item{display:flex;align-items:center;gap:8px;padding:9px 13px;cursor:pointer;border-bottom:1px solid var(--border)}
.bm-item:last-of-type{border-bottom:none}
.bm-item:hover{background:var(--hover)}
.bm-item.active{background:var(--primary-weak)}
.bm-name{display:flex;flex-direction:column;gap:1px;min-width:0;flex:1}
.bm-title{font-size:13px;font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.bm-sub{font-size:11px;color:var(--text-3)}
.bm-check{flex:0 0 auto;color:var(--primary-text);display:inline-flex}
.bm-check svg{width:15px;height:15px}
.bm-manage{
  display:flex;align-items:center;gap:7px;padding:10px 13px;font-size:12px;font-weight:600;
  color:var(--text-2);cursor:pointer;border-top:1px solid var(--border);background:var(--bg-subtle);
}
.bm-manage:hover{color:var(--text);background:var(--hover)}
.bm-manage svg{width:14px;height:14px}
.bm-search{
  display:flex;align-items:center;gap:7px;padding:8px 12px;border-bottom:1px solid var(--border);
  background:var(--bg-subtle);
}
.bm-search input{
  flex:1;border:none;background:transparent;font-size:13px;color:var(--text);outline:none;
  font-family:inherit;
}
.bm-search input::placeholder{color:var(--text-3)}
.bm-search svg{width:14px;height:14px;color:var(--text-3);flex:0 0 auto}
.bm-group{padding:6px 13px 3px;font-size:11px;font-weight:700;color:var(--text-3);text-transform:uppercase;letter-spacing:.5px}
.bm-badge{
  display:inline-flex;align-items:center;padding:1px 6px;border-radius:4px;font-size:11px;
  font-weight:600;background:var(--primary-weak);color:var(--primary-text);flex:0 0 auto;
}
/* BL-98 — provider đang bị ngắt mạch/hết hạn mức: mờ item + badge cam. Vẫn bấm
   được (phạt tự hết theo TTL) nên KHÔNG pointer-events:none. */
.bm-badge.warn{background:#fef3c7;color:#b45309} /* cặp amber của .tt-milestone */
.bm-item.blocked{opacity:.55}
.bm-item.blocked:hover{opacity:.8}
/* Run-mode picker (manual / credit / plan / auto / bypass) — reuses the model pill's
   look; only the dropdown anchors left (it sits at the start of the bottom row). */
.brain-mode-wrap .brain-model-drop{left:0;right:auto;width:340px}
.bmode-dot{width:8px;height:8px;border-radius:50%;background:var(--text-3);flex:0 0 8px}
.brain-mode-wrap .bm-item{align-items:flex-start}
.brain-mode-wrap .bm-item .bmode-dot{margin-top:5px}
.brain-mode-wrap .bm-sub{white-space:normal;line-height:1.35}

/* Secondary mode chips (Tóm tắt / Báo cáo / Rút việc cần làm) below the compose box. */
.brain-sec-modes{display:flex;gap:8px;flex-wrap:wrap;margin-top:10px}
.brain-sec-modes .chip{cursor:pointer;padding:5px 12px;transition:background .12s,border-color .12s}
.brain-sec-modes .chip:hover{background:var(--hover);border-color:var(--border-strong)}

/* Quick-action suggestion cards (Ask mode).

   P7 (07/08/2026) — `auto-fit` + `minmax(200px,1fr)` xếp BỐN thẻ thành 3 + 1.
   Đo: khối hero rộng 820px, 4×200 + 3×10 gap = 830 > 820, nên trình duyệt rơi
   xuống 3 cột và thẻ thứ tư mồ côi hẳn một hàng. Chênh đúng 10px.

   Chốt cứng 4 cột thay vì hạ `minmax` xuống 190px: `auto-fit` giải theo BỀ RỘNG
   CÒN LẠI, nên nó sẽ vỡ lại y như vậy ở lần sau ai đó đổi max-width của hero hay
   thêm padding — và cái vỡ ấy im lặng. Số thẻ là hằng sản phẩm
   (`BRAIN_QUICK_ACTIONS`, 4 mục), nên số cột cũng nên là một con số đọc được.

   NGƯỠNG ĐO THEO VIEWPORT, CÒN LƯỚI SỐNG TRONG MỘT CONTAINER HẸP HƠN NHIỀU —
   nên con số ngưỡng KHÔNG phải con số bề ngang lưới. Bề ngang thật ≈ viewport
   − 240 (thanh bên) − 48 (đệm `.content`) − 218 (cột phiên) − 14 (gap), tức
   viewport − 520. Ở viewport 1280 lưới chỉ có ~760px: bốn cột 177px, trừ đệm 26
   còn ~151px cho chữ — vừa đủ. Ở 1024 còn ~504px, bốn cột 116px: tiêu đề "Báo cáo
   điều hành tuần này" vỡ thành bốn dòng. Vì thế ngưỡng đặt ở 1180, không phải 900
   như bản đầu của lượt này — 900 rơi vào đúng khoảng đã vỡ. */
.brain-quick-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px}
@media (max-width:1180px){ .brain-quick-grid{grid-template-columns:repeat(2,minmax(0,1fr))} }
.brain-quick-card{
  display:flex;flex-direction:column;align-items:flex-start;gap:4px;text-align:left;
  background:var(--panel);border:1px solid var(--border);border-radius:8px;padding:12px 13px;
  cursor:pointer;font-family:inherit;box-shadow:var(--shadow);transition:box-shadow .12s,border-color .12s,transform .12s;
}
.brain-quick-card:hover{box-shadow:var(--shadow-md);border-color:var(--border-strong);transform:translateY(-1px)}
.brain-quick-card .bq-icon{color:var(--primary-text);width:18px;height:18px}
.brain-quick-card .bq-icon svg{width:18px;height:18px}
.brain-quick-card .bq-title{font-weight:600;font-size:13px;color:var(--text)}
.brain-quick-card .bq-desc{font-size:12px;color:var(--text-2);line-height:1.4}

/* Industry focus pill-tabs (Agents tab). */
.brain-industry-pills{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:4px}
.brain-pill{
  display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 13px;border-radius:20px;
  border:1px solid var(--border-strong);background:var(--panel);color:var(--text-2);font-size:12px;
  font-weight:600;cursor:pointer;white-space:nowrap;transition:background .12s,border-color .12s,color .12s;
}
.brain-pill:hover{background:var(--hover)}
/* Active = pill đen đặc như ClickUp (hợp nhất từ luật override cũ ở cuối file —
   hai luật cùng selector, luật sau thắng, nên gộp về một chỗ; giao diện không đổi). */
.brain-pill.active{background:#1d1f27;border-color:#1d1f27;color:#fff}

/* Agent template gallery cards. */
.brain-tpl-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px}
.brain-tpl-card{
  display:flex;flex-direction:column;background:var(--panel);border:1px solid var(--border);border-radius:8px;
  padding:13px 14px;box-shadow:var(--shadow);transition:box-shadow .12s,border-color .12s;
}
.brain-tpl-card:hover{box-shadow:var(--shadow-md);border-color:var(--border-strong)}
.bt-top{display:flex;align-items:flex-start;gap:10px;margin-bottom:8px}
.bt-avatar{font-size:28px;line-height:1;flex:0 0 auto}
.bt-name{font-weight:600;font-size:13.5px;margin-bottom:4px}
.bt-desc{font-size:12px;color:var(--text-2);line-height:1.5;margin-bottom:8px}
.bt-skills-link{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:600;color:var(--primary-text);cursor:pointer;margin-bottom:10px}
.bt-skills-link svg{width:12px;height:12px}
.bt-skills-link:hover{text-decoration:underline}
.bt-foot{margin-top:auto;display:flex;justify-content:flex-end}

/* Skill library cards (Kỹ năng tab) — same visual language as agent template cards, but the
   title IS the skill (a concrete, immediately runnable capability), not the agent. */
.brain-skill-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:12px}
.brain-skill-card{
  display:flex;flex-direction:column;background:var(--panel);border:1px solid var(--border);border-radius:8px;
  padding:13px 14px;box-shadow:var(--shadow);transition:box-shadow .12s,border-color .12s;
}
.brain-skill-card:hover{box-shadow:var(--shadow-md);border-color:var(--border-strong)}
.bs-top{display:flex;align-items:flex-start;gap:10px;margin-bottom:12px}
.bs-avatar{
  font-size:17px;line-height:1;flex:0 0 auto;width:32px;height:32px;border-radius:8px;
  background:var(--bg-subtle);display:flex;align-items:center;justify-content:center;
}
.bs-name{font-weight:600;font-size:13px;line-height:1.4}
.bs-agent{font-size:11px;color:var(--text-3)}
.bs-foot{margin-top:auto;display:flex;justify-content:flex-end}

/* "Agent của bạn" quick-run chips. */
.brain-myagents-row{display:flex;flex-wrap:wrap;gap:8px}
.brain-myagent-chip{
  display:inline-flex;align-items:center;gap:7px;height:32px;padding:0 12px 0 8px;border-radius:20px;
  border:1px solid var(--border);background:var(--panel);color:var(--text);font-size:13px;font-weight:600;
  cursor:pointer;font-family:inherit;transition:background .12s,border-color .12s;
}
.brain-myagent-chip:hover{background:var(--hover);border-color:var(--border-strong)}
.brain-myagent-chip .bm-avatar{font-size:15px;line-height:1}

/* Danh sách "Agent công ty" trong tab Agents (duyệt Figma 11/08/2026, node 304:146).
   Một hàng = một agent, đọc được cả ba câu mà không cần bấm: là ai, chạy bằng gì,
   đã chạy chưa. */
.brain-agent-search{margin-left:auto;max-width:260px;height:32px;text-transform:none;letter-spacing:0}
.brain-agent-list{display:flex;flex-direction:column;gap:8px}
.brain-agent-row{
  display:flex;align-items:center;gap:12px;padding:10px 12px;border:1px solid var(--border);
  border-radius:10px;background:var(--panel);
}
.brain-agent-row .ba-avatar{
  flex:0 0 36px;width:36px;height:36px;border-radius:10px;display:flex;align-items:center;
  justify-content:center;font-size:17px;background:var(--primary-weak);
}
.brain-agent-row .ba-mid{flex:1;min-width:0;display:flex;flex-direction:column;gap:3px}
.brain-agent-row .ba-name-line{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.brain-agent-row .ba-name{font-weight:600;font-size:14px}
.brain-agent-row .ba-desc{
  font-size:12.5px;color:var(--text-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.brain-agent-row .ba-skills{display:flex;flex-wrap:wrap;gap:6px;align-items:center}
.brain-agent-row .ba-skill{
  font-size:11px;padding:2px 8px;border-radius:20px;background:var(--bg-subtle);color:var(--text-2);
}
.brain-agent-row .ba-more{font-size:11px;color:var(--text-3)}
.brain-agent-row .ba-meta{font-size:12px;color:var(--text-3)}
.brain-agent-row .ba-acts{display:flex;gap:8px;align-items:center;flex-shrink:0}
.brain-agent-row .ba-acts .btn{min-height:32px}
/* Agent tắt: cả hàng lùi về sau, nút giao việc mất màu — trạng thái phải nhìn ra
   TRƯỚC khi bấm, không phải sau khi lệnh rơi vào im lặng. */
.brain-agent-row.is-off{background:var(--bg-subtle);border-style:dashed}
.brain-agent-row.is-off .ba-avatar{background:var(--hover);filter:grayscale(1)}
.brain-agent-row.is-off .ba-name{color:var(--text-2)}
@media (max-width:640px){
  .brain-agent-row{align-items:flex-start;flex-wrap:wrap}
  .brain-agent-row .ba-acts{width:100%;justify-content:flex-end}
  .brain-agent-search{max-width:none;width:100%;margin:6px 0 0}
}
@media (max-width:560px){
  .brain-glow-inner{padding:11px 12px 8px}
  .brain-quick-grid{grid-template-columns:1fr}
  /* Màn hẹp: padding 20px hai bên ăn mất 40px của ~360px bề ngang. Bo góc hạ theo
     để tab (bo 12) không lệch thang với panel. Thụt trái cụm tab hạ khớp bán kính. */
  .brain-tabpanel{padding:14px;border-radius:14px}
  .seg.brain-seg{padding-left:14px}
}

/* ═══════════════════════════════════════════════════════════════════
   PIXEL POLISH v2 (đợt 30) — Home/Board/CRM theo ngôn ngữ Clickflow 4.0.
   Khối override cuối file: tinh chỉnh type-scale, spacing 4px-grid,
   hover/focus, scrollbar, card language — không đổi DOM nên an toàn.
   ═══════════════════════════════════════════════════════════════════ */

/* — Scrollbar mảnh (chữ ký Clickflow) — */
*::-webkit-scrollbar{width:8px;height:8px}
*::-webkit-scrollbar-track{background:transparent}
*::-webkit-scrollbar-thumb{background:rgba(0,0,0,.16);border-radius:4px;border:2px solid transparent;background-clip:content-box}
*::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,.3);border:2px solid transparent;background-clip:content-box}
[data-theme="dark"] *::-webkit-scrollbar-thumb{background:rgba(255,255,255,.18);background-clip:content-box;border:2px solid transparent}

/* — Page header: title 20/700 −0.3, sub 13 muted, khoảng thở 4px-grid — */
.page-title{font-size:20px;font-weight:700;letter-spacing:-.3px;line-height:1.25;margin:2px 0 4px}
.page-sub{font-size:13px;color:var(--text-2);margin:0 0 14px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}

/* — Stat cards (Home/CRM/Finance): số to hơn, nhãn nén, lift khi hover — */
.stat{border-radius:10px;padding:14px 16px 13px;transition:box-shadow .14s,border-color .14s,transform .14s}
.stat:hover{transform:translateY(-1px)}
.stat .k{font-size:11px;letter-spacing:.5px;color:var(--text-3)}
.stat .v{font-size:27px;letter-spacing:-.8px;margin-top:5px;line-height:1.1;font-variant-numeric:tabular-nums}

/* — Company cards (Home) — */
.co-card{border-radius:10px;transition:box-shadow .14s,border-color .14s,transform .14s}
.co-card:hover{transform:translateY(-2px)}

/* — List view: hàng 40px, cột đầu thoáng, hover lộ hành động — */
.row{padding:5px 14px;border-bottom:1px solid var(--border)}
.row .t{font-size:13px;font-weight:520}
.row .due{font-size:12px;font-variant-numeric:tabular-nums}
.row .r-assignee .an{font-size:12px}
.list-head{letter-spacing:.5px;color:var(--text-3);border-bottom:1px solid var(--border);background:var(--bg)}
.grp-h{background:var(--bg);border-bottom:1px solid var(--border)}
.grp-h .grp-name{font-size:12px;font-weight:700;letter-spacing:.2px;text-transform:uppercase}
.grp-h .grp-count{font-size:11px;color:var(--text-3);background:var(--bg-subtle);border:1px solid var(--border);
  padding:1px 7px;border-radius:9px;font-variant-numeric:tabular-nums}
.grp-dot{width:8px;height:8px;border-radius:3px}   /* vuông bo nhẹ như status Clickflow */

/* — Kanban: cột nền xám nhạt, header sticky-cảm, card nổi khi hover — */
.kanban{gap:14px}
.kcol{flex:0 0 280px;width:280px;background:var(--bg-subtle);border-radius:10px;padding:6px}
/* header trải hết bề ngang cột (bỏ chip fit-content) để count trái / tổng tiền phải */
.kcol-h{padding:8px 8px 6px;letter-spacing:.5px;width:auto;background:transparent;margin-bottom:0}
.kcards{padding:2px 4px 8px;gap:8px}
.kcard{border-radius:9px;padding:11px 12px;transition:box-shadow .13s,border-color .13s,transform .13s;cursor:pointer}
.kcard:hover{transform:translateY(-1px);box-shadow:0 6px 18px -6px rgba(0,0,0,.16),0 2px 5px -2px rgba(0,0,0,.08)}
.kcard-title{font-size:13px;font-weight:560;line-height:1.4}
.kcard-meta{font-size:12px;color:var(--text-3)}

/* — Bảng dữ liệu (CRM/Finance/Users…): header nén, hover hàng, số tabular — */
.tbl th{font-size:11px;font-weight:600;letter-spacing:.5px;text-transform:uppercase;color:var(--text-3);
  padding:8px 12px;border-bottom:1px solid var(--border-strong)}
.tbl td{font-size:13px;padding:9px 12px;font-variant-numeric:tabular-nums}
.tbl tbody tr{transition:background .1s}
.tbl tbody tr:hover{background:var(--hover)}
.tbl tfoot td{font-size:12px;background:var(--bg-subtle)}

/* — Nút & input: cao nhất quán, focus ring 2px primary — */
.btn{transition:background .12s,border-color .12s,box-shadow .12s,color .12s}
.btn:focus-visible,.input:focus-visible,.nav-item:focus-visible{outline:2px solid var(--primary-ring);outline-offset:1px}
.input:focus{border-color:var(--primary);box-shadow:0 0 0 3px var(--primary-ring)}

/* — Badge: pill nén kiểu Clickflow — */
.badge{font-size:11px;font-weight:600;letter-spacing:.4px;padding:2px 8px;border-radius:9px;text-transform:uppercase}

/* — Empty & loading: gọn, đúng tông — */
.empty{padding:44px 16px;color:var(--text-3)}
.empty .et{font-size:13.5px;font-weight:600;color:var(--text-2);margin-top:10px}
.empty svg{width:36px;height:36px;opacity:.4}
.loading{padding:28px;color:var(--text-3);font-size:12px}
.spinner{width:18px;height:18px;border-width:2px}

/* — Modal: bo 12, header rõ, backdrop mờ hơn — */
.overlay{background:rgba(16,20,28,.42);backdrop-filter:blur(2px)}
.modal{border-radius:12px;box-shadow:0 24px 64px -16px rgba(0,0,0,.32),0 4px 16px -6px rgba(0,0,0,.14)}
.modal-h .mt{font-size:14.5px;font-weight:700;letter-spacing:-.2px}

/* — Segmented control: nền chìm, nút active trắng nổi (Clickflow view switcher) — */
.seg{background:var(--bg-subtle);border:1px solid var(--border);border-radius:8px;padding:2px;gap:2px}
.seg button{border-radius:6px;font-size:12px;font-weight:600;padding:5px 12px;color:var(--text-2)}
.seg button.active{background:var(--panel);color:var(--text);box-shadow:0 1px 2px rgba(0,0,0,.08);border:1px solid var(--border)}

/* — CRM pipeline dùng chung kanban class → tự hưởng polish; deal amount nổi — */
.kcard .kc-amount,.kcard b{font-variant-numeric:tabular-nums}

/* — Sidebar nav: item 30px, active đậm hơn (đúng Clickflow rail) — */
.nav-item{border-radius:7px;font-size:12px;padding:6px 10px}
.nav-sec{font-size:11px;letter-spacing:.7px}

/* — Team View (CU4-041) — */
.team-list{display:flex;flex-direction:column;gap:8px}
.team-row{display:grid;grid-template-columns:220px 160px 1fr;gap:14px;align-items:center;
  background:var(--panel);border:1px solid var(--border);border-radius:10px;padding:11px 14px}
.team-row:hover{border-color:var(--border-strong);box-shadow:var(--shadow-md)}
.team-who{display:flex;align-items:center;gap:9px;min-width:0}
.team-name{font-size:13px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.team-sub{font-size:11px;color:var(--text-3)}
.team-load{display:flex;align-items:center;gap:8px}
.team-load-bar{flex:1;height:8px;border-radius:4px;background:var(--bg-subtle);overflow:hidden}
.team-load-fill{height:100%;background:var(--primary);border-radius:4px}
.team-load-fill.has-overdue{background:var(--st-blocked)}
.team-load-n{font-size:12px;font-weight:700;font-variant-numeric:tabular-nums;min-width:18px;text-align:right}
.team-load-n.has-overdue{color:var(--st-blocked)}
.team-overdue-n{color:var(--st-blocked);font-weight:600}
/* "Chưa giao" / "AI phụ trách" không phải nhân sự — nền chìm để không đọc nhầm là thành viên */
.team-row-none,.team-row-ai{background:var(--bg-subtle)}
.team-row-none .team-name{color:var(--text-3)}
/* UIUX Đội nhóm (Figma 152:62): hàng có việc trễ nhuộm đỏ cả thẻ (cùng ngôn ngữ
   .stat-bad Trang chủ); hàng 0 việc chìm xám để rủi ro nổi lên. */
.team-row-risk{background:#fef2f2;border-color:var(--st-blocked)}
[data-theme="dark"] .team-row-risk{background:rgba(239,68,68,.09)}
.team-row-idle .team-load-n{color:var(--text-3);font-weight:600}
.team-row-idle .team-load-fill{background:var(--border-strong)}
.team-chips{display:flex;gap:6px;flex-wrap:wrap;min-width:0}
.team-chip{display:inline-flex;align-items:center;gap:5px;max-width:210px;padding:3px 9px;border-radius:12px;
  border:1px solid var(--border);background:var(--bg-subtle);font-size:12px;cursor:pointer}
.team-chip:hover{border-color:var(--border-strong);background:var(--hover)}
.team-chip.overdue{border-color:var(--st-blocked);color:var(--st-blocked)}
.team-chip .tc-t{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.team-more{font-size:11px;color:var(--text-3);align-self:center}
@media (max-width:880px){.team-row{grid-template-columns:1fr;gap:8px}}

/* — Goals chi tiết (đợt 32) — */
.goal-card .okr-h{gap:10px;align-items:center}
.kr-type{font-size:9.5px;font-weight:600;text-transform:uppercase;letter-spacing:.4px;color:var(--text-3);
  background:var(--bg-subtle);border:1px solid var(--border);border-radius:8px;padding:1px 6px;margin-left:7px}
.kr-actions{display:inline-flex;gap:4px;opacity:0;transition:opacity .12s}
.kr:hover .kr-actions{opacity:1}
.badge-danger{background:#fdecec;color:#b8283f}
/* Cùng họ với `.badge-ok`: kênh gốc sáng (226,68,92) rồi dựa vào alpha làm dịu, nên
   mọi phép đo tương phản — và mắt người trên màn hình chói — đọc ra nền sáng hơn thật.
   Hạ kênh gốc, giữ alpha đủ nhận ra sắc đỏ. Chỉ lộ ra khi có dữ liệu thật: nhãn "Rủi
   ro"/"Lệch hướng" ở KPI và "Mật" ở Tài liệu chỉ vẽ khi có KR lệch và tài liệu mật. */
[data-theme="dark"] .badge-danger{background:rgba(110,26,38,.34);color:#ff8d9d}

/* — Stat card v2 (đợt 33): icon tile màu theo ngữ nghĩa, layout ngang Clickflow — */
.stat{display:flex;align-items:center;gap:12px}
.stat-ic{flex:0 0 34px;width:34px;height:34px;border-radius:9px;display:inline-flex;align-items:center;
  justify-content:center;background:var(--bg-subtle);color:var(--text-2);border:1px solid var(--border)}
.stat-ic svg{width:17px;height:17px}
.stat-ic.good{background:#e7f6ee;color:var(--st-done);border-color:#cdeeda}
.stat-ic.bad{background:#fdecee;color:var(--st-blocked);border-color:#f8d3d9}
.stat-ic.warn{background:#fff4e0;color:#b06000;border-color:#f8e3bd}
.stat-ic.ai{background:#f1edff;color:var(--st-verified);border-color:#e2daf9}
[data-theme="dark"] .stat-ic{background:var(--bg-subtle);border-color:var(--border)}
[data-theme="dark"] .stat-ic.good{background:rgba(0,136,68,.16);border-color:rgba(0,136,68,.3)}
[data-theme="dark"] .stat-ic.bad{background:rgba(226,68,92,.14);border-color:rgba(226,68,92,.3)}
[data-theme="dark"] .stat-ic.warn{background:rgba(248,174,0,.12);border-color:rgba(248,174,0,.28)}
[data-theme="dark"] .stat-ic.ai{background:rgba(123,104,238,.14);border-color:rgba(123,104,238,.3)}
.stat-tx{min-width:0}
.stat-tx .v{margin-top:2px}

/* — CRM deal card v3 (Figma 157:280): TIỀN là dòng đầu và to nhất (amount >
   name > meta), select giai đoạn luôn hiện (WCAG 2.2 Dragging Movements) — */
.deal-card{cursor:pointer}
.deal-amount{font-size:15px;font-weight:700;color:var(--primary-text);margin:0 0 3px;letter-spacing:-.2px;font-variant-numeric:tabular-nums}
.deal-card .kcard-title{font-size:12.5px;font-weight:500;margin-bottom:4px}
.deal-contact{font-size:12px;color:var(--text-2);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.deal-ref{margin-left:auto;font-size:9.5px;flex:0 0 auto;max-width:55%;overflow:hidden;text-overflow:ellipsis}
.deal-prob{display:flex;align-items:center;gap:7px;margin-top:7px}
.deal-prob-bar{flex:1;height:4px;border-radius:3px;background:var(--bg-subtle);overflow:hidden;border:1px solid var(--border)}
.deal-prob-bar>span{display:block;height:100%;border-radius:3px}
.deal-prob-n{font-size:11px;font-weight:600;color:var(--text-3);font-variant-numeric:tabular-nums}
.deal-foot{display:flex;align-items:center;gap:7px;margin-top:8px;padding-top:8px;border-top:1px solid var(--border)}
.deal-foot .avatar{width:20px;height:20px;font-size:9px;flex:0 0 20px}
.deal-foot .due{font-size:11px}
.deal-foot-spacer{flex:1}
/* luôn hiện — hover-only (opacity:0) vô hình với touch/bàn phím; đây là đường
   thay thế kéo-thả bắt buộc theo WCAG 2.2 Dragging Movements. Hit area 24px. */
.deal-stage-sel{width:auto;max-width:112px;height:24px;font-size:11px;padding:0 4px;color:var(--text-2)}
.deal-stage-sel:hover,.deal-stage-sel:focus{color:var(--text)}

/* — Báo cáo công việc AI (đợt 33): AI làm → tự check → người duyệt lại — */
.aiw-sum{display:flex;gap:8px;margin:2px 0 8px;flex-wrap:wrap}
.aiw-row{display:flex;align-items:center;gap:10px;padding:8px 10px;border:1px solid var(--border);
  border-radius:9px;margin-bottom:7px;background:var(--panel);transition:border-color .12s,box-shadow .12s}
.aiw-row:hover{border-color:var(--border-strong);box-shadow:var(--shadow)}
.aiw-av{width:26px;height:26px;font-size:11px;flex:0 0 26px;background:#7c3aed}
.aiw-main{flex:1;min-width:0}
.aiw-title{display:block;max-width:100%;background:none;border:none;padding:0;cursor:pointer;
  font-size:13px;font-weight:600;color:var(--text);text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.aiw-title:hover{color:var(--primary-text)}
.aiw-meta{display:flex;align-items:center;gap:7px;margin-top:2px;min-width:0}
.aiw-meta .muted{font-size:11px;flex:0 0 auto}
.aiw-prev{font-size:11px;color:var(--text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0}
.aiw-cells{display:flex;align-items:center;gap:14px;flex:0 0 auto}
.aiw-cell{display:inline-flex;flex-direction:column;align-items:center;gap:2px}
.aiw-cl{font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.3px;color:var(--text-3)}
@media (max-width:760px){
  .aiw-row{flex-wrap:wrap}
  .aiw-cells{width:100%;justify-content:flex-end}
}

/* — Home widgets (Tiện ích của tôi) polish (đợt 33) — */
.hw-card{border-radius:10px;transition:box-shadow .13s,border-color .13s}
.hw-card:hover{border-color:var(--border-strong);box-shadow:var(--shadow-md)}
.hw-card .hw-h svg{width:15px;height:15px;color:var(--text-2)}
.hw-line:hover{background:var(--hover);border-radius:6px}
.hw-line:last-child{border-bottom:none!important}
/* .hw-line (tiêu đề việc trong "Việc của tôi" / "Sắp tới hạn" ở Trang chủ) là <button>
   dựng bằng style inline, không đặt `color` — cùng lỗi buttontext-mặc-định như
   .chip-autopilot phía trên: chữ đen 0.00 đè lên .panel-card nền ~0.10 ở chế độ Tối. */
[data-theme="dark"] .hw-line{color:var(--text)}
.badge svg{width:11px;height:11px}

/* — Gantt dependency arrows (CU4-038, đợt 33d) — */
.tl-arrow{fill:none;stroke:var(--text-3);stroke-width:1.6;opacity:.75}
.tl-arrow.blocks{stroke:var(--st-blocked)}
.tl-bar,.tl-point{position:relative;z-index:2}

/* ── Đợt 38: menu hồ sơ Clickflow-style ── */
.profile-menu-overlay{position:fixed;inset:0;z-index:960;background:transparent}
.profile-menu{position:fixed;width:320px;max-height:78vh;overflow:auto;background:var(--bg-card,#fff);border:1px solid var(--border);border-radius:12px;box-shadow:0 18px 50px rgba(15,23,42,.22);padding:8px;z-index:961}
[data-theme="dark"] .profile-menu{background:#101827;box-shadow:0 18px 50px rgba(0,0,0,.55)}
.pm-head{display:flex;gap:10px;align-items:center;padding:8px 10px 10px;border-bottom:1px solid var(--border);margin-bottom:6px}
.pm-head .u-name{font-weight:600;font-size:13.5px}
.pm-head .u-role{font-size:12px}
.pm-item{display:flex;gap:9px;align-items:center;padding:7px 10px;border-radius:8px;cursor:pointer;font-size:13px}
.pm-item:hover{background:var(--bg-subtle,#f2f4f9)}
[data-theme="dark"] .pm-item:hover{background:#1b2740}
.pm-ic{width:18px;display:inline-flex;justify-content:center}
.pm-ic svg{width:15px;height:15px}
.pm-right{margin-left:auto;font-size:11px;color:var(--text-3);border:1px solid var(--border);border-radius:5px;padding:0 5px}
.pm-danger{color:#dc2626}
.pm-sec{font-size:11px;font-weight:700;letter-spacing:.06em;text-transform:uppercase;color:var(--text-3);padding:8px 10px 3px}
.pm-div{height:1px;background:var(--border);margin:6px 4px}
.pm-status{display:flex;gap:6px;align-items:center;padding:4px 8px 8px}
.pm-mute{display:flex;gap:5px;flex-wrap:wrap;padding:2px 8px 8px}
.presence-dot{position:absolute;right:-2px;bottom:-2px;width:9px;height:9px;border-radius:50%;border:2px solid var(--bg-card,#fff)}
.side-user:hover{background:var(--bg-subtle,rgba(255,255,255,.06))}

/* ── Đợt 38: login SSO ── */
.login-sso{margin-top:14px}
.login-divider{display:flex;align-items:center;gap:10px;color:var(--text-3);font-size:11px;margin:12px 0 10px}
.login-divider:before,.login-divider:after{content:"";flex:1;height:1px;background:var(--border)}
.sso-row{display:flex;gap:8px}
.sso-btn{flex:1;display:inline-flex;gap:7px;align-items:center;justify-content:center;height:36px;font-size:12px}
/* CTA đăng nhập — hành động duy nhất của trang, 44px (Fitts + WCAG 2.2 target size) */
.login-cta{height:44px;font-size:14px;font-weight:600;margin-top:6px}
[data-theme="dark"] .login-err{background:rgba(228,72,61,.12);border-color:rgba(228,72,61,.45);color:#ff9d95}

/* ── Đợt 38: badge nguồn việc (Nguồn: người/AI/agent ngoài/import/form) ── */
.src-badge{font-size:9.5px;padding:1px 6px;border-radius:5px;font-weight:600;white-space:nowrap}

/* ── Đợt 41: Brain Chat v2 kiểu Claude ── */
.brain-chat-wrap{display:flex;gap:14px;margin-top:12px;align-items:stretch;min-height:420px}
/* align-self:flex-start = cột phiên cao theo NỘI DUNG (danh sách ngắn thì cột
   ngắn), không kéo giãn theo chiều cao khung chat như align-items:stretch cũ. */
.brain-sess-col{flex:0 0 218px;max-width:218px;border:1px solid var(--border);border-radius:12px;background:var(--bg-card,#fff);padding:8px;overflow-y:auto;max-height:66vh;align-self:flex-start}
[data-theme="dark"] .brain-sess-col{background:#101827}
.brain-sess-item{position:relative;padding:7px 26px 7px 9px;border-radius:8px;cursor:pointer;margin-bottom:2px}
.brain-sess-item:hover{background:var(--bg-subtle,#f2f4f9)}
[data-theme="dark"] .brain-sess-item:hover{background:#1b2740}
.brain-sess-item.active{background:rgba(43,84,230,.09);border:1px solid rgba(43,84,230,.25)}
.brain-sess-item .bs-title{font-size:12px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.brain-sess-item .bs-sub{font-size:11px;color:var(--text-3)}
/* P5 (07/08/2026) — trích câu trả lời cuối. MỘT dòng, cắt bằng ellipsis: cột rộng
   218px, để nó xuống hai dòng thì bốn phiên đã ăn hết một màn và danh sách thôi
   quét được bằng mắt — đúng thứ nó sinh ra để cứu. Nhạt hơn `bs-sub` một bậc: nó
   là thông tin phân biệt, không phải thông tin chính. */
.brain-sess-item .bs-prev{
  font-size:11px;color:var(--text-3);opacity:.85;margin-top:1px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.brain-sess-item .bs-del{position:absolute;right:4px;top:8px;opacity:0;width:18px;height:18px}
.brain-sess-item:hover .bs-del{opacity:.7}
.brain-chat-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:10px}
.brain-transcript{flex:1;min-height:300px;max-height:56vh;overflow-y:auto;border:1px solid var(--border);border-radius:12px;background:var(--bg-card,#fff);padding:16px 18px}
[data-theme="dark"] .brain-transcript{background:#0d1420}
.chat-b{display:flex;gap:10px;margin-bottom:14px}
.chat-user{flex-direction:row-reverse}
.chat-avatar{flex:0 0 30px;width:30px;height:30px;border-radius:9px;background:linear-gradient(135deg,rgba(37,99,235,.14),rgba(124,58,237,.14));display:flex;align-items:center;justify-content:center;font-size:15px}
.chat-body{max-width:76%;min-width:0}
.chat-user .chat-body{margin-left:auto}
.chat-content{white-space:pre-wrap;font-size:13.5px;line-height:1.55;border-radius:12px;padding:9px 13px;background:var(--bg-subtle,#f4f6fb);border:1px solid var(--border)}
.chat-user .chat-content{background:var(--primary,#2b54e6);color:#fff;border-color:transparent;border-bottom-right-radius:4px}
.chat-ai .chat-content{border-bottom-left-radius:4px}
[data-theme="dark"] .chat-content{background:#16203a}
[data-theme="dark"] .chat-user .chat-content{background:var(--primary,#2b54e6)}
.chat-meta{font-size:11px;color:var(--text-3);margin-top:3px;padding:0 4px}
.chat-user .chat-meta{text-align:right}
.chat-typing{color:var(--text-3);font-style:italic;animation:chatpulse 1.4s infinite}
@keyframes chatpulse{50%{opacity:.45}}
/* §2.2 AI transparency — one-liner "AI đã làm gì" trước câu trả lời khi auto-route */
.chat-auto-note{display:inline-block;font-size:12px;color:var(--text-3);background:var(--hover);
  border-radius:8px;padding:4px 10px;margin-bottom:5px}
/* §2.2 recovery — card lỗi/rỗng có lối thoát, thay bubble chữ đỏ trần */
.chat-recover{border-radius:12px;padding:12px 14px;border:1px solid}
.chat-recover.cr-err{background:#fef2f2;border-color:rgba(226,68,92,.35)}
.chat-recover.cr-warn{background:#fffbeb;border-color:rgba(245,158,11,.35)}
[data-theme="dark"] .chat-recover.cr-err{background:rgba(226,68,92,.12)}
[data-theme="dark"] .chat-recover.cr-warn{background:rgba(245,158,11,.12)}
.cr-title{font-weight:700;font-size:13px;margin-bottom:3px}
/* #b91c1c trên #fef2f2 ≈5.3:1 (AA); --st-blocked #e2445c chỉ ~3.5:1 nên không dùng cho chữ */
.cr-err .cr-title{color:#b91c1c}
[data-theme="dark"] .cr-err .cr-title{color:var(--st-blocked)}
/* #92400e trên #fffbeb ≥4.5:1 (cùng cặp với .task-dup/.btn-warn); --st-pending chỉ 2.1:1 */
.cr-warn .cr-title{color:#92400e}
[data-theme="dark"] .cr-warn .cr-title{color:var(--st-pending)}
.cr-detail{font-size:12.5px;color:var(--text-2);margin-bottom:9px}
.cr-actions{display:flex;gap:8px;flex-wrap:wrap}
.cr-btn{height:36px;font-size:12.5px}
/* §2.2 capability transparency — hint dữ liệu AI với tới, cạnh chip Autopilot */
.brain-cap-hint{align-self:center;font-size:12px;color:var(--text-3)}
.chat-tasks{margin-top:8px;border:1px solid rgba(124,58,237,.35);border-radius:10px;padding:10px 12px;background:rgba(124,58,237,.05)}
.chat-tasks .ct-head{font-weight:700;font-size:12px;margin-bottom:7px}
.chat-tasks .ct-row{display:flex;gap:7px;align-items:center;padding:3px 0;flex-wrap:wrap}
.chat-tasks .ct-sub{font-size:12px;color:var(--text-3);padding-left:26px}
/* F2 — thẻ kết quả công cụ ("AI vừa làm gì"), đứng trên bóng chat trả lời. Viền xám
   trung tính để không tranh chú ý với .chat-tasks (tím = đề xuất việc cần bấm). */
.chat-tools{margin-bottom:7px;border:1px solid var(--border);border-radius:10px;padding:8px 11px;background:var(--bg-subtle)}
.chat-tools .ct-head{font-weight:700;font-size:12px;margin-bottom:5px}
/* display:block là cách duy nhất bỏ hẳn marker mặc định trên cả Chromium lẫn Safari —
   list-style:none một mình vẫn để lọt dấu chấm ở Chromium mới. */
.chat-tools .ct-fold>summary{cursor:pointer;display:block;list-style:none;margin-bottom:5px}
.chat-tools .ct-fold>summary::-webkit-details-marker{display:none}
.chat-tools .ct-fold>summary::marker{content:""}
.chat-tools .ct-fold>summary::before{content:"▸ ";font-size:11px;color:var(--text-3);vertical-align:1px}
.chat-tools .ct-fold[open]>summary::before{content:"▾ "}
.chat-tools .ct-item{padding:4px 0;border-top:1px solid var(--border)}
.chat-tools .ct-item:first-child{border-top:0;padding-top:0}
.chat-tools .ct-row{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.chat-tools .ct-ic{font-size:12px;line-height:1}
.chat-tools .ct-name{font-size:12px;font-weight:600}
.chat-tools .ct-sum{font-size:12px;color:var(--text-3);padding-left:19px;margin-top:2px;overflow-wrap:anywhere}
.chat-tools .ct-reason{color:#b8283f}
[data-theme="dark"] .chat-tools .ct-reason{color:#ff6b7f}
.chat-tools .ct-open{margin-left:auto;font-size:12px;font-weight:600;background:none;border:0;padding:0;
  color:var(--primary-text);cursor:pointer;text-decoration:underline;white-space:nowrap}
/* C3 — @-mention: chip nguồn trong bóng chat + dropdown/chip trong khung soạn */
.chat-refs{display:flex;flex-wrap:wrap;gap:5px;align-items:center;margin-top:6px}
.chat-refs .cr-lead{font-size:11px;color:var(--text-3);font-weight:600}
.chat-ref{max-width:230px;text-transform:none;letter-spacing:0;gap:4px}
.chat-ref .brc-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.chat-ref.is-link{cursor:pointer}
.chat-ref.is-link:hover{background:var(--primary-weak);color:var(--primary-text)}
.brain-ref-chips{display:flex;flex-wrap:wrap;gap:6px;padding:0 12px 8px}
.brain-ref-chip{max-width:240px;text-transform:none;letter-spacing:0;gap:5px;align-items:center}
.brain-ref-chip .brc-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Mở LÊN trên (bottom:100%) chứ không xuống dưới: khung soạn nằm sát đáy vùng chat,
   dropdown đi xuống sẽ chạy ra ngoài khung nhìn ngay khi có 3-4 kết quả. */
.brain-mention-drop{position:absolute;left:12px;right:12px;bottom:100%;margin-bottom:6px;z-index:45;
  max-height:260px;overflow:auto;border:1px solid var(--border-strong);border-radius:10px;
  background:var(--panel);box-shadow:0 8px 24px rgba(0,0,0,.14)}
.brain-mention-drop .bm-item{display:flex;align-items:center;gap:8px;padding:7px 11px;cursor:pointer;font-size:13px}
.brain-mention-drop .bm-item:hover,.brain-mention-drop .bm-item.active{background:var(--primary-weak)}
.brain-mention-drop .bm-empty{padding:10px 12px;font-size:12px;color:var(--text-3)}
.brain-scope-sel{height:26px;border-radius:20px;border:1px solid var(--border-strong);
  background:var(--bg-subtle);color:var(--text-2);font-size:12px;font-weight:600;
  padding:0 8px;cursor:pointer;max-width:130px;flex:0 0 auto}
.brain-empty{text-align:center;padding:26px 8px}
.brain-empty-title{font-weight:800;font-size:17px;margin-bottom:14px;letter-spacing:-.3px}
.brain-empty .brain-quick-grid{text-align:left}
@media(max-width:880px){.brain-chat-wrap{flex-direction:column}.brain-sess-col{flex:none;max-width:none;max-height:150px}}

/* Fix C2: password strength meter + Fix D1: typing indicator */
.pw-weak{color:#e4483d}.pw-med{color:#f59e0b}.pw-strong{color:#22c55e}
.typing-dots span{display:inline-block;width:6px;height:6px;border-radius:50%;background:var(--text-3);animation:blink 1.4s infinite both;margin:0 2px}
.typing-dots span:nth-child(2){animation-delay:.2s}
.typing-dots span:nth-child(3){animation-delay:.4s}
@keyframes blink{0%,80%,100%{opacity:.2}40%{opacity:1}}

/* ===== INPUT COMPONENTS (Phase 1-3) ===== */

/* 1. Input with icon — wrapper chứa input + SVG icon prefix/suffix */
.input-wrap{position:relative;display:flex;align-items:center;flex:1}
.input-wrap .input-ic-left{position:absolute;left:10px;color:var(--text-3,#8c8c8c);pointer-events:none;display:flex;align-items:center;z-index:1}
.input-wrap .input-ic-right{position:absolute;right:10px;color:var(--text-3,#8c8c8c);pointer-events:none;display:flex;align-items:center;z-index:1}
.input-wrap .input-ic-left+input,.input-wrap .input.has-ic-left{padding-left:34px}
.input-wrap .input.has-ic-right,.input-wrap .input-ic-right~input{padding-right:34px}
.input-wrap .input-ic-left svg,.input-wrap .input-ic-right svg{width:16px;height:16px}
.input-wrap.input-wrap-clear .input{padding-right:30px}

/* 2. Clear button — nút × trong input */
.input-clear{position:absolute;right:8px;top:50%;transform:translateY(-50%);cursor:pointer;
  color:var(--text-3,#8c8c8c);background:none;border:none;font-size:16px;line-height:1;
  display:none;z-index:1;padding:2px;border-radius:4px}
.input-clear:hover{color:var(--text,#333);background:var(--hover,#f0f0f5)}
.input-wrap.has-value .input-clear{display:block}

/* 3. Char count — counter dưới textarea */
.input-counter{font-size:11px;color:var(--text-3,#8c8c8c);text-align:right;margin-top:4px;transition:color .15s}
.input-counter.over{color:var(--st-blocked,#e4483d);font-weight:600}
.input-counter.warn{color:#f59e0b}

/* 4. Validation states — border + message */
.input-error{border-color:var(--st-blocked,#e4483d)!important;box-shadow:0 0 0 3px rgba(228,72,61,.12)!important}
.input-ok{border-color:var(--st-done,#22c55e)!important;box-shadow:0 0 0 3px rgba(34,197,94,.12)!important}
.field-msg{font-size:12px;margin-top:4px;display:none;line-height:1.4}
.field-msg.err{color:var(--st-blocked,#e4483d);display:block}
.field-msg.ok{color:var(--st-done,#22c55e);display:block}

/* 5. Floating label — label nổi lên khi focus/có value */
.field-floating{position:relative;margin-bottom:14px}
.field-floating label{position:absolute;left:10px;top:50%;transform:translateY(-50%);
  font-size:13px;color:var(--text-3,#8c8c8c);pointer-events:none;transition:.15s ease;
  background:var(--panel,#fff);padding:0 4px;z-index:1}
.field-floating textarea+label{top:12px;transform:none}
.field-floating input:focus+label,.field-floating input:not(:placeholder-shown)+label,
.field-floating textarea:focus+label,.field-floating textarea:not(:placeholder-shown)+label{
  top:0;font-size:11px;color:var(--primary,#2b54e6);font-weight:600}
.field-floating .input{padding-top:2px}
/* Icon prefix trong field-floating — trước đây chỉ khai báo trong .input-wrap nên
   icon rơi ra ngoài luồng, nổi lên trên và cắt viền trên của input (bug login). */
/* top:18px = giữa ô input cao 36px; KHÔNG dùng 50% vì .field-msg có thể nối thêm dưới field */
.field-floating .input-ic-left{position:absolute;left:10px;top:18px;transform:translateY(-50%);
  color:var(--text-3,#8c8c8c);pointer-events:none;display:flex;align-items:center;z-index:2}
.field-floating .input-ic-left svg{width:16px;height:16px}
.field-floating .input.has-ic-left{padding-left:34px}
.field-floating:has(.input:focus) .input-ic-left{color:var(--primary,#2b54e6)}
/* Nút hiện/ẩn mật khẩu — trong ô, phải, vùng bấm 52x28 (WCAG 2.2 target size) */
.field-floating .pw-toggle{position:absolute;right:6px;top:18px;transform:translateY(-50%);
  height:28px;min-width:52px;padding:0 8px;border:0;background:transparent;cursor:pointer;
  font-size:11px;font-weight:600;color:var(--primary,#2b54e6);border-radius:6px;z-index:2}
.field-floating .pw-toggle:hover{background:var(--primary-weak,rgba(43,84,230,.08))}
.field-floating .input.has-pw-toggle{padding-right:60px}

/* 6. Checkbox card — card clickable chứa checkbox + label + desc */
.chk-card{display:flex;align-items:flex-start;gap:10px;padding:12px;border:1px solid var(--border,#e6e9f0);
  border-radius:var(--radius,8px);cursor:pointer;transition:.12s;background:var(--panel,#fff)}
.chk-card:hover{border-color:var(--primary,#2b54e6);background:var(--primary-weak,rgba(43,84,230,.06))}
.chk-card.checked{border-color:var(--primary,#2b54e6);background:var(--primary-weak,rgba(43,84,230,.06))}
.chk-card .chk-card-ic{flex:0 0 20px;margin-top:1px}
.chk-card .chk-card-body{flex:1;min-width:0}
.chk-card-title{font-weight:600;font-size:13px;color:var(--text,#1a1a2e)}
.chk-card-desc{font-size:12px;color:var(--text-3,#8c8c8c);margin-top:2px;line-height:1.4}

/* 7. Select with search — custom dropdown với hiệu ứng */
.select-search{position:relative;display:block;width:100%}
.select-search-input{width:100%;height:36px;padding:0 30px 0 11px;border:1px solid var(--border-strong,#d5d5d8);
  border-radius:var(--radius,8px);font-size:13px;background:var(--panel,#fff);color:var(--text,#1a1a2e);
  cursor:pointer;display:flex;align-items:center;gap:6px;overflow:hidden;white-space:nowrap;transition:border-color .15s,box-shadow .15s}
.select-search-input:hover{border-color:var(--primary,#2b54e6)}
.select-search.open .select-search-input{border-color:var(--primary,#2b54e6);box-shadow:0 0 0 3px rgba(43,84,230,.1)}
.select-search-input .ss-arrow{position:absolute;right:10px;color:var(--text-3,#8c8c8c);pointer-events:none;transition:transform .2s cubic-bezier(.4,0,.2,1)}
.select-search.open .ss-arrow{transform:rotate(180deg)}
.select-search-input .ss-placeholder{color:var(--text-3,#8c8c8c)}
.select-search-input .ss-tags{display:flex;gap:4px;flex-wrap:wrap;overflow:hidden}
.select-search-input .ss-tag{background:var(--primary-weak,rgba(43,84,230,.08));color:var(--primary,#2b54e6);
  padding:2px 8px;border-radius:4px;font-size:12px;font-weight:500}

/* Dropdown — animation scale + fade */
.select-search-drop{position:absolute;top:calc(100% + 6px);left:0;right:0;z-index:60;
  background:var(--panel,#fff);border:1px solid var(--border,#e6e9f0);border-radius:var(--radius,8px);
  box-shadow:0 8px 32px rgba(0,0,0,.12),0 1px 4px rgba(0,0,0,.04);max-height:280px;overflow:auto;
  display:block;padding:6px;opacity:0;transform:translateY(-4px) scale(.97);pointer-events:none;
  /* DESIGN.md cấm easing nảy: .34,1.56,.64,1 vọt quá 100% rồi dội lại. Đổi sang
     ease-out mũ — vật thật giảm tốc mượt, không nảy. Cùng đường cong đã dùng ở
     thanh tiến độ phía dưới, nên toàn hệ chỉ còn một giọng chuyển động. */
  transition:opacity .18s ease,transform .18s cubic-bezier(.16,1,.3,1)}
.select-search.open .select-search-drop{opacity:1;transform:translateY(0) scale(1);pointer-events:auto}

/* Filter input thanh lịch */
.select-search-filter{padding:6px 6px 8px;border-bottom:1px solid var(--border,#e6e9f0);position:sticky;
  top:0;background:var(--panel,#fff);z-index:1}
.select-search-filter input{width:100%;height:32px;padding:0 10px 0 30px;border:1px solid var(--border,#e6e9f0);
  border-radius:8px;font-size:12px;background:var(--bg,#f5f7fb);transition:border-color .15s,box-shadow .15s}
.select-search-filter input:focus{border-color:var(--primary,#2b54e6);box-shadow:0 0 0 2px rgba(43,84,230,.08);outline:none}
.select-search-filter::before{content:"";position:absolute;left:14px;top:15px;width:14px;height:14px;
  background:var(--text-3,#8c8c8c);mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'/%3E%3C/svg%3E") center/contain no-repeat;
  -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'/%3E%3C/svg%3E") center/contain no-repeat;
  mask-size:contain;-webkit-mask-size:contain;pointer-events:none;z-index:2}

/* Option item. Bỏ dải 3px cạnh trái + cú nhích padding-left khi hover: dải cạnh
   trái là thứ DESIGN.md cấm, và hoạt hoạ `padding-left` bắt trình duyệt tính lại
   bố cục mỗi khung hình — trong danh sách cuộn được thì đó là giật thấy rõ.
   Nền + cân nặng + dấu tích đã đủ nói mục nào đang trỏ, mục nào đã chọn. */
.select-search-opt{padding:9px 12px;cursor:pointer;font-size:13px;display:flex;align-items:center;gap:10px;
  border-radius:6px;transition:background .1s;margin-bottom:2px;position:relative;
  line-height:1.35}
.select-search-opt:last-child{margin-bottom:0}
.select-search-opt:hover{background:var(--primary-weak,rgba(43,84,230,.06))}
.select-search-opt:active{background:var(--primary-weak,rgba(43,84,230,.12))}
.select-search-opt.selected{font-weight:550;color:var(--primary,#2b54e6);background:rgba(43,84,230,.05)}
.select-search-opt .ss-check{flex:0 0 18px;width:18px;height:18px;margin-left:auto;border-radius:50%;
  background:var(--border,#e6e9f0);color:#fff;display:flex;align-items:center;justify-content:center;
  transition:all .15s;font-size:11px;line-height:1;opacity:0;transform:scale(.7)}
.select-search-opt.selected .ss-check{opacity:1;transform:scale(1);background:var(--primary,#2b54e6)}

/* Empty state */
.select-search-empty{padding:20px 16px;text-align:center;color:var(--text-3,#8c8c8c);font-size:12px;
  display:flex;flex-direction:column;gap:6px;align-items:center}
.select-search-empty::before{content:"";width:32px;height:32px;opacity:.35;
  background:var(--text-3,#8c8c8c);mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'/%3E%3C/svg%3E") center/contain no-repeat;
  -webkit-mask:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='currentColor' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cline x1='21' y1='21' x2='16.65' y2='16.65'/%3E%3C/svg%3E") center/contain no-repeat;
  mask-size:contain;-webkit-mask-size:contain}

/* Custom scrollbar cho dropdown */
.select-search-drop::-webkit-scrollbar{width:5px}
.select-search-drop::-webkit-scrollbar-track{background:transparent}
.select-search-drop::-webkit-scrollbar-thumb{background:var(--border,#e6e9f0);border-radius:4px}
.select-search-drop::-webkit-scrollbar-thumb:hover{background:var(--text-3,#8c8c8c)}

/* Floating label cho select-with-search */
.field-floating .select-search-input{padding-top:10px;height:40px}
.field-floating .select-search.filled ~ label,
.field-floating .select-search.open ~ label{top:0;font-size:11px;color:var(--primary,#2b54e6);font-weight:600}

/* 8. Toggle switch variants — sm/lg cho mọi settings */
.toggle-sm{width:32px;height:18px}
.toggle-sm .toggle-knob{width:14px;height:14px}
.toggle-sm.on .toggle-knob{transform:translateX(14px)}
.toggle-lg{width:48px;height:28px}
.toggle-lg .toggle-knob{width:24px;height:24px}
.toggle-lg.on .toggle-knob{transform:translateX(20px)}
.toggle-row{display:flex;align-items:center;gap:10px}
.toggle-label{font-size:13px;color:var(--text,#1a1a2e);font-weight:500}

/* =====================================================================
   SGH-WAVE-uiux — Social Growth state additions (spec 15)
   Skeleton state + inline bulk bar. Same tokens as the rest of the app —
   no new visual language, only missing STATE affordances.
   ===================================================================== */
/* Skeleton (spec 15 "Skeleton"): các khối xám shimmer theo hình dạng nội dung */
.skel{position:relative;overflow:hidden;background:var(--hover);border-radius:5px}
.skel::after{content:"";position:absolute;inset:0;transform:translateX(-100%);
  background:linear-gradient(90deg,transparent,rgba(255,255,255,.55),transparent);
  animation:skel-shimmer 1.2s infinite}
[data-theme="dark"] .skel::after{background:linear-gradient(90deg,transparent,rgba(255,255,255,.08),transparent)}
@keyframes skel-shimmer{100%{transform:translateX(100%)}}
.skel-line{height:13px;margin:5px 0}
.skel-line.sm{height:10px}
.skel-card{padding:12px 14px;margin-bottom:10px}
/* Bulk bar hiển thị trong luồng nội dung (tự dọn khi màn hình re-render) —
   cùng look .bulk-bar nổi của Bảng công việc */
.bulk-bar-inline{position:static;left:auto;bottom:auto;transform:none;
  margin:0 0 12px;z-index:auto;box-shadow:var(--shadow)}
/* SGH-18 (wave/secobs splice): kv-row metric lines in the deep-health console */
.kv-row{display:flex;justify-content:space-between;gap:12px;padding:2px 0}
.kv-row>span:last-child{font-variant-numeric:tabular-nums;text-align:right}

/* ===== Bộ não AI — reskin kiểu ClickUp Brain (hero + aurora + tab pill + tooltip model) ===== */
/* Hero (phiên trống): logo hoa + wordmark giữa trang, aurora mờ phía trên, composer và
   gợi ý gom về giữa. Có tin nhắn đầu tiên là .brain-hero rơi ra, layout chat cũ giữ nguyên. */
.brain-chat-main.brain-hero{position:relative}
.brain-chat-main.brain-hero::before{
  content:"";position:absolute;left:-16px;right:-16px;top:-20px;height:300px;
  pointer-events:none;z-index:0;
  /* Không filter:blur — radial-gradient đã tự mềm; thêm blur chỉ tốn một lượt raster. */
  background:
    radial-gradient(420px 190px at 18% 0%,rgba(255,110,196,.15),transparent 70%),
    radial-gradient(560px 220px at 52% -12%,rgba(120,115,245,.16),transparent 72%),
    radial-gradient(420px 190px at 86% 0%,rgba(74,222,222,.14),transparent 70%);
}
/* P7 (07/08/2026) — ở chế độ hero, khung transcript là một Ô VUÔNG RỖNG CÓ VIỀN
   cao 310px (`min-height:300px` + border + nền card ở block gốc). Hai hệ quả đo
   được, và cái thứ hai mới là cái đắt:

     · nó TRÔNG như một ô nhập đang bị vô hiệu — người mở lần đầu nhìn thấy một
       hộp trắng có viền, trống trơn, ngay chỗ đáng lẽ là nội dung;
     · nó đẩy cụm gợi ý xuống y≈735 trong khung 940. Màn laptop 768px mất hàng
       thứ hai; màn 720px mất cả bốn thẻ — tức người mới, đúng người cần gợi ý
       nhất, là người không nhìn thấy nó.

   Bỏ viền/nền/min-height CHỈ ở hero. Khi đã có tin nhắn thì `brain-hero` rời đi
   và khung card quay lại nguyên vẹn — ở đó nó đúng, vì lúc ấy có nội dung để
   đóng khung và có cuộn để cần một mép. */
.brain-hero .brain-transcript{
  flex:0 0 auto;max-height:none;overflow:visible;position:relative;z-index:1;
  min-height:0;border:0;background:transparent;padding:0;
}
[data-theme="dark"] .brain-hero .brain-transcript{background:transparent}
.brain-hero .brain-empty{padding:26px 8px 14px}
.brain-hero .brain-compose-wrap,.brain-hero .brain-suggest-wrap{
  max-width:820px;width:100%;margin-left:auto;margin-right:auto;position:relative;z-index:1;
}
/* Selector trên (0,2,0) thắng .brain-compose-wrap{z-index:3} (0,1,0), kéo composer
   xuống dưới seg ở màn hero → chữ tab xuyên qua flyout model. Trả lại z:3 đúng specificity. */
.brain-hero .brain-compose-wrap{z-index:3}
.brain-hero-brand{display:flex;align-items:center;justify-content:center;gap:12px;margin-bottom:8px}
.brain-hero-logo{display:inline-flex}
.brain-hero-brand .bh-word{font-size:34px;font-weight:800;letter-spacing:-.8px;color:var(--text)}
.brain-hero-sub{font-size:13.5px;color:var(--text-3);max-width:520px;margin:0 auto}
.brain-suggest-wrap{margin-top:12px}

/* Tab cụm Bộ não AI: xem block .seg.brain-seg duy nhất ở phần "Bộ não AI — unified hub". */

/* Glow composer: box-shadow đã gộp về block .brain-glow gốc (2026-07-31) — override
   rời ở đây từng đè mất quầng sáng khai báo trên, sửa một chỗ mà không ăn thua. */

/* Flyout Tuỳ chọn/Effort của bộ chọn model (kiểu VS Code) — đứng TRÁI dropdown vì
   dropdown neo mép phải composer, bên phải không còn chỗ. Tương tác được (toggle
   Thinking, chọn Effort) nên KHÔNG pointer-events:none như tooltip cũ. */
.bm-fly{
  position:absolute;right:308px;bottom:34px;width:225px;background:var(--panel);
  border:1px solid var(--border-strong);border-radius:10px;box-shadow:var(--shadow-md);
  z-index:41;overflow:hidden;padding-bottom:4px;
}
.bm-fly .bm-fly-head{padding:9px 13px 5px;border-bottom:1px solid var(--border)}
.bm-fly .bm-fly-name{font-weight:700;font-size:13px;color:var(--text)}
.bm-fly .bm-fly-sub{font-size:11px;color:var(--text-3)}
.bm-fly .bm-fly-group{
  padding:7px 13px 3px;font-size:10.5px;font-weight:700;color:var(--text-3);
  text-transform:uppercase;letter-spacing:.5px
}
.bm-fly .bm-fly-row{
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding:6px 13px;font-size:13px;color:var(--text);cursor:pointer
}
.bm-fly .bm-fly-row:hover{background:var(--hover)}
.bm-fly .bm-fly-row.disabled{opacity:.45;cursor:not-allowed}
.bm-fly .bm-fly-row.disabled:hover{background:transparent}
.bm-fly .bm-fly-sep{height:1px;background:var(--border);margin:4px 0}
.bm-switch{
  width:30px;height:17px;border-radius:9px;background:var(--border-strong);
  position:relative;flex:0 0 auto;transition:background .12s
}
.bm-switch::after{
  content:"";position:absolute;top:2px;left:2px;width:13px;height:13px;border-radius:50%;
  background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.25);transition:left .12s
}
.bm-switch.on{background:var(--primary)}
.bm-switch.on::after{left:15px}
/* Danh sách model cuộn riêng giữa search và footer. */
.bm-list{max-height:min(48vh,340px);overflow-y:auto}
/* Đuôi effort mờ trên từng item ("Med", "High"). */
.bm-effort{font-size:11px;color:var(--text-3);flex:0 0 auto}

/* Card gợi ý dưới hero — bo 10, hover nổi nhẹ (đã có transform ở .brain-quick-card). */
.brain-quick-card{border-radius:10px}

/* ── Điều hướng bàn phím dropdown (model/mode/+): item đang chọn bằng phím tên nổi
   viền, tách biệt với .active (giá trị đang chọn thật sự) — hai trạng thái khác nghĩa. */
.bm-item.kbd-active,.bc-item.kbd-active{background:var(--hover);outline:2px solid var(--primary);outline-offset:-2px}

/* Menu lệnh nhanh "/" — dùng chung khung .brain-mention-drop, chỉ khác nội dung item. */
.brain-slash-drop .bm-item{display:flex;align-items:center;gap:8px;padding:7px 11px;cursor:pointer}

/* "Tự động (Max)" — ghim đầu bộ chọn model, viền gradient nhạt tách biệt khỏi
   danh sách model thường bên dưới (giống pill "Max" của ClickUp Brain²). */
.bm-item.bm-item-auto{
  border-bottom:1px solid var(--border);
  background:linear-gradient(90deg,rgba(255,110,196,.06),rgba(120,115,245,.06));
}
.bm-item.bm-item-auto:hover{background:linear-gradient(90deg,rgba(255,110,196,.12),rgba(120,115,245,.12))}
.bm-item.bm-item-auto.active{background:var(--primary-weak)}

/* ── A1/A2/A6 — menu ngữ cảnh của composer Bộ não ─────────────────────────────
   Dùng lại token màu/viền/bóng của .brain-model-drop thay vì tự đặt số: hai
   dropdown đứng cạnh nhau trên cùng một hàng, lệch một pixel là thấy ngay. */
.brain-ctx-wrap{position:relative;display:inline-flex}
.brain-ctx-menu{
  position:absolute;bottom:34px;left:0;width:290px;max-width:84vw;background:var(--panel);
  border:1px solid var(--border-strong);border-radius:10px;box-shadow:var(--shadow-md);z-index:40;
  overflow:hidden auto;max-height:min(60vh,420px);
}
.brain-ctx-menu .bc-head{
  padding:9px 13px 5px;font-size:11px;font-weight:700;letter-spacing:.03em;
  text-transform:uppercase;color:var(--text-3)
}
.brain-ctx-menu .bc-sep{height:1px;background:var(--border);margin:4px 0}
.brain-ctx-menu .bc-item{display:flex;align-items:center;gap:9px;padding:8px 13px;cursor:pointer}
.brain-ctx-menu .bc-item:hover{background:var(--hover)}
.brain-ctx-menu .bc-ico{display:inline-flex;width:16px;color:var(--text-3);flex:0 0 auto}
.brain-ctx-menu .bc-ico svg{width:15px;height:15px}
.brain-ctx-menu .bc-txt{display:flex;flex-direction:column;gap:1px;min-width:0}
.brain-ctx-menu .bc-label{font-size:13px;font-weight:600;color:var(--text)}
.brain-ctx-menu .bc-sub{
  font-size:12px;color:var(--text-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis
}
.brain-ctx-menu .bc-empty{padding:10px 13px;font-size:12px;color:var(--text-3)}
.brain-ctx-menu .bc-apps{padding:2px 0}
.brain-ctx-menu .bc-app{
  display:flex;align-items:center;gap:8px;padding:6px 13px;font-size:12px;color:var(--text-2)
}
/* Chấm trạng thái, KHÔNG phải chữ: hàng ứng dụng đọc lướt, và "đã nối/chưa nối"
   viết ra mỗi dòng làm menu dày lên mà không thêm thông tin nào. */
.brain-ctx-menu .bc-dot{
  width:7px;height:7px;border-radius:50%;background:var(--text-3);opacity:.4;flex:0 0 auto
}
.brain-ctx-menu .bc-app.on .bc-dot{background:var(--ok,#16a34a);opacity:1}
.brain-ctx-menu .bc-app-st{margin-left:auto;font-size:11px;color:var(--text-3)}
.brain-ctx-menu .bc-more{color:var(--primary-text)}
.brain-ctx-menu .bc-more .bc-label{color:var(--primary-text)}

/* Kéo-thả: viền sáng lên để người dùng biết khung NÀY nhận tệp — thả nhầm ra
   ngoài thì trình duyệt mở luôn tệp và mất cả câu đang gõ. */
.brain-glow.is-dragging{outline:2px dashed var(--primary);outline-offset:3px}
.brain-glow.is-dragging .brain-glow-inner{background:var(--primary-weak)}

/* ── D1 — cảnh báo việc trùng trong bản xem trước kế hoạch ────────────────────
   Vàng-hổ phách chứ không đỏ: đây là ĐIỀU CẦN XEM LẠI, không phải lỗi. Đỏ dành cho
   thứ đã hỏng; dùng đỏ ở đây thì khi có lỗi thật người dùng không phân biệt được. */
.plan-dup{
  margin-top:8px;border:1px solid var(--warn-border,#fcd34d);border-radius:8px;
  background:var(--warn-weak,#fffbeb);padding:8px 10px
}
.plan-dup-head{
  display:flex;align-items:center;gap:6px;font-size:12px;font-weight:600;
  color:var(--warn-text,#92400e);margin-bottom:6px
}
.plan-dup-head svg{width:14px;height:14px}
.plan-dup-list{display:flex;flex-direction:column;gap:4px}
.plan-dup-row{display:flex;align-items:center;gap:6px;font-size:12px;flex-wrap:wrap}
.plan-dup-link{
  color:var(--text);text-decoration:none;border-bottom:1px dashed var(--text-3);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:min(420px,60vw)
}
.plan-dup-link:hover{color:var(--primary-text);border-bottom-color:var(--primary)}
.plan-dup-skip{
  display:flex;align-items:center;gap:6px;margin-top:7px;font-size:12px;
  color:var(--warn-text,#92400e);cursor:pointer;user-select:none
}
.plan-dup-skip input{margin:0;cursor:pointer}
/* Thẻ bị bỏ qua mờ đi nhưng VẪN ĐỌC ĐƯỢC — ẩn hẳn thì người dùng mất dấu vì sao
   số việc sắp tạo ít hơn số việc AI đề xuất. */
.plan-dup-skipped{opacity:.55}
.plan-dup-skipped .plan-dup{opacity:1}

@media (prefers-color-scheme: dark){
  .plan-dup{border-color:#78350f;background:rgba(120,53,15,.18)}
  .plan-dup-head,.plan-dup-skip{color:#fcd34d}
}
:root[data-theme="dark"] .plan-dup{border-color:#78350f;background:rgba(120,53,15,.18)}
:root[data-theme="dark"] .plan-dup-head,
:root[data-theme="dark"] .plan-dup-skip{color:#fcd34d}

/* ── A4 — thẻ mở đầu dưới ô hỏi ───────────────────────────────────────────── */
.brain-starters{
  display:grid;gap:10px;margin-top:14px;
  grid-template-columns:repeat(auto-fit,minmax(168px,1fr))
}
.brain-starter{
  display:flex;flex-direction:column;align-items:flex-start;gap:3px;
  padding:12px 13px;text-align:left;cursor:pointer;
  background:var(--panel);border:1px solid var(--border);border-radius:11px;
  transition:border-color .12s,box-shadow .12s,transform .12s
}
.brain-starter:hover{
  border-color:var(--primary);box-shadow:var(--shadow-sm);transform:translateY(-1px)
}
.brain-starter:active{transform:none}
.brain-starter .bs-ico{display:inline-flex;color:var(--primary-text);margin-bottom:3px}
.brain-starter .bs-ico svg{width:16px;height:16px}
.brain-starter .bs-title{font-size:13px;font-weight:600;color:var(--text)}
.brain-starter .bs-sub{
  font-size:12px;color:var(--text-3);line-height:1.35;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden
}
/* Dưới 420px bốn thẻ xếp dọc thành một cột dài đẩy ô hỏi lên khỏi màn hình —
   hai cột giữ chúng trong tầm mắt. */
@media (max-width:520px){
  .brain-starters{grid-template-columns:1fr 1fr;gap:8px}
  .brain-starter{padding:10px}
  .brain-starter .bs-sub{-webkit-line-clamp:1}
}

/* ── A5/A7 — prompt đã lưu + ghi chú ước lượng trên tooltip model ───────────── */
/* Neo cho promptDrop: nó mở từ menu "+" nên không có nút riêng, nhưng vẫn cần một
   phần tử position:relative để định vị. Rộng 0 để không chiếm chỗ trên hàng. */
.brain-ctx-anchor{width:0;overflow:visible}
.brain-ctx-menu .bc-item{position:relative}
.brain-ctx-menu .bc-del{
  position:absolute;right:8px;top:50%;transform:translateY(-50%);
  border:none;background:none;color:var(--text-3);cursor:pointer;padding:4px;
  border-radius:6px;opacity:0;transition:opacity .12s
}
.brain-ctx-menu .bc-item:hover .bc-del{opacity:1}
.brain-ctx-menu .bc-del:hover{background:var(--hover);color:var(--danger,#dc2626)}
.brain-ctx-menu .bc-del svg{width:12px;height:12px}
/* Chừa chỗ cho nút xoá, nếu không chữ dài chui xuống dưới nó. */
.brain-ctx-menu .bc-item:has(.bc-del) .bc-txt{padding-right:22px}


/* ═══════════════════════════════════════════════════════════════════
   B1–B4 — khu Agent của Bộ não AI: sub-nav, hai trục lọc, dải ứng
   dụng, danh sách kết nối, bảng hoạt động.

   Khối này cố ý nằm CUỐI FILE và chỉ dùng class mới có tiền tố riêng:
   phần hero/composer ở trên đang được sửa song song, và một selector
   dùng chung sẽ biến hai thay đổi độc lập thành một xung đột.
   ═══════════════════════════════════════════════════════════════════ */

.brain-subnav{
  display:flex;gap:4px;flex-wrap:wrap;padding:4px;margin-bottom:14px;
  background:var(--bg-subtle);border:1px solid var(--border);border-radius:10px;
}
.brain-subnav-btn{
  display:inline-flex;align-items:center;gap:7px;height:32px;padding:0 13px;border-radius:7px;
  border:1px solid transparent;background:transparent;color:var(--text-2);
  font-family:inherit;font-size:13px;font-weight:600;cursor:pointer;white-space:nowrap;
  transition:background .12s,color .12s,border-color .12s;
}
.brain-subnav-btn:hover{background:var(--hover);color:var(--text)}
.brain-subnav-btn.active{background:var(--panel);border-color:var(--border);color:var(--text);box-shadow:var(--shadow)}
.brain-subnav-btn .bsn-ic{display:inline-flex;width:15px;height:15px}
.brain-subnav-btn .bsn-ic svg{width:15px;height:15px}

.brain-inline-link{color:var(--primary-text);font-weight:600;cursor:pointer}
.brain-inline-link:hover{text-decoration:underline}

/* Hai trục lọc. Nhãn trục nằm BÊN TRÁI hàng pill chứ không phải phía trên:
   hai hàng pill không nhãn trông như một hàng bị xuống dòng, và người dùng
   không đoán được vì sao "Marketing" xuất hiện hai lần với hai nghĩa. */
.brain-axis{display:flex;align-items:center;gap:10px;margin:8px 0}
.brain-axis .bx-label{
  flex:0 0 auto;width:82px;font-size:12px;font-weight:700;color:var(--text-3);
  text-transform:uppercase;letter-spacing:.04em;
}
.brain-axis-track{
  display:flex;gap:6px;flex-wrap:nowrap;overflow-x:auto;padding-bottom:2px;
  scrollbar-width:thin;
}
.brain-axis-track::-webkit-scrollbar{height:5px}
.brain-axis-track::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:3px}

/* B2 — dải ứng dụng. Strip = một hàng cuộn ngang (thanh integrations kiểu
   ClickUp Agents Hub, đứng cuối trang); grid cũ giữ lại cho nơi khác dùng. */
.brain-app-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:10px}
.brain-app-strip{display:flex;gap:10px;overflow-x:auto;padding-bottom:6px;scrollbar-width:thin}
.brain-app-strip::-webkit-scrollbar{height:5px}
.brain-app-strip::-webkit-scrollbar-thumb{background:var(--border-strong);border-radius:3px}
.brain-app-strip .brain-app-card{flex:0 0 230px}
.brain-app-strip .bac-count{white-space:nowrap}

/* Thẻ danh mục ngành (Agents Hub): mỗi ngành một thẻ, agent bên trong là hàng
   có nút thêm nhanh — nút chỉ hiện khi hover, nhưng máy không có hover (điện
   thoại) thì hiện luôn, không thì không ai thêm được. */
.brain-cat-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;align-items:start}
.brain-cat-card{
  display:flex;flex-direction:column;gap:8px;padding:13px 14px;
  background:var(--panel);border:1px solid var(--border);border-radius:10px;box-shadow:var(--shadow);
}
.brain-cat-card:hover{border-color:var(--border-strong)}
.brain-cat-head{
  display:flex;align-items:center;gap:8px;width:100%;padding:0;border:0;background:none;
  font:inherit;color:var(--text);text-align:left;cursor:pointer;
}
.brain-cat-head:hover .bcc-name{text-decoration:underline}
.brain-cat-head .bcc-ic{font-size:18px;line-height:1}
.brain-cat-head .bcc-name{flex:1;min-width:0;font-size:13.5px;font-weight:700}
.brain-cat-head .bcc-count{
  flex:0 0 auto;font-size:11.5px;font-weight:600;color:var(--text-2);
  background:var(--hover);border-radius:10px;padding:1px 8px;
}
.brain-cat-card .bcc-desc{font-size:12px;color:var(--text-2);line-height:1.4}
.brain-cat-rows{display:flex;flex-direction:column}
.brain-cat-row{display:flex;align-items:center;gap:8px;padding:5px 6px;border-radius:7px;font-size:12.5px}
.brain-cat-row:hover{background:var(--hover)}
.brain-cat-row .bca-av{flex:0 0 auto;font-size:15px;line-height:1}
.brain-cat-row .bca-nm{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}
.brain-cat-row .bcc-add{flex:0 0 auto;opacity:0}
.brain-cat-more{
  align-self:flex-start;margin-top:4px;padding:4px 6px;border:0;background:none;cursor:pointer;
  font:inherit;font-size:12px;font-weight:600;color:var(--primary-text,var(--text-2));
}
.brain-cat-more:hover{text-decoration:underline}

/* Tab Bộ nhớ — hai cột kiểu hub: Cá nhân hoá trái, bộ nhớ + kỹ năng phải. */
.brain-mem-grid{display:grid;grid-template-columns:minmax(300px,380px) 1fr;gap:18px;align-items:start}
@media (max-width:980px){.brain-mem-grid{grid-template-columns:1fr}}
.brain-cat-row:hover .bcc-add,.brain-cat-row .bcc-add:focus-visible,.brain-cat-row .bcc-add:disabled{opacity:1}
@media (hover:none){.brain-cat-row .bcc-add{opacity:1}}
.brain-app-card{
  display:flex;flex-direction:column;gap:5px;padding:12px 13px;
  background:var(--panel);border:1px solid var(--border);border-radius:9px;box-shadow:var(--shadow);
}
.brain-app-card.is-on{border-color:var(--border-strong)}
.brain-app-card .bac-name{font-size:13.5px;font-weight:600;color:var(--text)}
.brain-app-card .bac-desc{font-size:12px;color:var(--text-2);line-height:1.4;min-height:2.8em}
.brain-app-card .bac-foot{display:flex;align-items:center;gap:8px;margin-top:2px}
.brain-app-card .bac-count{font-size:12px;font-weight:600;color:var(--text-2);cursor:help}

/* Ô thống kê dùng chung cho Kết nối và Hoạt động. */
.brain-stat-row{display:flex;flex-wrap:wrap;gap:10px;margin:12px 0 14px}
.brain-stat{
  min-width:132px;padding:10px 14px;background:var(--panel);
  border:1px solid var(--border);border-radius:9px;
}
.brain-stat .bs-val{font-size:19px;font-weight:700;color:var(--text);line-height:1.2}
.brain-stat .bs-lab{font-size:12px;color:var(--text-2);margin-top:2px}

/* B3 — danh sách kết nối. Hàng, không phải lưới: cột trạng thái phải thẳng
   nhau thì mới liếc một cái là thấy cái nào chưa nối. */
.brain-conn-list{display:flex;flex-direction:column;border:1px solid var(--border);border-radius:9px;overflow:hidden}
.brain-conn-row{
  display:flex;align-items:center;gap:14px;padding:12px 14px;background:var(--panel);
  border-bottom:1px solid var(--border);
}
.brain-conn-row:last-child{border-bottom:none}
.brain-conn-row:hover{background:var(--hover)}
.brain-conn-row .bcr-main{flex:1;min-width:0}
.brain-conn-row .bcr-name{font-size:13.5px;font-weight:600;color:var(--text)}
.brain-conn-row .bcr-desc{font-size:12px;color:var(--text-2);margin-top:1px}
.brain-conn-row .bcr-status{
  display:flex;align-items:center;gap:7px;flex:0 0 auto;width:230px;
  font-size:12px;color:var(--text-2);
}
.bcr-dot{width:8px;height:8px;border-radius:50%;flex:0 0 auto}
.bcr-dot-ok{background:#16a34a}
.bcr-dot-warn{background:#d97706}
.bcr-dot-off{background:var(--border-strong)}

/* B4 — hoạt động. */
.brain-act-controls{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin-bottom:12px}
.brain-act-controls .brain-axis-track{flex:1;min-width:0}
.brain-act-days{width:auto;min-width:140px;flex:0 0 auto}
.brain-act-table td{vertical-align:top}
.brain-act-table .ba-when{white-space:nowrap;color:var(--text-2);font-size:12px}
.brain-act-table .ba-action{font-weight:600;color:var(--text)}
.brain-act-table .ba-reason{
  margin-top:3px;font-size:12px;line-height:1.4;color:var(--danger,#dc2626);opacity:.85;max-width:420px;
}
.brain-act-table .ba-tool{
  font-family:ui-monospace,SFMono-Regular,Menlo,monospace;font-size:12px;
  padding:2px 6px;border-radius:5px;background:var(--bg-subtle);color:var(--text-2);white-space:nowrap;
}
.brain-act-table .ba-who{white-space:nowrap;font-size:12px}
.brain-act-pager{display:flex;align-items:center;gap:10px;margin-top:12px;flex-wrap:wrap}
.brain-act-pager .bap-mid{margin-left:auto;font-size:12px;color:var(--text-2)}

@media (max-width:760px){
  .brain-axis{align-items:flex-start;flex-direction:column;gap:4px}
  .brain-axis .bx-label{width:auto}
  .brain-conn-row{flex-wrap:wrap}
  .brain-conn-row .bcr-status{width:auto;order:3;flex:1 0 100%}
  .brain-app-grid{grid-template-columns:1fr 1fr}
  .brain-cat-grid{grid-template-columns:1fr}
}

/* Ô tìm mẫu agent — nằm trong .brain-axis nên .input (width:100%) phải bị chặn
   lại, nếu không nó kéo dài hết hàng và nuốt cả nhãn trục. */
.brain-tpl-search{max-width:420px;height:32px}

/* C2 — đồng hồ lượt AI. */
.brain-quota{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin:0 0 14px}
.brain-quota .bq-bar{width:150px;height:6px;border-radius:3px;background:var(--bg-subtle);overflow:hidden;flex:0 0 auto}
.brain-quota .bq-fill{height:100%;border-radius:3px;transition:width .2s}
.brain-quota .bq-fill.bq-ok{background:#16a34a}
.brain-quota .bq-fill.bq-warn{background:#d97706}
.brain-quota .bq-fill.bq-danger{background:#dc2626}
.brain-quota .bq-dot{width:8px;height:8px;border-radius:50%;background:#16a34a;flex:0 0 auto}
.brain-quota .bq-txt{font-size:12px;color:var(--text-2)}
.brain-quota .bq-left{font-weight:600;color:var(--text)}

/* ── UX polish 2026-07-29: nhóm Công cụ (email/docs/workspace/timesheet) ── */
.page-head-row{display:flex;align-items:flex-start;gap:12px;flex-wrap:wrap;margin-bottom:10px}
.page-head-row .page-title{margin-bottom:2px}
.page-head-row .page-sub{margin:0}
.ux-banner{display:flex;align-items:center;gap:12px;border:1px solid #f8e3bd;background:#fff8ec;
  border-radius:10px;padding:10px 14px;margin:0 0 12px;flex-wrap:wrap}
.ux-banner-ic{display:grid;place-items:center;width:32px;height:32px;border-radius:8px;
  background:#fff;border:1px solid #f8e3bd;color:#b06000;flex:0 0 auto}
.ux-banner-ic svg{width:16px;height:16px}
[data-theme="dark"] .ux-banner{background:#2a2113;border-color:#5c452a}
[data-theme="dark"] .ux-banner-ic{background:#1d1a14;border-color:#5c452a;color:#f0a35c}
.ux-steps{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:12px;margin:8px 0 4px}
.ux-step{background:var(--panel);border:1px solid var(--border);border-radius:10px;
  padding:14px 16px;display:flex;flex-direction:column;gap:6px;align-items:flex-start}
.ux-step-n{display:grid;place-items:center;width:24px;height:24px;border-radius:50%;
  font-size:12px;font-weight:700;background:var(--bg-subtle);color:var(--primary-text)}
.ux-step-n svg{width:13px;height:13px}
.ux-step-done .ux-step-n{background:#e7f6ee;color:var(--st-done)}
[data-theme="dark"] .ux-step-done .ux-step-n{background:#15311f}

/* ===== Tài chính (Thu Chi / Voucher / Mã giảm giá) — tham chiếu ClickUp =====
   Scoped bằng tiền tố .cu- để không ảnh hưởng .seg/.badge/.filter-bar dùng ở
   chỗ khác trong app. --st-verified (#7b68ee) đã có sẵn trong palette, dùng
   làm accent tím thay vì thêm token mới. */
.cu-tabs{display:flex;gap:2px;border-bottom:1px solid var(--border);margin:6px 0 12px;overflow-x:auto}
.cu-tabs button{appearance:none;background:none;border:none;font:inherit;font-size:12px;
  font-weight:600;color:var(--text-2);padding:8px 12px;border-bottom:2px solid transparent;
  margin-bottom:-1px;cursor:pointer;white-space:nowrap}
.cu-tabs button:hover{color:var(--text)}
.cu-tabs button.active{color:var(--st-verified);border-bottom-color:var(--st-verified)}
.cu-toolbar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 14px}
.cu-toolbar .cu-sp{flex:1}
/* min-height 32px (Figma "Thu Chi — ĐỀ XUẤT UI/UX"): padding 5px cho ~28px, đủ
   WCAG 2.2 Target Size (24px) nhưng hàng lọc là thứ bấm liên tục nên nới thêm. */
.cu-pill,.cu-pill-sel{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--border);
  border-radius:999px;padding:5px 12px;font-size:12px;font-weight:600;color:var(--text-2);
  background:var(--panel);cursor:pointer;height:auto;min-height:32px;line-height:1.3}
.cu-pill:hover,.cu-pill-sel:hover{border-color:var(--border-strong);color:var(--text)}
/* Bộ lọc ít dùng nằm sau nút này (Hick) — viền đứt để phân biệt với ô lọc thật. */
.cu-pill.cu-pill-more{border-style:dashed}
.cu-pill-search{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--border);
  border-radius:999px;padding:5px 12px 5px 10px;font-size:12px;background:var(--panel);min-width:190px;
  min-height:32px}
.cu-pill-search svg{width:13px;height:13px;color:var(--text-3);flex:none}
.cu-pill-search input{border:none;background:none;font:inherit;outline:none;flex:1;color:var(--text)}
/* CTA chính của thanh công cụ: 29px là dưới ngưỡng Fitts/WCAG 2.2 Target Size cho
   nút hành động chính — nới lên 36px, cùng thang với .btn-lg các trang khác. */
.cu-btn-primary{background:var(--st-verified);border:1px solid var(--st-verified);color:#fff;
  border-radius:999px;padding:8px 16px;font-size:12px;font-weight:700;cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;gap:6px;min-height:36px}
.cu-btn-primary:hover{filter:brightness(1.08)}
.cu-btn-primary svg{width:13px;height:13px}
.cu-group-h{display:flex;align-items:center;gap:10px;padding:11px 4px 7px;font-size:12px;color:var(--text-2)}
.cu-group-label{font-size:10px;font-weight:800;letter-spacing:.4px;text-transform:uppercase;
  color:#fff;border-radius:5px;padding:3px 9px;white-space:nowrap}
.cu-group-agg{margin-left:auto;font-variant-numeric:tabular-nums;font-weight:700;color:var(--text)}
.cu-inline-add{color:var(--text-3);font-size:12px;padding:7px 10px 10px;cursor:pointer}
.cu-inline-add:hover{color:var(--st-verified)}
.cu-avatar{display:inline-flex;align-items:center;justify-content:center;width:19px;height:19px;
  border-radius:50%;background:var(--primary-weak);color:var(--primary-text);font-size:9px;font-weight:800;
  margin-right:6px;vertical-align:-4px;flex:none}
.cu-status{display:inline-flex;align-items:center;font-size:10px;font-weight:800;letter-spacing:.4px;
  text-transform:uppercase;padding:3px 9px;border-radius:5px;color:#fff;white-space:nowrap}
/* Chữ trắng 10px KHÔNG phải "large text" (WCAG cần ≥18.66px bold) nên nền pill
   phải đạt 4.5:1 với #fff. Bộ cũ trượt: #12b76a 2.62:1, #98a1b0 2.37:1,
   #f59e0b 1.94:1 → tối lại. Đo trên #fff: ok 5.39 · part 5.13 · info 5.25 ·
   danger 6.15 · muted 4.83. Chữ trắng nên giá trị đúng cho cả 2 theme. */
.cu-status.ok{background:#0f7a48}
.cu-status.part{background:#a05e00}
.cu-status.info{background:#0b6fb0}
.cu-status.danger{background:#b8283f}
.cu-status.muted{background:#6b7280}
/* Figma "Mã giảm giá — ĐỀ XUẤT UI/UX" 179:287 — thẻ đợt khuyến mãi. Ưu đãi là nội
   dung chính của coupon nhưng trước đây chìm nhất thẻ (11px .intg-cat xám nhạt);
   pill trạng thái trong thẻ bị bỏ vì trùng nguyên văn nhãn nhóm ngay phía trên,
   chỗ trống đó dành cho chip tỉ lệ dùng. */
.cpn-card .intg-name{font-size:14px;font-weight:700}
.cpn-offer{font-size:12px;font-weight:600;color:var(--text-2)}
.cpn-rate{margin-left:auto;flex:none;font-size:11px;font-weight:700;white-space:nowrap;
  border:1px solid var(--border);border-radius:5px;padding:4px 9px;
  background:var(--bg-subtle);color:var(--text-2)}
/* <20% = đợt đang chạy mà mã không ai dùng (cần đẩy); ≥50% = chạy tốt. Chữ dùng
   --ach-warn/--ach-good (đã đo tương phản ≥4.5:1 ở pass KPI), không thêm màu mới. */
.cpn-rate.cpn-rate-low{background:#fffbeb;border-color:var(--st-pending);color:var(--ach-warn)}
.cpn-rate.cpn-rate-ok{background:#ecfdf3;border-color:var(--st-completed);color:var(--ach-good)}
.cpn-card.cpn-warn{background:#fffbeb;border-color:var(--st-pending)}
[data-theme="dark"] .cpn-card.cpn-warn{background:rgba(245,158,11,.09)}
[data-theme="dark"] .cpn-rate.cpn-rate-low{background:rgba(245,158,11,.12)}
[data-theme="dark"] .cpn-rate.cpn-rate-ok{background:rgba(18,183,106,.12)}
.cpn-metrics{display:flex;gap:14px;flex-wrap:wrap;font-size:12px;color:var(--text-2)}
.cpn-metrics b{color:var(--text);font-variant-numeric:tabular-nums}
.cpn-metrics.cpn-dim,.cpn-metrics.cpn-dim b{color:var(--text-3);font-weight:400}
.cpn-days{font-weight:700;color:var(--ach-warn)}
/* Figma "Voucher (thẻ quà tặng) — ĐỀ XUẤT UI/UX" 177:146.
   .intg-grid dùng auto-fit nên cột rỗng bị thu lại: nhóm còn 1 thẻ sẽ giãn thẻ
   đó ra hết 1182px, nhóm 2 thẻ thì mỗi thẻ 584px — vỡ nhịp giữa các nhóm. Dùng
   auto-fill để số cột cố định theo bề rộng vùng chứa, thẻ giữ đúng kích thước
   dù nhóm có 1 hay 6 thẻ. */
.vch-grid{grid-template-columns:repeat(auto-fill,minmax(300px,1fr))}
/* Sắp hết hạn mà còn số dư = tiền khách đã trả sắp mất hiệu lực → hổ phách.
   Đã hết hạn mà còn số dư = tiền kẹt, không thu hồi được → đỏ như .goal-risk.
   Hết vòng đời (dùng hết / hết hạn số dư 0) thì chìm xuống. */
.intg.vch-warn{background:#fffbeb;border-color:var(--st-pending)}
.intg.vch-risk{background:#fef2f2;border-color:var(--st-blocked)}
.intg.vch-done{background:var(--bg-subtle)}
.intg.vch-done .intg-name,.intg.vch-done .vch-money{color:var(--text-3)}
[data-theme="dark"] .intg.vch-warn{background:rgba(245,158,11,.09)}
[data-theme="dark"] .intg.vch-risk{background:rgba(239,68,68,.09)}
.vch-money{font-size:12px;font-variant-numeric:tabular-nums;color:var(--text-2)}
.vch-money b{font-size:13px;color:var(--text)}
.vch-meta{font-size:12px;color:var(--text-3);margin-top:6px}
.vch-exp{display:inline-block;margin-top:6px;font-size:11px;font-weight:600;
  border-radius:6px;padding:3px 8px;background:var(--bg-subtle);color:var(--text-3)}
.vch-exp.vch-exp-warn{background:#fff4e5;color:var(--ach-warn)}
.vch-exp.vch-exp-risk{background:#ffe4e6;color:var(--ach-bad)}
[data-theme="dark"] .vch-exp.vch-exp-warn{background:rgba(245,158,11,.14)}
[data-theme="dark"] .vch-exp.vch-exp-risk{background:rgba(239,68,68,.14)}
.cu-progress{height:6px;border-radius:999px;background:var(--bg-subtle);overflow:hidden;margin:8px 0 4px}
.cu-progress i{display:block;height:100%;background:#12b76a;border-radius:999px}
.cu-progress i.warn{background:#f59e0b}
.cu-progress i.info{background:#0b6fb0}
.cu-progress i.danger{background:var(--st-blocked)}
.cu-progress i.dim{background:var(--border-strong)}

/* D3 — cảnh báo việc trùng dưới ô tiêu đề. Nền hổ phách nhạt, KHÔNG đỏ: đây là
   lời nhắc kiểm tra, không phải lỗi chặn lưu. */
.task-dup{margin-top:8px;padding:8px 10px;border:1px solid #fcd34d;background:#fffbeb;border-radius:8px}
[data-theme="dark"] .task-dup{background:#2a2109;border-color:#78551a}
.task-dup .td-head{font-size:12px;font-weight:600;color:#92400e;margin-bottom:6px}
[data-theme="dark"] .task-dup .td-head{color:#fbbf24}
/* D4 — tiêu đề dải TƯƠNG TỰ. Nhạt hơn và có vạch ngăn: cùng một hộp nhưng phải
   đọc ra ngay là mức nhắc thấp hơn dải trùng ở trên, không thì hai dải hoà làm một. */
.task-dup .td-head-soft{color:var(--text-2);font-weight:500;margin-top:8px;padding-top:8px;
  border-top:1px solid rgba(146,64,14,.18)}
[data-theme="dark"] .task-dup .td-head-soft{color:var(--text-2);border-top-color:rgba(251,191,36,.22)}
.task-dup .td-row{display:flex;align-items:center;gap:8px;padding:4px 6px;border-radius:6px;font-size:12px}
.task-dup .td-row.is-link{cursor:pointer}
.task-dup .td-row.is-link:hover{background:rgba(0,0,0,.05)}
.task-dup .td-title{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text)}
.task-dup .td-who{color:var(--text-2);white-space:nowrap}

/* P0.1 — dải cảnh báo danh sách bị cắt. Hổ phách, không đỏ: dữ liệu đúng nhưng
   chưa đủ — việc của banner là nói thật con số và đưa đường lấy tiếp. */
.trunc-banner{display:flex;align-items:center;gap:10px;padding:9px 13px;margin:0 0 12px;
  border:1px solid #fcd34d;background:#fffbeb;border-radius:9px;font-size:13px;color:#92400e}
[data-theme="dark"] .trunc-banner{background:#2a2109;border-color:#78551a;color:#fbbf24}
.trunc-banner svg{width:16px;height:16px;flex:0 0 auto}
.trunc-banner .tb-txt{flex:1;min-width:0}

/* W8 — banner "chỉ đọc" thường trực (402 access_state=read_only, xem
   syncAccessBanner() trong app.js). Cùng bảng màu hổ phách với .trunc-banner
   ngay trên (ĐIỀU CẦN XEM LẠI, không phải lỗi đã hỏng — dữ liệu vẫn nguyên,
   chỉ tạm khoá GHI); khác .trunc-banner ở chỗ đây là dải TOÀN CHIỀU RỘNG
   `.main`, đứng NGOÀI mọi trang con (đầu .main, trước .header) — nó phải đúng
   trên MỌI route trong lúc còn hiệu lực, không chỉ trang đang mở lúc nó xuất
   hiện. Không có nút đóng: trạng thái vẫn đúng cho tới khi công ty nâng cấp
   thật, ẩn nó đi không đổi được sự thật đó (xem app.js cho lý lẽ đầy đủ). */
.access-banner{flex:0 0 auto;display:flex;align-items:center;gap:10px;
  padding:9px 20px;border-bottom:1px solid #fcd34d;background:#fffbeb;
  font-size:12.5px;color:#92400e}
[data-theme="dark"] .access-banner{background:#2a2109;border-color:#78551a;color:#fbbf24}
.access-banner svg{width:16px;height:16px;flex:0 0 auto}
.access-banner .ab-txt{flex:1;min-width:0}

/* U13 — hộp nhấn trên Trang chủ: token hoá thay vì inline style rải rác. Cách nhấn
   đổi từ "viền trái màu nghĩa" sang "nền nhuộm + viền 1px đủ bốn cạnh" theo
   DESIGN.md "Luật Không Viền Một Bên" — cùng cách .stat-bad/.mk-camp-warn đã nhấn. */
.panel-accent{margin:4px 0 10px;padding:12px 14px;border:1px solid var(--border-strong);
  border-radius:var(--radius)}
.panel-accent-amber{border-color:#f59e0b;background:#fffbeb}
.panel-accent-violet{border-color:#7c3aed;background:var(--primary-weak)}
[data-theme="dark"] .panel-accent-amber{background:rgba(245,158,11,.09)}

/* ── Email Marketing (Figma 182:178 / 182:4990) ───────────────────────────────
   Trạng thái chiến dịch nhuộm cả thẻ chứ không chỉ pill góc phải — cùng ngữ nghĩa
   .stat-bad/.stat-warn của Trang chủ. Chữ lỗi dùng --ach-bad (4.5:1 trên nền trắng),
   nền/viền vẫn --st-blocked như mọi chỗ khác. */
.mk-camp-bad{background:#fef2f2;border-color:var(--st-blocked)}
.mk-camp-warn{background:#fffbeb;border-color:var(--st-pending)}
[data-theme="dark"] .mk-camp-bad{background:rgba(239,68,68,.09)}
[data-theme="dark"] .mk-camp-warn{background:rgba(245,158,11,.09)}
.mk-prov-warn{background:#fffbeb;border-color:var(--st-pending)}
[data-theme="dark"] .mk-prov-warn{background:rgba(245,158,11,.09)}
.mk-err{font-size:12px;color:var(--ach-bad);line-height:1.5}
.mk-err .muted{color:var(--text-3)}
/* Hàng nút thẻ chiến dịch: CTA gửi (36px) đứng đầu, Xóa bị đẩy hẳn sang mép phải
   để hành động phá huỷ không nằm cạnh hành động thường (Fitts — xa tay hơn). */
.mk-acts{display:flex;gap:8px;margin-top:10px;flex-wrap:wrap;align-items:center}
.mk-acts .mk-del{margin-left:auto}
/* Hộp xác nhận gửi: cảnh báo đỏ + bảng tóm tắt phạm vi + ô tick khoá nút chính */
.mk-danger-note{border-left-color:var(--st-blocked);background:#fef2f2;color:var(--ach-bad);
  margin:0 0 12px;padding:10px 12px;font-size:13px}
[data-theme="dark"] .mk-danger-note{background:rgba(239,68,68,.09)}
.mk-sum{display:grid;grid-template-columns:110px 1fr;gap:7px 10px;font-size:12.5px;margin-bottom:12px}
.mk-sum-k{color:var(--text-3)}
.mk-ack{display:flex;align-items:center;gap:9px;font-size:12.5px;cursor:pointer;
  min-height:24px;font-weight:500}
.mk-ack .mk-chk{width:18px;height:18px;flex:0 0 18px;cursor:pointer;accent-color:var(--primary)}

/* Kho tài liệu — dropzone kéo-thả (task B2) */
.ws-dropzone{display:flex;align-items:center;gap:12px;border:1.5px dashed var(--border-strong);
  background:var(--bg-subtle);border-radius:10px;padding:16px 18px;margin:0 0 14px;cursor:pointer}
.ws-dropzone-ic{display:grid;place-items:center;width:36px;height:36px;border-radius:9px;
  background:var(--primary-weak);color:var(--primary-text);flex:0 0 auto}
.ws-dropzone-ic svg{width:17px;height:17px}
.ws-dropzone-over{border-color:var(--primary);background:var(--primary-weak)}

/* ===== UI/UX OPTIMIZATION (2026-07-29) ===== */

/* Enhanced Stat Cards — better spacing, modern design */
.stat-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 12px;
  margin-bottom: 20px;
}

.stat {
  background: var(--panel);
  border: 1px solid var(--border);
  border-radius: 10px;
  padding: 16px 18px;
  transition: all 0.16s cubic-bezier(0.16, 1, 0.3, 1);
  position: relative;
  overflow: hidden;
}

/* Bỏ dải gradient 3px chạy mép trên khi hover. DESIGN.md: hệ này nhấn bằng viền
   đậm lên + bóng, không bằng màu chuyển; và dải màu ở một cạnh thẻ là thứ bị cấm.
   Nhấc 2px + Bóng Nổi + viền đậm đã là ba tín hiệu hover, dải thứ tư chỉ là trang trí. */
.stat:hover {
  transform: translateY(-2px);
  box-shadow: 0 8px 24px -6px rgba(0, 0, 0, 0.12);
  border-color: var(--border-strong);
}

.stat .k {
  font-size: 11.5px;
  font-weight: 650;
  letter-spacing: 0.4px;
  color: var(--text-2);
  text-transform: uppercase;
  display: flex;
  align-items: center;
  gap: 6px;
  margin-bottom: 8px;
}

.stat .v {
  font-size: 28px;
  font-weight: 750;
  letter-spacing: -0.8px;
  line-height: 1.1;
  color: var(--text);
  font-variant-numeric: tabular-nums;
}

/* Đo lại 2026-08-03 (pass Chất lượng): ba hex này là CON SỐ TO NHẤT trên thẻ mà
   trên nền sáng còn trượt cả mức 3:1 dành cho chữ lớn — #10b981/trắng 2.54:1,
   #f59e0b/#fffbeb 2.07:1, #ef4444/#fef2f2 3.44:1 (chỉ vừa đủ). Bộ --ach-* sinh
   ra đúng cho việc này: cùng họ màu, đã đậm đủ trên nền sáng và tự đổi sang bản
   sáng hơn ở dark theme (4.56–8.10:1 cả hai chế độ). */
.stat .v.good { color: var(--ach-good); }
.stat .v.warn { color: var(--ach-warn); }
.stat .v.bad { color: var(--ach-bad); }

/* Số tiền dài ("909.097,88đ") tràn khỏi thẻ ở 28px khi lưới xếp 6 thẻ một hàng
   (chỉ còn ~100px cho chữ số). fitStatValues() trong app.js đo rồi hạ cỡ chữ cho
   vừa; hai dòng dưới là lưới an toàn khi JS chưa kịp chạy hoặc số dài quá mức. */
.stat .v { overflow-wrap: anywhere; }
.stat-tx { flex: 1 1 auto; overflow: hidden; }

/* Filter Bar Improvements */
.filter-bar {
  display: flex;
  flex-direction: column;
  gap: 12px;
  margin-bottom: 16px;
  padding: 12px;
  background: var(--bg-subtle);
  border-radius: 8px;
  border: 1px solid var(--border);
}

.filter-controls {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
}

.filter-lab {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 12.5px;
  font-weight: 650;
  color: var(--text-2);
  text-transform: uppercase;
  letter-spacing: 0.2px;
}

/* Progress Bars */
.progress {
  height: 8px;
  border-radius: 4px;
  background: var(--border);
  overflow: hidden;
  box-shadow: inset 0 0 0 1px var(--border-strong);
}

.progress > span {
  display: block;
  height: 100%;
  border-radius: 4px;
  background: linear-gradient(90deg, var(--primary), #3b9bf2);
  transition: width 0.4s cubic-bezier(0.16, 1, 0.3, 1);
}

/* Empty State */
.empty {
  text-align: center;
  padding: 60px 20px;
  color: var(--text-3);
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  min-height: 300px;
}

.empty svg {
  width: 48px;
  height: 48px;
  margin-bottom: 16px;
  opacity: 0.3;
}

.empty .et {
  font-size: 14.5px;
  font-weight: 600;
  color: var(--text-2);
  margin-bottom: 6px;
}

/* Section Headers */
.section-header {
  padding: 16px 0 12px;
  margin-top: 20px;
  border-bottom: 2px solid var(--border);
  font-size: 15px;
  font-weight: 700;
  color: var(--text);
  letter-spacing: -0.3px;
}

/* Responsive */
@media (max-width: 1024px) {
  .stat-grid {
    grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  }
}

@media (max-width: 768px) {
  .stat-grid {
    grid-template-columns: repeat(2, 1fr);
  }

  .filter-bar {
    flex-direction: column;
  }

  .tbl th, .tbl td {
    padding: 10px 12px;
    font-size: 12px;
  }
}

@media (max-width: 480px) {
  .stat-grid {
    grid-template-columns: 1fr;
  }
}

/* BRAIN_TABS/3/3b đã gộp ngược lên phần "Bộ não AI — unified hub" (2026-07-31):
   ba lượt vá nối đuôi ở EOF cùng nhắm .seg.brain-seg, mỗi lượt chỉ đè vài thuộc
   tính nên phần còn lại rơi rớt từ block pill cũ. Sửa kiểu tab: sửa ở trên. */

/* BRAIN_TABS2 — tab phụ (Agents/Kỹ năng/Bộ nhớ) hiện DƯỚI ô chat: khung chat co lại
   còn cụm tab + composer (transcript/sidebar ẩn bằng JS), bỏ min-height để nội dung
   tab đổ ngay sát bên dưới, không chừa khoảng trống 420px của chế độ chat. */
/* .brain-dock đã gỡ (2026-07-31): nội dung 3 tab phụ nay nằm trong chatMain,
   cột phiên hiện ở mọi tab nên không còn trạng thái "khung co lại". */

/* ================================================================
   BRAIN_QA (C4+C5, QA 2026-07-30) — block EOF để commit chọn lọc không
   dính WIP khác trong file (mẫu BRAIN_TABS).
   C4: badge kỹ năng trên card Agent mẫu — .badge gốc white-space:nowrap
   nên trong grid in-chat minmax(230px) chữ bị CẮT CỤT không ellipsis
   (trang Cấu hình card rộng hơn nên thoát). Ellipsis thay vì wrap: badge
   2 dòng phá chiều cao card đều nhau.
   C5: hàng chip NGÀNH — nowrap + overflow-x:auto nhưng scrollbar mỏng bị
   macOS auto-hide, chip cuối vô hình. Chip ít → wrap 2 hàng thấy hết,
   khỏi scroll ngang không affordance.
   ================================================================ */
.brain-tpl-card .bt-top .badge{max-width:100%;overflow:hidden;text-overflow:ellipsis;display:inline-block}
.brain-axis-track{flex-wrap:wrap;overflow-x:visible}

/* ===== Báo cáo ngày (Figma 152:3201) — tín hiệu amber cho báo cáo thiếu ===== */
/* Thẻ tiến độ khi chưa đủ người nộp: nhuộm amber như thẻ "Báo cáo gửi" Trang chủ */
/* Nền amber + viền amber đủ bốn cạnh đã nhấn xong; dải 3px cạnh trái vừa thừa
   vừa là thứ DESIGN.md cấm, nên bỏ. */
.report-warn-card{background:#fffbeb;border-color:var(--st-pending)}
[data-theme="dark"] .report-warn-card{background:rgba(245,158,11,.09)}
.report-warn-card .progress{background:#fef3c7}
[data-theme="dark"] .report-warn-card .progress{background:rgba(245,158,11,.15)}
/* Header mục cần hành động — #b45309 trên nền trắng 4.7:1, đạt AA */
.section-warn{color:#b45309}
[data-theme="dark"] .section-warn{color:#fbbf24}
/* CTA chính ≥36px (Fitts + WCAG 2.2 target size) */
.btn-lg{height:36px;padding:0 14px;font-weight:600}
.btn-warn{background:#fef3c7;border-color:#d97706;color:#92400e}
.btn-warn:hover{background:#fde68a;border-color:#b45309;color:#78350f}
[data-theme="dark"] .btn-warn{background:rgba(245,158,11,.15);border-color:#b45309;color:#fbbf24}
[data-theme="dark"] .btn-warn:hover{background:rgba(245,158,11,.25);color:#fde68a}
/* Bảng người chưa báo cáo nối vào tín hiệu amber của mục */
.tbl-warn{border:1px solid var(--st-pending);border-radius:var(--radius);overflow:hidden}

/* ===== Bảng chất lượng Q5 (Figma "Chất lượng — ĐỀ XUẤT UI/UX" 168:146) =====
   Ba tầng thay 12 ô bằng nhau: ô cần hành động to nhất, ô đạt ngưỡng cỡ thường,
   ô chưa đo được co thành danh sách một dòng. Vỏ ô mượn .stat/.stat-bad/
   .stat-warn/.stat-dim của Trang chủ nên dark theme và nền nhuộm có sẵn. */
.q-tiles{display:grid;gap:10px;margin:0 0 18px}
.q-tiles.q-act{grid-template-columns:repeat(auto-fit,minmax(300px,1fr))}
.q-tiles.q-ok{grid-template-columns:repeat(auto-fit,minmax(206px,1fr))}
.q-tile{align-items:flex-start}
.q-tile .stat-tx{flex:1;min-width:0}
.q-tile .k{color:var(--text-2)}
.q-tile .v{margin-top:5px}
.q-tile-big .v{font-size:30px}
.q-head{display:flex;align-items:flex-start;justify-content:space-between;gap:8px}
.q-head .badge{flex:none}
/* Ngưỡng + mẫu số dùng --text-2 chứ KHÔNG --text-3: #767676 trên nền ô cảnh báo
   chỉ đạt 4.38:1 (#fffbeb) và 4.15:1 (#fef2f2), dưới AA 4.5:1 cho cỡ 11px;
   #5f5f5f đạt 6.16:1 / 5.84:1. */
.q-meta{font-size:11px;line-height:1.55;color:var(--text-2);margin-top:6px}
.q-drill{margin-top:6px;padding:4px 0;min-height:24px;background:none;border:0;
  font-size:11px;font-weight:600;color:var(--primary-text);cursor:pointer;text-align:left}
.q-drill:hover{text-decoration:underline}
.q-un-h{display:flex;align-items:center;justify-content:space-between;gap:12px;margin:24px 0 8px}
.q-un{background:var(--bg-subtle);border:1px solid var(--border);border-radius:10px;overflow:hidden}
.q-un-row{display:flex;align-items:center;gap:12px;padding:9px 14px;color:var(--text-3)}
.q-un-row + .q-un-row{border-top:1px solid var(--border)}
.q-un-l{flex:0 0 250px;font-size:12px;font-weight:600}
.q-un-d{flex:0 0 22px;font-size:13px;font-weight:700}
.q-un-w{min-width:0;font-size:11px}
/* Cùng lý do 4.5:1 như .q-meta, cho mọi thẻ .stat đã nhuộm nền (Trang chủ, CRM…) */
.stat.stat-bad .muted,.stat.stat-warn .muted{color:var(--text-2)}

/* ── Bảng chấm công (Figma "Bảng chấm công — ĐỀ XUẤT UI/UX" 182:1924) ──────────
   Ngày làm việc ĐÃ QUA mà tổng = 0 giờ: nhuộm nguyên cột amber + gạch chân đầu
   cột. Chữ dùng --ach-warn (#b06000, 4.6:1) chứ không --st-pending (#f59e0b chỉ
   2.2:1 làm chữ) — cùng bộ đã dùng ở KPI/OKR. */
.ts-grid th{font-variant-numeric:tabular-nums;font-feature-settings:"tnum"}
.ts-grid .ts-day-miss{background:#fffbeb}
.ts-grid thead .ts-day-miss{border-bottom:2px solid var(--st-pending)}
.ts-grid thead .ts-day-miss div:last-child{color:var(--ach-warn);font-weight:700}
.ts-grid tfoot .ts-grid-foot td.ts-day-miss{background:#fffbeb}
/* Tổng cả tuần là con số to nhất bảng. --primary-text chứ không --primary:
   #7b68ee trên nền trắng chỉ 4.15:1, hụt AA cho chữ. */
.ts-grid .ts-grand{font-size:15px;color:var(--primary-text)}
.ts-miss-chip{display:inline-flex;align-items:center;height:22px;padding:0 10px;border-radius:11px;
  background:#fffbeb;border:1px solid var(--st-pending);color:var(--ach-warn);
  font-size:12px;font-weight:600;font-variant-numeric:tabular-nums}
[data-theme="dark"] .ts-grid .ts-day-miss,
[data-theme="dark"] .ts-grid tfoot .ts-grid-foot td.ts-day-miss,
[data-theme="dark"] .ts-miss-chip{background:rgba(245,158,11,.10)}

/* ── Omnichannel (Figma "Omnichannel — ĐỀ XUẤT UI/UX" 182:604) ─────────────────
   Danh sách khách trước đây là một chồng .btn-sm chữ trơn cao 26px: không đọc
   được ai đang chờ mình, và bấm trượt. Card 2 dòng + chip việc quá hạn/đến hạn
   là toàn bộ khác biệt. Màu chữ chip dùng --ach-warn/--ach-bad (4.6:1 / 4.5:1),
   KHÔNG dùng --st-pending/--st-blocked làm chữ như đã đo ở KPI/OKR. */
.omni-bar{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin:0 0 14px}
.omni-grid{display:grid;grid-template-columns:minmax(240px,300px) 1fr;gap:16px;align-items:start}
.omni-grid.omni-grid-empty{grid-template-columns:1fr}
.omni-listh{display:flex;align-items:center;gap:8px;justify-content:space-between}

.omni-cust{display:block;width:100%;text-align:left;margin:0 0 6px;padding:9px 11px;
  background:var(--panel);border:1px solid var(--border);border-radius:var(--radius);cursor:pointer}
.omni-cust:hover{background:var(--hover)}
.omni-cust.active{background:var(--primary-weak);border-color:var(--primary);border-width:1.5px;padding:8.5px 10.5px}
.omni-cust.omni-cust-bad{box-shadow:inset 3px 0 0 var(--st-blocked)}
.omni-cust .oc-l1{display:flex;align-items:center;gap:8px}
.omni-cust .oc-name{flex:1 1 auto;min-width:0;font-size:13px;font-weight:600;color:var(--text);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.omni-cust .oc-name.oc-noname{color:var(--text-2);font-weight:500}
.omni-cust .oc-time{flex:0 0 auto;font-size:11px;color:var(--text-3);font-variant-numeric:tabular-nums}
.omni-cust .oc-l2{display:flex;align-items:center;gap:6px;margin-top:5px;min-width:0}
.omni-cust .oc-ident{font-size:11px;color:var(--text-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.omni-pend-bad,.omni-pend-warn,.omni-pend-later{text-transform:none;letter-spacing:0;font-weight:600}
.omni-pend-bad{background:#fef2f2;border:1px solid var(--st-blocked);color:var(--ach-bad)}
.omni-pend-warn{background:#fffbeb;border:1px solid var(--st-pending);color:var(--ach-warn)}
.omni-pend-later{background:rgba(0,0,0,.05);color:var(--text-2)}

.omni-head{margin:0 0 10px}
.omni-head-name{font-size:18px;font-weight:700;color:var(--text)}
.omni-head-meta{margin-top:3px;font-size:12px;color:var(--text-3)}
.omni-note{margin:10px 0 0;padding:10px 12px;border-radius:var(--radius);border:1px solid var(--border)}
.omni-note .on-t{font-size:13px;font-weight:600}
.omni-note .on-d{font-size:12px;color:var(--text-2);margin-top:2px}
/* Hai cảnh báo khác loại thì phải khác màu: đỏ = việc của BẠN đang trễ, vàng =
   bản ghi này thiếu vì thiếu quyền. Cùng màu thì người đọc gộp chúng làm một. */
.omni-note-red{background:#fef2f2;border-color:var(--st-blocked)}
.omni-note-red .on-t{color:var(--ach-bad)}
.omni-note-amber{background:#fffbeb;border-color:var(--st-pending)}
.omni-note-amber .on-t{color:var(--ach-warn)}
.omni-note-amber .on-d{color:var(--ach-warn);font-weight:500}

.omni-fbar{display:flex;flex-wrap:wrap;gap:6px;margin:12px 0 10px}
.omni-fchip{height:34px;padding:0 12px;border-radius:var(--radius);cursor:pointer;
  background:var(--panel);border:1px solid var(--border);color:var(--text-2);font-size:12px;font-weight:500}
.omni-fchip:hover{background:var(--hover)}
/* Chữ chip đang chọn lấy --bg chứ không phải #fff: nền tối --cta là #f0f0f0,
   chữ trắng trên nền trắng thì chip biến mất (đo trên ảnh chụp dark 03/08). */
.omni-fchip.active{background:var(--cta);border-color:var(--cta);color:var(--bg);font-weight:600}

.omni-ev{display:grid;grid-template-columns:132px 1fr;gap:12px;padding:10px 12px;margin:0 0 8px}
.omni-ev .oe-time{font-size:12px;color:var(--text-3);font-variant-numeric:tabular-nums}
.omni-ev .oe-meta .badge{margin-top:5px}
.omni-ev .oe-head{display:flex;align-items:center;gap:10px}
.omni-ev .oe-title{flex:1 1 auto;min-width:0;font-size:13px;font-weight:600;color:var(--text-2)}
.omni-ev .oe-detail{margin-top:3px;font-size:12.5px;color:var(--text-2);white-space:pre-wrap}
.omni-ev .oe-tags{margin-top:3px;font-size:11.5px;color:var(--text-3)}
/* Tin khách gửi tới: vạch màu bên trái + tiêu đề đậm màu chữ chính. Hướng tin
   nhắn không được chỉ nằm ở chữ (WCAG 1.4.1 vẫn cần chữ — tiêu đề đã nói rõ
   "Khách nhắn tới"/"Mình đã trả lời", vạch màu chỉ là lớp thứ hai). */
.omni-ev-in{box-shadow:inset 3px 0 0 var(--st-progress)}
.omni-ev-in .oe-title{color:var(--text)}
.omni-foot{display:flex;align-items:center;gap:12px;margin-top:10px}
.omni-skel-cust{padding:12px 11px}
.omni-skel-ev{display:grid;grid-template-columns:132px 1fr;gap:12px;padding:12px}

[data-theme="dark"] .omni-pend-bad,[data-theme="dark"] .omni-note-red{background:rgba(239,68,68,.10)}
[data-theme="dark"] .omni-pend-warn,[data-theme="dark"] .omni-note-amber{background:rgba(245,158,11,.10)}
[data-theme="dark"] .omni-pend-later{background:rgba(255,255,255,.08)}

/* ── Nhật ký hoạt động — nhóm ngày + cột giờ (Figma 242:3590) ─────────────
   Header ngày position:sticky dính đỉnh vùng cuộn (.content / .setx-main);
   nền đặc --bg-subtle để dòng bên dưới không xuyên chữ khi trượt qua. */
.act-day-head{position:sticky;top:0;z-index:2;display:flex;justify-content:space-between;align-items:center;gap:8px;
  background:var(--bg-subtle);border-radius:6px;padding:7px 10px;margin:10px 0 2px;
  font-size:12px;font-weight:600;color:var(--text-2)}
.act-day-head .n{font-weight:400;font-size:11px;color:var(--text-3)}
.act-time{flex:0 0 40px;font-size:12px;color:var(--text-3);font-variant-numeric:tabular-nums;padding-top:2px}
.act-meta{font-size:11px}
.act-obj{color:var(--text-3)}
.act-obj-link{color:var(--primary-text);font-weight:500;cursor:pointer}
.act-obj-link:hover{text-decoration:underline}
/* Chip trạng thái lần xuất (export-center) — trạng thái bằng chữ, màu chỉ là lớp hai */
.exp-chip{flex:0 0 auto;font-size:10.5px;font-weight:700;padding:2px 8px;border-radius:8px;background:var(--bg-subtle);color:var(--text-2)}
.exp-chip-err{background:#fef2f2;color:var(--ach-bad)}
[data-theme="dark"] .exp-chip-err{background:rgba(239,68,68,.12);color:#f4a6b1}
/* Kho tính năng (addons) — Figma đề xuất 248:1383: trạng thái bật là tín hiệu
   mạnh nhất — thẻ đang bật viền + vạch trái xanh --st-done ĐI KÈM badge chữ
   "Đang bật" (không chỉ màu); mô tả cắt 2 dòng + "Xem thêm" bung tại chỗ;
   subhead nhóm ngành trong "Chưa bật" nhỏ hơn section-h để 2 mức phân cấp
   (trạng thái > nhóm) không đánh nhau. */
.intg.addon-on{border-color:var(--st-done);box-shadow:inset 3px 0 0 var(--st-done),var(--shadow)}
.addon-desc{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.addon-desc.open{-webkit-line-clamp:unset;display:block}
.addon-more{border:0;background:none;padding:4px 0;margin-top:2px;font-size:11px;font-weight:600;
  color:var(--primary-text);cursor:pointer;align-self:flex-start}
.addon-more:hover{text-decoration:underline}
.addon-subhead{font-size:11px;font-weight:600;letter-spacing:.4px;text-transform:uppercase;
  color:var(--text-3);margin:14px 0 8px}
.addon-card .intg-actions{align-items:center}
.addon-card .intg-actions .btn-sm{min-height:28px}
.addon-hint{font-size:11px;color:var(--text-3)}
/* ── Cấu trúc công việc (settings › work-model) — Figma đề xuất 248:700 ──
   Tab con Settings dùng .seg compact (nhất quán pass Tài liệu) — markup ở
   settingsTabGroup; ở đây chỉ còn phần riêng của tab. */
/* Hàng danh sách 44px (WCAG 2.2 target size) — chỉ các bảng cấu trúc công việc,
   không đụng .tbl toàn cục. */
.wm-tbl td{height:44px;padding:6px 12px}
.wm-tbl .btn-sm{min-height:26px}
/* row-tag gốc là chip board (inline-flex, trần 110px). text-overflow KHÔNG chạy trên
   flex container — chữ bị cắt cụt giữa ký tự, không có "…". Trong bảng cấu hình tên
   là cột chính: đổi sang inline-block (ellipsis chạy) và cho ăn hết bề rộng ô. */
.wm-tbl .row-tag{display:inline-block;max-width:100%;line-height:1.6}
/* tg-tbl (màn Loại việc): HAI bảng riêng/dùng chung xếp dọc — layout cố định + bề
   rộng cột khai ở th để cột hai bảng thẳng hàng; auto thì mỗi bảng tự chia một kiểu
   (đo 2026-08-05: cột từ khoá 416px vs 462px cùng một màn). Cột từ khoá ăn phần dư. */
.tg-tbl{table-layout:fixed}
.tg-tbl th:nth-child(1){width:200px}
.tg-tbl th:nth-child(2){width:130px}
.tg-tbl th:nth-child(4){width:150px}
.tg-tbl td code{overflow-wrap:anywhere}
/* Dải 4 bước minh bạch của AI kiến trúc sư (§2.2) */
.wm-steps{display:flex;flex-wrap:wrap;gap:4px 18px;align-items:center;background:var(--panel);
  border:1px solid var(--border);border-radius:10px;padding:10px 14px;margin:0 0 14px}
.wm-step{display:flex;gap:8px;align-items:center}
.wm-step-n{flex:0 0 auto;width:20px;height:20px;border-radius:999px;background:var(--bg-subtle);
  color:var(--text-2);font-size:11px;font-weight:700;display:flex;align-items:center;justify-content:center}
.wm-step.on .wm-step-n{background:var(--cta);color:var(--bg)}
.wm-step-t{display:block;font-size:12px;font-weight:600;color:var(--text)}
.wm-step-d{display:block;font-size:10.5px;color:var(--text-3)}
/* ── AI: Agent & Kỹ năng (settings › ai-assets) — Figma đề xuất 268:146/268:2572 ──
   Banner trần uỷ quyền: con số quyết định AI được làm gì một mình nên to rõ +
   hệ quả thành chữ ngay dưới (heuristic #1). Màu map token, không hardcode mới. */
.auton-banner{border:1px solid var(--primary);background:var(--primary-weak);
  border-radius:8px;padding:14px 18px;margin:10px 0}
.auton-banner .ab-label{font-size:10.5px;font-weight:600;letter-spacing:.04em;
  text-transform:uppercase;color:#5237c9}
[data-theme="dark"] .auton-banner .ab-label{color:var(--primary-text)}
.auton-banner .ab-level{font-size:24px;font-weight:800;margin:2px 0;color:var(--text)}
/* Chưa có uỷ quyền = mọi lượt tự động bị chặn — cùng ngữ nghĩa stat-bad */
.auton-banner.auton-blocked{background:#fef2f2;border-color:var(--st-blocked)}
[data-theme="dark"] .auton-banner.auton-blocked{background:rgba(239,68,68,.09)}
.auton-banner.auton-blocked .ab-label{color:var(--ach-bad)}
/* Thang mức L0–L5: mức hiện tại highlight, mức trên trần dim (nâng = xác nhận) */
.auton-ladder{overflow:hidden}
.auton-lv{display:flex;gap:10px;align-items:center;padding:9px 14px;
  border-bottom:1px solid var(--border);font-size:13px}
.auton-lv:last-child{border-bottom:none}
.auton-lv.cur{background:var(--primary-weak)}
.auton-lv.above{opacity:.55}
.auton-lv .lv-name{font-weight:600;min-width:130px}
.auton-lv .lv-conseq{flex:1;color:var(--text-2);font-size:12.5px}
/* Thư viện agent/kỹ năng: item chưa gắn (chưa thêm vào công ty / chưa ★) dim nhẹ,
   hover/focus trả lại đủ đậm để vẫn duyệt được */
.tpl-dim{opacity:.62}
.tpl-dim:hover,.tpl-dim:focus-within{opacity:1}
/* Agent đang tắt: dim cả card, badge "Nghỉ" nói lý do */
.intg.agent-off{opacity:.62}
/* ── Pass UI/UX aiops (2026-08-04, Figma 268:706) ─────────────────────
   Tab "Mô hình AI & Chi phí": provider chưa key dim + CTA thêm key,
   bảng model giá tabular căn phải, hàng model mặc định tint primary. */
.aiops-dim{color:var(--text-3);font-weight:600}
.btn-key-add{background:var(--primary-weak);border-color:var(--primary-ring);
  color:var(--primary-text);font-weight:600}
.btn-key-add:hover{background:var(--primary-weak);border-color:var(--primary-text)}
.tbl-num{text-align:right;font-variant-numeric:tabular-nums;font-feature-settings:"tnum"}
.aiops-def-row td{background:var(--primary-weak)}

/* =====================================================================
   LỚP CỨNG HOÁ CHO WEB TRÊN ĐIỆN THOẠI  (03/08/2026)
   =====================================================================
   Đặt CUỐI FILE là cố ý: đây là lớp phủ sau cùng, phải thắng mọi khai báo
   ở trên mà không cần !important và không cần sửa vào từng khối cũ.

   BỐI CẢNH: trước hôm nay templates/index.html KHÔNG có <meta viewport>.
   Điện thoại vì thế dựng viewport ảo 980px rồi thu nhỏ cả trang, nên toàn bộ
   18 khối @media trong file này CHƯA BAO GIỜ khớp trên máy thật — chúng được
   viết ra, được review, và nằm chết. Nay viewport đã đúng, phần dưới đây là
   những thứ phải có mà bản cũ chưa từng cần tới.
   ===================================================================== */

/* ── 1. KHOÁ CUỘN NỀN KHI NGĂN KÉO ĐIỀU HƯỚNG MỞ ──
   Không khoá thì vuốt trong ngăn kéo tới đáy sẽ truyền đà xuống trang phía sau
   (scroll chaining): đóng ngăn kéo ra thấy nội dung đã trôi đi chỗ khác. Đúng
   một trong những cú "tự nhiên nhảy" mà người dùng báo. app.js bật/tắt lớp này
   ở openNavDrawer/closeNavDrawer. */
body.nav-locked{overflow:hidden;overscroll-behavior:none}
.sidebar,.content,.modal-b,.peek-b,.nav{overscroll-behavior:contain}

/* ── 2. VÙNG CHẠM + CỠ CHỮ Ô NHẬP TRÊN THIẾT BỊ CẢM ỨNG ──
   Nhắm bằng (pointer:coarse) chứ không bằng bề rộng: máy tính bảng ngang 1024px
   vẫn là ngón tay, còn cửa sổ trình duyệt hẹp trên laptop vẫn là con trỏ chuột.
   Bề rộng trả lời sai cả hai câu. */
@media (pointer:coarse){
  /* CỠ CHỮ ≥16px LÀ BẮT BUỘC, KHÔNG PHẢI THẨM MỸ.
     iOS Safari TỰ PHÓNG TO cả trang mỗi khi con trỏ vào một ô nhập có cỡ chữ
     dưới 16px, rồi KHÔNG thu lại. Mọi lần gõ vào ô tìm kiếm là một lần trang
     nhảy và lệch. Bản cũ để .input ở 13px nên bệnh này xảy ra ở MỌI ô nhập của
     app. Chữa ở đây, KHÔNG chữa bằng maximum-scale=1 (chặn phóng to là vi phạm
     WCAG 1.4.4 — người mắt kém mất hẳn khả năng phóng to). */
  .input,input,select,textarea{font-size:16px}
  .input,select.input{height:44px}
  textarea.input{min-height:88px}
  .peek-add .input,.bulk-in{height:38px}

  /* Nút: vùng chạm THẬT, không phải vùng chạm giả bằng pseudo-element chồng lên
     nhau (dày đặc như thanh công cụ ở đây thì các vùng giả sẽ đè lên nhau và ăn
     nhầm cú chạm của nút bên cạnh). */
  .btn{height:40px;padding:0 14px}
  .btn-lg{height:46px;padding:0 18px}
  .btn-sm{height:36px;padding:0 12px;font-size:13px}
  .btn-xs{height:32px;padding:0 10px;font-size:12.5px}
  .icon-btn{width:40px;height:40px}
  /* WCAG 2.5.8 đòi tối thiểu 24×24 CSS px cho mọi đích chạm; 44 là mức AAA và là
     mức Apple/Google khuyến nghị. Ô chọn hàng loạt cũ 24px — đạt mức sàn, nhưng
     đứng ngay cạnh tên việc bấm được nên chạm nhầm liên tục. */
  .row-sel-hit{flex:0 0 44px;width:44px;height:44px}
  .nav-item{min-height:44px;padding:10px 12px}
  .nav-sec{min-height:40px}
  .ws-btn{min-height:48px}
  .switcher .sw-item{min-height:44px}
  .modal-h .x{min-width:44px;min-height:44px;display:flex;align-items:center;justify-content:center}
  .tbl th,.tbl td{padding:12px}
  .row{min-height:48px}

  /* Bỏ độ trễ 300ms "chờ xem có phải double-tap không" của trình duyệt cảm ứng.
     Áp cho phần tử bấm được, KHÔNG áp cho body: đặt ở body sẽ tắt luôn pinch-zoom. */
  .btn,.icon-btn,.nav-item,.row,.chip,a,button,[role="button"]{touch-action:manipulation}

  /* Ngón tay không có :hover. Trạng thái hover trên cảm ứng bị "dính" lại sau khi
     chạm — người dùng thấy một dòng sáng lên rồi ở nguyên đó, đọc ra như đang chọn. */
  .row:hover,.tbl tr:hover td{background:transparent}
  .row:active,.tbl tr:active td{background:var(--hover)}
  /* Đổi lại: ô chọn hàng loạt vốn chỉ hiện khi hover thì trên cảm ứng phải hiện sẵn. */
  .row-sel{opacity:1}
}

/* ── 2b. CHỐT CHẶN THỨ HAI CHO BỆNH iOS TỰ PHÓNG TO ──
   Khối (pointer:coarse) ở trên là cách nhắm ĐÚNG, nhưng nó chỉ đúng khi trình duyệt
   khai báo thật. Chrome headless (và một số WebView nhúng) báo pointer:fine dù đang
   chạy ở khổ điện thoại — nghĩa là khối trên KHÔNG áp, và cũng không kiểm chứng được
   bằng máy tự động. Cỡ chữ ô nhập là thứ gây phóng-to-khi-chạm, nên nó được lặp lại
   theo bề rộng: dưới 560px thì luôn ≥16px, không phụ thuộc trình duyệt báo gì.
   CHỈ lặp lại cỡ chữ, KHÔNG lặp lại chiều cao 44px — cửa sổ desktop kéo hẹp vẫn là
   con trỏ chuột, không cần vùng chạm ngón tay. */
@media (max-width:560px){
  .input,input,select,textarea{font-size:16px}
}

/* ── 3. BÙ VÙNG AN TOÀN (tai thỏ, thanh gạt Home, góc bo màn hình) ──
   Chỉ có tác dụng khi <meta viewport> mang viewport-fit=cover — đã thêm ở
   templates/index.html cùng bản vá này. Thiếu nó env() luôn trả 0px.
   Trước hôm nay file này KHÔNG có lấy một env(safe-area-inset-*) nào, nên trên
   iPhone thanh gạt Home nằm đè lên hàng nút cuối trang. */
@supports (padding:max(0px)){
  .content{
    padding-left:max(24px,env(safe-area-inset-left));
    padding-right:max(24px,env(safe-area-inset-right));
    padding-bottom:max(40px,calc(env(safe-area-inset-bottom) + 24px));
  }
  .header{padding-right:max(18px,env(safe-area-inset-right))}
  .sidebar{padding-bottom:env(safe-area-inset-bottom)}
  .bulk-bar{bottom:max(18px,calc(env(safe-area-inset-bottom) + 10px))}
  .toasts{bottom:max(20px,calc(env(safe-area-inset-bottom) + 12px))}
  .peek{padding-bottom:env(safe-area-inset-bottom)}
}

/* ── 4. BỐ CỤC MÀN HẸP (≤900px — cùng mốc với ngăn kéo sidebar đã có) ── */
@media (max-width:900px){
  /* Header DÍNH NÓC. Đây là thanh mang nút mở menu và đường dẫn — cuộn xuống giữa
     một danh sách 200 dòng mà muốn đổi trang thì phải cuộn ngược lên tận đầu.
     Trên màn hình cao 700px đó là 8-10 lần vuốt cho một thao tác. */
  .header{
    position:sticky;top:0;z-index:70;
    padding-top:max(8px,env(safe-area-inset-top));
    /* Nền ĐỤC hoàn toàn: header trong suốt một phần thì nội dung cuộn qua phía sau
       đọc lem vào chữ đường dẫn. */
    background:var(--panel);
    box-shadow:0 1px 0 var(--border);
  }
  .content{padding:14px}
  /* Khi banner "chỉ đọc" đang hiện, NÓ mới là mép trên cùng của .main (đứng trước
     .header trong DOM — xem renderShell()), nên phần chừa notch (safe-area-inset-top)
     phải chuyển sang đây; .header giữ nguyên phần chừa của nó cho lúc banner vắng mặt. */
  .access-banner{padding-top:max(9px,env(safe-area-inset-top))}

  /* Ngăn kéo: rộng theo màn nhưng CHỪA MÉP PHẢI. Chừa mép là chỗ để vuốt-đóng và
     là tín hiệu thị giác "phía sau vẫn còn trang" — ngăn kéo tràn 100% đọc ra như
     đã chuyển sang một trang khác, người dùng bấm Back thay vì đóng nó. */
  .sidebar{width:min(84vw,320px);flex-basis:min(84vw,320px);
    padding-top:env(safe-area-inset-top);
    padding-left:env(safe-area-inset-left)}
  .app.nav-open .backdrop{-webkit-tap-highlight-color:transparent}

  /* BẢNG: cuộn ngang TRONG khung của nó, không đẩy cả trang trôi ngang.
     Trang cuộn ngang trên điện thoại là lỗi bố cục nặng nhất — mọi thứ khác lệch
     theo và người dùng không tìm lại được mép trái. */
  .tbl{display:block;overflow-x:auto;-webkit-overflow-scrolling:touch;
    white-space:nowrap;border-radius:8px}

  /* Modal thành SHEET dán đáy — ngón cái với tới được, và không bị bàn phím ảo
     đẩy phần thân ra khỏi màn hình như modal căn giữa. */
  .overlay{padding:0;align-items:flex-end}
  .modal{max-width:none;border-radius:14px 14px 0 0;
    max-height:92dvh;display:flex;flex-direction:column}
  .modal-b{max-height:none;flex:1;min-height:0;overflow-y:auto}
  .modal-f{padding-bottom:max(13px,calc(env(safe-area-inset-bottom) + 10px));
    position:sticky;bottom:0;background:var(--panel)}
  .modal-f .btn{flex:1}

  /* Slide-over chi tiết việc: full màn, không còn là "tấm bên phải". */
  .peek{width:100vw;max-width:100vw}

  /* Toast tràn ngang thay vì nép góc phải: ở góc phải trên màn 360px nó che mất
     nút hành động ngay dưới nó. */
  .toasts{left:12px;right:12px;align-items:stretch}

  /* Thanh chọn hàng loạt không được rộng hơn màn. */
  .bulk-bar{left:12px;right:12px;transform:none;max-width:none;justify-content:center}
}

/* ── 5. MÀN RẤT HẸP (≤560px) ── */
@media (max-width:560px){
  /* ── HEADER HAI TẦNG ──
     Tầng 1: nút menu + đường dẫn. Tầng 2: cụm nút hành động, cuộn ngang.
     PHẢI đặt order cho CẢ BA phần tử. Đặt order cho hai phần tử và bỏ phần thứ ba là
     lỗi vừa mắc ở lượt sửa trước: .header-actions giữ order mặc định 0 nên nhảy lên
     TRÊN cả nút menu — ảnh chụp máy thật cho thấy ô "Tìm nhanh" và dải tab nằm ở đỉnh
     trang, nút menu bị đẩy xuống dưới, và cụm rộng 521px trong header 402px nên tràn
     hẳn ra ngoài mép phải. */
  .header{align-items:flex-start;padding-left:12px;padding-right:12px}
  .header .hamburger{order:1;flex:0 0 auto}
  .crumbs{order:2;flex:1 1 auto;min-width:0}
  .header-actions{
    order:3;flex:1 1 100%;width:100%;margin-left:0;justify-content:flex-start;
    /* Cuộn ngang trong khung riêng: cụm nút của Bảng công việc (tìm nhanh + 5 tab
       view + xuất/nhập + thêm việc) không thể nào vừa 360px, và ép nó xuống dòng thì
       header cao gần nửa màn hình. */
    flex-wrap:nowrap;overflow-x:auto;overflow-y:hidden;
    -webkit-overflow-scrolling:touch;scrollbar-width:none;
    padding-bottom:2px;
  }
  .header-actions::-webkit-scrollbar{display:none}
  .header-actions>*{flex:0 0 auto}
  .content{padding:12px}

  /* ── DÒNG VIỆC THÀNH THẺ HAI TẦNG ──
     Đo trên máy thật ở khổ 402px: .r-title chỉ còn 51px, tên việc hiện ra "Cập n…",
     "F…", "S…". Danh sách công việc mà không đọc được tên việc thì không dùng được.
     Nguyên nhân: hàng giữ nguyên bố cục desktop — ô chọn, mức ưu tiên, tên, ngày, rồi
     BA ô .cell rộng 96px mỗi ô — tổng phần cố định đã hơn 300px trong 402px.
     Cách chữa: cho hàng xuống dòng, tên việc giữ chỗ tối thiểu 180px nên các ô meta
     tự rớt xuống tầng hai thay vì bóp tên. */
  .row{flex-wrap:wrap;row-gap:6px;padding:10px 12px;align-items:center}
  .row .r-title{flex:1 1 auto;min-width:0}
  /* Ngày hạn xuống TẦNG HAI cùng cụm NV/AI/QL, không giữ ở tầng một.
     Giữ ở tầng một kèm margin-left:auto thì hàng nào tên dài hoặc có chip tiến độ
     "2/4" sẽ đẩy ngày rớt xuống MỘT DÒNG RIÊNG — hàng đó cao ba tầng trong khi hàng
     bên cạnh hai tầng. Ngày là dữ liệu meta, thuộc về tầng meta. */
  .row .due{order:3;margin-left:0}
  /* NGẮT DÒNG CỐ ĐỊNH giữa phần "việc gì" và phần "ai đã tick".
     Để flex tự chọn chỗ xuống dòng thì mỗi hàng gãy một kiểu — hàng có chip tiến độ
     "2/4" đẩy được ô NV lên tầng một, hàng không có thì không; đọc dọc xuống thấy nhãn
     NV/AI/QL nhảy zig-zag giữa hai tầng. Một phần tử rộng 100% cao 0 chèn giữa hai
     nhóm order buộc mọi hàng gãy ở CÙNG một chỗ. */
  .row::after{content:"";flex:0 0 100%;height:0;order:2}
  .row .cells,.row .cell{order:3}
  .row .cell{width:auto;min-width:0;justify-content:flex-start;gap:5px}
  /* Nhãn cột đi THEO Ô khi ô rớt xuống tầng hai. Hàng tiêu đề .list-head (NV | AI | QL)
     bị ẩn ở khổ này, nên nếu không có nhãn thì tầng hai chỉ là hai ô vuông trống và một
     chữ "Chưa chấm" — không phân biệt được ô "NV đã làm" với ô "QL duyệt", mà bấm nhầm
     ô QL là duyệt khống. Nội dung lấy từ data-label do app.js gắn vào từng ô. */
  .row .cell[data-label]::before{
    content:attr(data-label);
    font-size:10px;font-weight:700;letter-spacing:.4px;color:var(--text-3);
    text-transform:uppercase;flex:0 0 auto;
  }
  /* Chừa chỗ cho nút nổi "Trợ lý AI" ở góc dưới phải: không chừa thì nó đè lên đúng
     hàng cuối của danh sách và hàng đó không bấm được. */
  .content{padding-bottom:max(88px,calc(env(safe-area-inset-bottom) + 80px))}
  /* Lưới hai cột đứng chồng lên nhau. */
  .set-grid,.row2,.two-col,.cmd-grid{grid-template-columns:1fr}
  /* Cụm tab cuộn ngang thay vì xuống dòng thành ba tầng chiếm nửa màn hình. */
  .seg,.setx-tabbar{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;
    scrollbar-width:none}
  .seg::-webkit-scrollbar,.setx-tabbar::-webkit-scrollbar{display:none}
  .seg>button,.setx-tabbar>button{flex:0 0 auto}

  /* ── HÀNG CÔNG CỤ Ô SOẠN BỘ NÃO AI ──
     Đo ở khổ 390px: .brain-box-bottom có scrollWidth 369 trong clientWidth 331 nhưng
     overflow-x:visible, nên các con TRÀN ra ngoài mà không cuộn được. Con cuối cùng là
     .brain-send-btn — mép phải 394 trên viewport 390: NÚT GỬI bị cắt và không bấm được.
     Ô soạn là chức năng chính của trang này; không gửi được thì trang vô dụng trên
     điện thoại. Cho hàng xuống dòng và đẩy nút gửi về cuối, luôn nằm trong màn. */
  .brain-box-bottom{flex-wrap:wrap;row-gap:8px}
  .brain-box-bottom .brain-send-btn{margin-left:auto;order:9}
}

/* ── 6. IN ẤN — ngăn kéo và thanh nổi không được lên giấy ── */
@media print{
  .sidebar,.header,.bulk-bar,.toasts,.backdrop{display:none!important}
  .app{display:block;height:auto}
  .content{overflow:visible;padding:0}
}

/* ═══════════════════════════════════════════════════════════════════════════
   BỐN BỀ MẶT MỚI CỦA BỘ NÃO AI — N8.3 lịch · N8.5 công cụ MCP · N7.3 tìm phiên
   · N8.6 quick action.  Mã dựng chúng: `static/app.js`, mốc "BỐN BỀ MẶT CÒN
   THIẾU".  Toàn bộ tên lớp ở khối này là MỚI — không lớp nào đè lên lớp đang
   có, nên đặt ở cuối tệp không tạo ra một lượt vá-nối-đuôi thứ tư như khối
   `.seg.brain-seg` từng dính.
   ═══════════════════════════════════════════════════════════════════════════ */

/* ── Lỗi API hiện RA MẶT, kèm mã lỗi. Dùng chung cho cả bốn bề mặt. ── */
.brain-surface-err{
  padding:12px 14px;border:1px solid var(--ach-bad);border-radius:var(--radius);
  background:#fef2f2;font-size:13px;line-height:1.5;
}
[data-theme="dark"] .brain-surface-err{background:var(--danger-wash)}
.brain-surface-err .bse-t{font-weight:700;margin-bottom:4px;color:var(--ach-bad)}
.brain-surface-err .hint{margin-top:4px}

/* ── Đầu mục trong tabpanel ── */
.brain-sec-h{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:2px}
.brain-sec-h h2{margin:0;font-size:16px}
.brain-sub-h{
  font-size:12px;font-weight:700;letter-spacing:.4px;text-transform:uppercase;
  color:var(--text-3);margin:18px 0 8px;
}

/* ── N8.3 · danh sách lịch · và dùng lại cho danh sách server/công cụ MCP ── */
.cron-list{padding:0;overflow:hidden}
.cron-row{padding:11px 14px;border-bottom:1px solid var(--border)}
.cron-row:last-child{border-bottom:none}
.cron-row .cr-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.cron-row .cr-name{font-weight:600;font-size:14px;word-break:break-word}
.cron-row .cr-sub{font-size:12px;color:var(--text-2);margin-top:3px;line-height:1.5}
/* Lỗi lượt gần nhất KHÔNG được thu nhỏ thành một chấm: một lịch chết ba tuần mà
   không ai thấy là đúng thứ bốn ô này sinh ra để chấm dứt. */
.cron-row .cr-err{
  font-size:12px;color:var(--ach-bad);margin-top:5px;
  background:var(--hover);border:1px solid var(--ach-bad);
  padding:5px 8px;border-radius:var(--radius-sm);word-break:break-word;
}
.cron-row .cr-acts{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:8px}
.cron-preview{
  flex:1;min-width:0;background:var(--hover);border-radius:var(--radius);
  padding:7px 10px;line-height:1.6;
}
.cron-preview.is-err{color:var(--ach-bad);background:transparent;border:1px solid var(--ach-bad)}
.cron-run{padding:9px 0;border-bottom:1px solid var(--border)}
.cron-run:last-child{border-bottom:none}
.cron-run .cr-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.cron-run-out{
  font-family:var(--mono);font-size:11.5px;white-space:pre-wrap;word-break:break-word;
  background:var(--hover);border-radius:var(--radius);padding:7px 9px;margin-top:6px;
  max-height:180px;overflow:auto;
}

/* ── N8.5 · băng-rôn "công cụ chưa gán rủi ro" ──
   `achau/views/brain_mcp.py:340` viết: "Con số này là thứ màn hình quản trị phải
   hiện TO". Nên nó to thật — 30px, không phải một dòng chữ nữa lẫn vào phần còn lại. */
.mcp-banner{
  display:flex;align-items:center;gap:14px;flex-wrap:wrap;
  padding:12px 16px;margin:12px 0;border-radius:var(--radius);
  border:1px solid var(--ach-warn);background:var(--hover);
}
.mcp-banner.is-ok{border-color:var(--border);color:var(--text-2);font-size:13px}
.mcp-banner .mb-n{font-size:30px;font-weight:800;line-height:1;color:var(--ach-warn)}
.mcp-banner .mb-t{font-weight:700;font-size:14px}
.mcp-filter{display:flex;gap:6px;margin-bottom:8px;flex-wrap:wrap}
.mcp-risk-sel{height:30px;width:auto;min-width:150px;font-size:12px;padding:0 6px}
/* Ô tích chọn công cụ cho một nhóm (toolset). Danh mục có thể tới 200 dòng —
   cuộn trong khung riêng, không kéo dài modal thành một trang không có đáy. */
.mcp-toolpick{max-height:220px;overflow:auto;border:1px solid var(--border);
  border-radius:var(--radius);padding:6px}
.mcp-toolpick-row{display:flex;align-items:center;gap:8px;padding:4px 6px;
  border-radius:4px;cursor:pointer;font-size:12.5px}
.mcp-toolpick-row:hover{background:var(--hover)}
.mcp-toolpick-row code{flex:1;min-width:0;word-break:break-all}

/* ── N7.3 · ô tìm trong lịch sử phiên (nằm trên cột phiên chat) ── */
.brain-search{margin-bottom:8px}
/* Cột phiên rộng 218px vừa cho một dòng tiêu đề, không vừa cho trích đoạn có
   tô sáng. JS gắn .is-searching lên cột trong lúc đang xem kết quả — nới ra
   tại chỗ, vì cột có overflow-y:auto nên mọi thứ thò ra ngoài đều bị CẮT. */
.brain-sess-col.is-searching{flex:0 0 340px;max-width:340px;max-height:78vh}
.brain-search .brain-search-i{height:30px;font-size:12.5px;margin-bottom:4px}
.brain-search .brain-search-role{height:26px;font-size:11.5px;padding:0 4px;width:100%}
.brain-search-out{
  margin-top:6px;border:1px solid var(--border);border-radius:var(--radius);
  background:var(--panel);max-height:52vh;overflow:auto;
}
.brain-search-out .bsr-head{
  display:flex;align-items:center;gap:6px;flex-wrap:wrap;
  padding:6px 8px;border-bottom:1px solid var(--border);font-size:11.5px;font-weight:600;
}
.brain-search-out .bsr-head .hint{flex:1;font-weight:400}
.brain-search-out .bsr-sum{
  padding:7px 9px;font-size:12px;line-height:1.55;color:var(--text-2);
  border-bottom:1px solid var(--border);background:var(--hover);
}
.brain-search-out .bsr-item{padding:7px 9px;border-bottom:1px solid var(--border)}
.brain-search-out .bsr-item:last-child{border-bottom:none}
.brain-search-out .bsr-item.is-open{cursor:pointer}
.brain-search-out .bsr-item.is-open:hover{background:var(--hover)}
.brain-search-out .bsr-meta{font-size:10.5px;color:var(--text-3);margin-bottom:3px}
.brain-search-out .bsr-snip{font-size:12px;line-height:1.5;word-break:break-word}
.brain-search-out .bsr-snip mark{background:var(--primary-weak);color:inherit;padding:0 1px;border-radius:2px}

/* ── N8.6 · menu "Giao AI ▸ …" trên bản ghi ── */
.qa-wrap{position:relative;display:inline-block}
.qa-menu{
  position:absolute;top:calc(100% + 4px);left:0;z-index:60;
  min-width:260px;max-width:340px;max-height:320px;overflow:auto;
  background:var(--panel);border:1px solid var(--border);
  border-radius:var(--radius);box-shadow:var(--shadow-md);padding:4px;
}
.qa-menu .qa-item{
  display:flex;align-items:center;gap:8px;padding:7px 9px;
  border-radius:4px;cursor:pointer;font-size:13px;
}
.qa-menu .qa-item:hover{background:var(--hover)}
.qa-menu .qa-item .qa-lab{flex:1;min-width:0}
.qa-menu .hint{padding:8px 9px}
.qa-conf-h{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:6px}
.qa-act{display:flex;align-items:center;gap:8px;padding:3px 0;font-size:13px}
.qa-acts{display:flex;gap:8px;flex-wrap:wrap;margin-top:12px}

@media (max-width:760px){
  /* Menu quick action neo trái sẽ tràn khỏi mép phải trên máy hẹp — đúng lỗi mà
     .brain-box-bottom đã dính ở khổ 390px. Cho nó bám mép phải và co lại. */
  .qa-menu{left:auto;right:0;min-width:0;width:min(300px,86vw)}
  .mcp-banner .mb-n{font-size:24px}
  .cron-row .cr-acts{gap:5px}
}

/* ── Bảng trong câu trả lời AI (simpleMarkdown → mdTables) ─────────────────────
   Model tự chọn viết bảng khi liệt kê nhiều cột. Dùng chung cho Bộ não AI
   (.chat-content) và Trợ lý AI (.ai-chat-md, khung rộng 360px).
   .md-tw là hộp cuộn NGANG riêng: không có nó thì bảng 4 cột kéo giãn cả bong
   bóng chat và trang bị cuộn ngang theo. */
.md-tw{overflow-x:auto;-webkit-overflow-scrolling:touch;margin:6px 0;max-width:100%}
.md-table{border-collapse:collapse;font-size:12px;line-height:1.4;min-width:100%}
.md-table th,.md-table td{border:1px solid var(--border);padding:4px 8px;text-align:left;vertical-align:top;white-space:nowrap}
.md-table th{background:var(--bg-subtle);font-weight:600}
.md-table tbody tr:nth-child(even) td{background:color-mix(in srgb,var(--border) 18%,transparent)}
/* Ô dài (mô tả, danh sách trường cần nhập) được xuống dòng thay vì kéo bảng dài mãi. */
.md-table td:last-child{white-space:normal;min-width:160px}
.ai-chat-md code{background:color-mix(in srgb,var(--border) 40%,transparent);padding:1px 4px;border-radius:4px;font-size:12px}
.ai-chat-md strong{font-weight:600}

/* ── Thẻ công cụ trong khung Trợ lý AI (rộng 360px) ────────────────────────────
   Bộ não AI có cả trang để trải một hàng: icon · tên · badge · badge · nút. Trong
   widget thì flex-wrap bẻ mỗi thứ xuống một dòng ⇒ một công cụ chiếm 5 dòng, đọc
   như giao diện hỏng (ảnh QA 06/08). Thu nhỏ và cho tên tự xuống dòng thay vì đẩy
   badge đi. */
#ai-chat-root .chat-tools{padding:7px 9px;margin:0}
#ai-chat-root .chat-tools .ct-head{font-size:11.5px;margin-bottom:4px}
#ai-chat-root .chat-tools .ct-row{gap:5px;row-gap:3px;align-items:center}
/* Tên tool co được và tự xuống dòng, thay vì đẩy từng badge xuống một dòng riêng. */
#ai-chat-root .chat-tools .ct-name{font-size:11.5px;flex:1 1 auto;min-width:0}
#ai-chat-root .chat-tools .ct-ic{font-size:11px}
#ai-chat-root .chat-tools .badge{font-size:10px;padding:0 5px;line-height:16px}
#ai-chat-root .chat-tools .ct-sum{font-size:11.5px;padding-left:18px}
#ai-chat-root .chat-tools .ct-open{font-size:11.5px}


/* ===== Bản sao ClickUp — thanh công cụ danh sách =====
   Đặt CUỐI tệp có chủ đích: khối “Filter Bar Improvements” ở giữa tệp khai lại
   .filter-lab/.filter-controls, nên các luật dưới đây phải đứng sau mới thắng. */
.filter-chips{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.filter-toggle{display:inline-flex;align-items:center;gap:6px;height:30px;padding:0 9px;border-radius:var(--radius-sm);
  border:none;background:none;cursor:pointer;color:var(--text-2);font:500 13.5px/1 var(--font)}
.filter-toggle:hover{background:var(--hover);color:var(--text)}
.filter-toggle.on{background:var(--primary-weak);color:var(--primary-text);font-weight:600}
.filter-toggle svg{width:14px;height:14px}
.filter-count{margin-left:auto;font-size:12px;color:var(--text-3)}
/* Khung lọc bỏ nền xám + viền: ClickUp để thanh công cụ trôi trên nền trắng, hộp
   xám chỉ tổ ra một ô trống lớn khi các ô lọc đang thu lại. */
.filter-bar{background:none;border:none;padding:0;gap:6px;margin-bottom:8px}
.filter-controls{gap:6px}
