/***********************************************************************************
 *  Hệ thống Báo cáo Real-time & Chăm sóc khách hàng
 *  Bảng màu: xanh ngọc (teal) làm màu chủ đạo — mát mắt, thân thiện, ít gây mỏi
 *  khi nhìn bảng số liệu cả ngày. Giữ nguyên đỏ cảnh báo / xanh lá hoàn thành
 *  của file Word để nhân viên không phải học lại quy ước màu.
 ***********************************************************************************/

/* ================================ 1. Token ================================ */
:root {
  /* ═══════════ MÀU CHỦ ĐẠO: VÀNG NGHỆ ĐẤT ═══════════
     Màu trong ảnh là #C8932F — đẹp trên nền gỗ, nhưng đặt làm màu CHỮ trên nền
     trắng thì tương phản chỉ 2,6:1, dưới chuẩn đọc được (4,5:1). Nên nó làm
     --ngoc-nhat (mảng lớn, viền, nền nút), còn --ngoc là bản đậm hơn để chữ và
     đường dẫn còn đọc nổi.

     Admin đổi được ba biến này ngay trong ⚙️ Cài đặt bằng một mã màu —
     apMauChuDao() bên ui.js ghi đè thẳng lên :root, và nó tự tính hai biến thể
     nhạt từ mã ấy. Giá trị viết ở đây là giá trị MẶC ĐỊNH, dùng khi admin chưa
     đặt gì. */
  --ngoc:        #9A6C10;   /* nghệ đậm — tương phản 4,7:1 trên nền trắng */
  --ngoc-nhat:   #C8932F;   /* đúng màu bột nghệ trong ảnh */
  --ngoc-mo:     #FBF2DC;
  --do:          #C0392B;
  --do-mo:       #FDECEA;
  --xanhla:      #4A7C10;   /* ô-liu — trạng thái hoàn thành, tách khỏi màu chủ đạo */
  --xanhla-mo:   #EFF7E1;
  /* Cam CẢNH BÁO đẩy sang cam cháy. Cam cũ (#DE8A2B) gần như trùng màu nghệ
     chủ đạo — để nguyên thì dải cảnh báo và nút chính cùng một tông vàng, mắt
     lướt qua không phân biệt được đâu là việc phải đọc. */
  --cam:         #D2601A;
  --cam-mo:      #FDEDE2;
  --tim:         #6B4FA8;
  --tim-mo:      #F0EBFA;
  --xanhduong:   #1478A8;
  --xanhduong-mo:#E2F2F9;
  --ngocbien:    #0F7B76;   /* xanh ngọc — chặng "Đã giao", giữa chờ giao và đã xong */
  --ngocbien-mo: #E0F2F1;

  --nen:         #FBF7EF;   /* nền trang: trắng ngả kem rất nhạt */
  --nen-the:     #FFFFFF;
  --nen-nhe:     #FAF4E8;
  --vien:        #ECE0C8;
  --vien-dam:    #D8C494;
  --chu:         #241B0C;
  --chu-nhat:    #6B5B3E;
  --chu-mo:      #9C8B6C;

  /* Bóng đổ cũng ngả nâu ấm. Bóng xám xanh trên nền kem trông như vết bẩn. */
  --bong:        0 1px 2px rgba(90,62,10,.06), 0 4px 16px rgba(90,62,10,.09);
  --bong-cao:    0 8px 30px rgba(90,62,10,.18);
  --bo:          12px;
  --bo-nho:      8px;
  --rong:        1180px;
  --font: 'Segoe UI', system-ui, -apple-system, 'Helvetica Neue', Arial, sans-serif;
}

:root[data-theme="dark"] {
  /* Nền tối thì ngược lại: màu chủ đạo phải SÁNG hơn hẳn mới đọc nổi, nên ở
     đây là bản nghệ nhạt chứ không phải bản đậm của nền sáng. */
  --ngoc:        #E3B45C;
  --ngoc-nhat:   #F0CB8A;
  --ngoc-mo:     #33270E;
  --do:          #FF7B6B;
  --do-mo:       #3A1F1C;
  --xanhla:      #A9D45F;
  --xanhla-mo:   #23300F;
  --cam:         #F58B4C;
  --cam-mo:      #3A2314;
  --tim:         #B9A0EA;
  --tim-mo:      #272040;
  --xanhduong:   #6EBEE4;
  --xanhduong-mo:#14262F;
  --ngocbien:    #5FCFC6;
  --ngocbien-mo: #102B29;

  --nen:         #16130D;
  --nen-the:     #1F1B13;
  --nen-nhe:     #272118;
  --vien:        #3A3123;
  --vien-dam:    #554935;
  --chu:         #F1EBE0;
  --chu-nhat:    #BAAF9C;
  --chu-mo:      #8E8371;
  --bong:        0 1px 2px rgba(0,0,0,.3), 0 4px 14px rgba(0,0,0,.28);
  --bong-cao:    0 8px 30px rgba(0,0,0,.5);
}

/* ================================ 2. Nền chung ================================ */
* { box-sizing: border-box; }

html { scroll-behavior: smooth; scroll-padding-top: calc(var(--cao-dieu-huong, 62px) + 16px); }

body {
  margin: 0;
  font-family: var(--font);
  font-size: 15px;
  line-height: 1.6;
  color: var(--chu);
  background: var(--nen);
  -webkit-font-smoothing: antialiased;
}

h1, h2, h3, h4 { margin: 0 0 .5em; line-height: 1.28; font-weight: 700; }
h2 { font-size: 27px; letter-spacing: -.3px; }
h3 { font-size: 19px; }
p  { margin: 0 0 1em; }
a  { color: var(--ngoc); }

.boc { max-width: var(--rong); margin: 0 auto; padding: 0 20px; }
.an  { display: none !important; }
.chu-do    { color: var(--do); }
.chu-xanhla{ color: var(--xanhla); }
.chu-cam   { color: var(--cam); }
.chu-nhat  { color: var(--chu-nhat); }
.chu-mo    { color: var(--chu-mo); font-size: 13px; }
.giua { text-align: center; }
.nho  { font-size: 13px; }

/* ================================ 3. Nút ================================ */
.nut {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 10px 18px;
  font: inherit; font-weight: 600; font-size: 14px;
  color: #fff; background: var(--ngoc);
  border: 1px solid transparent; border-radius: var(--bo-nho);
  cursor: pointer; text-decoration: none;
  transition: transform .12s, filter .12s, background .12s;
  white-space: nowrap;
}
.nut:hover  { filter: brightness(1.12); }
.nut:active { transform: translateY(1px); }
.nut:disabled { opacity: .45; cursor: not-allowed; }
.nut--vien   { background: transparent; color: var(--ngoc); border-color: var(--vien-dam); }
.nut--vien:hover { background: var(--ngoc-mo); }
.nut--do     { background: var(--do); }
.nut--xanhla { background: var(--xanhla); }
.nut--cam    { background: var(--cam); color: #fff; }
.nut--nho    { padding: 6px 12px; font-size: 13px; }
.nut--khoi   { width: 100%; justify-content: center; }
.nut--phang  { background: transparent; color: var(--chu-nhat); border-color: var(--vien); }
.nut--phang:hover { background: var(--nen-nhe); color: var(--chu); }

:root[data-theme="dark"] .nut { color: #10141c; }
:root[data-theme="dark"] .nut--vien,
:root[data-theme="dark"] .nut--phang { color: var(--chu); background: transparent; }

/* ================================ 4. Thanh điều hướng ================================ */
.dieuhuong {
  position: sticky; top: 0; z-index: 60;
  background: var(--nen-the);
  border-bottom: 1px solid var(--vien);
  box-shadow: 0 1px 0 rgba(20,30,60,.03);
}
.dieuhuong__trong {
  max-width: var(--rong); margin: 0 auto; padding: 0 20px;
  height: 62px; display: flex; align-items: center; gap: 14px;
}
.logo { display: flex; align-items: center; gap: 10px; text-decoration: none; color: inherit; flex-shrink: 0; }
.logo__hinh {
  width: 36px; height: 36px; border-radius: 9px;
  background: linear-gradient(135deg, var(--ngoc), var(--ngoc-nhat));
  color: #fff; display: grid; place-items: center; font-size: 18px;
}
.logo__chu   { font-weight: 800; font-size: 15px; letter-spacing: -.2px; }
.logo__phu   { font-size: 11px; color: var(--chu-mo); margin-top: -3px; }

.menu { display: flex; gap: 2px; margin-left: 10px; flex: 1; overflow-x: auto; scrollbar-width: none; }
.menu::-webkit-scrollbar { display: none; }
.menu a {
  padding: 7px 11px; border-radius: 7px; font-size: 13.5px; font-weight: 600;
  color: var(--chu-nhat); text-decoration: none; white-space: nowrap;
}
.menu a:hover     { background: var(--nen-nhe); color: var(--chu); }
.menu a.dang-xem  { background: var(--ngoc-mo); color: var(--ngoc); }

.dh-phai { display: flex; align-items: center; gap: 8px; flex-shrink: 0; }
.dongho  { font-variant-numeric: tabular-nums; font-size: 13px; color: var(--chu-nhat); font-weight: 600; }

.nut-tron {
  width: 38px; height: 38px; border-radius: 50%;
  border: 1px solid var(--vien); background: var(--nen-the);
  cursor: pointer; font-size: 17px; position: relative;
  display: grid; place-items: center; color: var(--chu);
}
.nut-tron:hover { background: var(--nen-nhe); }

.badge {
  position: absolute; top: -4px; right: -4px;
  min-width: 19px; height: 19px; padding: 0 5px;
  background: var(--cam); color: #fff;
  border-radius: 10px; font-size: 11px; font-weight: 700;
  display: grid; place-items: center; border: 2px solid var(--nen-the);
}
.badge--do { background: var(--do); animation: dap 1.6s infinite; }
@keyframes dap { 0%,100% { transform: scale(1); } 50% { transform: scale(1.16); } }

/* Panel chuông */
.panel {
  position: absolute; top: 52px; right: 0; width: 380px; max-width: calc(100vw - 24px);
  background: var(--nen-the); border: 1px solid var(--vien);
  border-radius: var(--bo); box-shadow: var(--bong-cao);
  display: none; max-height: 72vh; overflow: auto; z-index: 70;
}
.panel.mo { display: block; }
.panel__dau { padding: 12px 15px; border-bottom: 1px solid var(--vien); font-weight: 700; font-size: 14px; }
.panel__rong { padding: 30px 18px; text-align: center; color: var(--chu-nhat); }
.panel__ghichu { padding: 9px 15px; font-size: 12.5px; color: var(--chu-nhat); background: var(--nen-nhe); }
.panel__ds { list-style: none; margin: 0; padding: 0; }
.panel__muc { padding: 11px 15px; border-bottom: 1px solid var(--vien); cursor: pointer; border-left: 4px solid transparent; }
.panel__muc:hover { background: var(--nen-nhe); }
.panel__muc-td { font-weight: 600; font-size: 13.5px; }
.panel__muc-mo { font-size: 12.5px; color: var(--chu-nhat); margin-top: 2px; }
.panel__muc--do        { border-left-color: var(--do); }
.panel__muc--vang      { border-left-color: var(--cam); }
.panel__muc--xanhduong { border-left-color: var(--xanhduong); }
.panel__muc--tim       { border-left-color: var(--tim); background: var(--tim-mo); }
.panel__muc--tim .panel__muc-td { font-variant-numeric: tabular-nums; }
.panel__chan { padding: 11px 15px; }

.boc-tron { position: relative; }

/* ================================ 5. Hero ================================ */
.hero {
  /* Ba mảng lớn mang màu thương hiệu đi theo BIẾN, không viết cứng: ô nhập mã
     màu trong Cài đặt ghi đè mấy biến ấy, nên viết cứng là admin đổi màu mà
     hero, màn đăng nhập và chân trang vẫn giữ màu cũ — đúng ba chỗ đập vào mắt
     trước nhất. color-mix pha thẳng trong CSS, không phải tính lại bên JS. */
  background: linear-gradient(150deg, var(--ngoc-nhat) 0%, var(--ngoc) 52%, color-mix(in srgb, var(--ngoc) 78%, #000) 100%);
  color: #fff; padding: 58px 0 76px; position: relative; overflow: hidden;
}
.hero::after {
  content: ''; position: absolute; inset: auto -10% -60% 55%;
  height: 300px; background: radial-gradient(circle, rgba(255,255,255,.09), transparent 70%);
}
.hero__nhan {
  display: inline-flex; align-items: center; gap: 7px;
  padding: 5px 13px; border-radius: 20px; font-size: 12.5px; font-weight: 600;
  background: rgba(255,255,255,.14); border: 1px solid rgba(255,255,255,.2); margin-bottom: 16px;
}
.hero h1 { font-size: 40px; max-width: 780px; letter-spacing: -.7px; }
.hero__mo { font-size: 16.5px; opacity: .88; max-width: 700px; margin-bottom: 26px; }
.hero__nut { display: flex; gap: 11px; flex-wrap: wrap; margin-bottom: 40px; }
.hero .nut--vien { color: #fff; border-color: rgba(255,255,255,.4); }
.hero .nut--vien:hover { background: rgba(255,255,255,.13); }
.hero .nut { background: #fff; color: var(--ngoc); }

.kpi { display: grid; grid-template-columns: repeat(4, 1fr); gap: 13px; position: relative; }
.kpi__o {
  background: rgba(255,255,255,.1); border: 1px solid rgba(255,255,255,.17);
  border-radius: var(--bo); padding: 15px 17px; backdrop-filter: blur(4px);
}
.kpi__so  { font-size: 30px; font-weight: 800; line-height: 1.1; font-variant-numeric: tabular-nums; }
.kpi__ten { font-size: 12.5px; opacity: .82; margin-top: 3px; }
.kpi__o--canhbao .kpi__so { color: #FFC98A; }
.kpi__o--nguy   .kpi__so { color: #FF9E9E; }

/* ================================ 6. Section ================================ */
.section { padding: 58px 0; }
.section--nhe { background: var(--nen-the); }
.section__dau { max-width: 700px; margin-bottom: 32px; }
.section__so {
  display: inline-block; font-size: 12px; font-weight: 800; letter-spacing: 1.4px;
  color: var(--ngoc); background: var(--ngoc-mo);
  padding: 4px 11px; border-radius: 20px; margin-bottom: 11px; text-transform: uppercase;
}
.section__mo { color: var(--chu-nhat); font-size: 15.5px; }

.the {
  background: var(--nen-the); border: 1px solid var(--vien);
  border-radius: var(--bo); padding: 20px; box-shadow: var(--bong);
}
.luoi { display: grid; gap: 16px; }
.luoi > *, .form-luoi > *, .lv-noi > * { min-width: 0; }
.luoi--2 { grid-template-columns: repeat(2, 1fr); }
.luoi--3 { grid-template-columns: repeat(3, 1fr); }
.luoi--4 { grid-template-columns: repeat(4, 1fr); }

/* Lịch hẹn: khung lịch tháng bên phải co lại còn một phần ba bề ngang.
   Danh sách việc phải làm mới là thứ người ta đọc; lịch chỉ để liếc xem
   ngày nào có hẹn, không cần to bằng nửa màn hình. */
.luoi--lichhen { grid-template-columns: 2fr 1fr; }

/* ================================ 7. Sơ đồ giai đoạn ================================ */
.giaidoan { display: grid; grid-template-columns: repeat(5, 1fr); gap: 11px; }
.gd {
  background: var(--nen-the); border: 1px solid var(--vien); border-radius: var(--bo);
  padding: 18px 15px; cursor: pointer; text-align: left; font: inherit; color: inherit;
  position: relative; transition: border-color .15s, transform .15s, box-shadow .15s;
}
.gd:hover { border-color: var(--ngoc); transform: translateY(-2px); box-shadow: var(--bong); }
.gd.mo    { border-color: var(--ngoc); box-shadow: 0 0 0 3px var(--ngoc-mo); }
.gd__so {
  width: 30px; height: 30px; border-radius: 50%; background: var(--ngoc); color: #fff;
  display: grid; place-items: center; font-weight: 800; font-size: 13px; margin-bottom: 11px;
}
.gd__icon { font-size: 21px; position: absolute; top: 15px; right: 15px; }
.gd__ten  { font-weight: 700; font-size: 14.5px; margin-bottom: 5px; }
.gd__tom  { font-size: 12.8px; color: var(--chu-nhat); line-height: 1.5; }

.gd-chitiet {
  margin-top: 18px; background: var(--nen-the); border: 1px solid var(--ngoc);
  border-radius: var(--bo); padding: 22px 24px; box-shadow: var(--bong);
}
.gd-chitiet h3 { color: var(--ngoc); }
.gd-chitiet ul { margin: 0; padding-left: 20px; }
.gd-chitiet li { margin-bottom: 8px; }

/* ================================ 8. Thẻ vai trò / trạng thái ================================ */
.vaitro { border-top: 4px solid var(--ngoc); }
.vaitro--xanhla { border-top-color: var(--xanhla); }
.vaitro--tim    { border-top-color: var(--tim); }
.vaitro__icon   { font-size: 30px; margin-bottom: 8px; }

.tt-the { border-left: 4px solid var(--vien-dam); }
.tt-the__ten { font-weight: 700; margin-bottom: 4px; font-size: 14.5px; }
.tt-the__y   { color: var(--chu-nhat); font-size: 13.5px; margin-bottom: 9px; }
.tt-the__tc  { font-size: 12.5px; background: var(--nen-nhe); padding: 8px 11px; border-radius: var(--bo-nho); }
.tt-the__dem { float: right; font-size: 22px; font-weight: 800; line-height: 1; }
.tt-the--xanhduong { border-left-color: var(--xanhduong); } .tt-the--xanhduong .tt-the__dem { color: var(--xanhduong); }
.tt-the--vang      { border-left-color: var(--cam); }        .tt-the--vang .tt-the__dem      { color: var(--cam); }
.tt-the--xanhla    { border-left-color: var(--xanhla); }     .tt-the--xanhla .tt-the__dem    { color: var(--xanhla); }
.tt-the--do        { border-left-color: var(--do); }         .tt-the--do .tt-the__dem        { color: var(--do); }
.tt-the--tim       { border-left-color: var(--tim); }        .tt-the--tim .tt-the__dem       { color: var(--tim); }
.tt-the--ngocbien  { border-left-color: var(--ngocbien); }    .tt-the--ngocbien .tt-the__dem  { color: var(--ngocbien); }

/* ================================ 9. Timeline ================================ */
.timeline { position: relative; padding-left: 34px; }
.timeline::before {
  content: ''; position: absolute; left: 12px; top: 8px; bottom: 8px;
  width: 2px; background: linear-gradient(var(--ngoc), var(--vien));
}
.tl { position: relative; padding-bottom: 22px; }
.tl::before {
  content: ''; position: absolute; left: -27px; top: 5px;
  width: 12px; height: 12px; border-radius: 50%;
  background: var(--ngoc); border: 3px solid var(--nen-the); box-shadow: 0 0 0 2px var(--ngoc);
}
.tl__ten { font-weight: 700; }
.tl__khi { color: var(--chu-nhat); font-size: 13.5px; }
.tl__tinh {
  display: inline-block; margin-top: 5px; font-size: 12.5px; font-weight: 700;
  color: var(--ngoc); background: var(--ngoc-mo); padding: 3px 10px; border-radius: 14px;
}

.hm-luoi { display: grid; grid-template-columns: repeat(6, 1fr); gap: 11px; }
.hm {
  background: var(--nen-the); border: 1px solid var(--vien); border-radius: var(--bo);
  padding: 15px 13px; text-align: center; cursor: pointer; font: inherit; color: inherit;
  transition: border-color .15s, transform .15s;
}
.hm:hover, .hm.mo { border-color: var(--xanhla); transform: translateY(-2px); }
.hm__icon { font-size: 25px; }
.hm__so   { font-size: 11px; font-weight: 800; color: var(--chu-mo); }
.hm__ten  { font-size: 13px; font-weight: 700; margin-top: 3px; }
.hm-chitiet {
  margin-top: 15px; padding: 17px 20px; background: var(--xanhla-mo);
  border-radius: var(--bo); border-left: 4px solid var(--xanhla);
}

/* ================================ 10. Bảng ================================ */
.bang-boc { overflow-x: auto; border: 1px solid var(--vien); border-radius: var(--bo); background: var(--nen-the); }
table.bang { width: 100%; border-collapse: collapse; font-size: 13.5px; min-width: 620px; }
table.bang th {
  background: var(--ngoc); color: #fff; text-align: left; font-weight: 600;
  padding: 11px 13px; position: sticky; top: 0; white-space: nowrap; font-size: 13px;
}
/* Ô cuối của thanh tiêu đề mang nút (➕ Thêm khách hàng): dạt phải, nút nền
   trắng để nổi trên nền nâu của thanh. */
table.bang th.th-them { text-align: right; padding-top: 6px; padding-bottom: 6px; }
.nut-tren-nau, :root[data-theme="dark"] .nut-tren-nau {
  background: #fff; color: var(--ngoc); border-color: #fff;
}
.nut-tren-nau:hover { background: var(--ngoc-mo); }
table.bang td { padding: 10px 13px; border-bottom: 1px solid var(--vien); vertical-align: top; }
table.bang tbody tr:hover { background: var(--nen-nhe); }
table.bang tbody tr:last-child td { border-bottom: none; }
table.bang td.so { text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; }
.bang--gon th, .bang--gon td { padding: 8px 11px; }
.bang__rong { padding: 34px; text-align: center; color: var(--chu-nhat); }

/* Ô đơn vị tính trong bảng dòng hàng: ô chọn xổ danh sách, bên dưới là ô gõ tay
   chỉ hiện khi chọn "Khác…" (class .an gỡ đi lúc đó). */
.bang select[data-dvt] { width: 100%; }
.dvt-go { width: 100%; margin-top: 5px; }

/* Ô danh mục sản phẩm — bắt buộc, nên có thêm trạng thái "chưa chọn" tô đỏ.
   Class .o-thieu do kiemDanhMucDong() gắn vào lúc bấm Lưu, và tự gỡ ra ngay khi
   người ta chọn xong: viền đỏ chỉ nên nằm đó chừng nào lỗi còn đó. */
.bang select[data-dm] { width: 100%; }
.o-thieu {
  border-color: var(--do) !important;
  background: var(--do-mo);
}

/* Bốn bảng dòng hàng sửa được — báo giá, đơn hàng, phiếu xuất kho, hóa đơn.

   Mặc định table-layout là 'auto', nên phần trăm bề ngang khai trong thẻ <th>
   chỉ là gợi ý: ô nhập số tự bung ra gần 200px theo bề rộng mặc định của thẻ
   input, và bóp nghẹt mấy cột chữ bên cạnh. Hồi năm cột thì còn chỗ để chịu;
   thêm cột Danh mục vào là ô chọn teo còn 86px, không đọc nổi tên mục nào.

   'fixed' làm mấy con phần trăm kia có hiệu lực thật. Nới min-width lên 760px
   để sáu cột đều đủ thở; bảng vốn đã tự cuộn ngang trong .bang-boc nên không
   tràn ra ngoài hộp, và bản điện thoại đã bỏ min-width ở cuối file này rồi. */
#bgBangDong table.bang,
#dBangDong table.bang,
#pxkBangDong table.bang,
#hdBangDong table.bang {
  table-layout: fixed;
  min-width: 760px;
}
#bgBangDong input, #dBangDong input, #pxkBangDong input, #hdBangDong input,
#bgBangDong select, #dBangDong select, #pxkBangDong select, #hdBangDong select {
  min-width: 0;   /* bề rộng mặc định của input không được phá bố cục fixed */
}
/* Ô tên hàng kèm ô tích 📦 "lấy từ hàng sẵn kho" — xem oTenHangDong() bên
   ui.js. Ô tích co lại, ô chữ ăn hết phần còn lại của cột. */
.o-ten-hang { display: flex; align-items: center; gap: 4px; }
.o-ten-hang input[list] { flex: 1; min-width: 0; }
.o-ten-hang__kho {
  margin: 0; display: flex; align-items: center; gap: 1px;
  font-size: 12px; cursor: pointer; white-space: nowrap;
}
.o-ten-hang__kho input { width: auto; min-width: 0; min-height: 0; margin: 0; }
/* Tên dài tự xuống dòng: lớp chữ .o-ten-hang__chu giữ chỗ và hiện tên, ô nhập
   thật phủ trong suốt lên trên, chỉ hiện ra lúc đang gõ (gợi ý datalist, máy
   quét vẫn đi qua ô nhập như cũ). */
.o-ten-hang__o { position: relative; flex: 1; min-width: 0; }
.o-ten-hang__chu {
  border: 1px solid #8f8f8f; border-radius: 2px; padding: 2px 4px;
  min-height: 1.75em; line-height: 1.35; white-space: normal; overflow-wrap: anywhere;
  background: Field; color: FieldText;
}
.o-ten-hang__chu.la-rong { color: var(--chu-nhat); }
.o-ten-hang__o input[list] {
  position: absolute; inset: 0; width: 100%; height: 100%; box-sizing: border-box; opacity: 0;
}
.o-ten-hang__o input[list]:focus { opacity: 1; }
/* Bảng hàng báo giá & đơn hàng rộng hơn: nút 🎁 🧩 ✕ nằm ngang một hàng */
#bgBangDong table.bang, #dBangDong table.bang { min-width: 1000px; }
#bgBangDong .kem__nut, #dBangDong .kem__nut { flex-direction: row; flex-wrap: nowrap; justify-content: flex-end; }
#bgBangDong .kem__nut .nut, #dBangDong .kem__nut .nut { padding: 6px 8px; }
#bgBangDong tr:not(.dong-kem) > td:last-child, #dBangDong tr:not(.dong-kem) > td:last-child { padding-left: 4px; padding-right: 6px; }

/* 🎁 Sản phẩm đi kèm — hàng con ngay dưới dòng hàng, xem hangKem() bên ui.js.
   Nút 🎁 và ✕ xếp dọc vì cột thao tác chỉ rộng ~7%. */
.kem__nut { display: flex; flex-direction: column; gap: 4px; align-items: center; }
tr.dong-kem > td { background: var(--nen-nhe); padding-top: 4px; }
.kem { display: flex; flex-direction: column; gap: 6px; padding-left: 24px; }
.kem__dau { font-size: 12.5px; font-weight: 700; }
.kem__mon { display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
/* Ô tên KHÔNG giãn hết hàng: bảng hàng rộng hơn hộp (min-width 760px, cuộn
   ngang), giãn ra là đẩy ô số lượng và nút ✕ ra ngoài chỗ nhìn thấy. */
.kem__mon input[data-kem-ten] { flex: 0 1 240px; min-width: 0; }
.kem__mon input[data-kem-sl] { width: 80px; }
.kem__in { margin: 0; display: flex; align-items: center; gap: 3px; font-size: 12px; white-space: nowrap; }
.kem__in input { width: auto; min-height: 0; margin: 0; }
.kem > .nut { align-self: flex-start; }

/* Bảng hàng của hộp 📝 Hợp đồng — năm cột, không có Danh mục. Hộp chỉ rộng
   ~614px nên min-width 620px gốc của table.bang làm nó cuộn ngang vì đúng
   6px; 540px vẫn đủ chỗ cho năm cột. */
#hdgHang table.bang { table-layout: fixed; min-width: 540px; }
#hdgHang input { min-width: 0; }

.nhan {
  display: inline-block; padding: 3px 9px; border-radius: 20px;
  font-size: 11.5px; font-weight: 700; white-space: nowrap;
}
.nhan--xanhduong { background: var(--xanhduong-mo); color: var(--xanhduong); }
.nhan--vang      { background: var(--cam-mo);       color: #9a5f11; }
.nhan--xanhla    { background: var(--xanhla-mo);    color: var(--xanhla); }
.nhan--do        { background: var(--do-mo);        color: var(--do); }
.nhan--tim       { background: var(--tim-mo);       color: var(--tim); }
.nhan--ngocbien  { background: var(--ngocbien-mo);  color: var(--ngocbien); }
.nhan--xam       { background: var(--nen-nhe);      color: var(--chu-nhat); }
/* ───────── Bảng Lịch sản xuất ─────────
   Một đơn một dòng, công đoạn là cột tích — đúng kiểu tờ lịch giấy của xưởng.
   Cột công đoạn phải HẸP và cố định bề ngang, nếu không bảy cột ấy giãn ra đẩy
   hết cột "Nội dung công việc" ra ngoài màn hình. */
/* ───── .hop-lon--tran-man ĐÃ GỠ ─────
   Nó từng là lối thoát riêng cho hai cái bảng xưởng: khung chung bó ở 1180px,
   nên hai bảng ấy tự kéo mình ra bằng width:100vw cộng một lề trái ÂM tính từ
   tâm khung.

   Nay cả khu làm việc đã rộng hết màn hình — xem luật body.chi-bang-lam-viec
   .boc ở mục 30 — nên cái lề âm ấy thành tai hoạ: nó tính theo giả định "cha
   rộng đúng 1180px và đứng giữa trang", giả định đó vừa hết đúng. Để lại là
   bảng bị đẩy hẳn ra ngoài mép trái màn hình.

   Một chỗ nới thay cho hai chỗ tự nới. Mọi bảng trong khu làm việc nay rộng
   bằng nhau, khỏi phải nhớ dán thêm class cho bảng mới. */

/* ───── Hai cột chữ CHIA NHAU phần thừa, không cột nào nuốt hết ─────
   Trước đây "Nội dung công việc" lấy width:100%, nên cột Ghi chú bị ép còn
   vài chục điểm ảnh: mỗi chữ rơi một dòng, một đơn cao vống lên đẩy đơn dưới
   ra khỏi màn hình. Nay chia theo tỷ lệ, và min-width giữ sàn cho cả hai.

   KHÔNG ép tỷ lệ cứng. Đã thử width:58%/22% và bỏ: bảng dàn trang tự động coi
   % là mong muốn rồi vẫn chia lại theo lượng chữ, nên con số ép vào chỉ làm
   khó đoán chứ không giữ được gì. Để trình duyệt tự giãn theo nội dung THẬT —
   đơn ghi chú dài thì cột ghi chú rộng ra, đơn không ghi gì thì chỗ ấy trả
   lại cho cột nội dung.

   Chỉ giữ SÀN min-width: không có nó thì cột trống bị bóp còn vài chục điểm
   ảnh và mỗi chữ rơi một dòng — đúng lỗi đã gặp. */
/* Sàn hạ từ 230 / 170 xuống 180 / 130 — tờ lịch phải vừa màn hình ~1100px
   mà không kéo ngang; chữ dài vẫn cắt ở hai dòng, đọc đủ bằng title. */
.bang-sx th.sx-viec,   .bang-sx td.sx-viec   { min-width: 180px; }
.bang-sx th.sx-ghichu, .bang-sx td.sx-ghichu { min-width: 130px; }

/* ───── CHẶN TRẦN SỐ DÒNG ─────
   Tờ lịch của xưởng phải liếc một cái thấy được nhiều đơn. Một đơn có yêu cầu
   dài ba dòng là đẩy mấy đơn sau xuống dưới mép màn hình, và người ta cuộn
   qua không thấy.

   Cắt ở 2 dòng, phần còn lại nằm trong thuộc tính title — rê chuột vào là đọc
   đủ, mà chiều cao mỗi dòng thì không bao giờ vượt khỏi tầm mắt. Dòng phụ
   (tên khách · vật tư) cắt ở 1 dòng vì nó chỉ để đối chiếu nhanh.

   Kẹp vào thẻ BÊN TRONG ô, không kẹp vào chính <td>: ô bảng buộc phải giữ
   display:table-cell, đặt -webkit-box lên nó thì trình duyệt lờ đi và chữ vẫn
   tràn xuống dòng thứ ba bị cắt ngang thân. */
.bang-sx td.sx-viec > b,
.bang-sx td.sx-ghichu > div {
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;
  overflow: hidden; overflow-wrap: anywhere;
}
.bang-sx td.sx-viec .chu-mo {
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 1;
  overflow: hidden; overflow-wrap: anywhere;
}

/* Cột VẬT TƯ — MỘT DÒNG MỘT VẬT TƯ, tên bên trái số lượng bên phải.
   Đúng cách xếp của hàng vật tư trong hộp nhập, nên người đọc trên tờ lịch và
   người gõ trong hộp nhìn thấy cùng một hình.

   Bản cũ rộng 150px và chặn hai hàng, nối cả danh sách thành một câu — đọc ra
   "Mica trong 5 mm DL ×1, Mica trong 3…" rồi mất hẳn phần sau. Người duyệt
   không biết đơn ăn những gì và bao nhiêu, mà đó đúng là thứ họ phải biết
   trước khi cho chạy máy. Nay nới ra cho vừa một tên vật tư thật; cột chỉ có
   mặt ở hai khu Chờ duyệt và Sản xuất xong nên không bóp chỗ suốt bảng, và
   hẹp hơn nữa thì .bang-boc cuộn ngang như mọi cột khác. */
.bang-sx th.sx-vt, .bang-sx td.sx-vt { width: 232px; min-width: 200px; }
.bang-sx td.sx-vt .sx-vt__nhom + .sx-vt__nhom { margin-top: 6px; }
.sx-vt__nhan {
  font-size: 10px; font-weight: 700; letter-spacing: .04em;
  color: var(--chu-mo); text-transform: uppercase;
}
/* Tên chiếm phần thừa, con số neo bên phải và KHÔNG bao giờ bị cắt — cắt tên
   thì còn đoán ra, cắt số thì dòng ấy thành vô nghĩa. Tên dài quá một hàng
   thì ba chấm, đọc đủ bằng title. */
.sx-vt__dong { display: flex; gap: 6px; align-items: baseline; line-height: 1.4; }
.sx-vt__ten {
  flex: 1; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.sx-vt__so { white-space: nowrap; font-variant-numeric: tabular-nums; }
/* Cột DUYỆT vừa đúng một cái nút, không rộng hơn. */
.bang-sx th.sx-duyet, .bang-sx td.sx-duyet { width: 96px; text-align: center; }

/* Cột VIỆC PHẢI LÀM của tab 📋 Báo cáo SX — bốn nút của chặng ghi vật tư.
   Chốt bề rộng để hai nút "Cắt lại" xuống hàng thành khối 2×2 gọn gàng, thay
   vì kéo cột dài ra rồi bóp mất chỗ của Nội dung công việc. Khoảng cách hẹp
   hơn chip-hang mặc định: bốn nút xếp sát nhau vẫn bấm trúng, mà dòng không
   cao lên thêm. */
.bang-sx th.sxx-viec, .bang-sx td.sxx-viec { width: 250px; min-width: 230px; }
/* Nút trong ô bảng bóp nhỏ lại để bốn cái xếp thành khối 2×2.
   Cỡ nút mặc định thì mỗi cái chiếm trọn một hàng, dòng cao gấp đôi và cả
   bảng chỉ còn chứa được ba bốn đơn — đúng thứ mà việc đổi từ thẻ sang bảng
   sinh ra để tránh. */
.bang-sx td.sxx-viec .chip-hang { gap: 4px; }
.bang-sx td.sxx-viec .nut { padding: 6px 9px; font-size: 12px; gap: 5px; }
/* Cột THAO TÁC của tab 🏁 SX Đã Báo cáo — chỉ hai nút (🔓 Mở lại, 📒 Vào sổ)
   nên xếp DỌC trong cột hẹp. Giữ nguyên 250px của cột bốn nút là cả bảng rộng
   hơn màn hình, và nút Vào sổ nằm khuất sau mép phải. */
.bang-sx th.dsx-viec, .bang-sx td.dsx-viec { width: 130px; min-width: 120px; }
.bang-sx td.dsx-viec .chip-hang { flex-direction: column; align-items: stretch; }
.bang-sx td.dsx-viec .nut, .bang-sx td.dsx-viec .nhan { justify-content: center; white-space: nowrap; }

.bang-sx th.sx-cd, .bang-sx td.sx-cd { width: 62px; text-align: center; padding: 4px; }
.bang-sx th.sx-cd { font-size: 14px; line-height: 1.15; }
/* Tên công đoạn dưới biểu tượng — đọc được ngay, không phải rê chuột. */
.bang-sx th.sx-cd .sx-cd__ten {
  font-size: 11px; font-weight: 600; margin-top: 2px; white-space: nowrap;
}
.bang-sx td { vertical-align: middle; }

/* DÒNG TRỄ HẸN GIAO — quá ngày giao mà xưởng chưa tích đủ công đoạn.
   Nền đỏ nhạt cho cả hàng, cộng một vạch đỏ đậm ở đầu dòng: người đứng máy đọc
   tờ lịch theo hàng ngang, nên dấu hiệu cũng phải chạy hết hàng. Nền nhạt chứ
   không đậm — chữ trong dòng vẫn phải đọc được, và bảy ô tích vẫn phải bấm
   trúng; tô đậm cả dòng là biến đúng những dòng gấp nhất thành khó dùng nhất.
   Vạch đỏ đặt bằng box-shadow inset trên ô ĐẦU TIÊN vì <tr> không nhận
   border-left khi bảng ở chế độ border-collapse. */
.bang-sx tr.sx-tre > td { background: var(--do-mo); }
/* Ưu tiên sản xuất (⏳ Khách chờ / ⭐ Khách UT) — đỏ đậm hơn quá hạn, vạch trái dày
   hơn, để giữa hai dòng đỏ vẫn nhận ra dòng nào là ưu tiên. Xem oUuTienSX(). */
.bang-sx tr.sx-uu-tien > td { background: color-mix(in srgb, var(--do) 16%, var(--nen-the)); }
.bang-sx tr.sx-uu-tien > td:first-child { box-shadow: inset 7px 0 0 var(--do); }
.bang-sx tr.sx-uu-tien .sx-viec > b { color: var(--do); }
.bang-sx tr.sx-uu-tien .o-tich, .bang-sx tr.sx-uu-tien .nut-cd { background: var(--nen-the); }
.bang-sx tr.sx-uu-tien .o-tich--xong { background: var(--ngoc); }
.bang-sx tr.sx-uu-tien .nut-cd--xong { background: var(--xanhla); }
.sx-ut-nhan { margin-top: 4px; color: var(--do); font-weight: 700; font-size: 12.5px; }
.sx-ut-nhan .sx-ut-phu { display: block; font-weight: 400; color: var(--chu-nhat); font-size: 11.5px; }
.sx-ut-nut { margin-top: 4px; display: flex; gap: 4px; flex-wrap: wrap; }
.sx-ut-nut .nut { padding: 3px 8px; font-size: 12px; }
.bang-sx tr.sx-tre > td:first-child { box-shadow: inset 4px 0 0 var(--do); }
/* Ô tích giữ nền riêng của nó, đừng để nền đỏ ăn mất dấu ✓ đã tích. */
.bang-sx tr.sx-tre .o-tich { background: var(--nen-the); }
.bang-sx tr.sx-tre .o-tich--xong { background: var(--ngoc); }

/* ───── CỘT "CÔNG ĐOẠN" — một hàng nút có chữ ─────
   Thay cho sáu cột ô tích trơn, vốn đẩy tờ lịch rộng quá màn hình. Nút tự
   ghi tên tắt (CNC · LZ · UV · PP · GC · BH).
     · Chưa xong: viền ĐẬM, nền thẻ — nhìn là biết còn việc.
     · Đã xong:  nền XANH LÁ, chữ trắng, dấu ✓ tròn đè lên góc trên phải.
   Xanh lá là màu "hoàn thành" của cả app (--xanhla), tách khỏi màu chủ đạo. */
/* Cột ôm vừa khít lưới nút (width 1%) — bề rộng thật do min-width của
   .nut-cd-hang ngay dưới giữ. */
.bang-sx th.sx-cds, .bang-sx td.sx-cds { width: 1%; }
/* Chừa chỗ trên và phải cho dấu ✓ đè ra ngoài nút — không thì khung cuộn
   của bảng cắt mất nửa dấu ở dòng đầu. */
/* LƯỚI 3 NÚT MỘT HÀNG, đủ sáu thì xuống đúng hai hàng. min-width đặt trên
   KHỐI NÚT chứ không trên <td>: trình duyệt coi min-width của ô bảng chỉ là
   gợi ý, bảng chật là bóp cột lại và nút rơi xếp dọc từng cái — tốn dòng. Một
   <div> có min-width thì ô chứa nó không co nhỏ hơn được. */
.nut-cd-hang {
  display: grid; grid-template-columns: repeat(3, max-content); gap: 8px;
  min-width: 164px; padding: 7px 7px 0 0;
}
.nut-cd {
  position: relative; min-width: 40px; height: 30px; padding: 0 8px;
  border: 2px solid var(--chu); border-radius: 7px; background: var(--nen-the);
  color: var(--chu); font: inherit; font-size: 12px; font-weight: 800;
  letter-spacing: .02em; cursor: pointer; white-space: nowrap;
}
.nut-cd:hover:not(:disabled) { background: var(--xanhla-mo); border-color: var(--xanhla); }
.nut-cd--xong { background: var(--xanhla); border-color: var(--xanhla); color: #fff; }
.nut-cd--xong:hover:not(:disabled) { background: var(--xanhla); filter: brightness(.92); }
:root[data-theme="dark"] .nut-cd--xong { color: #1b2a0a; }
.nut-cd--xong::after {
  content: '✓'; position: absolute; top: -8px; right: -7px;
  width: 17px; height: 17px; border-radius: 50%;
  background: #fff; color: var(--xanhla); border: 2px solid var(--xanhla);
  font-size: 11px; font-weight: 900; line-height: 13px; text-align: center;
}
.nut-cd:disabled { cursor: default; opacity: .55; }
/* Dòng trễ hẹn tô đỏ cả hàng — nút giữ nền riêng, đừng để nền đỏ ăn mất nó. */
.bang-sx tr.sx-tre .nut-cd { background: var(--nen-the); }
.bang-sx tr.sx-tre .nut-cd--xong { background: var(--xanhla); }

/* Ô tích vuông, to đủ để bấm trúng bằng ngón tay trên máy tính bảng ngoài xưởng. */
.o-tich {
  width: 26px; height: 26px; border-radius: 6px; cursor: pointer;
  border: 2px solid var(--vien-dam); background: var(--nen-the);
  font-size: 15px; font-weight: 700; line-height: 1; color: var(--ngoc);
  display: inline-flex; align-items: center; justify-content: center;
}
.o-tich:hover:not(:disabled) { border-color: var(--ngoc); background: var(--ngoc-mo); }
.o-tich--xong { background: var(--ngoc); border-color: var(--ngoc); color: #fff; }
.o-tich:disabled { cursor: default; opacity: .55; }

/* Ô "SX xong" — nền xanh chữ x, đúng kiểu tờ lịch giấy của xưởng. App tự tô
   khi tích đủ công đoạn, không ai bấm vào đây cả. */
.bang-sx td.o-xong {
  background: var(--ngoc); color: #fff; font-weight: 700; font-size: 15px;
}

/* Chặng "Hoàn thành sản xuất" — nằm giữa tím (đang ở xưởng) và ngọc biển
   (đã giao). Cam ĐẬM, không dùng var(--cam-mo): nhãn "Đang chăm sóc"
   (.nhan--vang) đã lấy đúng nền ấy rồi, hai chặng cách nhau nửa hành trình mà
   trông y hệt nhau thì nhìn bảng không phân biệt nổi. */
.nhan--cam       { background: #FBDCA8;             color: #7A4712; }
:root[data-theme="dark"] .nhan--cam { background: #4a3416; color: #e8b46a; }
/* Hạng Đồng — màu nâu đồng, không đụng vào bộ màu trạng thái đang dùng */
.nhan--dong      { background: #f1e2d3;              color: #7a4a1d; }
:root[data-theme="dark"] .nhan--dong { background: #3a2a1c; color: #d9a877; }
/* Chặng "Chờ duyệt sản xuất" — nằm giữa chốt xong và tím (Đang sản xuất), hồng
   nhạt để không trùng bất kỳ chặng nào khác trong hành trình. */
.nhan--hong      { background: #F5D6E0;              color: #8C2F52; }
:root[data-theme="dark"] .nhan--hong { background: #3A1F28; color: #E8A0BD; }
:root[data-theme="dark"] .nhan--vang { color: var(--cam); }

/* ================================ 11. Form ================================ */
.form-luoi { display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; }
.o { display: flex; flex-direction: column; gap: 5px; }
.o--rong { grid-column: 1 / -1; }
/* Tiêu đề nhóm ô trong hộp dài (07/10): chữ nhỏ viết hoa màu chủ đạo, gạch chân mảnh, trải hết hàng. */
.hop-nhom {
  grid-column: 1 / -1; margin: 8px 0 -4px; padding-bottom: 6px; border-bottom: 1px solid var(--vien);
  font-size: 12.5px; font-weight: 700; letter-spacing: .05em; text-transform: uppercase; color: var(--ngoc);
}
.hop-nhom:first-child { margin-top: 0; }
/* Tiêu đề nhóm đứng một mình giữa hộp (ngoài lưới ô), vd "Danh mục hàng hoá" của hộp đơn hàng. */
.hop-nhom--roi { margin: 24px 0 12px; }
/* Ô địa chỉ có gợi ý tỉnh / xã — xem ganODiaChi() bên ui.js */
.dg-goi-y { position: absolute; left: 0; right: 0; z-index: 40; max-height: 280px; overflow-y: auto;
  background: var(--nen-the); border: 1px solid var(--vien); border-radius: var(--bo); box-shadow: var(--bong-cao); }
.dg-goi-y.an { display: none; }
.dg-muc { padding: 8px 12px; cursor: pointer; font-size: 13.5px; border-bottom: 1px solid var(--vien); }
.dg-muc:last-child { border-bottom: none; }
.dg-muc.dang, .dg-muc:hover { background: var(--nen-nhe); }
.dg-dong { margin-top: 6px; display: flex; gap: 6px; align-items: center; flex-wrap: wrap; }
.dg-dong .nut { padding: 2px 8px; font-size: 11.5px; }
.o label { font-size: 13px; font-weight: 600; color: var(--chu-nhat); }
.o label .bb { color: var(--do); }
.o input, .o select, .o textarea {
  padding: 10px 12px; font: inherit; font-size: 14px;
  border: 1px solid var(--vien-dam); border-radius: var(--bo-nho);
  background: var(--nen-the); color: var(--chu); width: 100%;
}
.o input:focus, .o select:focus, .o textarea:focus {
  outline: none; border-color: var(--ngoc); box-shadow: 0 0 0 3px var(--ngoc-mo);
}
.o textarea { resize: vertical; min-height: 74px; }
.o__giup { font-size: 12px; color: var(--chu-mo); }
.o__loi { font-size: 12px; color: var(--do); font-weight: 600; }

.xemtruoc {
  background: var(--ngoc-mo); border-left: 4px solid var(--ngoc);
  border-radius: var(--bo-nho); padding: 13px 16px; font-size: 13.5px;
}
.xemtruoc b { color: var(--ngoc); }

.hang-nut { display: flex; gap: 10px; flex-wrap: wrap; align-items: center; }
.thanh-loc { display: flex; gap: 9px; flex-wrap: wrap; align-items: center; margin-bottom: 14px; }
.thanh-loc input, .thanh-loc select {
  padding: 8px 11px; font: inherit; font-size: 13.5px;
  border: 1px solid var(--vien-dam); border-radius: var(--bo-nho);
  background: var(--nen-the); color: var(--chu);
}
.thanh-loc input[type="search"] { min-width: 210px; flex: 1; max-width: 320px; }

/* ================================ 12. Thẻ số liệu ================================ */
/* Thẻ số liệu nói đúng một con số, nên nó chỉ cần chỗ cho một con số.
   Bản cũ đệm 16/18px quanh cỡ chữ 27px: ba cái thẻ ăn gần hết chiều cao màn
   hình laptop, đẩy cái bảng — thứ người ta thật sự vào để xem — xuống dưới
   mép. Thẻ nào có dòng chú thích phụ còn kéo cả hàng cao theo nó, để lại hai
   khoảng trắng trống trơn ở hai thẻ bên cạnh. */
.sl {
  background: var(--nen-the); border: 1px solid var(--vien); border-radius: var(--bo);
  padding: 9px 12px; border-left: 4px solid var(--ngoc);
  /* Không kéo cao bằng thẻ cao nhất trong hàng nữa: thẻ có chú thích thì cao
     hơn một dòng, mấy thẻ kia giữ nguyên chiều cao của mình. */
  align-self: start;
}
.sl__ten { font-size: 12.3px; color: var(--chu-nhat); font-weight: 600; line-height: 1.35; }
.sl__so  { font-size: 21px; font-weight: 800; line-height: 1.15; font-variant-numeric: tabular-nums; }
.sl__phu { font-size: 11.5px; color: var(--chu-mo); line-height: 1.35; }
.sl--do     { border-left-color: var(--do); }     .sl--do .sl__so     { color: var(--do); }
.sl--cam    { border-left-color: var(--cam); }    .sl--cam .sl__so    { color: var(--cam); }
.sl--xanhla { border-left-color: var(--xanhla); } .sl--xanhla .sl__so { color: var(--xanhla); }
.sl--tim    { border-left-color: var(--tim); }    .sl--tim .sl__so    { color: var(--tim); }

.nhom-sl { margin-bottom: 26px; }
.nhom-sl__ten {
  font-size: 12.5px; font-weight: 800; letter-spacing: 1px; text-transform: uppercase;
  color: var(--chu-mo); margin-bottom: 11px; display: flex; align-items: center; gap: 9px;
}
.nhom-sl__ten::after { content: ''; flex: 1; height: 1px; background: var(--vien); }

/* ================================ 13. Lịch hẹn ================================ */
.lh-nhom { margin-bottom: 26px; }
.lh-nhom__dau {
  display: flex; align-items: center; gap: 9px; margin-bottom: 11px;
  font-weight: 700; font-size: 15px;
}
.lh-nhom__dem { font-size: 12px; padding: 2px 9px; border-radius: 12px; background: var(--nen-nhe); }
.lh {
  display: flex; align-items: center; gap: 14px; flex-wrap: wrap;
  background: var(--nen-the); border: 1px solid var(--vien); border-left: 4px solid var(--vien-dam);
  border-radius: var(--bo-nho); padding: 12px 15px; margin-bottom: 9px;
}
.lh--do     { border-left-color: var(--do);     background: linear-gradient(90deg, var(--do-mo), var(--nen-the) 42%); }
.lh--vang   { border-left-color: var(--cam);    background: linear-gradient(90deg, var(--cam-mo), var(--nen-the) 42%); }
.lh--xanhla { border-left-color: var(--xanhla); }
.lh__gio  { font-weight: 800; font-size: 15px; min-width: 108px; font-variant-numeric: tabular-nums; }
.lh__ngay { font-size: 11.5px; color: var(--chu-nhat); font-weight: 500; }
.lh__ten  { font-weight: 700; }
.lh__mo   { font-size: 12.5px; color: var(--chu-nhat); }
.lh__than { flex: 1; min-width: 190px; }
.lh__nut  { display: flex; gap: 6px; flex-wrap: wrap; }

.lich-thang { background: var(--nen-the); border: 1px solid var(--vien); border-radius: var(--bo); padding: 16px; }
.lich-thang__dau { display: flex; align-items: center; justify-content: space-between; margin-bottom: 11px; font-weight: 700; }
.lich-luoi { display: grid; grid-template-columns: repeat(7, 1fr); gap: 3px; }
.lich-luoi__thu { text-align: center; font-size: 11px; font-weight: 700; color: var(--chu-mo); padding: 5px 0; }
.lich-o {
  aspect-ratio: 1; border-radius: 7px; display: flex; flex-direction: column;
  align-items: center; justify-content: center; font-size: 12.5px;
  border: 1px solid transparent; position: relative;
}
.lich-o--ngoai { color: var(--chu-mo); opacity: .4; }
.lich-o--naydu { border-color: var(--ngoc); font-weight: 800; }
.lich-o--co    { background: var(--ngoc-mo); font-weight: 700; cursor: pointer; }
.lich-o--qua   { background: var(--do-mo); color: var(--do); font-weight: 800; cursor: pointer; }
.lich-o__cham  { width: 5px; height: 5px; border-radius: 50%; background: var(--ngoc); margin-top: 2px; }
.lich-o--qua .lich-o__cham { background: var(--do); }

/* ================================ 14. Biểu đồ ================================ */
.bd { background: var(--nen-the); border: 1px solid var(--vien); border-radius: var(--bo); padding: 18px; }
.bd__ten { font-weight: 700; font-size: 14.5px; margin-bottom: 13px; }
.bd svg { width: 100%; height: auto; display: block; overflow: visible; }
.chu-thich { display: flex; flex-wrap: wrap; gap: 11px; margin-top: 13px; font-size: 12.5px; }
.chu-thich span { display: flex; align-items: center; gap: 6px; }
.chu-thich i { width: 11px; height: 11px; border-radius: 3px; display: inline-block; }

/* ---------- 📅 Lịch làm việc: lưới Ngày / Tuần / Tháng / Năm ----------
   Viền trái của khối việc là màu ô Eisenhower (--mau, đặt inline); nền đổi
   theo thời hạn: sắp tới → viền cam, đang tới giờ → cam, quá giờ → đỏ. */
.llv-kieu { display: inline-flex; gap: 4px; flex-wrap: wrap; }
.llv-cuon {
  overflow-x: auto; overflow-y: hidden; border: 1px solid var(--vien); border-radius: var(--bo);
  background: var(--nen-the);
}
/* Chừa chỗ dưới đáy cho nhãn 17:30 — nhãn nằm ngay dưới vạch cuối. */
.llv-gio { display: grid; padding-bottom: 14px; }
.llv-gio--tuan { min-width: 760px; }
.llv-gio__goc, .llv-gio__nhan { border-bottom: 1px solid var(--vien); }
.llv-gio__dau {
  font: inherit; font-size: 13px; color: var(--chu); background: none; border: 0;
  border-left: 1px solid var(--vien); border-bottom: 1px solid var(--vien);
  padding: 8px 4px; cursor: pointer; text-align: center;
}
.llv-gio__dau:hover { background: var(--nen-nhe); }
.llv-gio__dau--nay { background: var(--ngoc-mo); color: var(--ngoc); }
.llv-gio__nhan { font-size: 10.5px; line-height: 1.25; color: var(--chu-mo); padding: 6px 6px 6px 0; text-align: right; }
.llv-gio__ngoai {
  border-left: 1px solid var(--vien); border-bottom: 1px solid var(--vien);
  padding: 3px; min-height: 30px; display: flex; flex-direction: column; gap: 3px; min-width: 0;
}
.llv-gio__truc { position: relative; }
.llv-gio__moc { position: absolute; right: 6px; font-size: 10.5px; color: var(--chu-mo); line-height: 1; margin-top: 2px; }
.llv-gio__cot { position: relative; border-left: 1px solid var(--vien); min-width: 0; }
.llv-gio__vach { position: absolute; left: 0; right: 0; border-top: 1px solid var(--vien); pointer-events: none; }
.llv-gio__vach--nua { border-top-style: dashed; opacity: .6; }
.llv-gio__nghi {
  position: absolute; left: 0; right: 0; pointer-events: none;
  display: flex; align-items: center; justify-content: center;
  font-size: 10.5px; color: var(--chu-mo);
  background: repeating-linear-gradient(45deg, var(--nen-nhe) 0 6px, transparent 6px 12px);
}
.llv-gio__bay-gio { position: absolute; left: 0; right: 0; border-top: 2px solid var(--do); z-index: 3; pointer-events: none; }
.llv-gio__bay-gio::before {
  content: ''; position: absolute; left: -5px; top: -6px;
  width: 10px; height: 10px; border-radius: 50%; background: var(--do);
}
.llv-them { cursor: cell; }
.llv-them:hover { background-color: color-mix(in srgb, var(--ngoc-mo) 45%, transparent); }

.llv-khoi {
  position: absolute; box-sizing: border-box; z-index: 2; overflow: hidden;
  border-left: 4px solid var(--mau); border-radius: 6px; padding: 2px 6px;
  background: color-mix(in srgb, var(--mau) 15%, var(--nen-the)); color: var(--chu);
  font-size: 12px; line-height: 1.3; cursor: grab; box-shadow: 0 1px 2px rgba(0,0,0,.08);
  user-select: none; -webkit-user-select: none; -webkit-touch-callout: none;
}
.llv-khoi:focus-visible { outline: 2px solid var(--ngoc); outline-offset: 1px; }
.llv-khoi__gio { font-weight: 700; font-size: 11px; white-space: nowrap; }
.llv-khoi__ten { display: block; overflow-wrap: anywhere; }
.llv-khoi--dong { position: static; white-space: nowrap; text-overflow: ellipsis; flex: none; }
.llv-khoi--dong .llv-khoi__ten { display: inline; }
.llv-khoi--khoa { cursor: pointer; }
.llv-khoi--sap  { box-shadow: inset 0 0 0 1.5px var(--cam); }
.llv-khoi--dang { background: color-mix(in srgb, var(--cam) 30%, var(--nen-the)); box-shadow: inset 0 0 0 1.5px var(--cam); }
.llv-khoi--qua  { background: var(--do-mo); box-shadow: inset 0 0 0 1.5px var(--do); }
.llv-khoi--qua .llv-khoi__gio { color: var(--do); }
.llv-khoi--xong { opacity: .55; }
.llv-khoi--huy  { opacity: .45; text-decoration: line-through; }
.llv-cham {
  display: inline-block; width: 7px; height: 7px; border-radius: 50%;
  background: var(--cam); margin-right: 4px; vertical-align: 1px;
}
.llv-the--sap  { box-shadow: inset 0 0 0 1.5px var(--cam); }
.llv-the--dang { background: var(--cam-mo); box-shadow: inset 0 0 0 1.5px var(--cam); }
.llv-the--qua  { background: var(--do-mo); box-shadow: inset 0 0 0 1.5px var(--do); }
.llv-the[data-llv-keo] { cursor: grab; user-select: none; -webkit-user-select: none; -webkit-touch-callout: none; }
/* Hộp XEM MẪU IN (06/10): tờ in dựng trên nền trắng như giấy, cuộn trong hộp. */
.xem-mau-in { background: #fff; color: #000; padding: 16px 20px; border: 1px solid var(--vien);
              border-radius: 6px; overflow: auto; }
.xem-mau-in .tbg { max-width: 780px; margin: 0 auto; }
.xem-mau-in--hd { font-family: "Times New Roman", Times, serif; font-size: 14px; line-height: 1.4;
                  max-width: 820px; margin: 0 auto; }

/* Thẻ việc GỌN ở màn Bốn ô (06/10): hai dòng, ba nút biểu tượng nằm góc phải dòng đầu. */
.llv-the--gon { padding: 6px 10px; margin-bottom: 5px; }
.llv-gon__dau { display: flex; flex-wrap: wrap; align-items: center; gap: 2px 8px; }
.llv-gon__ten { flex: 1 1 200px; min-width: 0; overflow-wrap: anywhere; }
.llv-gon__ten .chip { padding: 1px 8px; font-size: 12px; margin-left: 4px; }
.llv-gon__nut { display: inline-flex; gap: 3px; }
.llv-gon__nut .nut { padding: 2px 6px; min-height: 26px; font-size: 12.5px; line-height: 1.2; }
@media (max-width: 699px) {
  .llv-gon__nut { gap: 8px; }
  .llv-gon__nut .nut { min-height: 40px; min-width: 40px; padding: 4px 10px; }
}
.llv-nhan--qua  { color: var(--do); }
.llv-nhan--dang, .llv-nhan--sap { color: var(--cam); }
.llv-tay { color: var(--chu-mo); cursor: grab; }
.llv-mau { border: 1.5px solid; }
.llv-mau--sap  { border-color: var(--cam); background: var(--nen-the); }
.llv-mau--dang { border-color: var(--cam); background: color-mix(in srgb, var(--cam) 30%, var(--nen-the)); }
.llv-mau--qua  { border-color: var(--do); background: var(--do-mo); }

/* Kéo-thả */
.llv-keo-goc { opacity: .35; }
.llv-bong {
  position: fixed !important; z-index: 9999; pointer-events: none; opacity: .92;
  margin: 0; box-shadow: 0 8px 22px rgba(0,0,0,.28);
}
.llv-dich { background-color: var(--ngoc-mo) !important; outline: 2px dashed var(--ngoc); outline-offset: -2px; }
body.llv-dang-keo, body.llv-dang-keo * { cursor: grabbing !important; user-select: none; }

/* Tháng */
.llv-thang { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); min-width: 560px; }
.llv-thang__thu {
  text-align: center; font-size: 11.5px; font-weight: 700; color: var(--chu-mo);
  padding: 7px 0; border-bottom: 1px solid var(--vien);
}
.llv-thang__o {
  min-height: 104px; min-width: 0; padding: 4px; display: flex; flex-direction: column; gap: 3px;
  border-left: 1px solid var(--vien); border-bottom: 1px solid var(--vien);
}
.llv-thang__o:nth-child(7n+1) { border-left: 0; }
.llv-thang__o--ngoai { background: var(--nen-nhe); }
.llv-thang__o--ngoai .llv-thang__so { color: var(--chu-mo); }
.llv-thang__so {
  align-self: flex-start; font: inherit; font-size: 12.5px; font-weight: 700;
  background: none; border: 0; color: var(--chu); cursor: pointer; border-radius: 999px; padding: 1px 7px;
}
.llv-thang__so:hover { background: var(--nen-nhe); }
/* 04/11: ngày âm lịch + ngày lễ trên lịch */
.llv-am { font-size: 10.5px; font-weight: 400; color: var(--chu-mo); margin-left: 4px; white-space: nowrap; }
.llv-am--moc { color: #b45309; font-weight: 700; }
.llv-le { display: block; font-size: 10.5px; font-weight: 600; color: #b91c1c; line-height: 1.25; margin: 1px 0 2px; }
.llv-thang__o--le { background: #fef2f2; }
.llv-nam__ngay--le { box-shadow: inset 0 -2px 0 #dc2626; }
.llv-nam__ngay--moc { box-shadow: inset 0 -2px 0 #d97706; }
.llv-gio__dau .llv-am { display: block; margin-left: 0; }
.llv-thang__o--nay .llv-thang__so { background: var(--ngoc); color: #fff; }
.llv-thang__them {
  font: inherit; font-size: 11.5px; color: var(--ngoc); background: none; border: 0;
  text-align: left; cursor: pointer; padding: 0 2px;
}

/* Năm */
.llv-nam { display: grid; grid-template-columns: repeat(auto-fill, minmax(210px, 1fr)); gap: 14px; }
.llv-nam__thang { border: 1px solid var(--vien); border-radius: var(--bo); padding: 10px 12px; background: var(--nen-the); }
.llv-nam__ten {
  display: flex; justify-content: space-between; align-items: baseline; width: 100%;
  font: inherit; font-weight: 700; background: none; border: 0; color: var(--chu);
  cursor: pointer; padding: 0; margin-bottom: 6px;
}
.llv-nam__ten:hover span:first-child { color: var(--ngoc); }
.llv-nam__luoi { display: grid; grid-template-columns: repeat(7, 1fr); gap: 2px; }
.llv-nam__thu { font-size: 10px; text-align: center; color: var(--chu-mo); }
.llv-nam__ngay {
  aspect-ratio: 1; font: inherit; font-size: 11px; border: 0; border-radius: 5px; padding: 0;
  background: transparent; color: var(--chu); cursor: pointer;
}
.llv-nam__ngay:hover { outline: 1px solid var(--vien-dam); }
.llv-nam__ngay--1 { background: var(--ngoc-mo); }
.llv-nam__ngay--2 { background: color-mix(in srgb, var(--ngoc-nhat) 45%, var(--nen-the)); font-weight: 700; }
.llv-nam__ngay--3 { background: var(--ngoc-nhat); color: #fff; font-weight: 700; }
.llv-nam__ngay--nay { outline: 2px solid var(--ngoc) !important; }
.llv-nam__ngay--qua { box-shadow: inset 0 -3px 0 var(--do); }

@media (max-width: 699px) {
  .llv-thang { min-width: 0; }
  .llv-thang__o { min-height: 70px; padding: 2px; }
  .llv-thang .llv-khoi { font-size: 10.5px; padding: 1px 3px; border-left-width: 3px; }
  .llv-thang .llv-khoi__gio { display: none; }
  .llv-gio .llv-khoi { font-size: 11px; padding: 1px 4px; }
}

/* Tiêu đề phụ của từng khối trong một mục Cài đặt gộp nhiều khối
   (vd. 🏭 Sản xuất = duyệt SX + công đoạn + file SX). */
.cd-khoi { margin: 16px 0 2px; padding-top: 12px; border-top: 1px solid var(--vien); font-size: 15px; }
[data-cd-nhom] > .cd-khoi:first-child { margin-top: 0; padding-top: 0; border-top: 0; }

/* ================================ 15. Accordion ================================ */
.acc { border: 1px solid var(--vien); border-radius: var(--bo); background: var(--nen-the); overflow: hidden; margin-bottom: 9px; }
.acc__dau {
  width: 100%; text-align: left; font: inherit; font-weight: 700; font-size: 14.5px;
  padding: 15px 18px; background: none; border: none; cursor: pointer; color: var(--chu);
  display: flex; justify-content: space-between; align-items: center; gap: 12px;
}
.acc__dau:hover { background: var(--nen-nhe); }
.acc__mui { transition: transform .2s; color: var(--chu-mo); flex-shrink: 0; }
.acc.mo .acc__mui { transform: rotate(180deg); }
.acc__than { display: none; padding: 0 18px 17px; }
.acc.mo .acc__than { display: block; }
.acc__than ol, .acc__than ul { margin: 0; padding-left: 20px; }
.acc__than li { margin-bottom: 7px; }

/* ================================ 16. Toast ================================ */
.khung-toast {
  position: fixed; right: 18px; bottom: 18px; z-index: 200;
  display: flex; flex-direction: column; gap: 10px; max-width: 380px;
}
.toast {
  background: var(--nen-the); border: 1px solid var(--vien); border-left: 5px solid var(--ngoc);
  border-radius: var(--bo); box-shadow: var(--bong-cao); padding: 13px 15px;
  animation: truotVao .26s ease-out;
}
@keyframes truotVao { from { opacity: 0; transform: translateX(28px); } }
.toast--tat { opacity: 0; transform: translateX(28px); transition: .26s; }
.toast--do        { border-left-color: var(--do); }
.toast--vang      { border-left-color: var(--cam); }
.toast--xanhduong { border-left-color: var(--xanhduong); }
.toast--tim       { border-left-color: var(--tim); }
.toast--tim .toast__tieude { font-size: 15px; letter-spacing: .3px; }
.toast__head  { display: flex; align-items: flex-start; gap: 8px; }
.toast__icon  { font-size: 16px; }
.toast__tieude{ font-weight: 700; font-size: 14px; flex: 1; }
.toast__dong  { background: none; border: none; font-size: 20px; line-height: 1; cursor: pointer; color: var(--chu-mo); padding: 0 2px; }
.toast__than  { font-size: 13px; color: var(--chu-nhat); margin-top: 4px; }
.toast__nut   { margin-top: 10px; }


/* ================================ 17. Modal ================================ */
/* Khung hộp thoại (07/10 làm đẹp): nền mờ nhẹ, hộp bo lớn có viền mảnh + bóng, đầu hộp và chân hộp có nền
   nhạt để tách khỏi phần nhập liệu, nút × to dễ bấm. Chỉ đổi giao diện — id, sự kiện và bố cục cuộn giữ nguyên. */
.man {
  position: fixed; inset: 0; background: rgba(12,18,32,.55); z-index: 150;
  display: none; align-items: flex-start; justify-content: center; padding: 26px 16px; overflow: auto;
  -webkit-backdrop-filter: blur(3px); backdrop-filter: blur(3px);
}
.man.mo { display: flex; animation: manHien .18s ease-out; }
@keyframes manHien { from { opacity: 0; } }
.hop {
  background: var(--nen-the); border-radius: 16px; box-shadow: var(--bong-cao), 0 0 0 1px var(--vien);
  width: 100%; max-width: 660px; animation: len .22s cubic-bezier(.2, .8, .2, 1);
}
@keyframes len { from { opacity: 0; transform: translateY(18px) scale(.985); } }
@keyframes truotLenDay { from { transform: translateY(100%); } }
.hop__dau {
  padding: 15px 18px 15px 24px; border-bottom: 1px solid var(--vien); background: var(--nen-nhe);
  border-radius: 16px 16px 0 0;
  display: flex; justify-content: space-between; align-items: center; gap: 12px;
}
.hop__dau h3 { margin: 0; font-size: 19px; line-height: 1.3; }
.hop__dau .nut-tron { flex: none; width: 40px; height: 40px; font-size: 22px; line-height: 1; }
.hop__dau .nut-tron:hover { background: var(--do); border-color: var(--do); color: #fff; }
.hop__than { padding: 22px 24px; }
/* flex-wrap là bắt buộc: hộp đơn hàng có tới năm nút (Xoá · Huỷ · in hóa đơn ·
   in phiếu kho · Lưu). Không cho xuống dòng thì chúng bị bóp chồng lên nhau và
   chữ trên nút đọc thành một đống. */
.hop__chan {
  padding: 14px 20px; border-top: 1px solid var(--vien); background: var(--nen-nhe);
  border-radius: 0 0 16px 16px;
  display: flex; flex-wrap: wrap; gap: 10px; justify-content: flex-end; align-items: center;
}
.hop__chan .nut { min-height: 40px; padding-left: 20px; padding-right: 20px; }
/* Ô nhập bị khoá (người không có quyền sửa): nền xám nhạt để thấy ngay là không gõ được. */
.o input:disabled, .o select:disabled, .o textarea:disabled {
  background: var(--nen-nhe); color: var(--chu-mo); cursor: not-allowed;
}
@media (prefers-reduced-motion: reduce) { .man.mo, .hop { animation: none !important; } }

/* Máy tính: hộp không cao quá màn hình. Đầu hộp và chân hộp (các nút Lưu / Huỷ…)
   đứng yên, chỉ phần giữa cuộn — hộp dài bao nhiêu thì nút vẫn nằm trong màn
   hình, không phải cuộn hết mới thấy. Điện thoại đã làm y vậy ở mục Responsive.
   52px = hai lề 26px của .man. */
@media (min-width: 700px) {
  .hop { display: flex; flex-direction: column; max-height: calc(100vh - 52px); }
  .hop__dau, .hop__chan { flex: none; }
  .hop__than { flex: 1 1 auto; min-height: 0; overflow-y: auto; }

  /* Hộp nhiều thông tin — xem hopRong() bên ui.js. Nới tới 1100px (không quá
     màn hình), lưới ô nhập tự chia thêm cột theo bề ngang: rộng đủ thì 4 cột. */
  .hop.hop--rong { max-width: min(1100px, calc(100vw - 32px)); }
  /* Nút đỏ (Xoá…) KHÔNG đứng cuối hàng nút thì tách sang TRÁI và đổi thành nút viền đỏ — xa nút Lưu, đỡ bấm nhầm.
     Nút đỏ đứng cuối (hộp hỏi lại: "Xoá" / "Đồng ý") giữ nguyên là nút đặc ở bên phải. */
  .hop__chan .nut--do:not(:last-child) { margin-right: auto; background: transparent; color: var(--do); border-color: var(--do); }
  .hop__chan .nut--do:not(:last-child):hover { background: var(--do); color: #fff; filter: none; }
  /* dense: ô rộng cả hàng (.o--rong) chen giữa thì hàng trước nó hổng mất hai
     ô — cho các ô nhỏ phía sau lấp lên, đỡ những khoảng trắng nửa hàng. */
  .hop--rong .form-luoi {
    grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
    grid-auto-flow: row dense;
  }
  /* Hộp có tiêu đề nhóm (.hop-nhom): KHÔNG dùng dense — ô của nhóm dưới sẽ chen lên lấp chỗ trống phía trên
     tiêu đề nhóm, mất ý nghĩa chia nhóm. Chỗ trống nửa hàng cuối mỗi nhóm là đúng chỗ. */
  .hop--rong .form-luoi:has(> .hop-nhom) { grid-auto-flow: row; }
  /* Khối công ty của hộp khách hàng (hiện khi tích "Khách mua cho công ty"): trải hết hàng và tự chia cột như
     lưới cha, thay vì bị nhốt trong MỘT ô lưới. [hidden] vẫn phải ẩn được nên khai riêng. */
  #fKhoiCongTy { grid-column: 1 / -1; display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 15px; }
  #fKhoiCongTy[hidden] { display: none; }
}

/* ================================ 18. Thông báo nhanh ================================ */
.tb-nhanh {
  position: fixed; top: calc(var(--cao-dieu-huong, 62px) + 14px); left: 50%; transform: translateX(-50%);
  z-index: 210; padding: 11px 20px; border-radius: 30px; font-size: 14px; font-weight: 600;
  box-shadow: var(--bong-cao); animation: roi .25s; max-width: min(560px, calc(100vw - 32px));
}
@keyframes roi { from { opacity: 0; transform: translate(-50%, -14px); } }
.tb-nhanh--ok      { background: var(--xanhla); color: #fff; }
.tb-nhanh--loi     { background: var(--do); color: #fff; }
.tb-nhanh--canhbao { background: var(--cam); color: #fff; }
.tb-nhanh--tin     { background: var(--ngoc); color: #fff; }

/* ================================ 19. Trạng thái đồng bộ ================================ */
.sync {
  display: inline-flex; align-items: center; gap: 7px; font-size: 12.5px; font-weight: 600;
  padding: 5px 12px; border-radius: 20px; background: var(--nen-nhe); color: var(--chu-nhat);
}
.sync__cham { width: 8px; height: 8px; border-radius: 50%; background: var(--chu-mo); }
.sync--ok  .sync__cham { background: var(--xanhla); }
.sync--dang .sync__cham { background: var(--cam); animation: dap 1s infinite; }
.sync--loi .sync__cham { background: var(--do); }

/* ================================ 20. Chân trang ================================ */
.chan { background: color-mix(in srgb, var(--ngoc) 88%, #000); color: rgba(255,255,255,.82); padding: 40px 0 26px; margin-top: 20px; }
:root[data-theme="dark"] .chan { background: #1C1408; }
.chan a { color: #fff; }
.chan__luoi { display: grid; grid-template-columns: 2fr 1fr 1fr; gap: 28px; margin-bottom: 26px; }
.chan h4 { color: #fff; font-size: 14px; }
.chan ul { list-style: none; margin: 0; padding: 0; font-size: 13.5px; }
.chan li { margin-bottom: 6px; }
/* Hai dòng cuối chân trang xếp CHỒNG và CĂN GIỮA, không còn dạt hai bên.

   Dòng trạng thái ("Trần Văn A (Nhân viên) · 4 khách hàng · 2 lượt chăm sóc ·
   3 việc cần xử lý") là thứ người dùng thật sự liếc vào — nó nói họ đang đăng
   nhập bằng ai và còn bao nhiêu việc. Nấp ở góc phải với cỡ chữ 12.5px thì
   chẳng ai thấy. Cho nó xuống dòng cuối cùng, giữa trang, chữ to hơn hẳn.

   Số phiên bản thì ngược lại: chỉ dùng để đối chiếu sau mỗi lần deploy, nên
   thu nhỏ và mờ đi, nhường chỗ cho dòng dưới. */
.chan__cuoi {
  border-top: 1px solid rgba(255,255,255,.18); padding-top: 17px;
  display: flex; flex-direction: column; align-items: center; gap: 8px;
  text-align: center;
}
.chan__cuoi > span:first-child { font-size: 12px; opacity: .72; }
#chanTrangThai {
  font-size: 15.5px; font-weight: 600; line-height: 1.5;
  max-width: 60ch;                 /* dòng dài thì ngắt cho dễ đọc, đừng kéo hết bề ngang */
}
@media (max-width: 640px) {
  #chanTrangThai { font-size: 14.5px; }
}

/* ================================ 21. Khu vực làm việc ================================ */
.lamviec { background: var(--nen); }
/* Chín tab phải vừa một hàng cho tới cỡ màn hình laptop nhỏ. Tab cuối là
   ⚙️ Cài đặt — nơi chứa phần xuất/nhập dữ liệu — nên nó bị đẩy khuất là
   người dùng tưởng app không có chức năng đó. */
/* Gạch chân và khoảng cách dưới chuyển lên hàng ngoài, để nút ☰ đứng chung
   một đường kẻ với hàng tab thay vì lơ lửng bên cạnh. */
.lv-hang { display: flex; align-items: flex-end; gap: 6px; border-bottom: 2px solid var(--vien); margin-bottom: 26px; }
.lv-tab { display: flex; flex-wrap: wrap; gap: 2px; flex: 1 1 auto; min-width: 0; }
.lv-tab::-webkit-scrollbar { display: none; }
/* Tab đang được kéo: mờ đi để mắt bám được nó giữa hàng chục nút giống nhau. */
.lv-tab button.dang-keo { opacity: .4; }
.lv-tab button { -webkit-user-select: none; user-select: none; }
.lv-tab button {
  padding: 11px 11px; font: inherit; font-size: 13.5px; font-weight: 600;
  background: none; border: none; border-bottom: 3px solid transparent;
  color: var(--chu-nhat); cursor: pointer; white-space: nowrap; margin-bottom: -2px;
  /* Mỗi tab là một NÚT (người dùng chốt 30/09): rê chuột thì nổi lên, đổi màu. */
  border-radius: var(--bo-nho) var(--bo-nho) 0 0;
  transition: transform .15s ease, background-color .15s ease, color .15s ease, box-shadow .15s ease;
}
.lv-tab button:hover {
  color: var(--ngoc); background: var(--ngoc-mo);
  transform: translateY(-2px); box-shadow: var(--bong);
}
.lv-tab button:active { transform: translateY(0); box-shadow: none; }
.lv-tab button:focus-visible { outline: 2px solid var(--ngoc); outline-offset: -2px; }
@media (prefers-reduced-motion: reduce) {
  .lv-tab button { transition: none; }
  .lv-tab button:hover { transform: none; }
}
.lv-tab button.dang-xem { color: var(--ngoc); border-bottom-color: var(--ngoc); }
.lv-tab button .dem {
  display: inline-block; min-width: 18px; padding: 0 5px; margin-left: 5px;
  background: var(--do); color: #fff; border-radius: 9px; font-size: 11px; font-weight: 700;
}
/* ---- Menu thả ☰ ---- */
.lv-menu { position: relative; flex: 0 0 auto; }
.lv-menu__nut {
  padding: 11px 12px; font: inherit; font-size: 15px; font-weight: 700;
  background: none; border: none; border-bottom: 3px solid transparent;
  color: var(--chu-nhat); cursor: pointer; margin-bottom: -2px; line-height: 1;
}
.lv-menu__nut:hover { color: var(--chu); }
.lv-menu__hop {
  position: absolute; right: 0; top: 100%; z-index: 60; margin-top: 4px;
  min-width: 250px; max-height: 70vh; overflow-y: auto; padding: 6px;
  background: var(--nen-the); border: 1px solid var(--vien);
  border-radius: var(--bo); box-shadow: var(--bong);
}
.lv-menu__muc {
  display: block; width: 100%; text-align: left; padding: 9px 11px;
  font: inherit; font-size: 13.5px; font-weight: 600; color: var(--chu-nhat);
  background: none; border: none; border-radius: 7px; cursor: pointer; white-space: nowrap;
}
.lv-menu__muc:hover { background: var(--nen); color: var(--chu); }
.lv-menu__muc.dang-xem { color: var(--ngoc); }
.lv-menu__ngan { height: 1px; background: var(--vien); margin: 6px 4px; }
/* 23/10: ☰ mở thành bảng nhiều cột, hiện đủ mọi tab một lượt, không phải cuộn */
#hopMenuTab:not(.an) {
  display: grid; grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); gap: 4px;
  width: min(960px, calc(100vw - 24px)); max-height: 88vh; padding: 10px;
}
#hopMenuTab .lv-menu__loc, #hopMenuTab .lv-menu__ngan { grid-column: 1 / -1; }
#hopMenuTab .lv-menu__ngan { margin: 4px 0; }
#hopMenuTab .lv-menu__muc { white-space: normal; border: 1px solid var(--vien); line-height: 1.3; }
#hopMenuTab .lv-menu__muc.dang-xem { border-color: var(--ngoc); background: var(--nen); }
#hopMenuTab .lv-menu__muc[draggable="true"] { cursor: grab; }
#hopMenuTab .lv-menu__muc.dang-keo { opacity: .45; }
#hopMenuTab #nutSapTab { grid-column: 1 / -1; text-align: center; }
@media (max-width: 600px) { #hopMenuTab:not(.an) { grid-template-columns: repeat(2, 1fr); } }
/* 22/10: ô tìm tab ở đầu menu ☰ */
.lv-menu__loc { display: block; width: 100%; margin: 0 0 6px; padding: 8px 10px; font: inherit; font-size: 13.5px; border: 1px solid var(--vien); border-radius: 7px; background: var(--nen-the); color: var(--chu); box-sizing: border-box; }
.lv-menu__loc:focus { outline: 2px solid var(--ngoc); outline-offset: 0; }

/* ---- Hộp sắp xếp thứ tự tab ---- */
.sap-tab { max-height: 56vh; overflow-y: auto; }
.sap-tab__dong {
  display: flex; align-items: center; justify-content: space-between; gap: 10px;
  padding: 7px 10px; border: 1px solid var(--vien); border-radius: 8px; margin-bottom: 6px;
  font-size: 13.5px; font-weight: 600;
}
.sap-tab__so { color: var(--chu-mo); font-weight: 700; margin-right: 6px; }
.sap-tab__nut { display: flex; gap: 4px; flex: 0 0 auto; }
.sap-tab__nut button {
  width: 32px; height: 32px; font: inherit; font-size: 15px; cursor: pointer;
  background: var(--nen); border: 1px solid var(--vien); border-radius: 7px; color: var(--chu);
}
.sap-tab__nut button:disabled { opacity: .35; cursor: default; }

.lv-noi > div { display: none; }
.lv-noi > div.hien { display: block; }

.hop-lon { background: var(--nen-the); border: 1px solid var(--vien); border-radius: var(--bo); padding: 24px; box-shadow: var(--bong); }
.hop-lon__dau { display: flex; justify-content: space-between; align-items: flex-start; gap: 15px; flex-wrap: wrap; margin-bottom: 18px; }
.hop-lon__dau h3 { margin: 0; }

/* ═══════════ ĐẦU TAB: BỎ CHỮ, GIỮ VIỆC ═══════════
   Mỗi tab mở ra bằng một tiêu đề, một câu mô tả cách dùng và thường thêm vài
   dải nhắc — người làm quen việc rồi thì đó là mấy dòng phải lướt qua mỗi lần
   vào, trước khi thấy bảng. Tên tab đã nằm sẵn trên thanh tab nên tiêu đề chỉ
   là nói lại lần hai.

   Giấu bằng CSS chứ không đi xoá 35 chỗ dựng HTML: muốn bày lại thì gỡ đúng
   khối này, không phải đi tìm lại từng câu chữ đã xoá.

   CHỈ GIẤU CHỮ. Dải nào có nút, ô nhập hay đường dẫn bên trong thì nó đang
   mang một VIỆC, không phải một lời giải thích — giấu là mất luôn cái nút, và
   mất im lặng. :has() làm đúng việc phân biệt ấy; trình duyệt nào không hiểu
   :has() thì bỏ qua cả dòng và dải hiện lại như cũ — hỏng về phía an toàn. */
.hop-lon__dau h3, .hop-lon__dau p { display: none; }
/* Đầu tab không còn gì ngoài chữ vừa giấu thì bỏ luôn cả khối, không thì còn
   đọng lại 18px khoảng trắng chẳng của ai. */
.hop-lon__dau:not(:has(button)):not(:has(input)):not(:has(select)):not(:has(textarea)):not(:has(a)):not(:has(label)) { display: none; }
.dai--tin:not(:has(button)):not(:has(input)):not(:has(select)):not(:has(textarea)):not(:has(a)):not(:has(label)),
.dai--canhbao:not(:has(button)):not(:has(input)):not(:has(select)):not(:has(textarea)):not(:has(a)):not(:has(label)),
.dai--nguy:not(:has(button)):not(:has(input)):not(:has(select)):not(:has(textarea)):not(:has(a)):not(:has(label)) { display: none; }

/* ================================ 22. Responsive ================================ */
@media (max-width: 1024px) {
  /* Dưới cỡ này chín tab không còn vừa một hàng dù đã rút gọn chữ. Cho xuống
     hai hàng thay vì để tab cuối khuất ra ngoài — khuất thì không ai biết là
     còn tab, còn hai hàng thì chỉ tốn thêm ít chiều cao. */
  .giaidoan { grid-template-columns: repeat(3, 1fr); }
  .hm-luoi  { grid-template-columns: repeat(3, 1fr); }
  .luoi--4  { grid-template-columns: repeat(2, 1fr); }
  .chan__luoi { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 699px) {
  .menu { display: none; }
  .menu.mo {
    display: flex; flex-direction: column; position: absolute; top: 62px; left: 0; right: 0;
    background: var(--nen-the); border-bottom: 1px solid var(--vien); padding: 10px;
    box-shadow: var(--bong-cao); max-height: 70vh; overflow: auto; z-index: 65;
  }
  .dongho { display: none; }
  .hero { padding: 40px 0 52px; }
  .hero h1 { font-size: 29px; }
  .kpi { grid-template-columns: repeat(2, 1fr); }
  .giaidoan, .hm-luoi, .luoi--2, .luoi--3, .luoi--4,
  .luoi--lichhen { grid-template-columns: 1fr; }
  .form-luoi { grid-template-columns: 1fr; }
  .section { padding: 40px 0; }
  h2 { font-size: 23px; }
  .chan__luoi { grid-template-columns: 1fr; }
  .khung-toast { left: 12px; right: 12px; bottom: 12px; max-width: none; }
  .panel { width: calc(100vw - 24px); right: -8px; }
  .lh__gio { min-width: auto; }
  .hop-lon { padding: 17px; }
}
@media (max-width: 900px) { #nutVaoLamViec { display: none; } }
@media (max-width: 1300px) { .menu a.menu--phu { display: none; } }
@media (min-width: 700px) { .nut-menu { display: none; } }

@media print {
  .dieuhuong, .khung-toast, .lv-tab, .lv-hang, .hero__nut, .nut { display: none !important; }
  body { background: #fff; }
  /* Tờ in thì PHẢI có tiêu đề. inKho() in thẳng trang đang mở, nên luật giấu
     tiêu đề ở trên đi theo luôn vào giấy — mà tờ giấy rời khỏi màn hình thì
     không còn thanh tab nào nói nó là bảng gì. */
  .hop-lon__dau { display: flex !important; }
  .hop-lon__dau h3 { display: block !important; }
}

/* ================================ 23. Đăng nhập & người dùng ================================ */
.khoa {
  max-width: 760px; margin: 0 auto;
  background: var(--nen-the); border: 1px solid var(--vien);
  border-radius: var(--bo); box-shadow: var(--bong); overflow: hidden;
}
.khoa__dau {
  background: linear-gradient(135deg, var(--ngoc-nhat), var(--ngoc));
  color: #fff; padding: 26px 28px;
}
.khoa__dau h3 { color: #fff; margin: 0 0 5px; font-size: 21px; }
.khoa__dau p  { margin: 0; opacity: .88; font-size: 14px; }
.khoa__than   { padding: 26px 28px; }
/* Trước có hai cột cách nhau bằng vách "hoặc" — cột kia là đăng nhập Google, đã gỡ */
.khoa__cot    { display: block; }
.khoa__loi {
  background: var(--do-mo); color: var(--do); border-left: 4px solid var(--do);
  border-radius: var(--bo-nho); padding: 10px 14px; font-size: 13.5px; font-weight: 600; margin-bottom: 14px;
}
.khoa__gc { font-size: 12.5px; color: var(--chu-mo); margin-top: 14px; line-height: 1.55; }
.khoa__gc b { color: var(--chu-nhat); }
.ghinho { display: flex; align-items: center; gap: 8px; font-size: 13.5px; margin: 4px 0 12px; }
.ghinho input { width: auto; }

.nguoidung {
  display: flex; align-items: center; gap: 9px;
  padding: 4px 11px 4px 4px; border: 1px solid var(--vien); border-radius: 24px;
  background: var(--nen-the); cursor: pointer; font: inherit; color: var(--chu); max-width: 210px;
}
.nguoidung:hover { background: var(--nen-nhe); }
.nguoidung__avatar {
  width: 30px; height: 30px; border-radius: 50%; flex-shrink: 0;
  background: linear-gradient(135deg, var(--ngoc), var(--ngoc-nhat));
  color: #fff; display: grid; place-items: center; font-weight: 800; font-size: 13px;
}
.nguoidung__chu   { display: flex; flex-direction: column; line-height: 1.2; overflow: hidden; }
.nguoidung__ten   { font-size: 13px; font-weight: 700; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.nguoidung__vaitro{ font-size: 10.5px; color: var(--chu-mo); }
.panel--hep { width: 250px; }
.panel__nguoi { padding: 14px 15px; border-bottom: 1px solid var(--vien); }
.panel__nut   { display: flex; flex-direction: column; padding: 7px; gap: 2px; }
.panel__nut button {
  text-align: left; padding: 9px 12px; border: none; background: none; border-radius: var(--bo-nho);
  font: inherit; font-size: 13.5px; cursor: pointer; color: var(--chu);
}
.panel__nut button:hover { background: var(--nen-nhe); }
.panel__nut button.thoat { color: var(--do); font-weight: 600; }

/* Dải nhắc phải cho chữ chảy bình thường: trước đây dùng flex nên mọi <b> và
   <br> bên trong biến thành flex-item riêng, câu bị ngắt vụn và dấu chấm rơi
   xuống đầu dòng. Dùng block + float cho nút để chữ liền mạch mà nút vẫn nằm phải. */
.dai {
  display: block;
  padding: 11px 16px; border-radius: var(--bo); margin-bottom: 18px;
  font-size: 13.5px; font-weight: 600; line-height: 1.65;
}
.dai::after { content: ""; display: block; clear: both; }
.dai--tin     { background: var(--ngoc-mo);  color: var(--ngoc); border-left: 4px solid var(--ngoc); }
.dai--canhbao { background: var(--cam-mo);   color: #9A4310;     border-left: 4px solid var(--cam); }
.dai--nguy    { background: var(--do-mo);    color: var(--do);   border-left: 4px solid var(--do); }
:root[data-theme="dark"] .dai--canhbao { color: var(--cam); }
.dai .nut { float: right; margin: -2px 0 6px 14px; }

.nut[disabled], .nut:disabled { opacity: .4; cursor: not-allowed; pointer-events: auto; }

/* ================================ 24. Chip giờ hẹn ================================ */
.chip-hang { display: flex; flex-wrap: wrap; gap: 7px; align-items: center; }
.chip {
  padding: 7px 14px; border: 1px solid var(--vien-dam); border-radius: 20px;
  background: var(--nen-the); color: var(--chu-nhat);
  font: inherit; font-size: 13px; font-weight: 600; cursor: pointer; white-space: nowrap;
}
.chip:hover { border-color: var(--ngoc); color: var(--ngoc); }
.chip.chon  { background: var(--ngoc); border-color: var(--ngoc); color: #fff; }
:root[data-theme="dark"] .chip.chon { color: #20180A; }
.chip--nhat { background: var(--nen-nhe); }
.chip-gc { font-size: 12.5px; color: var(--chu-mo); margin-top: 7px; }
/* Ô danh sách dạng nút (Cài đặt: đơn vị tính, danh mục, bộ phận). ✕ chỉ hiện
   khi rê chuột — máy cảm ứng không có rê chuột thì ✕ luôn hiện. */
.chip-o { display: flex; flex-wrap: wrap; gap: 7px; align-items: center; margin-bottom: 6px; }
.chip--xoa { position: relative; cursor: default; padding-right: 14px; }
.chip__x {
  display: none; margin-left: 6px; border: 0; background: none; padding: 0 2px;
  font: inherit; font-weight: 700; color: var(--do); cursor: pointer; line-height: 1;
}
.chip--xoa:hover .chip__x, .chip--xoa:focus-within .chip__x { display: inline; }
@media (hover: none) { .chip__x { display: inline; } }
.chip-o__them { width: auto; min-width: 150px; max-width: 220px; }
.nhan-hen {
  display: inline-block; font-size: 10.5px; font-weight: 700; padding: 1px 7px;
  border-radius: 10px; background: var(--cam-mo); color: #9A4310; margin-left: 5px;
}
:root[data-theme="dark"] .nhan-hen { color: var(--cam); }

/* ================================ 25. Tab Biểu đồ ================================ */
.bd__dau { display: flex; justify-content: space-between; align-items: flex-start; gap: 12px; margin-bottom: 12px; }
.bd__mo  { font-size: 12.5px; color: var(--chu-mo); margin-top: 2px; }
.bd__nut { display: flex; gap: 5px; flex-shrink: 0; }
.bd__ve  { overflow-x: auto; }
.bd__bang{ margin-top: 13px; }
.bd__rong{ text-align: center; color: var(--chu-mo); padding: 32px 12px; font-size: 13.5px; }
.bd-luoi { display: grid; grid-template-columns: repeat(2, 1fr); gap: 16px; align-items: start; }
.bd-luoi > * { min-width: 0; }
.thanh-bd {
  display: flex; gap: 9px; flex-wrap: wrap; align-items: center;
  padding: 13px 16px; background: var(--nen-the); border: 1px solid var(--vien);
  border-radius: var(--bo); margin-bottom: 18px; position: sticky; top: calc(var(--cao-dieu-huong, 62px) + 4px); z-index: 20;
}
/* Vạch ngăn mảnh giữa hai cụm nút trên cùng một hàng (hành trình | Ưu tiên, Nợ xấu). */
.thanh-bd__vach { width: 1px; align-self: stretch; min-height: 24px; background: var(--vien-dam); margin: 0 2px; }
.thanh-bd select, .thanh-bd input {
  padding: 7px 11px; font: inherit; font-size: 13.5px;
  border: 1px solid var(--vien-dam); border-radius: var(--bo-nho);
  background: var(--nen-the); color: var(--chu);
}
.kpi-hang { display: grid; grid-template-columns: repeat(4, 1fr); gap: 13px; margin-bottom: 18px; }

@media (max-width: 900px) {
  .bd-luoi { grid-template-columns: 1fr; }
  .kpi-hang { grid-template-columns: repeat(2, 1fr); }
  .nguoidung__chu { display: none; }
  .nguoidung { padding: 4px; border-radius: 50%; }
  .thanh-bd { position: static; }
}

@media print {
  .thanh-bd, .bd__nut, .dai, .khoa { display: none !important; }
  .bd-luoi { grid-template-columns: 1fr; }
  .bd { break-inside: avoid; page-break-inside: avoid; border-color: #ccc; }
  .lv-noi > div { display: block !important; }
}

/* ================================ 26. Màn hình đăng nhập toàn trang ================================ */
.man-dn {
  display: none;
  position: fixed; inset: 0; z-index: 300;
  background:
    radial-gradient(1100px 520px at 12% -10%, rgba(196,236,132,.34), transparent 60%),
    radial-gradient(900px 460px at 100% 110%, rgba(124,179,66,.38), transparent 62%),
    linear-gradient(150deg, var(--ngoc-nhat) 0%, var(--ngoc) 55%, color-mix(in srgb, var(--ngoc) 74%, #000) 100%);
  overflow: auto; padding: 26px 16px;
}
.man-dn__hop {
  max-width: 780px; margin: min(6vh, 60px) auto;
  background: var(--nen-the); border-radius: 16px;
  box-shadow: 0 24px 70px rgba(6,44,22,.42); overflow: hidden;
}

/* Trước khi đăng nhập: khoá toàn bộ nội dung bên trong */
body.chua-dang-nhap { overflow: hidden; }
body.chua-dang-nhap .man-dn { display: block; }
body.chua-dang-nhap > .dieuhuong,
body.chua-dang-nhap > section,
body.chua-dang-nhap > footer,
body.chua-dang-nhap > .khung-toast { display: none !important; }

/* ================================ 27. Thanh nav trên màn hình hẹp ================================ */
.dieuhuong__trong > .logo { min-width: 0; }
.logo__chu { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

@media (max-width: 560px) {
  .dieuhuong__trong { gap: 8px; padding: 0 12px; }
  .logo__chu   { max-width: 40vw; font-size: 14px; }
  .logo__phu   { display: none; }
  .nut-tron    { width: 34px; height: 34px; font-size: 15px; }
  .dh-phai     { gap: 5px; }
  #nutTheme    { display: none; }        /* chuyển sáng/tối nằm trong menu người dùng */
  .nguoidung__avatar { width: 28px; height: 28px; font-size: 11px; }
  .boc         { padding: 0 14px; }
}

/* ================================ 28. Phạm vi giao diện theo vai trò ================================ */
/* Tài khoản nhân viên chỉ thấy phần phục vụ công việc hàng ngày: không có tab Nhân sự
   và Cài đặt, không có hướng dẫn hạ tầng, không có liên kết tới file dữ liệu gốc. */
body.vai-nhanvien #cai-dat-hd,
body.vai-nhanvien #chanTaiLieu,

/* ================================ 29. Sóng uốn lượn xanh lá – trắng ================================
   Nền trắng ngả xanh, các dải sóng mềm ngăn giữa các phần. Sóng vẽ bằng SVG nhúng
   thẳng trong CSS nên không cần file ảnh, không tải thêm gì từ mạng. */

/* Nền trang để trơn: các dải sóng nằm ở hero, ranh giới section và chân trang.
   (Đã thử lát hoạ tiết sóng lặp lên toàn bộ body — trang cao ~10.000px nên trình duyệt
   phải vẽ lại một ảnh nền rất lớn và có lúc mất khung hình; bỏ đi cho chắc.) */
body { background-color: var(--nen); }

/* Vệt xanh mềm ở đầu mỗi phần nền màu, cho đỡ phẳng */
.section:not(.section--nhe) {
  background-image: radial-gradient(1100px 220px at 50% -60px, rgba(124,179,66,.10), transparent 70%);
}


/* --- Hai lớp sóng khép đáy khối hero: một lớp mờ phía sau, một lớp trắng phía trước --- */
.hero { padding-bottom: 130px; }

.hero::after {            /* lớp sóng mờ, lệch pha để tạo chiều sâu */
  content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 132px;
  background: rgba(255,255,255,.16); z-index: 1; pointer-events: none;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 140' preserveAspectRatio='none'%3E%3Cpath d='M0,96 C200,26 380,124 620,86 C880,44 1080,128 1440,64 L1440,140 L0,140 Z' fill='%23000'/%3E%3C/svg%3E") no-repeat center/100% 100%;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 140' preserveAspectRatio='none'%3E%3Cpath d='M0,96 C200,26 380,124 620,86 C880,44 1080,128 1440,64 L1440,140 L0,140 Z' fill='%23000'/%3E%3C/svg%3E") no-repeat center/100% 100%;
}

.hero::before {           /* lớp sóng chính, cùng màu với phần nội dung bên dưới */
  content: ''; position: absolute; left: 0; right: 0; bottom: -1px; height: 104px;
  background: var(--nen-the); z-index: 2; pointer-events: none;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 120' preserveAspectRatio='none'%3E%3Cpath d='M0,74 C180,10 400,118 660,72 C920,26 1140,116 1440,52 L1440,120 L0,120 Z' fill='%23000'/%3E%3C/svg%3E") no-repeat center/100% 100%;
          mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 120' preserveAspectRatio='none'%3E%3Cpath d='M0,74 C180,10 400,118 660,72 C920,26 1140,116 1440,52 L1440,120 L0,120 Z' fill='%23000'/%3E%3C/svg%3E") no-repeat center/100% 100%;
}

/* Section ngay dưới hero đã được sóng của hero khép rồi, không cần sóng trên nữa */
.hero + .section--nhe::before { display: none; }

/* --- Các section trắng nổi lên trên nền sóng, mép trên/dưới uốn lượn nhẹ --- */
.section--nhe {
  position: relative;
  background: var(--nen-the);
  border-top: 1px solid var(--vien);
  border-bottom: 1px solid var(--vien);
}
.section--nhe::before,
.section--nhe::after {
  content: ''; position: absolute; left: 0; right: 0; height: 26px;
  background: var(--nen-the); pointer-events: none;
}
.section--nhe::before {
  top: -25px;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 26' preserveAspectRatio='none'%3E%3Cpath d='M0,18 C260,-2 460,26 720,14 C980,2 1200,24 1440,10 L1440,26 L0,26 Z' fill='%23000'/%3E%3C/svg%3E") no-repeat center/100% 100%;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 26' preserveAspectRatio='none'%3E%3Cpath d='M0,18 C260,-2 460,26 720,14 C980,2 1200,24 1440,10 L1440,26 L0,26 Z' fill='%23000'/%3E%3C/svg%3E") no-repeat center/100% 100%;
}
.section--nhe::after {
  bottom: -25px;
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 26' preserveAspectRatio='none'%3E%3Cpath d='M0,8 C260,28 460,0 720,12 C980,24 1200,2 1440,16 L1440,0 L0,0 Z' fill='%23000'/%3E%3C/svg%3E") no-repeat center/100% 100%;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 26' preserveAspectRatio='none'%3E%3Cpath d='M0,8 C260,28 460,0 720,12 C980,24 1200,2 1440,16 L1440,0 L0,0 Z' fill='%23000'/%3E%3C/svg%3E") no-repeat center/100% 100%;
}

/* --- Sóng dẫn vào chân trang --- */
.chan { position: relative; margin-top: 64px; }
.chan::before {
  content: ''; position: absolute; left: 0; right: 0; top: -47px; height: 48px;
  background: color-mix(in srgb, var(--ngoc) 88%, #000);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 48' preserveAspectRatio='none'%3E%3Cpath d='M0,34 C240,2 460,46 720,26 C980,6 1220,44 1440,20 L1440,48 L0,48 Z' fill='%23000'/%3E%3C/svg%3E") no-repeat center/100% 100%;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 48' preserveAspectRatio='none'%3E%3Cpath d='M0,34 C240,2 460,46 720,26 C980,6 1220,44 1440,20 L1440,48 L0,48 Z' fill='%23000'/%3E%3C/svg%3E") no-repeat center/100% 100%;
}
:root[data-theme="dark"] .chan::before { background: #1C1408; }

/* --- Sóng trên màn hình đăng nhập --- */
.man-dn::before {
  content: ''; position: absolute; left: 0; right: 0; bottom: 0; height: 34vh;
  background-image:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1440 320' preserveAspectRatio='none'%3E%3Cpath fill='%23ffffff' fill-opacity='.10' d='M0,176 C240,96 420,256 720,192 C1020,128 1200,256 1440,176 L1440,320 L0,320 Z'/%3E%3Cpath fill='%23ffffff' fill-opacity='.08' d='M0,240 C260,176 480,288 720,240 C960,192 1200,288 1440,232 L1440,320 L0,320 Z'/%3E%3C/svg%3E");
  background-size: 100% 100%; background-repeat: no-repeat;
  pointer-events: none;
}
.man-dn__hop { position: relative; z-index: 1; }
.khoa__dau { position: relative; overflow: hidden; }
.khoa__dau::after {
  content: ''; position: absolute; left: 0; right: 0; bottom: -1px; height: 22px;
  background: var(--nen-the);
  -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 600 22' preserveAspectRatio='none'%3E%3Cpath d='M0,14 C120,-2 220,20 300,12 C380,4 500,20 600,8 L600,22 L0,22 Z' fill='%23000'/%3E%3C/svg%3E") no-repeat center/100% 100%;
  mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 600 22' preserveAspectRatio='none'%3E%3Cpath d='M0,14 C120,-2 220,20 300,12 C380,4 500,20 600,8 L600,22 L0,22 Z' fill='%23000'/%3E%3C/svg%3E") no-repeat center/100% 100%;
}

/* Khu vực làm việc để nền trong suốt cho sóng lộ ra */
.lamviec { background: transparent; }

@media (prefers-reduced-motion: no-preference) {
  .hero__nhan { animation: noiLen .6s ease-out both; }
}
@keyframes noiLen { from { opacity: 0; transform: translateY(8px); } }

/* ================================ 30. Nhân viên: chỉ có bảng làm việc ================================
   Đăng nhập xong là vào thẳng việc — phần giới thiệu quy trình, hero, tra cứu, FAQ đều
   ẩn đi. Nhân viên cần chỗ nhập liệu, không cần đọc lại quy trình mỗi lần mở máy. */
/* Đăng nhập xong là vào thẳng bảng làm việc — đúng với MỌI vai trò, không riêng
   nhân viên. Phần giới thiệu quy trình chỉ dành cho người chưa đăng nhập. */
body.chi-bang-lam-viec > .hero,
body.chi-bang-lam-viec > section:not(#lam-viec) { display: none !important; }

body.chi-bang-lam-viec .menu,
body.chi-bang-lam-viec .nut-menu,
body.chi-bang-lam-viec #nutVaoLamViec { display: none !important; }

body.chi-bang-lam-viec #lam-viec { padding-top: 26px; }
body.chi-bang-lam-viec .dieuhuong__trong .dh-phai { margin-left: auto; }
body.chi-bang-lam-viec .chan { margin-top: 32px; }
body.chi-bang-lam-viec .chan__luoi { grid-template-columns: 1fr; }

/* ───── ĐĂNG NHẬP RỒI THÌ DÙNG HẾT BỀ NGANG MÀN HÌNH ─────
   Khung chung 1180px là bề rộng của một trang GIỚI THIỆU — dòng chữ dài quá
   thì mắt mất dòng. Nhưng đăng nhập xong thì mọi section giới thiệu đã ẩn
   (luật ngay trên), cái còn lại là BẢNG: đơn hàng, tờ lịch xưởng, danh sách
   khách. Bảng thì càng rộng càng đọc được nhiều cột mà không phải cuộn ngang,
   nên bó nó vào 1180px là bỏ không một phần ba màn hình PC.

   Nới CẢ thanh điều hướng, không riêng phần thân: để một thanh 1180px nằm trên
   một cái bảng 2500px thì logo trôi vào giữa trời, mép trái hai bên lệch nhau
   trông như trang bị hỏng.

   KHÔNG chạm .boc của người CHƯA đăng nhập — trang giới thiệu vẫn 1180px như
   cũ, vì ở đó chữ mới là nội dung chính.

   Điện thoại và máy tính bảng không đổi gì: max-width vốn đã không phải thứ bó
   chúng (màn hẹp hơn 1180px rồi), phần lề hai bên vẫn do .boc giữ, và bảng nào
   quá khổ thì .bang-boc cuộn ngang trong lòng nó như trước. */
body.chi-bang-lam-viec .boc,
body.chi-bang-lam-viec .dieuhuong__trong { max-width: none; }

/* Chữ mô tả đầu mỗi bảng vẫn phải giữ độ dài dòng đọc được — rộng ra là để
   cho BẢNG, không phải để kéo một câu văn dài suốt 2500px. */
body.chi-bang-lam-viec .hop-lon__dau p { max-width: 96ch; }

/* ================================ 31. Ô tìm khách hàng ================================
   Tên khách trùng nhau được, nên mỗi dòng gợi ý phải hiện kèm số điện thoại và mã KH
   thì người nhập mới phân biệt nổi hai người cùng tên. */

.timkh            { position: relative; min-width: 0; }
.timkh > input    { width: 100%; }

.timkh__ds {
  position: absolute; z-index: 40; top: calc(100% + 4px); left: 0; right: 0;
  max-height: 288px; overflow-y: auto;
  background: var(--nen-the); border: 1px solid var(--vien-dam);
  border-radius: var(--bo); box-shadow: var(--bong-cao);
}

.timkh__dong {
  padding: 9px 12px; cursor: pointer;
  border-bottom: 1px solid var(--vien);
}
.timkh__dong:last-child { border-bottom: 0; }
.timkh__dong:hover,
.timkh__dong--sang      { background: var(--nen-nhe); }

.timkh__ten  { font-weight: 600; color: var(--chu); display: flex; align-items: center; gap: 7px; flex-wrap: wrap; }
.timkh__phu  { font-size: 12px; color: var(--chu-nhat); margin-top: 3px;
               display: flex; align-items: center; gap: 6px; flex-wrap: wrap; }

.timkh__dong--moi       { background: var(--xanhla-mo); }
.timkh__dong--moi:hover,
.timkh__dong--moi.timkh__dong--sang { background: var(--xanhla-mo); filter: brightness(.97); }

.timkh__trong { padding: 12px; font-size: 13px; color: var(--chu-mo); }

/* Dải trả lời ngay "khách này đã có chưa" khi gõ số điện thoại */
.timkh__bang {
  padding: 8px 12px; font-size: 12.5px;
  border-bottom: 1px solid var(--vien);
  position: sticky; top: 0; z-index: 1;
}
.timkh__bang--cu  { background: var(--xanhla-mo); color: var(--chu); }
.timkh__bang--moi { background: var(--cam-mo, var(--nen-nhe)); color: var(--chu); }

/* Danh sách năm trạng thái trong hộp đổi trạng thái */
.ds-tt { display: flex; flex-direction: column; gap: 6px; }

.ds-tt__dong {
  display: flex; align-items: flex-start; gap: 10px;
  padding: 10px 12px; cursor: pointer;
  border: 1px solid var(--vien); border-radius: 10px;
  background: var(--nen-the);
}
.ds-tt__dong:hover           { border-color: var(--vien-dam); background: var(--nen-nhe); }
.ds-tt__dong input           { width: auto; margin-top: 3px; flex: none; }
.ds-tt__dong--dang           { background: var(--nen-nhe); border-color: var(--vien-dam); }
/* Chặng đi ngược: vẫn đọc được để biết nó tồn tại, nhưng không bấm được. */
.ds-tt__dong--khoa           { opacity: .5; cursor: not-allowed; }
.ds-tt__dong--khoa:hover     { border-color: var(--vien); background: transparent; }
.ds-tt__dong:has(input:checked) { border-color: var(--chinh, var(--vien-dam)); box-shadow: 0 0 0 2px var(--xanhla-mo); }

/* Ô hành động của bảng Danh sách KH: 5 nút, cho xuống 2-3 hàng thay vì xếp dọc 5 tầng */
.hang-nut--oviec {
  display: flex; flex-wrap: wrap; gap: 6px;
  min-width: 232px;
}
.hang-nut--oviec .nut { white-space: nowrap; }

/* ================================ 32. Bảng Danh sách KH gọn lại ================================
   Gộp 10 cột thành 5 để bảng vừa bề ngang màn hình. Mọi thông tin phụ (mã, số điện thoại,
   nguồn lead, số lần chăm sóc) xuống dòng nhỏ bên dưới giá trị chính của cùng ô. */

/* Dãy nút liên hệ một chạm dưới số điện thoại: gọi · Zalo · WhatsApp · SMS · Messenger.
   KHÔNG đặt tên .lh — lớp đó đã là thẻ lịch hẹn ở mục 14 phía trên, đè lên nó thì
   mọi thẻ lịch hẹn co lại thành ô vuông 26px và chồng lên nhau. */
/* Ô tích trên thẻ lịch hẹn. Thẻ không có cột đầu như bảng kẻ ô, nên ô tích
   nằm sát lề trái và tự giãn hết chiều cao để bấm vào đâu trong dải đó cũng
   được — thẻ cao gần 80px, một ô vuông 16px giữa lề là chỗ khó nhắm. */
.lh__tich {
  display: flex; align-items: center; padding-right: 4px; cursor: pointer;
}
.lh__tich input { width: 16px; height: 16px; cursor: pointer; }
/* Đã chọn thì thẻ đổi nền — nhìn cả danh sách là thấy ngay mình đang cầm
   những ai, không phải rà từng ô vuông. */
.lh--chon { background: var(--xanhla-mo); }
:root[data-theme="dark"] .lh--chon { background: rgba(74,124,16,.18); }

.lienhe { display: flex; gap: 4px; margin-top: 4px; flex-wrap: wrap; }
.lienhe__nut {
  display: inline-flex; align-items: center; justify-content: center;
  width: 26px; height: 26px; border-radius: 7px; font-size: 13px;
  text-decoration: none; border: 1px solid var(--vien);
  background: var(--nen-2); transition: transform .12s, border-color .12s;
}
/* Nút email lúc khách chưa có email là thẻ <button>, không phải <a> — phải tự
   khai mấy thứ trình duyệt vốn cho thẻ nút, nếu không nó lệch hẳn khỏi hàng. */
.lienhe__nut { padding: 0; font-family: inherit; cursor: pointer; }
/* Mờ = "chỗ này còn trống", chứ không phải "nút hỏng". Vẫn bấm được, và rê
   chuột vào thì title nói rõ bấm để làm gì. */
.lienhe__nut--mo { opacity: .4; }
.lienhe__nut--mo:hover { opacity: 1; }
.lienhe__nut:hover { transform: translateY(-1px); border-color: var(--chinh); }
.lienhe__nut:focus-visible { outline: 2px solid var(--chinh); outline-offset: 2px; }

/* Biểu đồ ngang: mất đơn vì đâu */
.cot-lost { display: flex; flex-direction: column; gap: 8px; }
.cot-lost__dong {
  display: grid; grid-template-columns: minmax(130px, 1fr) 2fr auto;
  gap: 10px; align-items: center;
}
.cot-lost__ten { font-size: 13px; }
.cot-lost__thanh { height: 14px; border-radius: 7px; background: var(--nen-2); overflow: hidden; }
.cot-lost__thanh span { display: block; height: 100%; border-radius: 7px; background: var(--do); }
.cot-lost__so { font-size: 13px; font-weight: 700; font-variant-numeric: tabular-nums; }
@media (max-width: 640px) {
  .cot-lost__dong { grid-template-columns: 1fr auto; }
  .cot-lost__thanh { grid-column: 1 / -1; }
}

.o-kh__phu {
  font-size: 12px; color: var(--chu-mo); margin-top: 2px;
  overflow-wrap: anywhere;
}
.o-kh__nhan { display: flex; flex-wrap: wrap; gap: 4px; margin-top: 5px; }
.o-kh       { min-width: 146px; }

/* Ô khách hàng bố trí gọn (06/10): tên + mã một dòng; số điện thoại + nút liên hệ một hàng;
   báo giá · nguồn · sản phẩm gộp một dòng. Nút liên hệ giữ cỡ cũ (điện thoại to hơn ở luật riêng). */
.o-kh__ten { display: flex; flex-wrap: wrap; align-items: baseline; gap: 0 6px; }
.o-kh__ma  { font-size: 12px; color: var(--chu-mo); }
.o-kh__lh  { display: flex; flex-wrap: wrap; align-items: center; gap: 2px 8px; margin-top: 2px;
             font-size: 12px; color: var(--chu-mo); }
.o-kh__lh .lienhe { margin-top: 0; gap: 3px; }
.o-kh__gop { overflow-wrap: anywhere; }

/* Cột hành động: ở màn hình hẹp bỏ chữ, chỉ còn biểu tượng — vẫn đủ nghĩa nhờ title */
@media (max-width: 900px) {
  .hang-nut--oviec { min-width: 0; gap: 4px; }
  .hang-nut--oviec .nut { padding: 6px 9px; }
  .hang-nut--oviec .nut .chu-nut { display: none; }
}

/* Màn hình hẹp: bóp ô bảng lại một chút để bảng vẫn vừa khung, khỏi kéo ngang */
@media (max-width: 900px) {
  table.bang th, table.bang td { padding-left: 9px; padding-right: 9px; }
}

/* Cột "Đã mua": con số là chính, tiền và ngày mua gần nhất chỉ là chú thích */
.o-mua        { white-space: nowrap; }
.o-mua b      { font-size: 16px; }
.o-mua .o-kh__phu { text-align: right; }

/* Màn hình hẹp: cột "Đã mua" chỉ giữ con số, bỏ tiền và ngày mua gần nhất
   — hai dòng đó là chú thích, không đáng để cả bảng phải kéo ngang */
@media (max-width: 980px) {
  .o-mua .o-kh__phu { display: none; }
  .o-mua b          { font-size: 14px; }
  .o-kh             { min-width: 116px; }
}

/* ================================ 33. Thẻ báo cáo từng nhân viên ================================ */

.the-nv-luoi {
  display: grid; gap: 14px;
  grid-template-columns: repeat(auto-fill, minmax(268px, 1fr));
}

.the-nv {
  border: 1px solid var(--vien); border-radius: var(--bo);
  background: var(--nen-the); padding: 15px 16px; box-shadow: var(--bong);
}

.the-nv__dau {
  display: flex; align-items: flex-start; justify-content: space-between;
  gap: 10px; margin-bottom: 12px;
}
.the-nv__dau b { font-size: 15px; }

.the-nv__so { display: grid; grid-template-columns: repeat(4, 1fr); gap: 8px; }
.the-nv__o   { text-align: center; }
.the-nv__ten { font-size: 11px; color: var(--chu-mo); line-height: 1.3; }
.the-nv__gt  { font-size: 19px; font-weight: 700; font-variant-numeric: tabular-nums; }

/* Thanh so sánh nhịp làm việc giữa các nhân viên trong cùng một kỳ */
.the-nv__thanh {
  height: 5px; border-radius: 3px; background: var(--vien);
  margin: 12px 0 10px; overflow: hidden;
}
.the-nv__thanh span { display: block; height: 100%; background: var(--xanhla); }

.the-nv__chan {
  display: flex; flex-direction: column; gap: 3px;
  font-size: 12px; color: var(--chu-nhat);
}

/* Đã đăng nhập thì chân trang không cần giới thiệu lại trang là gì, và nhất là
   không nên nói dữ liệu đang nằm ở đâu — đó là việc của admin trong ⚙️ Cài đặt */
body.chi-bang-lam-viec .chan__luoi    { grid-template-columns: repeat(auto-fit, minmax(200px, 1fr)); }

/* Hàng tab giấu hay hiện do apDungPhamViGiaoDien() quyết, theo SỐ TAB ĐANG
   HIỆN — không theo vai trò.

   Chỗ này từng là "body.vai-cskh #lvTab { display: none !important }" với chú
   thích "CSKH chỉ có màn hình tiếp nhận". Điều đó đúng ở thời điểm viết, rồi
   phần JS mở thêm 📦 Đơn hàng, ⏰ Lịch hẹn và ba tab hậu mãi cho vai trò này,
   còn dòng CSS thì không ai gỡ. Hậu quả: tài khoản CSKH được cấp đủ ô tích
   nhưng không thấy một cái tab nào — vì cả hàng tab bị !important giấu đi, và
   không có gì trên màn hình nói vì sao.

   Bài học nằm ở chỗ luật được viết bằng VAI TRÒ. Vai trò đổi việc thì luật im
   lặng sai theo. Đếm số tab đang hiện thì không bao giờ lỗi thời. */

/* ================================ 34. Ma trận phân quyền ================================
   Hai mươi ô tích gom theo năm nhóm việc, nằm trong hộp cấp tài khoản. */

.quyen {
  margin-top: 18px; padding-top: 18px;
  border-top: 1px solid var(--vien);
}
.quyen__dau { margin: 0 0 4px; font-size: 15px; }
.quyen__nhom { margin-top: 16px; }
.quyen__ten {
  font-size: 12px; font-weight: 700; letter-spacing: .06em;
  text-transform: uppercase; color: var(--chu-mo); margin-bottom: 6px;
}
.quyen__dong {
  display: flex; gap: 10px; align-items: flex-start;
  padding: 8px 10px; border-radius: 9px; cursor: pointer;
  transition: background .12s;
}
.quyen__dong:hover { background: var(--nen-2); }
.quyen__dong input { margin-top: 3px; flex: none; }
.quyen__dong--khoa { opacity: .55; cursor: default; }
.quyen__dong--khoa:hover { background: none; }
/* Nhóm thu gọn (08/10): bấm dòng tên mở / thu, số "đã tích / tổng" ngay bên cạnh. */
.quyen__gon { margin-top: 8px; border: 1px solid var(--vien); border-radius: 10px; padding: 0 6px; }
.quyen__gon > summary.quyen__ten {
  cursor: pointer; list-style: none; margin: 0; padding: 10px 6px;
  display: flex; align-items: center; gap: 8px;
}
.quyen__gon > summary.quyen__ten::-webkit-details-marker { display: none; }
.quyen__gon > summary.quyen__ten::before { content: '▸'; font-size: 13px; transition: transform .12s; }
.quyen__gon[open] > summary.quyen__ten::before { transform: rotate(90deg); }
.quyen__gon[open] { padding-bottom: 6px; }
.quyen__gon > summary.quyen__ten:hover { color: var(--chu); }
.quyen__dem {
  margin-left: auto; font-size: 11px; letter-spacing: 0; text-transform: none;
  padding: 1px 8px; border-radius: 99px; background: var(--nen-nhe); color: var(--chu-mo);
  border: 1px solid var(--vien);
}
.quyen__dem--co { background: var(--ngoc-mo); color: var(--ngoc); border-color: var(--ngoc-nhat); font-weight: 700; }
.quyen__gon--con { margin: 6px 4px 0; }

/* 🏆 KPI · cửa sổ chấm sao (09/10): mỗi việc một hàng — tên + sao quan trọng | 6 nút ✕ ★★★★★ | ý nghĩa mức. */
.kpi-sao {
  display: grid; grid-template-columns: minmax(160px, 1.3fr) auto minmax(140px, 1fr);
  gap: 6px 12px; align-items: center; padding: 8px 4px; border-bottom: 1px solid var(--vien);
}
.kpi-sao__chon { display: flex; gap: 2px; }
.kpi-sao__nut {
  width: 34px; height: 34px; border: 1px solid var(--vien); border-radius: 8px; background: var(--nen-the);
  font-size: 18px; line-height: 1; color: var(--vien-dam); cursor: pointer; padding: 0;
}
.kpi-sao__nut--bat { color: var(--ngoc-nhat); background: var(--ngoc-mo); border-color: var(--ngoc-nhat); }
.kpi-sao__nut--0 { font-size: 13px; }
.kpi-sao__nut--0.kpi-sao__nut--bat { color: var(--do); background: var(--do-mo); border-color: var(--do); }
.kpi-sao__nut:disabled { cursor: default; }
.kpi-sao__muc { color: var(--chu-nhat); }
@media (max-width: 640px) {
  .kpi-sao { grid-template-columns: 1fr; }
}
/* 💡 Gợi ý hành động (09/10) — trong cửa sổ chấm và dưới bảng phiếu. */
.kpi-gy { margin-top: 14px; padding: 12px 14px; border: 1px solid var(--ngoc-nhat); border-radius: 12px; background: var(--ngoc-mo); }
.kpi-gy--phong > summary { cursor: pointer; font-weight: 700; margin-bottom: 6px; }
.kpi-gy__khoi { margin: 6px 0 8px; }
.kpi-gy__khoi ul { margin: 4px 0 0; padding-left: 20px; }
.kpi-gy__khoi li { margin: 2px 0; line-height: 1.45; }
/* 📋 KPI KD (09/10) — hộp sales bấm đúp + bảng đánh giá bày giống file Excel. */
.kd-the { cursor: pointer; user-select: none; }
.kd-the:hover, .kd-the:focus { outline: 2px solid var(--ngoc-nhat); outline-offset: 1px; }
.kd-bang table { width: 100%; border-collapse: collapse; font-size: 13px; }
.kd-bang th, .kd-bang td { border: 1px solid var(--vien-dam); padding: 4px 6px; vertical-align: middle; }
.kd-bang__dau { margin-bottom: 8px; background: var(--nen-nhe); }
.kd-bang__bang thead th { background: var(--ngoc-mo); text-align: center; font-weight: 700; }
.kd-bang__muc td { background: var(--nen-nhe); }
.kd-bang__tong td { background: var(--ngoc-mo); }
.kd-bang__m { text-align: center; color: var(--chu-mo); font-size: 12px; white-space: nowrap; }
.kd-bang__m--chon { background: var(--ngoc-mo); color: var(--ngoc); font-weight: 700; outline: 2px solid var(--ngoc-nhat); outline-offset: -2px; }
.kd-bang__kq { white-space: nowrap; }
/* 13/10 — KPI KD giống file mẫu: bốn mốc có màu, ô đạt tô đậm; chọn người + thanh T1–T12 + bảng hiện trong trang. */
.kd-bang__bang thead th.kd-m1, .kd-bang__m.kd-m1 { background: var(--do-mo); }
.kd-bang__bang thead th.kd-m2, .kd-bang__m.kd-m2 { background: var(--cam-mo); }
.kd-bang__bang thead th.kd-m3, .kd-bang__m.kd-m3 { background: var(--xanhduong-mo); }
.kd-bang__bang thead th.kd-m4, .kd-bang__m.kd-m4 { background: var(--xanhla-mo); }
.kd-bang__m--chon { outline: none; font-size: 13px; }
.kd-bang__m--chon.kd-m1 { background: var(--do); color: #fff; }
.kd-bang__m--chon.kd-m2 { background: var(--cam); color: #fff; }
.kd-bang__m--chon.kd-m3 { background: var(--xanhduong); color: #fff; }
.kd-bang__m--chon.kd-m4 { background: var(--xanhla); color: #fff; }
.kd-chonnv { margin: 4px 0 8px; }
.kd-nv { display: inline-flex; align-items: center; gap: 6px; }
.kd-nv__cham { width: 10px; height: 10px; border-radius: 50%; background: var(--vien-dam); flex: none; }
.kd-nv__cham--vuot { background: var(--xanhla); } .kd-nv__cham--dat { background: var(--xanhduong); }
.kd-nv__cham--can { background: var(--cam); } .kd-nv__cham--khong { background: var(--do); }
.kd-tbar { margin: 0 0 10px; align-items: center; gap: 6px; }
.kd-trong { padding: 10px 12px; border: 1px solid var(--vien); border-radius: 12px; background: var(--nen-the); }
.kd-chan { margin-top: 12px; justify-content: flex-end; }
.kd-o { display: block; width: 100%; min-width: 70px; margin-top: 3px; padding: 2px 4px; font-size: 12px; }
.kd-o--gc { min-width: 120px; }
.kd-kn { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 6px; }
.kd-kn__o { padding: 6px 8px; border: 1px solid var(--vien); border-radius: 8px; }
.kd-kn__o--hoc { border-color: var(--cam); background: var(--cam-mo); }
/* Biểu đồ LNG 12 tháng + bảng thưởng (bước 2). */
.kd-bd { display: block; width: 100%; height: 200px; margin: 4px 0; }
.kd-bd--nho { height: 46px; margin-top: 6px; }
.kd-bd__cot { fill: var(--vien-dam); }
.kd-bd__cot--nay { fill: var(--ngoc-nhat); }
.kd-bd__cot--kl { fill: var(--cam); }
.kd-bd__luoi { stroke: var(--vien); stroke-width: 1; }
.kd-bd__mt { stroke: var(--xanhla); stroke-width: 2; stroke-dasharray: 6 4; }
.kd-bd__kl { stroke: var(--do); stroke-width: 2; stroke-dasharray: 2 3; }
.kd-bd__chu { font-size: 11px; fill: var(--chu-mo); }
/* 🎯 Mục tiêu công ty đợt 1 (09/10) — ô nhập số nền, ô bắt buộc còn trống viền đỏ, dòng ↳ App mờ, thẻ 4 con số. */
.mtct-o { width: 84px; padding: 3px 5px; font-size: 12.5px; text-align: right; border: 1px solid var(--vien-dam); border-radius: 6px; background: var(--nen-the); color: inherit; }
.mtct-o--thieu { border: 2px solid var(--do); background: var(--do-mo); }
.mtct-o::placeholder { color: var(--chu-mo); }
.mtct-bang td, .mtct-bang th { white-space: nowrap; }
.mtct-app td { font-size: 11.5px; color: var(--chu-mo); border-top: 0; }
.mtct-coChai td { background: var(--do-mo); }
.mtct-chon td { background: var(--ngoc-mo); }
.mtct-tt td { background: var(--ngoc-mo); }
.mtct-nay td { outline: 1px dashed var(--ngoc-nhat); }
.mtct-vao { display: flex; flex-wrap: wrap; gap: 10px 18px; align-items: flex-end; margin: 6px 0 10px; }
.mtct-vao label { display: flex; flex-direction: column; gap: 4px; font-weight: 600; font-size: 13px; }
.mtct-vao .mtct-o { width: auto; min-width: 90px; text-align: left; font-size: 14px; padding: 6px 8px; }
.mtct-the-hang { display: grid; grid-template-columns: repeat(auto-fit, minmax(190px, 1fr)); gap: 10px; margin: 12px 0; }
.mtct-the { padding: 10px 12px; border: 1px solid var(--vien); border-radius: 12px; background: var(--nen-the); }
.mtct-the__ten { font-size: 12.5px; color: var(--chu-mo); }
.mtct-the__so { font-size: 20px; font-weight: 700; margin: 2px 0; }
.mtct-the__phu { font-size: 12px; color: var(--chu-mo); }
/* 🏪 KPP (10/10) — phiếu đánh giá bày giống bảng slide 5 GDKPP. */
.kpp-phieu { width: 100%; border-collapse: collapse; font-size: 13px; }
.kpp-phieu th, .kpp-phieu td { border: 1px solid var(--vien-dam); padding: 4px 6px; vertical-align: middle; }
.kpp-phieu thead th { background: var(--ngoc-mo); text-align: center; }
.kpp-phieu select.mtct-o--thieu { border: 2px solid var(--do); background: var(--do-mo); }
.kpp-o { width: 100%; min-width: 150px; padding: 3px 5px; font-size: 12.5px; border: 1px solid var(--vien-dam); border-radius: 6px; background: var(--nen-the); color: inherit; }
.kpp-10 { margin: 0; padding-left: 22px; }
.kpp-10 li { margin: 4px 0; }
.kpp-10--dang { font-weight: 700; color: var(--ngoc); }
/* 📈 Marketing ROI (09/10) — cột nhập trái, kết quả phải; điện thoại xếp dọc. */
.mr-khung { display: grid; grid-template-columns: minmax(260px, 340px) 1fr; gap: 18px; align-items: start; }
@media (max-width: 860px) { .mr-khung { grid-template-columns: 1fr; } }
.mr-vao h4 { margin: 10px 0 4px; }
.mr-o { margin: 6px 0; }
.mr-o label { display: block; font-size: 13px; font-weight: 600; }
.mr-o__hang { display: flex; gap: 8px; align-items: center; }
.mr-o__hang .mtct-o { width: 130px; flex: none; }
.mr-o__hang input[type=range] { flex: 1; min-width: 80px; }
.mr-tong { margin: 6px 0; font-size: 13px; }
.mr-the--to .mtct-the__so { font-size: 26px; }
.mr-the--lai { border-color: var(--xanhla); background: var(--xanhla-mo); }
.mr-the--lai .mtct-the__so { color: var(--xanhla); }
.mr-the--lo { border-color: var(--do); background: var(--do-mo); }
.mr-the--lo .mtct-the__so { color: var(--do); }
.mr-nguoc { padding: 10px 12px; border: 1px solid var(--ngoc-nhat); border-radius: 10px; background: var(--ngoc-mo); margin-bottom: 8px; }
.mr-bd-hang { display: grid; grid-template-columns: 3fr 2fr; gap: 12px; }
@media (max-width: 640px) { .mr-bd-hang { grid-template-columns: 1fr; } }
.mr-bd { display: block; width: 100%; height: auto; }
.mr-bd__dt { stroke: var(--ngoc-nhat); stroke-width: 2.5; }
.mr-bd__cp { stroke: var(--do); stroke-width: 2.5; }
.mr-bd__dk { stroke: var(--chu-mo); stroke-width: 1; stroke-dasharray: 4 3; }
.mr-bd__hv { fill: var(--cam); }
.mr-bd__cot--dt { fill: var(--ngoc-nhat); }
.mr-bd__cot--cp { fill: var(--do); }
.mr-bd__cot--lai { fill: var(--xanhla); }
.mr-bd__cot--lo { fill: var(--do); opacity: .6; }
.mr-cg { display: inline-block; width: 12px; height: 3px; margin: 0 4px 3px 10px; vertical-align: middle; }
.mr-cg--dt { background: var(--ngoc-nhat); } .mr-cg--cp { background: var(--do); } .mr-cg--hv { background: var(--cam); height: 8px; border-radius: 50%; width: 8px; }
/* 💹 Tài chính (13/10) — bảng Lời–Lỗ: cột tên dính trái, mỗi ô 3 dòng (kế hoạch / thực tế / năm trước), ô lệch tô đỏ. */
.tcp-boc { overflow-x: auto; }
.tcp-bang { border-collapse: separate; border-spacing: 0; font-size: 12.5px; min-width: 100%; }
.tcp-bang th, .tcp-bang td { border-bottom: 1px solid var(--vien); padding: 4px 6px; white-space: nowrap; background: var(--nen-the); }
.tcp-bang thead th { position: sticky; top: 0; background: var(--ngoc); color: #fff; font-weight: 600; text-align: center; z-index: 2; }
:root[data-theme="dark"] .tcp-bang thead th { color: #20180A; }
.tcp-bang thead th.tcp-nay { outline: 2px solid var(--cam); outline-offset: -2px; }
.tcp-bang .tcp-ten { position: sticky; left: 0; z-index: 1; min-width: 210px; max-width: 260px; white-space: normal; font-weight: 600; }
.tcp-bang thead .tcp-ten { z-index: 3; text-align: left; }
.tcp-loai { text-align: center; }
.tcp-o { text-align: right; vertical-align: top; min-width: 92px; }
.tcp-kh { font-weight: 600; }
.tcp-tt { color: var(--ngoc); }
.tcp-nt { font-size: 11px; color: var(--chu-mo); min-height: 13px; }
.tcp-ptd { font-size: 10.5px; color: var(--chu-mo); }
.tcp-xau, .tcp-bang tr td.tcp-xau { background: var(--do-mo); }
.tcp-xau .tcp-tt { color: var(--do); font-weight: 700; }
.tcp-nam { border-left: 2px solid var(--vien-dam); }
.tcp-dau td { background: var(--nen-nhe); font-weight: 700; color: var(--ngoc); letter-spacing: .3px; position: sticky; left: 0; }
.tcp-tong td { background: var(--ngoc-mo); font-weight: 700; }
.tcp-to td { background: var(--xanhla-mo); font-weight: 800; font-size: 13.5px; }
.tcp-pt td { font-style: italic; }
.tcp-in { width: 96px; }
.tcp-the--xau { border-color: var(--do); }
.tcp-bd-hang { display: grid; grid-template-columns: 1fr 1fr; gap: 14px; margin: 12px 0; }
@media (max-width: 860px) { .tcp-bd-hang { grid-template-columns: 1fr; } }
.tcp-bd-khung { padding: 10px 12px; border: 1px solid var(--vien); border-radius: 12px; background: var(--nen-the); min-width: 0; }
.tcp-bd { display: block; width: 100%; height: auto; }
.tcp-bd__kh { fill: var(--vien-dam); }
.tcp-bd__tt { fill: var(--ngoc-nhat); }
.tcp-bd__0 { stroke: var(--chu-mo); stroke-width: 1; }
.tcp-bd__l--lr, .tcp-bd__l--lrkh { stroke: var(--xanhla); stroke-width: 2.2; }
.tcp-bd__l--lg, .tcp-bd__l--lgkh { stroke: var(--cam); stroke-width: 2.2; }
.tcp-bd__l--lrkh, .tcp-bd__l--lgkh { stroke-dasharray: 5 4; stroke-width: 1.6; }
.tcp-bd__d--lr, .tcp-bd__d--lrkh { fill: var(--xanhla); }
.tcp-bd__d--lg, .tcp-bd__d--lgkh { fill: var(--cam); }
.tcp-cg { display: flex; flex-wrap: wrap; gap: 4px 14px; margin-top: 4px; color: var(--chu-mo); }
.tcp-cg__c { display: inline-block; width: 10px; height: 10px; border-radius: 2px; margin-right: 5px; vertical-align: -1px; }
.tcp-cg__c.tcp-bd__kh { background: var(--vien-dam); } .tcp-cg__c.tcp-bd__tt { background: var(--ngoc-nhat); }
.tcp-cg__l { display: inline-block; width: 16px; height: 0; border-top: 2.5px solid; margin-right: 5px; vertical-align: 3px; }
.tcp-cg--lr { border-color: var(--xanhla); } .tcp-cg--lrkh { border-color: var(--xanhla); border-top-style: dashed; }
.tcp-cg--lg { border-color: var(--cam); } .tcp-cg--lgkh { border-color: var(--cam); border-top-style: dashed; }
/* 📐 Dự toán dự án đầu tư (13/10) — thanh trên, kết luận màu, ô nhập, bảng độ nhạy giống sheet "Đánh giá rủi ro dự án". */
.da-thanh { align-items: center; margin-bottom: 10px; }
.da-ten { flex: 1 1 260px; min-width: 200px; font-size: 16px; font-weight: 700; padding: 6px 10px; }
input.da-ten { border: 1px solid var(--vien-dam); border-radius: 8px; background: var(--nen-the); color: inherit; }
.da-kl { padding: 10px 14px; border-radius: 12px; border: 1px solid var(--vien); margin: 8px 0; }
.da-kl ul { margin: 6px 0 0; padding-left: 20px; }
.da-kl--xanh { background: var(--xanhla-mo); border-color: var(--xanhla); }
.da-kl--vang { background: var(--cam-mo); border-color: var(--cam); }
.da-kl--do { background: var(--do-mo); border-color: var(--do); }
.da-bd-khung { padding: 8px 12px; border: 1px solid var(--vien); border-radius: 12px; background: var(--nen-the); margin: 8px 0; }
.da-bd { display: block; width: 100%; height: auto; max-height: 170px; }
.da-bd__duong { fill: var(--xanhla); } .da-bd__am { fill: var(--do); opacity: .75; }
.da-luoi { display: flex; flex-wrap: wrap; gap: 10px 18px; align-items: flex-end; margin: 6px 0 10px; }
.da-nhan { display: flex; flex-direction: column; gap: 4px; font-size: 13px; font-weight: 600; }
.da-nhan--mo { opacity: .45; }
.da-o-ct { width: 118px; text-align: right; padding: 2px 4px; font-size: 12.5px; }
.da-o-ct.da-de { background: rgba(240, 180, 0, .25); font-weight: 700; }
.da-tn { border: 1px solid var(--vien-dam); border-radius: 8px; padding: 10px 12px; margin: 14px 0; }
.da-tn-chon td { background: rgba(240, 180, 0, .12); }
.da-tn-moi { font-weight: 700; background: rgba(240, 180, 0, .25); padding: 0 4px; border-radius: 3px; }
.da-tn-cu { font-size: 12px; color: var(--chu-mo); text-decoration: line-through; }
.da-nhan--mo:focus-within, .da-nhan--mo:hover { opacity: .8; }
.da-o { text-align: right; }
.da-o--chu { text-align: left; }
.da-xem { font-weight: 600; }
.da-nhap td, .da-nhap th { white-space: normal; vertical-align: middle; }
.da-nhap { width: 100%; }
.da-nhap input.mtct-o, .da-nhap select { max-width: 100%; box-sizing: border-box; }
.da-cp--auto td { background: var(--nen-nhe); color: var(--chu-nhat); }
.da-nhan select { min-width: 160px; }
.da-sp-ds { display: grid; gap: 12px; margin-top: 8px; }
.da-sp { border: 1px solid var(--vien-dam); border-radius: 12px; padding: 10px 12px; background: var(--nen-the); }
.da-sp__dau { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; margin-bottom: 6px; }
.da-sp__ten { flex: 1 1 280px; min-width: 200px; font-weight: 600; }
.da-sp__kq { margin-top: 6px; padding: 6px 10px; background: var(--ngoc-mo); border-radius: 8px; font-size: 13px; line-height: 1.6; }
.da-so-to { font-size: 15px; }
.da-nhap select { padding: 3px 4px; font-size: 12.5px; }
.da-cb { display: flex; justify-content: center; }
.da-dot td { background: var(--ngoc-mo); }
.da-dot__o { display: inline-flex; align-items: center; gap: 4px; margin: 2px 10px 2px 0; }
.da-ghichu { width: 100%; max-width: 720px; }
.da-nhom { padding: 6px 10px; border: 1px dashed var(--vien-dam); border-radius: 10px; font-size: 13px; }
.da-cs td { white-space: normal; vertical-align: top; }
.da-cs td:nth-child(3), .da-cs td:nth-child(4) { min-width: 220px; }
.da-hang-cs td { background: var(--ngoc-mo); font-weight: 700; }
.chu-xanh { color: var(--xanhla); }
.da-o-cs { background: var(--ngoc-mo); font-weight: 700; }
.da-rr__tieu { margin: 22px 0 0; padding: 8px; text-align: center; color: #fff; background: #1FA64A; letter-spacing: .5px; }
.da-rr__chu { padding: 8px 12px; border: 1px solid var(--vien); border-top: 0; font-size: 13.5px; }
.da-rr__chu p { margin: 4px 0; }
.da-nhay-hang { display: flex; flex-wrap: wrap; gap: 0; margin-top: 10px; }
.da-nhay { border-collapse: collapse; font-size: 13.5px; flex: 1 1 300px; }
.da-nhay th, .da-nhay td { border: 1px solid #2b2b2b; padding: 3px 10px; text-align: center; }
.da-nhay--gia th, .da-nhay--gia td { background: #D9E5BC; color: #1d1d1d; }
.da-nhay--cs th, .da-nhay--cs td { background: #FCE4D6; color: #1d1d1d; }
.da-nhay tr.da-nhay__cs td { background: #1FA64A; color: #FFF34D; font-weight: 700; }
.da-nhay td.chu-do { color: #B00020; }
.da-luoi2 { border-collapse: collapse; font-size: 13px; }
.da-luoi2 th, .da-luoi2 td { border: 1px solid var(--vien-dam); padding: 4px 10px; text-align: right; white-space: nowrap; }
.da-luoi2 th { background: var(--nen-nhe); }
.da-luoi2--duong { background: var(--xanhla-mo); }
.da-luoi2--am { background: var(--do-mo); color: var(--do); }
.da-luoi2--giua { outline: 2px solid var(--ngoc); outline-offset: -2px; font-weight: 700; }
.da-kv td { padding: 3px 12px 3px 0; border-bottom: 1px dotted var(--vien); }
.da-khac summary { cursor: pointer; font-weight: 600; }
.da-duyet { padding: 8px 12px; border: 1px solid var(--vien); border-radius: 12px; margin: 8px 0; background: var(--nen-the); }
.da-duyet--xanh { border-color: var(--xanhla); background: var(--xanhla-mo); }
.da-duyet--do { border-color: var(--do); background: var(--do-mo); }
.da-bd--tor { max-height: none; max-width: 760px; }
.da-tor__ten { font-size: 12.5px; fill: currentColor; font-weight: 600; }
.da-tor__goc { stroke: var(--chu); stroke-width: 1.5; stroke-dasharray: 4 3; }
/* 🌳 Cây mục tiêu (10/10) — mỗi phòng một khối mở / gập; báo cáo tháng xếp thành thẻ. */
.mtct-phong { margin: 8px 0; padding: 8px 12px; border: 1px solid var(--vien); border-radius: 12px; background: var(--nen-the); }
.mtct-phong > summary { cursor: pointer; padding: 2px 0; }
/* 🧭 Chiến lược (10/10) — biểu đồ BCG, lưới 3×3 giá, phễu 4 tầng. */
.cl-bd { display: block; width: 100%; height: auto; max-width: 720px; }
.cl-bd__o--star { fill: var(--xanhla-mo); } .cl-bd__o--cow { fill: var(--ngoc-mo); } .cl-bd__o--hoi { fill: var(--cam-mo); } .cl-bd__o--cho { fill: var(--do-mo); }
.cl-bd__nhan { font-size: 13px; font-weight: 700; fill: var(--chu-mo); }
.cl-bd__duong { stroke: var(--vien-dam); stroke-width: 1.5; stroke-dasharray: 5 4; }
.cl-bd__chu { font-size: 11px; fill: var(--chu-mo); }
.cl-bd__ten { font-size: 10.5px; font-weight: 700; fill: var(--chu); pointer-events: none; }
.cl-dong { cursor: pointer; }
.cl-luoi { display: grid; grid-template-columns: 110px repeat(3, 1fr); gap: 6px; margin: 10px 0; }
.cl-luoi__tieude { font-size: 12.5px; font-weight: 700; text-align: center; align-self: center; color: var(--chu-mo); }
.cl-luoi__tieude--doc { text-align: left; }
.cl-luoi__o { min-height: 70px; padding: 6px 8px; border: 1px solid var(--vien); border-radius: 10px; background: var(--nen-nhe); }
.cl-luoi__o--dung { border-color: var(--xanhla); background: var(--xanhla-mo); }
.cl-luoi__o--xau { border-color: var(--do); background: var(--do-mo); }
.cl-luoi__so { font-size: 12px; font-weight: 700; margin-bottom: 4px; }
@media (max-width: 640px) { .cl-luoi { grid-template-columns: 70px repeat(3, 1fr); } .cl-luoi__so { font-size: 10.5px; } }
.cl-pheu { display: grid; gap: 6px; margin: 10px 0; }
.cl-pheu__tang { padding: 8px 12px; border: 1px solid var(--vien); border-radius: 10px; background: var(--nen-the); }
.cl-pheu__tang--1 { width: 100%; } .cl-pheu__tang--2 { width: 90%; margin: 0 auto; } .cl-pheu__tang--3 { width: 80%; margin: 0 auto; border-color: var(--ngoc-nhat); background: var(--ngoc-mo); } .cl-pheu__tang--4 { width: 70%; margin: 0 auto; }
/* ⚡ Hành động (10/10) — lịch ngang 12 tháng: ô tô màu từ tháng bắt đầu tới tháng hoàn thành. */
.mtct-gantt td, .mtct-gantt th { padding: 4px 6px; }
.mtct-gt { width: 26px; min-width: 26px; padding: 0 !important; border-left: 1px solid var(--vien); }
.mtct-gt--on { background: var(--vien-dam); }
.mtct-gt--dang { background: var(--ngoc-nhat); }
.mtct-gt--xong { background: var(--xanhla); }
.mtct-gt--tre { background: var(--do); }
.mtct-gt-nay { box-shadow: inset 2px 0 0 var(--cam), inset -2px 0 0 var(--cam); }
.mtct-bc { margin: 8px 0; padding: 8px 10px; border: 1px solid var(--vien); border-radius: 10px; }
.mtct-bc > div { margin: 2px 0; }
.kd-th { width: 100%; border-collapse: collapse; font-size: 12.5px; }
.kd-th th, .kd-th td { border: 1px solid var(--vien); padding: 3px 6px; }
.kd-th th { background: var(--nen-nhe); font-weight: 600; }
.kd-th__tong td { background: var(--ngoc-mo); font-size: 14px; }
/* Bước 3: đăng ký mục tiêu + 12 ô % mùa vụ. */
.kd-dk { margin: 0 0 12px; padding: 10px 12px; border: 1px solid var(--vien); border-radius: 12px; background: var(--nen-nhe); }
.kd-dk > summary { cursor: pointer; font-weight: 700; }
.kd-pt12 { display: grid; grid-template-columns: repeat(6, minmax(70px, 1fr)); gap: 6px; }
@media (max-width: 640px) { .kd-pt12 { grid-template-columns: repeat(3, 1fr); } }
.kd-in { font-size: 11px; color: #000; }
.kd-in table { width: 100%; border-collapse: collapse; }
.kd-in th, .kd-in td { border: 1px solid #888; padding: 2px 4px; }
/* Tờ in phiếu KPI — nằm trong #khungIn. */
.kpi-in { font-size: 12.5px; color: #000; }
.kpi-in h2 { font-size: 16px; margin: 4px 0 8px; text-align: center; }
.kpi-in h3 { font-size: 14px; margin: 12px 0 4px; }
.kpi-in__cty { text-align: center; font-weight: 700; }
.kpi-in table { width: 100%; border-collapse: collapse; margin: 6px 0; }
.kpi-in th, .kpi-in td { border: 1px solid #999; padding: 3px 6px; text-align: left; }
.kpi-in__luong { width: 60% !important; }
.kpi-in__luong td:last-child { text-align: right; }
.kpi-in .kpi-gy__khoi ul { padding-left: 18px; }
.kpi-in__ky { display: flex; justify-content: space-around; margin-top: 24px; text-align: center; font-weight: 700; }
.o label.kpi-tich { display: flex; align-items: center; gap: 8px; font-weight: 400; cursor: pointer; }
.o label.kpi-tich input { width: auto; margin: 0; flex: none; }
.kpi-tinh { display: flex; flex-wrap: wrap; gap: 8px; margin: 12px 0 4px; }
.kpi-tinh__o {
  flex: 1 1 140px; border: 1px solid var(--vien); border-radius: 10px; padding: 8px 10px;
  display: flex; flex-direction: column; gap: 2px; background: var(--nen-nhe);
}
.kpi-tinh__o span { font-size: 12px; color: var(--chu-nhat); }
.kpi-tinh__o b { font-size: 17px; }
.kpi-tinh__o--mat b { color: var(--do); text-decoration: line-through; }
.kpi-tinh__o--tong { background: var(--ngoc-mo); border-color: var(--ngoc-nhat); }
.kpi-tinh__o--tong b { color: var(--ngoc); font-size: 20px; }

/* ================================ 35. Tờ báo giá đem in ================================
   Khung này ẩn trên màn hình. Lúc in thì giấu hết mọi thứ khác, chỉ còn nó —
   nếu không thì in ra kèm cả thanh tab và bảng làm việc. */

#khungIn { display: none; }

/* Chặn in thẳng màn hình (chốt 01/10): in mà KHÔNG qua nút In của app — Ctrl+P,
   menu In của trình duyệt — thì ra trang trắng kèm một dòng nhắc. Nút In của
   app bật cờ 'dang-in' (goiInCuaApp) hoặc 'in-bao-gia' (tờ in) trước khi in. */
@media print {
  body:not(.dang-in):not(.in-bao-gia) > * { display: none !important; }
  body:not(.dang-in):not(.in-bao-gia)::before {
    content: "Không in thẳng màn hình — dùng nút 🖨 In của từng mục trong app.";
    display: block; padding: 20mm; font: 14px Arial, sans-serif; color: #000;
  }
}

@media print {
  body.in-bao-gia > *:not(#khungIn) { display: none !important; }
  body.in-bao-gia #khungIn { display: block !important; }
  body.in-bao-gia { background: #fff; }

  /* Bỏ đầu trang & chân trang do TRÌNH DUYỆT tự thêm — dòng "16:14 5/9/26 ·
     Báo cáo Real-time…" ở trên và địa chỉ web ở dưới. Chúng nằm trong phần lề
     của trang giấy, nên chừa lề 0 là trình duyệt hết chỗ in chúng.

     Vì sao phải làm bằng CSS: chỗ tắt hai dòng đó nằm trong hộp thoại In của
     từng máy và mỗi người tự nhớ tắt, nên cùng một hoá đơn in ở máy admin thì
     sạch mà in ở máy nhân viên lại lòi ngày giờ với tên trang web ra.

     Lề 0 nghĩa là chữ chạy sát mép giấy, mà máy in nào cũng có vùng không in
     được — nên phải trả lại khoảng thở bằng padding của chính tờ in. */
  @page { size: A4; margin: 0; }
  body.in-bao-gia #khungIn { padding: 12mm 10mm; }
}

/* ---------------- Tem mã vạch dán lên sản phẩm ----------------
   Xếp thành lưới 5 cột: tem bao giờ cũng cần cả loạt, in từng cái một là phí
   cả tờ A4. Mỗi tem tự tránh bị cắt đôi giữa hai trang nhờ break-inside. */
.tem-trang {
  display: grid;
  grid-template-columns: repeat(5, 1fr);
  gap: 4mm;
}
.tem {
  border: 1px dashed #bbb;      /* đường cắt, in ra nhìn là biết cắt ở đâu */
  border-radius: 3px;
  padding: 3mm 2mm;
  text-align: center;
  break-inside: avoid;
  page-break-inside: avoid;
  color: #000;
  font-family: Arial, Helvetica, sans-serif;
}
/* Người dùng chốt 01/10: MÃ ở trên vạch, TÊN ở dưới vạch. */
.tem__ma {
  font-family: monospace; font-size: 11px; letter-spacing: 1px;
  margin-bottom: 1mm;
}
.tem__ten {
  font-size: 9px; font-weight: 700; line-height: 1.2;
  margin-top: 1mm;
  /* Tên dài cắt còn hai dòng: tem cao bằng nhau thì lưới mới thẳng hàng */
  display: -webkit-box; -webkit-line-clamp: 2; -webkit-box-orient: vertical;
  overflow: hidden;
}
.tem svg { max-width: 100%; height: auto; }
.tem__gia { font-size: 10px; font-weight: 700; margin-top: 1mm; }
/* Ảnh mã vạch nhỏ trong ô bảng (Sản phẩm / Hàng sẵn kho / Vật tư). */
.o-mavach svg { display: block; height: 22px; width: auto; max-width: 160px; }
/* 20/10: ô mã vạch trong bảng = cái tem sẽ in (mã trên, vạch, tên, giá), tự thu nhỏ vừa ô */
.o-mavach--tem { min-width: 150px; max-width: 190px; }
.o-mavach--tem .tem { padding: 2mm 1.5mm; margin: 0; }
.o-mavach--tem svg { display: block; width: 100%; max-width: 100%; height: auto; margin: 0 auto; }

.tbg { font-family: "Times New Roman", Times, serif; color: #000; font-size: 13px; line-height: 1.45; }
.tbg__cty  { font-weight: 700; font-size: 15px; }
.tbg__d    { margin-top: 1px; }
.tbg__sao  { letter-spacing: -.5px; margin: 4px 0 10px; }
.tbg__ten  { text-align: center; font-size: 19px; font-weight: 700; margin: 8px 0 4px; }
.tbg__ngay { text-align: center; font-style: italic; }
.tbg__gach { text-align: center; margin: 2px 0 12px; }
.tbg__mo   { margin: 10px 0 12px; text-align: justify; }
.tbg__nho  { font-size: 11px; font-style: italic; }

.tbg__bang { width: 100%; border-collapse: collapse; }
.tbg__bang th, .tbg__bang td { border: 1px solid #000; padding: 5px 6px; vertical-align: top; white-space: pre-line; }
.tbg__bang th { text-align: center; font-weight: 700; }
.tbg__bang td.giua { text-align: center; }
.tbg__bang td.phai { text-align: right; }
.tbg__bang tfoot td { font-weight: 700; }
.tbg__tong td { font-size: 14px; }

.tbg__gc  { margin-top: 12px; }
.tbg__gc div { margin-top: 2px; }
.tbg__ky  { display: flex; justify-content: space-around; margin-top: 40px; font-weight: 700;
            text-align: center; }

/* Phiếu xuất kho và hóa đơn: số hiệu chứng từ dưới ngày, và khối thông tin
   người nhận / khách hàng tách khỏi bảng bằng một khoảng thở. */
.tbg__so   { text-align: center; margin-top: 2px; }
.tbg__khoi { margin: 14px 0 12px; }

/* Phiếu kho ký bốn ô nên chia đều bốn cột thay vì dàn hai bên như báo giá */
.tbg__ky--4 { justify-content: space-between; }
.tbg__ky--4 > div { width: 24%; }
.tbg__kynho { font-weight: 400; font-style: italic; font-size: 11px; }

/* 💵 Phiếu thu 01-TT / Phiếu chi 02-TT — khổ A5 ngang (inPhieuTC). Dòng chấm
   là chỗ ghi tay; ô nào app đã có dữ liệu thì in chữ lên thay dòng chấm. */
.ptc { font-family: "Times New Roman", Times, serif; color: #000; font-size: 13px; line-height: 1.5; }
.ptc__dau { display: flex; justify-content: space-between; gap: 16px; font-size: 12px; }
.ptc__mau { text-align: center; font-size: 11px; }
.ptc__giua { display: grid; grid-template-columns: 1fr 2fr 1fr; align-items: start; margin: 8px 0 10px; }
.ptc__tieude { grid-column: 2; text-align: center; }
.ptc__tieude h1 { font-size: 20px; margin: 0 0 2px; letter-spacing: .5px; }
.ptc__so { grid-column: 3; font-size: 12px; }
.ptc__dong { display: flex; align-items: baseline; gap: 6px; margin: 3px 0; }
.ptc__nhan { white-space: nowrap; }
.ptc__gt { flex: 0 1 auto; }
.ptc__phu { font-size: 12px; font-style: italic; }
.ptc__cham { flex: 1 1 auto; display: inline-block; min-width: 60px;
             border-bottom: 1px dotted #000; height: 1em; }
.ptc__so .ptc__cham { width: 70px; flex: none; }
.ptc__ky { display: grid; grid-template-columns: repeat(5, 1fr); text-align: center;
           margin: 12px 0 6px; font-size: 12px; }
.ptc__kynho { font-style: italic; font-size: 11px; }
.ptc__kyten { height: 58px; display: flex; align-items: flex-end; justify-content: center; font-weight: 700; }
.ptc__cuoi { font-size: 12px; display: flex; align-items: baseline; gap: 4px; }

/* Đầu tờ báo giá: logo một phần ba bề ngang, thông tin công ty hai phần ba.
   Logo co theo cột chứ không cố định chiều cao, để mọi tỉ lệ ảnh đều vừa ô. */
.tbg__dau {
  display: grid; grid-template-columns: 1fr 2fr;
  gap: 16px; align-items: center; margin-bottom: 4px;
}
.tbg__dau--khonglogo { grid-template-columns: 1fr; }
.tbg__olog { display: flex; align-items: center; }
.tbg__logo { width: 100%; max-height: 96px; object-fit: contain; object-position: left center; }
.tbg__tin { min-width: 0; }

/* ================================ 36. Bản điện thoại ================================
   Mốc 780px trùng với mốc thu gọn menu sẵn có, để cả trang cùng đổi một lượt.

   Ba việc lớn ở đây:
     • Thanh tab đổi thành ô chọn — mười một tab xếp bốn hàng ăn mất một phần tư
       chiều cao điện thoại trước khi thấy được nội dung gì.
     • Bảng đổi thành thẻ — bảng rộng 620px trên màn 375px thì phải vuốt ngang
       từng dòng mới thấy trạng thái và nút thao tác.
     • Nút to lên — đầu ngón tay cần khoảng 40px, nhiều nút đang 26px.  */

.lv-chon { display: none; }

/* ───── THANH TAB GHIM LÊN ĐẦU TRANG (06/10) — chỉ màn hình rộng; điện thoại giữ nguyên ─────
   Logo + tên công ty ẩn đi, #lvHang dời vào thanh đầu trang (xem datThanhTabLenDau). 22/10: tối đa MỘT hàng
   (--lv-hang-cao do JS đo); tab còn lại vào ☰ (có ô tìm) hoặc ô chọn bên trái, chuột phải để mở tab ở cửa sổ mới. */
@media (min-width: 700px) {
  body.chi-bang-lam-viec .dieuhuong__trong > .logo { display: none; }
  body.chi-bang-lam-viec .dieuhuong__trong { height: auto; min-height: 56px; }
  body.chi-bang-lam-viec .lv-hang--dau {
    position: relative; flex: 1 1 auto; min-width: 0; margin: 0; border-bottom: none; align-self: flex-end;
  }
  body.chi-bang-lam-viec .lv-hang--dau .lv-tab {
    max-height: var(--lv-hang-cao, 40px); overflow: hidden; background: var(--nen-the);
  }
  body.chi-bang-lam-viec .lv-hang--dau .lv-tab button { padding: 8px 10px; font-size: 13px; }
  /* Ô chọn thả xuống đứng đầu tiên thanh đầu trang (vốn chỉ hiện trên điện thoại). */
  body.chi-bang-lam-viec .lv-chon--dau {
    display: block; flex: 0 0 auto; width: 190px; height: 34px; margin: 0; align-self: center;
    font-size: 13px; font-weight: 600;
  }
  body.chi-bang-lam-viec .lv-hang--dau.mo .lv-tab {
    position: absolute; left: 0; right: 36px; top: 0; z-index: 80;
    max-height: 72vh; overflow-y: auto; padding-bottom: 4px;
    border: 1px solid var(--vien); border-radius: 0 0 var(--bo) var(--bo); box-shadow: var(--bong-cao);
  }
}

@media (max-width: 699px) {

  /* --- Thanh tab thành ô chọn --- */
  .lv-tab { display: none; }
  /* Hàng ngoài Ở LẠI, chỉ còn mỗi nút ☰ nép bên phải ô chọn: đó là lối duy
     nhất vào hộp sắp xếp tab trên điện thoại, vì kéo thả thì màn cảm ứng
     không làm được. Bỏ gạch chân đi vì không còn hàng tab nào để gạch. */
  .lv-hang { border-bottom: none; margin-bottom: 14px; justify-content: flex-end; }
  .lv-chon {
    display: block; width: 100%; height: 46px; font-size: 15px; font-weight: 600;
    margin-bottom: 20px;
  }

  /* --- Bảng thành thẻ xếp dọc ---
     Mỗi dòng là một thẻ, mỗi ô một hàng có nhãn cột bên trái. Nhãn lấy từ
     data-nhan do ganNhanCotBang() dán vào. */
  .bang-boc { overflow-x: visible; border: none; }
  .bang thead { display: none; }
  .bang, .bang tbody, .bang tr, .bang td { display: block; width: auto; }

  .bang tr {
    border: 1px solid var(--vien); border-radius: 12px;
    padding: 10px 12px; margin-bottom: 10px; background: var(--nen-the);
  }
  .bang td {
    border: none; padding: 5px 0;
    display: flex; gap: 12px; align-items: baseline; justify-content: space-between;
  }
  .bang td + td { border-top: 1px dashed var(--vien); }
  .bang td::before {
    content: attr(data-nhan);
    flex: none; font-size: 12px; font-weight: 600; color: var(--chu-mo);
  }
  /* Ô không có nhãn (cột nút, ô tích chọn) trải hết bề ngang */
  .bang td:not([data-nhan]) { display: block; }
  .bang td:not([data-nhan])::before { content: none; }
  /* Phần nội dung của ô dồn về phải cho thẳng hàng với nhãn */
  .bang td[data-nhan] > * { text-align: right; }
  /* min-width 0: ô là flex, con của nó mặc định không co nhỏ hơn nội dung —
     ô tên hàng trong form đơn (ô tích + ô gõ) thò ra ngoài mép thẻ, phải kéo
     ngang mới thấy hết. */
  .bang td[data-nhan] > * { min-width: 0; }
  .bang td[data-nhan] .hang-nut { justify-content: flex-end; }

  .bang td.bang__rong { display: block; text-align: center; }
  .bang td.bang__rong::before { content: none; }
  .bang tfoot { display: block; }
  .bang tfoot tr { background: var(--nen-2); }

  /* --- TỜ LỊCH XƯỞNG: sáu ô tích nằm CHUNG MỘT HÀNG ---
     Luật chung ở trên biến mỗi ô thành một dòng — đúng với ô nhiều chữ, nhưng
     sai hẳn với sáu ô tích công đoạn: chúng thành sáu dòng gần trắng, và một
     đơn hàng ăn trọn màn hình máy tính bảng của xưởng. Người đứng máy cần thấy
     ba bốn đơn một lúc.

     Nay chúng xếp ngang thành một dải, nhãn máy nằm TRÊN ô tích — vừa gọn vừa
     đọc được ô nào là máy nào, thứ bản cũ mất hẳn.

     Ô của công đoạn KHÔNG được giao thì bỏ luôn. Trên bản máy tính phải giữ
     thẻ <td> rỗng cho khỏi lệch cột, nhưng ở đây mỗi dòng là một thẻ nên
     không có cột nào để mà lệch — bày ra chỉ là sáu cái nhãn vô nghĩa. */
  .bang-sx td.sx-cd {
    display: inline-flex; flex-direction: column; align-items: center;
    gap: 2px; width: auto; padding: 4px 10px 4px 0;
    border-top: none !important;
  }
  .bang-sx td.sx-cd:empty { display: none; }
  /* Cột Công đoạn ở dạng thẻ: bỏ bề rộng cố định của bản máy tính, hàng nút
     dồn về phải như mọi ô khác của thẻ. */
  .bang-sx td.sx-cds { width: auto; min-width: 0; }
  .bang-sx td.sx-cds .nut-cd-hang { min-width: 0; justify-content: end; }
  .bang-sx td.sx-cd::before { font-size: 11px; white-space: nowrap; }
  /* Ô tích vốn được luật chung dồn về phải; ở dải ngang thì phải giữa. */
  .bang-sx td.sx-cd > * { text-align: center; }

  /* --- Hộp thoại chiếm trọn màn hình --- */
  .hop {
    position: fixed; inset: 0; width: 100%; max-width: none;
    max-height: none; height: 100%; border-radius: 0;
    display: flex; flex-direction: column;
  }
  .hop__dau, .hop__chan { flex: none; }
  .hop__than { flex: 1; overflow-y: auto; }
  /* Toàn màn hình: không bo góc đầu / chân hộp; hộp trượt từ đáy lên; chân hộp chừa chỗ cho thanh vuốt của iPhone. */
  .hop { animation: truotLenDay .26s cubic-bezier(.2, .8, .2, 1); }
  .hop__dau { border-radius: 0; padding: 12px 14px 12px 18px; }
  .hop__than { padding: 18px; }
  .hop__chan { border-radius: 0; border-top: 1px solid var(--vien); padding: 12px 16px; padding-bottom: max(12px, env(safe-area-inset-bottom)); }
  /* Nút đỏ không đứng cuối: viền đỏ cho khác nút Lưu (điện thoại không đẩy sang trái vì hàng nút đã xuống dòng). */
  .hop__chan .nut--do:not(:last-child) { background: transparent; color: var(--do); border-color: var(--do); }
  /* min-width 118px: thà xuống dòng còn hơn bóp nút đến mức mất chữ. */
  .hop__chan .nut { flex: 1 1 auto; min-width: 118px; }

  /* --- Nút đủ to cho đầu ngón tay --- */
  .nut { min-height: 44px; }
  .nut--nho { min-height: 40px; padding-left: 12px; padding-right: 12px; }
  .lienhe { gap: 8px; margin-top: 8px; }
  .lienhe__nut { width: 38px; height: 38px; font-size: 17px; }
  .lv-tab button { min-height: 44px; }

  /* Ô nhập cao hơn cho dễ chạm, và cỡ chữ 16px để iPhone không tự phóng to trang */
  input, select, textarea { min-height: 44px; font-size: 16px; }
  textarea { min-height: 88px; }
  /* Ô trong khung .o / .vc-khoi đặt 14px bằng bộ chọn MẠNH HƠN dòng ngay trên, nên 16px bị đè và iPhone vẫn tự
     phóng to trang mỗi lần chạm vào ô (đo thật 07/10). Đặt lại 16px bằng đúng bộ chọn đó. */
  .o input, .o select, .o textarea, .vc-khoi select, .vc-khoi input { font-size: 16px; }

  /* Bảng đã thành thẻ nên bỏ bề ngang tối thiểu 620px — giữ lại là thẻ tràn
     ra ngoài màn hình hẹp.

     Bốn bảng dòng hàng phải gọi đích danh: chúng được đặt min-width 760px bằng
     bộ chọn có id, mà id thì thắng mọi bộ chọn class — viết mỗi table.bang ở
     đây là không với tới, và bảng tràn ra ngoài màn hình điện thoại. */
  table.bang,
  #bgBangDong table.bang, #dBangDong table.bang,
  #pxkBangDong table.bang, #hdBangDong table.bang { min-width: 0; }
  #bgBangDong table.bang, #dBangDong table.bang,
  #pxkBangDong table.bang, #hdBangDong table.bang,
  #hdgHang table.bang { table-layout: auto; }

  /* Thẻ rộng cả màn hình nên trả lại chữ cho nút thao tác. Chỉ còn biểu tượng
     thì phải đoán 📝 với 🔄 là gì. Bù lại phải bóp đệm cho nhiều nút vừa
     một hàng, nếu không riêng hàng nút đã cao 150px. */
  .hang-nut--oviec { gap: 6px; }
  .hang-nut--oviec .nut .chu-nut { display: inline !important; }
  .hang-nut--oviec .nut { padding: 8px 10px; min-height: 38px; font-size: 12.5px; }

  /* Ô tích chọn không có nhãn, để nguyên thì luật ô nhập 44px thổi nó lên 73px */
  .bang td:not([data-nhan]) { padding: 3px 0; }
  .bang td input[type="checkbox"] { min-height: 0; width: 20px; height: 20px; }

  /* Dãy nút liên hệ nằm trong ô khách hàng — ô này vốn đã cao nhất thẻ */
  .bang td[data-nhan] .lienhe { justify-content: flex-end; margin-top: 6px; }

  /* Hai nút chính, còn lại nấp sau nút ⋯ cho tới khi bấm vào.
     display:contents để các nút phụ vẫn nằm chung một hàng flex với nút chính,
     không thành một khối riêng lệch hàng. */
  .nut-them { display: inline-flex !important; }
  .hang-nut--oviec .nut-phu { display: none; }
  .hang-nut--oviec.mo .nut-phu { display: contents; }
  .hang-nut--oviec.mo .nut-them { background: var(--nen-2); }
}

/* Màn hình rộng bày đủ nút, không cần nút ⋯ */
.nut-them { display: none; }
.nut-phu { display: contents; }

/* Danh sách báo giá của một khách, mở từ nút 📄 trong Danh sách KH */
.ds-bg { display: flex; flex-direction: column; gap: 10px; }
.ds-bg__dong {
  display: flex; gap: 12px; align-items: center; justify-content: space-between;
  flex-wrap: wrap; border: 1px solid var(--vien); border-radius: 10px; padding: 11px 13px;
}
.ds-bg__tin { min-width: 0; flex: 1; }
@media (max-width: 699px) {
  .ds-bg__dong { align-items: stretch; }
  .ds-bg__dong .hang-nut { width: 100%; }
  .ds-bg__dong .hang-nut .nut { flex: 1; }
}

/* Nháy viền một nhịp để chỉ chỗ — dùng khi một nút cuộn người dùng tới một khối
   nằm khuất giữa trang dài (VD: nút "Tải sản phẩm lên" → khung nhập file). */
@keyframes nhayVien {
  0%, 100% { box-shadow: 0 0 0 0 rgba(23, 134, 74, 0); }
  25%, 75% { box-shadow: 0 0 0 4px rgba(23, 134, 74, .35); }
}
.nhay-vien { animation: nhayVien 1.6s ease-in-out; }
@media (prefers-reduced-motion: reduce) { .nhay-vien { animation: none; } }

/* ── Dòng kết quả dưới ô "Số điện thoại khách" của báo giá và đơn hàng ──
   Ba trạng thái: khớp một khách (xanh lá), khớp nhiều hồ sơ (vàng, kèm ô chọn),
   chưa có ai mang số này (xanh dương, kèm nút thêm khách mới). */
.tin-kh {
  display: flex; flex-wrap: wrap; align-items: center; gap: 8px;
  margin-top: 6px; padding: 8px 10px; border-radius: 8px;
  font-size: 13px; line-height: 1.45;
  background: var(--nen-nhe); border: 1px solid var(--vien);
}
.tin-kh:empty { display: none; }
.tin-kh select { min-width: 200px; flex: 1; }
.tin-kh--khop  { background: var(--xanhla-mo);    border-color: var(--xanhla);    color: var(--xanhla); }
.tin-kh--nhieu { background: var(--cam-mo);       border-color: var(--cam);       color: #9a5f11; }
.tin-kh--moi   { background: var(--xanhduong-mo); border-color: var(--xanhduong); color: var(--xanhduong); }
:root[data-theme="dark"] .tin-kh--nhieu { color: var(--cam); }

/* ══════════════════ Tem dán thùng hàng ══════════════════
   Tờ thứ hai in kèm mỗi hóa đơn, cắt ra dán lên thùng cho shipper. Chữ to và
   giãn rộng vì nó được nhìn từ xa, trên một thùng hàng đặt dưới đất — không
   phải tờ giấy cầm trên tay. Toàn bộ căn giữa theo đúng mẫu công ty đang dùng.

   break-before: page — đây là chỗ bắt tờ giấy mới. Không có nó thì tem dính
   luôn vào cuối hóa đơn, cắt ra là mất mấy dòng chữ ký. */
.tem-thung {
  break-before: page;
  page-break-before: always;
  font-family: "Times New Roman", Times, serif;
  color: #000;
  text-align: center;
  padding-top: 18mm;
}
/* Trên màn hình khung in vốn đã ẩn; giữ khoảng cách này cho ai mở DevTools xem */
.tem-thung__nhan, .tem-thung__gui, .tem-thung__khau { margin: 0 auto; max-width: 150mm; }

.tem-thung__d1 { font-size: 19px; font-weight: 700; margin-bottom: 6px; }
.tem-thung__d2 { font-size: 19px; margin-bottom: 6px; }
.tem-thung__gach-chan {
  font-size: 19px; font-weight: 700; text-decoration: underline; margin-bottom: 6px;
}
.tem-thung__nho { font-size: 12px; margin-top: 4px; }

/* Đường gạch đứt ngăn ba khối, đúng như mẫu đang dùng. Dùng border-top kiểu
   dotted chứ không gõ một hàng dấu chấm: hàng dấu chấm gõ tay dài ngắn khác
   nhau tuỳ cỡ chữ của máy in. */
.tem-thung__dut {
  border-top: 2px dotted #000;
  width: 108mm; margin: 12px auto;
}

.tem-thung__gui { font-size: 12.5px; line-height: 1.7; }
.tem-thung__gui i { font-style: italic; }

.tem-thung__khau { margin-top: 16px; }
.tem-thung__khau div {
  font-size: 34px; font-weight: 700; text-decoration: underline;
  line-height: 1.55; letter-spacing: .5px;
}

/* Máy in đen trắng nào cũng in được, nhưng ép luôn cho chắc: nền trắng chữ đen,
   không để chế độ tiết kiệm mực làm nhạt mất dòng "Hàng Dễ Vỡ". */
@media print {
  .tem-thung { -webkit-print-color-adjust: exact; print-color-adjust: exact; }
}

/* ================================ 40. Quyền lợi theo hạng ================================
   Một dòng nhỏ dưới nhãn hạng ở bảng Danh sách KH và tab Chăm sóc lại. Cắt còn một
   dòng: bảng khách vốn đã chật, dán nguyên đoạn vào mỗi dòng thì bảng dài gấp đôi.
   Bản đầy đủ nằm trong title, rê chuột vào là ra. */
.quyen-loi {
  color: var(--tim);
  max-width: 240px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  cursor: help;
}
:root[data-theme="dark"] .quyen-loi { color: #c9a9f0; }

/* Trên màn hình hẹp bảng đã xuống thành thẻ, mỗi ô một dòng riêng — không còn
   lý do gì phải cắt ngắn nữa, cho hiện đủ. */
@media (max-width: 900px) {
  .quyen-loi { max-width: none; white-space: normal; }
}

/* ================================ 41. Thanh tác vụ hàng loạt ================================
   Nằm ngay trên bảng sản phẩm, mà khối "Nhập bằng file" ngay phía trên lại cùng kiểu
   dải chữ nhật — hai khối giống hệt nhau xếp chồng thì mắt không tách ra được cái nào
   là cái vừa hiện lên vì mình vừa tích chọn. Cho nó một màu riêng và một vệt bên trái. */
.khu-chon {
  background: var(--tim-mo);
  border-left: 3px solid var(--tim);
}
:root[data-theme="dark"] .khu-chon { background: rgba(139,92,246,.14); }

/* ================================ 42. Tiêu đề cột bấm được ================================
   Tiêu đề bảng sản phẩm là nút bấm để sắp xếp. Phải trông ra là bấm được — nếu nhìn
   y hệt chữ thường thì chẳng ai nghĩ tới việc bấm vào, và tính năng coi như không có.
   Nhưng cũng không được kêu gào như một cái nút thật: nó vẫn là tiêu đề bảng. */
.th-sap {
  background: none; border: 0; padding: 0; margin: 0;
  font: inherit; color: inherit; cursor: pointer;
  display: inline-flex; align-items: center; gap: 4px;
  border-radius: 4px;
}
.th-sap:hover { text-decoration: underline; text-underline-offset: 3px; }
.th-sap__mui { font-size: 13px; line-height: 1; }
/* Cột đang sắp: đậm hơn phần còn lại để nhìn một cái là ra */
.th-sap--dang { font-weight: 800; }

/* Ô tiêu đề cột số căn phải, nên nút bên trong cũng phải đẩy về phải theo */
.bang th.so .th-sap { justify-content: flex-end; }

/* ---- Tiêu đề gộp nhiều nút sắp xếp (ô "Đã mua" ở Danh sách KH) ----

   Ô ấy bày bốn con số khác nhau nên tiêu đề cũng có bốn nút. Bản đầu xếp nhãn
   ở trên, nút ở dưới, cho phép xuống dòng — kết quả là bốn nút gãy thành lưới
   2×2, hàng tiêu đề cao gấp đôi và trông như bốn ô bị vô hiệu hoá.

   Nay tất cả nằm trên MỘT dòng ngang, nhãn đứng trước như một câu: "Đã mua:
   Số lần · Tiền · TB/đơn · Hạng". Ô tiêu đề vốn đã white-space:nowrap nên nó
   tự nới đúng bề ngang cần, không phải đoán min-width.

   Màu cũng phải đổi: nút dựng theo nền sáng, mà hàng tiêu đề bảng là nền xanh
   đậm chữ trắng — viền xám và chữ xám trên nền ấy đọc không ra. Dùng sắc trắng
   trong suốt cho nút thường, và nền tối cho nút đang chọn: cả hai chỉ dựa vào
   việc nền là màu xanh đậm chữ trắng, nên đúng ở cả giao diện sáng lẫn tối. */
.th-nhieu {
  display: flex; align-items: center; gap: 8px;
  justify-content: flex-end; white-space: nowrap;
}
.th-nhieu__ten { font-weight: 700; }
.th-nhieu__nut { display: flex; gap: 4px; }
.th-sap--nho {
  font-size: 11.5px; font-weight: 600; line-height: 1.6;
  color: rgba(255,255,255,.86);
  background: rgba(255,255,255,.15);
  border: 1px solid rgba(255,255,255,.28);
  padding: 1px 9px; border-radius: 999px;
}
.th-sap--nho:hover {
  background: rgba(255,255,255,.3); color: #fff; text-decoration: none;
}
.th-sap--nho.th-sap--dang {
  background: rgba(0,0,0,.3); color: #fff;
  border-color: rgba(255,255,255,.6); font-weight: 700;
}
.th-sap--nho .th-sap__mui { margin-left: 1px; }

/* Màn hình hẹp: hàng tiêu đề bảng bị ẩn hẳn (bảng xuống thành thẻ), nên hàng
   nút này cũng biến mất theo. Sắp xếp lúc đó dùng ô chọn trên thanh lọc — đó
   là lý do ô chọn ấy vẫn giữ lại chứ không bỏ đi. */

/* Dòng hotline dưới nút Đăng nhập. Đủ nổi để đọc được ngay, đủ nhẹ để không
   tranh chỗ với hai ô nhập — người biết mật khẩu thì gõ, người không biết mới
   cần đọc nó. */
.khoa__hotline {
  margin: 18px 0 0; text-align: center;
  font-size: 13.5px; line-height: 1.55; font-weight: 600;
  /* Màu CHỦ ĐẠO, không phải màu "hoàn thành": dòng hotline là lời mời liên hệ
     của công ty, không phải một trạng thái xanh. Trước đây nó đi theo
     var(--xanhla) nên khi cả trang đổi sang tông nghệ thì mỗi nó còn xanh lá,
     nằm chình ình giữa màn đăng nhập. */
  color: var(--ngoc); word-break: break-word;
}
.khoa__hotline:empty { display: none; }

/* ─────────── Biểu đồ đổi được tròn ↔ cột ───────────
   Cả hai hình được vẽ sẵn trong DOM, CSS chỉ giấu một cái. Đổi kiểu vì thế
   không phải vẽ lại, và không chớp một nhịp trắng.

   Ba mức, mức sau đè mức trước:
     .bd__ve--cot ẩn mặc định        → mặc định là hình tròn
     [data-kieu-bd="cot"]            → nút chung đầu tab
     .bd[data-kieu="…"]              → nút riêng của từng khung

   Mức 3 thắng mức 2 nhờ độ ưu tiên: .bd[data-kieu] (0,2,0) cao hơn
   [data-kieu-bd] .bd__ve (0,1,1). Không dùng !important ở đâu cả. */
.bd__ve--cot { display: none; }
[data-kieu-bd="cot"] .bd__ve--tron { display: none; }
[data-kieu-bd="cot"] .bd__ve--cot  { display: block; }
.bd[data-kieu="tron"] .bd__ve--tron { display: block; }
.bd[data-kieu="tron"] .bd__ve--cot  { display: none; }
.bd[data-kieu="cot"]  .bd__ve--tron { display: none; }
.bd[data-kieu="cot"]  .bd__ve--cot  { display: block; }

/* Thanh nút chung đầu tab */
.thanh-kieu { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; }
.thanh-kieu__ten { font-size: 12.5px; font-weight: 700; color: var(--chu-mo); }

/* Dòng đang được tích trong bảng làm hàng loạt. Nền nhạt thôi — đủ để mắt
   khoanh vùng, không đủ để tranh chỗ với chữ trong dòng. */
.dong-chon > td { background: var(--xanhla-mo); }
:root[data-theme="dark"] .dong-chon > td { background: rgba(74,124,16,.18); }

/* Hai nút giao hàng trên tờ Lịch sản xuất. Xếp dọc và không cho ngắt chữ:
   cột này hẹp, để chúng nằm ngang là hai cái nút bị bóp thành hai cục chữ
   gãy đôi giữa từ. */
.sx-giao { display: flex; flex-direction: column; gap: 4px; align-items: stretch; }
/* Khu 📋 Chờ gán người giao: ô chọn người và nút Gán cùng một hàng. */
.vc-gan { display: flex; gap: 6px; align-items: center; }
.vc-gan select { flex: 1 1 auto; min-width: 0; width: auto; }
.vc-gan .nut { flex: none; }
.sx-giao .nut { white-space: nowrap; }
/* Bảng 🚚 Vận chuyển: nút ngắn (📥 Nhận · ❌ · 🧾), nằm NGANG một dòng để mỗi
   đơn chỉ chiếm một hàng — người giao lướt cả danh sách trên điện thoại. */
.sx-giao.vc-viec { flex-direction: row; flex-wrap: nowrap; align-items: center; }
.vc-viec .nut { padding-left: 9px; padding-right: 9px; }

/* ═══════════ LỜI CẢNH BÁO KHÔNG ĐƯỢC PHÉP GIẤU ═══════════
   Luật "gọn đầu tab" giấu mọi dải nhắc thuần chữ — đúng với chín mươi phần
   trăm dải trong app, nhưng sai chết người với mấy câu cảnh báo đứng ngay trên
   một cái nút xoá sạch dữ liệu. Nên chúng dùng lớp RIÊNG, không mang họ .dai,
   để không rơi vào tầm của luật ấy dù luật kia có mở rộng tới đâu.

   Nhìn y hệt .dai--nguy: cùng nền đỏ nhạt, cùng vạch đỏ bên trái. */
.canh-nang {
  background: var(--do-mo); color: var(--do); border-left: 4px solid var(--do);
  padding: 11px 14px; border-radius: var(--bo-nho); font-size: 13.5px; line-height: 1.55;
}
.canh-nang b { color: var(--do); }

/* ============================== 🚚 Vận chuyển ==============================
   Ba cụm: khối ô chọn trong form đơn, ô nhãn trên tờ lịch sản xuất, và sổ vết
   sửa phương thức. Màu mượn hẳn biến chung, không đặt mã màu mới — admin đổi
   màu chủ đạo trong ⚙️ Cài đặt thì cụm này đổi theo. */

/* Khối ô chọn: mấy ô xếp ngang, tự xuống dòng trên điện thoại. Nhãn của từng
   ô nằm TRÊN ô, cùng hình với .o của form chung. */
.vc-khoi { display: flex; flex-wrap: wrap; gap: 10px; }
.vc-khoi > label {
  display: flex; flex-direction: column; gap: 5px;
  flex: 1 1 180px; min-width: 0;
  font-size: 13px; font-weight: 600; color: var(--chu-nhat);
}
.vc-khoi > label > span { font-weight: 400; }
.vc-khoi select, .vc-khoi input {
  padding: 9px 11px; font: inherit; font-size: 14px;
  border: 1px solid var(--vien-dam); border-radius: var(--bo-nho);
  background: var(--nen-the); color: var(--chu); width: 100%;
}
.vc-khoi label.an { display: none; }

/* Dòng chữ chỉ-đọc, cho người không được sửa phương thức. */
.o__doc {
  padding: 9px 11px; border: 1px dashed var(--vien-dam);
  border-radius: var(--bo-nho); font-size: 14px; background: var(--nen-nhe);
}

/* Ô trên tờ lịch sản xuất: nhãn co lại, nút ✏️ neo bên phải và không bị nhãn
   dài đẩy xuống dòng — người bọc hàng liếc theo hàng ngang. */
/* Tờ lịch chỉ ghi hình thức + đơn vị nên cho xuống hai dòng thay vì kéo cột
   dài ra — cột hẹp giữ bảng vừa màn hình. */
.sx-vc { max-width: 140px; }
.sx-vc__o { display: flex; align-items: center; gap: 4px; }
.sx-vc__nhan {
  flex: 1 1 auto; min-width: 0; overflow: hidden; overflow-wrap: anywhere;
  display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 2;
}
/* Nhãn nay là NÚT mở hộp đủ thông tin (hopVanChuyenSX) — gọn như chữ, canh trái. */
button.sx-vc__nhan { text-align: left; padding: 4px 8px; font-size: 12px; line-height: 1.3; white-space: normal; }

/* Sổ vết — cố ý nhỏ và mờ: nó là thứ để tra khi có tranh cãi, không phải thứ
   đọc mỗi ngày. */
.vc-vet {
  border-top: 1px solid var(--vien); margin-top: 6px; padding-top: 8px;
  font-size: 12px; color: var(--chu-mo);
}
.vc-vet__nhan { font-weight: 700; margin-bottom: 4px; color: var(--chu-nhat); }
.vc-vet__dong { padding: 2px 0; }

@media (max-width: 720px) {
  .sx-vc { max-width: none; }
  .vc-khoi > label { flex: 1 1 100%; }
}

/* Bảng 🚚 Vận chuyển — mượn đúng hai lối tô của bảng xưởng, nhưng phải khai
   lại vì .sx-tre bên trên chỉ áp trong .bang-sx. Quá hẹn tô đỏ, đúng hôm nay
   tô vàng: người giao hàng đọc bảng theo hàng ngang, một chữ đỏ lẻ loi ở cột
   giữa thì lọt thỏm. */
.bang-vc tr.sx-tre > td { background: var(--do-mo); }
.bang-vc tr.sx-tre > td:first-child { box-shadow: inset 4px 0 0 var(--do); }
.bang-vc tr.vc-homnay > td { background: var(--cam-mo); }
.bang-vc tr.vc-homnay > td:first-child { box-shadow: inset 4px 0 0 var(--cam); }

/* Dòng danh mục đang ẩn — mờ đi chứ không giấu, admin vẫn phải thấy nó để bật
   lại. Dùng ở bảng danh mục vận chuyển trong ⚙️ Cài đặt. */
.mo-di > td { opacity: .55; }

/* Dải "hồ sơ và cửa đăng nhập đang nói khác nhau" trong form nhân sự.
   Trông như .dai--nguy nhưng mang tên riêng, vì luật giấu-chữ-đầu-tab ở trên
   sẽ nuốt mọi dải .dai--* không chứa nút — mà dải này với người KHÔNG có
   quyền thì đúng là không có nút nào, và họ lại chính là người cần đọc nó. */
.ns-lech {
  background: var(--do-mo); color: var(--do);
  border-left: 4px solid var(--do); border-radius: var(--bo);
  padding: 11px 16px; font-size: 13px; font-weight: 600; line-height: 1.6;
}
.ns-lech b { font-weight: 800; }

/* ============================== 📎 File sản xuất ==============================
   Danh sách file trong form đơn và trong hộp mở từ tờ Lịch sản xuất. Mỗi file
   một dòng: tên + thông tin bên trái, nút bên phải; trên điện thoại nút rơi
   xuống dưới. File ĐÃ THAY mờ đi và gạch tên — vẫn hiện, vì xưởng có thể đã
   tải nó về từ trước và phải biết bản trong máy mình là bản sai. */
.fsx-ds { display: flex; flex-direction: column; gap: 6px; }
.fsx-dong {
  display: flex; flex-wrap: wrap; align-items: flex-start; gap: 6px 10px;
  padding: 8px 10px; border: 1px solid var(--vien); border-radius: var(--bo-nho);
  background: var(--nen-the);
}
.fsx-dong__ten { flex: 1 1 260px; min-width: 0; overflow-wrap: anywhere; }
.fsx-dong__nut { display: flex; gap: 6px; flex-wrap: wrap; }
.fsx-dong--thay { opacity: .6; }
.fsx-dong--thay .fsx-dong__ten > b { text-decoration: line-through; }
.fsx-ghichu {
  margin-top: 4px; padding: 4px 8px; border-left: 3px solid var(--cam);
  background: var(--cam-mo); border-radius: var(--bo-nho); font-size: 13px;
}
.fsx-thaycho { margin-top: 2px; font-size: 13px; color: var(--chu-mo); }
.fsx-thay {
  flex: 1 1 100%; display: flex; flex-direction: column; gap: 8px;
  padding-top: 8px; border-top: 1px dashed var(--vien);
}
.fsx-thay > button { align-self: flex-start; }
.fsx-them { display: flex; flex-wrap: wrap; gap: 8px; align-items: center; margin-top: 8px; }
.fsx-them > input[type="file"] { flex: 1 1 220px; width: auto; }
.fsx-them > #fsxGhiChu { flex: 2 1 220px; width: auto; }
.fsx-them > #fsxCho { flex: 1 1 100%; display: flex; flex-direction: column; gap: 6px; }

/* Hai thẻ chọn nơi cất file ở ⚙️ Cài đặt → 📎 File Sản Xuất. Cả thẻ bấm được,
   thẻ đang chọn viền đậm — admin nhìn một cái biết công ty đang cất ở đâu. */
.fsx-chon { display: grid; grid-template-columns: repeat(auto-fit, minmax(240px, 1fr)); gap: 10px; }
.fsx-chon__o {
  display: flex; gap: 10px; align-items: flex-start; cursor: pointer;
  padding: 12px 14px; border: 1.5px solid var(--vien); border-radius: var(--bo);
  background: var(--nen-the); font-weight: 400;
}
.fsx-chon__o > input { width: auto; margin-top: 3px; }
.fsx-chon__o b { display: block; margin-bottom: 4px; }
.fsx-chon__o .chu-mo { display: block; line-height: 1.5; }
.fsx-chon__o.chon { border-color: var(--ngoc); background: var(--ngoc-mo); }

/* Thanh đo dung lượng kho file sản xuất. Màu theo MỨC (xanh / cam / đỏ) và
   LUÔN kèm chữ + biểu tượng ở dòng dưới — màu không nói một mình. Hai vạch
   mảnh đánh dấu 80% (cảnh báo) và 90% (tự dọn) để thấy còn bao xa. */
.fsx-do { display: flex; flex-direction: column; gap: 6px; max-width: 520px; }
.fsx-do__so { font-size: 14px; }
.fsx-do__thanh {
  position: relative; height: 10px; border-radius: 5px;
  background: var(--nen-nhe); box-shadow: inset 0 0 0 1px var(--vien); overflow: hidden;
}
.fsx-do__phan { position: absolute; left: 0; top: 0; bottom: 0; border-radius: 5px; }
.fsx-do__phan--xanh { background: var(--xanhla); }
.fsx-do__phan--cam  { background: var(--cam); }
.fsx-do__phan--do   { background: var(--do); }
.fsx-do__vach { position: absolute; top: 0; bottom: 0; width: 2px; background: var(--nen-the); }
.fsx-do__nhan { font-size: 13px; color: var(--chu-nhat); }

/* Khối 🏭 Giao cho xưởng sáng lên một nhịp khi app mở đơn ra để sales giao
   xưởng — xem moFormGiaoXuong(). Viền màu chủ đạo, tắt dần; không nhấp nháy
   lặp lại. Người tắt hiệu ứng chuyển động thì chỉ thấy viền, không có nhịp. */
.gx-nhay { border-radius: var(--bo); animation: gxNhay 2.4s ease-out; }
@keyframes gxNhay {
  0%, 30% { box-shadow: 0 0 0 3px var(--ngoc); }
  100%    { box-shadow: 0 0 0 3px transparent; }
}
@media (prefers-reduced-motion: reduce) {
  .gx-nhay { animation: none; box-shadow: 0 0 0 3px var(--ngoc); }
}


/* ================================ Bảng thông minh (bangthongminh.js) ================================
   Thanh lọc + tích chọn gắn trên mọi bảng .bang (người dùng chốt 30/09). */
.btm-thanh { display: flex; flex-wrap: wrap; gap: 6px; align-items: center; margin: 4px 0 6px; }
/* ⬇ Excel / 🖨 In gộp vào cuối hàng lọc (data-btm-gop) — cùng một dòng. */
.thanh-bd .btm-thanh--gop { display: inline-flex; margin: 0; }
.btm-thanh .btm-tim { flex: 1 1 160px; min-width: 140px; max-width: 280px; padding: 5px 9px; font-size: 13px; }
.btm-thanh .btm-cot { width: auto; max-width: 170px; padding: 5px 8px; font-size: 13px; }
.btm-dem { font-size: 12px; color: var(--chu-mo); }
.bang td.btm-o, .bang th.btm-o { width: 28px; text-align: center; padding-left: 6px; padding-right: 2px; }
.bang td.btm-o input, .bang th.btm-o input { width: auto; margin: 0; }
.bang tr.btm-an { display: none; }
/* 20/10 — bảng Dự toán: mỗi bản ghi HAI dòng sát nhau (thông tin + một hàng nút ngang). Lọc ẩn dòng trên thì dòng nút ẩn theo. */
.bang tr.btm-an + tr[data-btm-bo] { display: none; }
.bang tr.dt-co-nut > td, .bang tr.co-hang-nut > td { border-bottom: 0; padding-bottom: 2px; }
.bang tr.dt-nut-hang > td, .bang tr.hang-nut-duoi > td { padding: 0 10px 8px; }
.bang tr.dt-nut-hang .hang-nut, .bang tr.hang-nut-duoi .hang-nut { display: flex; flex-wrap: wrap; gap: 6px; justify-content: flex-start; }
@media print { .btm-thanh { display: none !important; } }

/* ================================ 📒 Vào sổ — bố trí lại (01/10) ================================
   Ba sổ làm việc thành TAB gạch chân; rổ / mục đang 0 thì mờ (không ẩn — "đang
   trống" cũng là một câu trả lời); mô tả thu vào ⓘ; tổng quan một dòng gọn.
   Ô "Lọc bảng" của bảng thông minh ẩn ở tab này vì đã có ô tìm riêng (tìm cả
   hàng hoá) — tích chọn, Excel, In của bảng vẫn còn. */
.vs-tq { margin: 0 0 12px; padding: 8px 12px; border: 1px solid var(--vien); border-radius: 10px; background: var(--nen-nhe); }
.vs-tq__dong { display: flex; flex-wrap: wrap; align-items: center; gap: 4px 6px; line-height: 1.6; }
.vs-tab { display: flex; flex-wrap: wrap; gap: 2px; border-bottom: 2px solid var(--vien); margin: 0 0 10px; }
.vs-tab__nut { background: none; border: 0; border-bottom: 3px solid transparent; margin-bottom: -2px;
  padding: 8px 14px; font: inherit; font-weight: 600; color: var(--chu-nhat); cursor: pointer; border-radius: 6px 6px 0 0; }
.vs-tab__nut:hover { background: var(--nen-nhe); color: var(--chu); }
.vs-tab__nut.chon { color: var(--ngoc); border-bottom-color: var(--ngoc); }
.vs-tab__nut:focus-visible { outline: 2px solid var(--ngoc); outline-offset: 2px; }
.nut.vs-mo { opacity: .55; }
.vs-i { font-size: 13px; font-weight: 400; color: var(--chu-mo); cursor: help; margin-left: 4px; }
#tab-vao-so .btm-tim, #tab-vao-so .btm-cot { display: none; }

/* ───── GIỜ 24H (gio24.js, 05/10) ─────
   Ô gốc datetime-local / time bị ẩn; thay bằng ô ngày + ô Giờ + ô Phút cạnh nhau. */
.g24-an { display: none !important; }
.g24 { display: inline-flex; align-items: center; gap: 4px; max-width: 100%; flex-wrap: nowrap; }
.g24 input { width: auto !important; margin: 0; }
.g24 .g24__ngay { min-width: 140px; }
.g24 .g24__gio, .g24 .g24__phut { width: 58px !important; min-width: 0; text-align: center; }
.g24 .g24__hai { font-weight: 700; }

/* ───── 🕘 CHẤM CÔNG (chamcong.js, 05/10) — lưới tháng ───── */
.cc-bang th, .cc-bang td { padding: 3px 4px; }
.cc-bang .cc-dau { min-width: 26px; text-align: center; font-size: 12px; }
.cc-bang .cc-thu { font-size: 10px; font-weight: 400; opacity: .8; }
.cc-bang td.cc-o { text-align: center; min-width: 26px; cursor: pointer; font-weight: 700; }
.cc-bang td.cc-o:hover { outline: 2px solid var(--cam, #c98a1b); outline-offset: -2px; }
.cc-bang .cc-cuoituan { background: rgba(0, 0, 0, .05); }
.cc-bang .cc-homnay { box-shadow: inset 0 0 0 2px var(--cam, #c98a1b); }
.cc-bang td.cc-tre { background: #FBDCA8; color: #7A4712; }

/* ───── Ghi chú LUÔN HIỆN (05/10) ─────
   Luật "gọn đầu tab" giấu mọi dải .dai--* thuần chữ. Các màn Nhân sự (hồ sơ, chấm công, cơm,
   chăm sóc, lương) có vài ghi chú cần ĐỌC được ngay (hồ sơ nối tài khoản, mã chưa khớp, chưa có
   dữ liệu…) nên dùng lớp riêng này — cùng màu .dai--tin nhưng không mang họ .dai. */
.dai-hien {
  background: var(--ngoc-mo); color: var(--ngoc); border-left: 4px solid var(--ngoc);
  padding: 11px 14px; border-radius: var(--bo-nho); font-size: 13.5px; line-height: 1.55; margin: 0 0 12px;
}
.canh-nang { margin: 0 0 12px; }

/* ===== 👔 CEO (13/10): thẻ công cụ / tình huống bấm mở ra ===== */
.ceo-nhom { margin-bottom: 18px; }
.ceo-nhom[hidden], .ceo-the[hidden] { display: none; }
.ceo-nhom__ten { margin: 14px 0 8px; font-size: 15px; color: var(--ngoc); }
.ceo-the { background: var(--nen-the); border: 1px solid var(--vien); border-radius: var(--bo); margin-bottom: 8px; }
.ceo-the > summary { cursor: pointer; padding: 11px 14px 11px 32px; list-style: none; position: relative; }
.ceo-the > summary::-webkit-details-marker { display: none; }
.ceo-the > summary::before { content: '▸'; position: absolute; left: 13px; top: 11px; color: var(--ngoc); }
.ceo-the[open] > summary::before { content: '▾'; }
.ceo-the[open] > summary { border-bottom: 1px solid var(--vien); }
.ceo-the__ten { display: block; font-weight: 600; }
.ceo-the__ud { display: block; margin-top: 3px; font-size: 13px; color: var(--chu-mo); }
.ceo-the__than { padding: 12px 14px 14px; }
.ceo-khoi { margin-bottom: 14px; }
.ceo-khoi > b { display: block; margin-bottom: 4px; color: var(--ngoc); }
.ceo-ds { margin: 0; padding-left: 20px; }
.ceo-ds li { margin-bottom: 3px; }
.ceo-doan { margin: 0 0 8px; line-height: 1.6; }
.ceo-tde { margin: 12px 0 5px; font-weight: 600; }
.ceo-nut { margin-top: 6px; }
.ceo-chon { display: grid; grid-template-columns: repeat(auto-fill, minmax(230px, 1fr)); gap: 4px 12px; }
.ceo-chon__o { font-size: 13px; display: flex; gap: 6px; align-items: flex-start; }
.ceo-nhung { margin-top: 10px; }
.ceo-nhung__o { border: 1px solid var(--ngoc-nhat); background: var(--ngoc-mo); border-radius: var(--bo); padding: 10px 14px 4px; margin-bottom: 8px; }
.ceo-nhung__dau { display: flex; justify-content: space-between; align-items: center; margin-bottom: 6px; color: var(--ngoc); }
.ceo-lich-b { margin-left: 6px; padding: 1px 7px; font-size: 11.5px; border: 1px solid var(--vien); border-radius: 10px; background: var(--nen-the); color: var(--ngoc); cursor: pointer; white-space: nowrap; }
.ceo-lich-b:hover { background: var(--ngoc-mo); }


/* ============ Cửa sổ lớn có thu gọn (20/10) ============
   QUY TẮC CHUNG: mục lớn mở thành cửa sổ nổi gần hết màn hình, nút ▁ Thu gọn đưa xuống thanh dưới (không tắt),
   nhiều cửa sổ làm song song. Dưới .man (150) để hộp thoại mở từ trong cửa sổ vẫn nằm trên. */
.form-luoi.cd-cuaso {
  position: fixed; z-index: 100; display: grid; align-content: start; overflow: auto;
  top: calc(var(--cao-dieu-huong, 62px) + 8px + var(--cs-lech, 0px)); left: calc(3vw + var(--cs-lech, 0px));
  right: calc(3vw - var(--cs-lech, 0px)); bottom: calc(56px - var(--cs-lech, 0px));
  background: var(--nen-the); border: 1px solid var(--vien); border-radius: 14px;
  box-shadow: var(--bong-cao), 0 0 0 1px var(--vien); padding: 0 18px 18px;
}
.form-luoi.cd-cuaso > .o, .form-luoi.cd-cuaso > .cd-nhom__ruot { margin-bottom: 12px; }
.cd-cuaso__dau {
  grid-column: 1 / -1; position: sticky; top: 0; z-index: 3; display: flex; align-items: center; justify-content: space-between; gap: 10px;
  flex-wrap: wrap; margin: 0 -18px 14px; padding: 10px 18px; background: var(--nen-the); border-bottom: 1px solid var(--vien);
  border-radius: 14px 14px 0 0; cursor: default;
}
.cd-cuaso__dau b { font-size: 16px; }
.cd-cuaso__nut { display: inline-flex; gap: 6px; flex-wrap: wrap; }
.cd-dock {
  position: fixed; left: 0; right: 0; bottom: 0; z-index: 101; display: flex; gap: 8px; align-items: center; flex-wrap: wrap;
  padding: 8px 14px; background: var(--nen-the); border-top: 1px solid var(--vien); box-shadow: 0 -4px 14px rgba(0,0,0,.12);
}
.cd-dock__nhan { font-size: 12.5px; color: var(--chu-mo); }
.chip--thu { border-style: dashed; opacity: .8; }
@media (max-width: 700px) {
  .form-luoi.cd-cuaso { left: 0; right: 0; top: var(--cao-dieu-huong, 62px); bottom: 48px; border-radius: 0; padding: 0 12px 14px; }
  .cd-cuaso__dau { margin: 0 -12px 12px; padding: 8px 12px; border-radius: 0; }
}
.hop-dock__muc { display: inline-flex; align-items: center; gap: 2px; }
.hop-dock__bo { border: 0; background: transparent; cursor: pointer; font-size: 16px; color: var(--chu-mo); padding: 0 4px; }
.hop-dock__bo:hover { color: var(--do); }
body.co-thanh-duoi { padding-bottom: 48px; }
body.co-thanh-duoi .cd-dock:not(.hop-dock) { bottom: 44px; }
#hopThuGon { margin-right: 6px; }

/* 3 nút kiểu cửa sổ (20/10): — thu gọn · ▢ phóng to · ✕ đóng */
.cs-nut { width: 34px; height: 30px; border: 0; background: transparent; color: var(--chu, inherit); font-size: 16px; line-height: 1; cursor: pointer; border-radius: 6px; }
.cs-nut:hover { background: var(--vien); }
.cs-nut--dong:hover { background: #e5484d; color: #fff; }
.cd-cuaso__nut { gap: 0; align-items: center; }
.cd-cuaso__nut .nut { margin-right: 8px; }
.form-luoi.cd-cuaso.cd-cuaso--to { top: var(--cao-dieu-huong, 62px); left: 0; right: 0; bottom: 44px; border-radius: 0; }
.hop__dau { align-items: center; }
#hopThuGon, #hopPhongTo { margin-right: 0; }
.hop.hop--max { max-width: none; width: 100%; min-height: calc(100vh - 20px); max-height: calc(100vh - 20px); }      /* 24/10: phóng to = đầy cả chiều cao màn hình, phần giữa tự cuộn */
.hop.hop--max.hop--rong { max-width: none; }
.man:has(.hop--max) { padding: 10px; }
/* 3 nút cạnh nhau ở góc phải: tiêu đề chiếm chỗ trống, các nút sát nhau */
.hop__dau { gap: 4px; }
.hop__dau h3 { flex: 1; min-width: 0; margin-right: 8px; }
.hop__dau .cs-nut { flex: none; }
.hop__dau .nut-tron { width: 34px; height: 30px; font-size: 18px; border-radius: 6px; border: 0; background: transparent; box-shadow: none; }
.cd-cuaso__dau b { flex: 1; min-width: 0; }
.cd-cuaso__dau { gap: 4px 8px; }
.cd-cuaso__nut { margin-left: auto; }

/* 20/10 — CẢNH BÁO RẤT NỔI BẬT (vd giá thấp hơn giá phân phối): nền đỏ đặc, chữ trắng to đậm, biểu tượng lớn, viền sáng nhấp nháy.
   Chỉ dùng cho lỗi PHẢI sửa trước khi đi tiếp — việc nhắc nhẹ vẫn dùng .canh-nang. */
.canh-bao-to { display: flex; gap: 12px; align-items: center; background: #d92d20; color: #fff; font-size: 17px; font-weight: 800; line-height: 1.4;
  padding: 14px 18px; border-radius: 10px; border: 3px solid #7a0c06; margin: 6px 0 12px;
  box-shadow: 0 0 0 3px rgba(217,45,32,.35), 0 6px 18px rgba(217,45,32,.45); animation: canhBaoNhay 1.1s ease-in-out infinite; }
.canh-bao-to::before { content: '⚠'; flex: none; font-size: 34px; line-height: 1; }
.canh-bao-to b { color: #fff; text-decoration: underline; }
.canh-bao-to small { display: block; font-weight: 600; font-size: 13.5px; margin-top: 3px; opacity: .95; }
@keyframes canhBaoNhay {
  0%, 100% { box-shadow: 0 0 0 3px rgba(217,45,32,.35), 0 6px 18px rgba(217,45,32,.45); }
  50% { box-shadow: 0 0 0 9px rgba(217,45,32,.14), 0 6px 26px rgba(217,45,32,.8); }
}
@media (prefers-reduced-motion: reduce) { .canh-bao-to, .nhan-nguy-nhay { animation: none; } }
.nhan-nguy-nhay { display: inline-block; background: #d92d20; color: #fff; font-weight: 800; padding: 3px 10px; border-radius: 999px; animation: canhBaoNhay 1.1s ease-in-out infinite; }

/* 20/10 — GỢI Ý THÔNG MINH (goiythongminh.js): danh sách gợi ý xếp theo độ giống, thay danh sách của trình duyệt */
.gytm { position: fixed; z-index: 2147483000; background: var(--nen-the, #fff); color: var(--chu, inherit); border: 1px solid var(--vien-dam, #cbbd9a);
  border-radius: 8px; box-shadow: 0 8px 24px rgba(0,0,0,.2); max-height: 320px; overflow: auto; font-size: 13.5px; padding: 3px; }
.gytm__muc { display: flex; flex-direction: column; gap: 1px; padding: 6px 10px; border-radius: 6px; cursor: pointer; }
.gytm__muc:hover, .gytm__muc--chon { background: var(--nen-nhe, #f6f1e6); }
.gytm__muc--chon { outline: 1px solid var(--ngoc, #9a6d0b); }
.gytm__phu { font-size: 12px; color: var(--chu-mo, #777); }

/* ⏱ Dự báo kịp tiến độ sản xuất (21/10) — vàng = nguy cơ, đỏ = không kịp. Xem sxdubao.js. */
.bang-sx tr.sx-nguy-co > td { background: color-mix(in srgb, #f0b400 16%, var(--nen-the)); }
.bang-sx tr.sx-nguy-co > td:first-child { box-shadow: inset 5px 0 0 #e0a100; }
.bang-sx tr.sx-khong-kip > td { background: color-mix(in srgb, var(--do) 12%, var(--nen-the)); }
.bang-sx tr.sx-khong-kip > td:first-child { box-shadow: inset 5px 0 0 var(--do); }
.bang-sx tr.sx-nguy-co .o-tich, .bang-sx tr.sx-khong-kip .o-tich, .bang-sx tr.sx-nguy-co .nut-cd, .bang-sx tr.sx-khong-kip .nut-cd { background: var(--nen-the); }
.bang-sx tr.sx-nguy-co .o-tich--xong, .bang-sx tr.sx-khong-kip .o-tich--xong { background: var(--ngoc); }
.bang-sx tr.sx-nguy-co .nut-cd--xong, .bang-sx tr.sx-khong-kip .nut-cd--xong { background: var(--xanhla); }
.sx-db { margin-top: 4px; font-size: 12px; font-weight: 700; white-space: normal; max-width: 190px; }
.sx-db--do { color: var(--do); animation: nhapNhaySX 1.2s ease-in-out infinite; }
.sx-db--vang { color: #a87400; }
.sx-db--xanh { color: var(--xanhla, #1f7a3a); font-weight: 600; }
.sx-db--chua { color: var(--chu-nhat, #777); font-weight: 500; }
@keyframes nhapNhaySX { 0%,100% { opacity: 1; } 50% { opacity: .55; } }
@media (prefers-reduced-motion: reduce) { .sx-db--do { animation: none; } }

/* 23/10: Cài đặt → Cài đặt dự toán → quy tắc công đoạn: mỗi công đoạn là một thẻ gọn (xepphai.js dongQT), bấm ▸ bung Thông số riêng */
.xq-thanh { display: flex; gap: 8px; align-items: center; flex-wrap: wrap; margin: 0 0 10px; }
.xq-thanh input[type="search"] { flex: 1 1 180px; min-width: 160px; max-width: 320px; }
.xq-bang { width: 100%; table-layout: fixed; border-collapse: separate; border-spacing: 0 8px; margin: 0; }
.xq-bang td { padding: 0; border: 0; background: none; }
.xq { border: 1px solid var(--vien); border-radius: 12px; background: var(--nen-the); }
.xq-dau { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 8px 12px; padding: 10px 12px; }
.xq-bung { flex: 0 0 auto; width: 30px; height: 30px; padding: 0; font-size: 14px; background: none; border: 1px solid var(--vien); border-radius: 8px; color: var(--chu); cursor: pointer; transition: transform .15s; }
.xq-bung--rong { border-color: transparent; cursor: default; }
.xq--mo .xq-bung { transform: rotate(90deg); }
/* Khung chứa (.o) ép ô nhập padding 10px 12px + rộng 100% + nhãn 13px đậm — các bộ chọn dưới mạnh hơn để thẻ vẫn gọn. */
.xq-o { display: flex; flex-direction: column; gap: 2px; }
.o .xq-o { font-size: 12px; font-weight: 600; color: var(--chu-mo); }
.o .xq-o input, .o .xq-o select { font-size: 13px; height: 34px; min-height: 0; padding: 4px 8px; box-sizing: border-box; width: 84px; line-height: normal; }
.o .xq-o--rong select { width: auto; min-width: 170px; max-width: 260px; }
.xq-ghi { align-self: center; }
.xq-xoa { margin-left: auto; }
.xq-than { display: none; padding: 10px 12px 4px; border-top: 1px solid var(--vien); background: var(--nen); border-radius: 0 0 12px 12px; }
.xq--mo .xq-than { display: block; }
.xq-nh { background: var(--nen-the); border: 1px solid var(--vien); border-radius: 8px; padding: 8px 10px; margin: 0 0 8px; }
.xq-nh h5 { margin: 0 0 6px; font-size: 12px; font-weight: 700; color: var(--chu-mo); }
.xq-g { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 6px 10px; align-items: end; }
.o .xq-g > label { margin: 0 !important; font-size: 12px; }
.o .xq-g > label input[type="text"], .o .xq-g > label select { width: 100% !important; height: 34px; min-height: 0; padding: 4px 8px; box-sizing: border-box; font-size: 13px; }
.xq-g > .chu-mo { grid-column: 1 / -1; }

/* ── Bảng tự co để hiện đủ cột (27/10) — bangtuco.js thêm class khi bảng rộng hơn khung; bảng đã vừa thì không đổi gì ── */
table.bang--co1 th, table.bang--co1 td { padding: 5px 7px; font-size: 12.5px; }
table.bang--co2 th, table.bang--co2 td { padding: 4px 5px; font-size: 12px; white-space: normal !important; overflow-wrap: anywhere; }
table.bang--co2 .nut, table.bang--co3 .nut { padding: 2px 6px; font-size: 11px; }
table.bang--co3 th, table.bang--co3 td { padding: 3px 4px; font-size: 11px; white-space: normal !important; overflow-wrap: anywhere; }
@media print { table.bang--co1 th, table.bang--co1 td, table.bang--co2 th, table.bang--co2 td, table.bang--co3 th, table.bang--co3 td { white-space: normal; } }

/* 03/11: ô sửa trực tiếp trên dòng tab Nhân sự (hosonv.js, data-hsnv-sua) */
.bang .hsnv-o { width: 100%; min-width: 110px; max-width: 190px; padding: 3px 6px; font-size: 13px; margin: 0 0 4px; box-sizing: border-box; }
.bang input.hsnv-o[type="date"] { min-width: 128px; }
