/* =====================================================================
   NAWARUCO — COMPONENT LIBRARY
   Nhúng SAU tokens.css. Mọi giá trị màu/khoảng cách/typography đều lấy
   từ token — không hard-code số hay mã màu mới trong file này.
   Xem markup mẫu từng thành phần trong components.html

   QUY ƯỚC KHOẢNG CÁCH (áp dụng cho mọi "box thông tin" — card, alert,
   panel showcase...):
     20px (--gap-box) khoảng cách GIỮA các box thông tin và giữa các module
                    (card-grid gap, hai cột nội dung, box xếp chồng dọc).
                    Chốt 2026-09-07, thay cho mốc 32px ghi trước đó.
     24px (--sp-5)  padding BÊN TRONG một box (=75% của 32px)
     16px (--sp-4)  khoảng cách giữa các NHÓM thành phần con trong box
                    (icon+tiêu đề+mô tả, tiêu đề+ngày+đoạn văn) (=50%)
     8px  (--sp-2)  khoảng cách giữa các phần tử ghép sát nhau trong
                    cùng một dòng (badge+chấm trạng thái, icon+nhãn ngắn) (=25%)
   ===================================================================== */

/* ============ BUTTONS ============ */
/* Chiều cao chuẩn 40px cho mọi nút (chốt 2026-09-08). Dùng min-height chứ không
   height cố định: nhãn dài xuống hai dòng thì nút cao thêm chứ không cắt chữ. */
.btn{font-family:var(--font-body); font-weight:600; font-size:var(--fs-sm); border-radius:var(--radius-md); min-height:40px; padding:8px 20px; border:1px solid transparent; cursor:pointer; display:inline-flex; align-items:center; justify-content:center; gap:8px; transition:transform .12s var(--ease), box-shadow .12s var(--ease); text-decoration:none; line-height:1.2;}
.btn:active{transform:translateY(1px);}
.btn-primary{background:var(--brand); color:#fff; box-shadow:var(--shadow-sm);}
.btn-primary:hover{background:var(--c-primary-700); box-shadow:var(--shadow-md);}
/* Nền dùng bậc 700, không dùng #00AB38 của logo: chữ trắng trên #00AB38 chỉ đạt
   3.05:1, dưới chuẩn 4.5:1 cho chữ thường. Màu logo nguyên bản vẫn dùng cho vệt
   sóng và các mảng đồ hoạ, nơi không có chữ đặt lên. */
.btn-accent{background:var(--c-accent-700); color:#fff;}
.btn-accent:hover{background:var(--c-accent-800);}
.btn-secondary{background:var(--bg-surface); color:var(--text-primary); border-color:var(--border-strong);}
.btn-secondary:hover{border-color:var(--brand); color:var(--brand);}
.btn-ghost{background:transparent; color:var(--brand); border-color:transparent; padding:10px 12px;}
.btn-ghost:hover{background:var(--bg-tint);}
.btn-sm{min-height:32px; padding:6px 14px; font-size:var(--fs-xs);}
.btn-lg{min-height:48px; padding:12px 26px; font-size:var(--fs-md); border-radius:var(--radius-md);}
.btn:disabled{opacity:.45; cursor:not-allowed;}

/* ============ FORM ELEMENTS ============ */
.field{display:flex; flex-direction:column; gap:6px; max-width:340px;}
.field label{font-size:var(--fs-sm); font-weight:600; color:var(--text-primary);}
.field .hint{font-size:var(--fs-xs); color:var(--text-secondary);}
/* Cùng chiều cao 40px với nút — ô nhập và nút hay đứng cạnh nhau ở hàng tìm kiếm */
.input,.select{min-height:40px;}
.input,.select,.textarea{
  font-family:var(--font-body); font-size:var(--fs-base); color:var(--text-primary);
  background:var(--bg-surface); border:1px solid var(--border-input); border-radius:var(--radius-sm);
  padding:10px 12px; width:100%; transition:border-color .12s, box-shadow .12s;
}
.input:focus,.select:focus,.textarea:focus{border-color:var(--brand); box-shadow:0 0 0 3px var(--c-primary-100); outline:none;}
.select{appearance:none; background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%2351697A' stroke-width='1.6' fill='none' stroke-linecap='round'/%3E%3C/svg%3E"); background-repeat:no-repeat; background-position:right 12px center; padding-right:32px;}
.textarea{resize:vertical; min-height:88px;}
.input.error,.select.error{border-color:var(--c-danger);}
.field .error-text{font-size:var(--fs-xs); color:var(--c-danger);}
.checkbox-row,.radio-row{display:flex; align-items:center; gap:8px; font-size:var(--fs-sm);}
.checkbox-row input,.radio-row input{width:16px; height:16px; accent-color:var(--brand);}
.input-unit{position:relative;}
.input-unit .input{padding-right:52px;}
.input-unit .unit{position:absolute; right:12px; top:50%; transform:translateY(-50%); font-size:var(--fs-xs); color:var(--text-secondary); font-family:var(--font-numeric); font-variant-numeric:tabular-nums;}

/* ============ BADGES / TAGS — trạng thái vận hành ============ */
/* align-self:flex-start = thuộc tính Hug của Figma. Badge là inline-flex nên tự
   co theo nội dung, nhưng khi đặt trong một flex column (thẻ tin, dòng thông báo)
   thì align-self:stretch mặc định kéo nó rộng hết hàng. Khai báo ở đây một lần
   cho mọi chỗ; ngoài flex/grid thuộc tính này không có tác dụng gì. */
.badge{display:inline-flex; align-self:flex-start; align-items:center; gap:6px; font-size:var(--fs-xs); font-weight:600; padding:4px 10px; border-radius:var(--radius-pill);}
.badge::before{content:''; width:6px; height:6px; border-radius:50%; background:currentColor;}
.badge-success{background:var(--c-success-bg); color:var(--c-success);}
.badge-warning{background:var(--c-warning-bg); color:var(--c-warning);}
.badge-danger{background:var(--c-danger-bg); color:var(--c-danger);}
.badge-info{background:var(--c-info-bg); color:var(--c-info);}
.badge-neutral{background:var(--bg-sunken); color:var(--text-secondary); border:1px solid var(--border-default);}

/* ============ ALERT / BANNER — thông báo cấp nước ============ */
.alert{display:flex; gap:var(--sp-4); padding:var(--sp-4) var(--sp-5); border-radius:var(--radius-md); border:1px solid; align-items:flex-start;}
.alert svg{flex:none; width:20px; height:20px; margin-top:2px;}
.alert strong{display:block; margin-bottom:2px; font-size:var(--fs-sm);}
.alert p{font-size:var(--fs-base); color:var(--text-secondary); margin:0;}
.alert-warning{background:var(--c-warning-bg); border-color:color-mix(in srgb, var(--c-warning) 30%, transparent); color:var(--c-warning);}
.alert-danger{background:var(--c-danger-bg); border-color:color-mix(in srgb, var(--c-danger) 30%, transparent); color:var(--c-danger);}
.alert-info{background:var(--c-info-bg); border-color:color-mix(in srgb, var(--c-info) 30%, transparent); color:var(--c-info);}

/* ============ CARDS ============ */
.card-grid{display:grid; grid-template-columns:repeat(auto-fit,minmax(220px,1fr)); gap:var(--gap-box);}
.card{background:var(--bg-surface); border:1px solid var(--border-default); border-radius:var(--radius-lg); overflow:hidden; box-shadow:var(--shadow-sm); transition:box-shadow .16s var(--ease), transform .16s var(--ease);}
.card:hover{box-shadow:var(--shadow-md); transform:translateY(-2px);}

/* Thẻ truy cập nhanh (tra cứu hoá đơn, thanh toán, đăng ký...) */
.card-quick{padding:var(--sp-5); text-align:left; display:flex; flex-direction:column; gap:var(--sp-4); text-decoration:none; color:inherit; height:100%;}
/* Chỉ còn icon, không có khung nền phía sau (chốt 2026-09-08). Bỏ khung thì
   icon 24px trông hụt so với tiêu đề thẻ, nên phóng lên 36px để giữ đúng trọng
   lượng thị giác cũ của khối 44px. */
.card-quick .icon{width:36px; height:36px; color:var(--brand); display:flex; align-items:center; justify-content:center;}
.card-quick .icon svg{width:100%; height:100%;}
/* Component không tự quyết cấp tiêu đề (h2/h3/h4): mỗi trang chọn đúng cấp
   kế tiếp trong outline thật của trang đó, component chỉ lo hình thức.
   Phát hiện 2026-09-09: khi kiểu khoá cứng vào một thẻ (vd ".card-quick h4"),
   trang nào đặt component ngay sau <h1> (không qua h2/h3) sẽ nhảy cấp; trang
   khác đặt nó dưới h2/h3 lại đúng — cùng một component, hai ngữ cảnh khác
   nhau, nên style phải theo TẤT CẢ cấp có thể xảy ra. */
.card-quick h2,.card-quick h3,.card-quick h4{font-size:var(--fs-base);}
.card-quick p{color:var(--text-secondary); font-size:var(--fs-base); margin:0;}
.card-quick .go{margin-top:auto; font-size:var(--fs-xs); font-weight:700; color:var(--brand); display:flex; align-items:center; gap:4px;}

/* Thẻ tin tức */
.card-news{display:flex; flex-direction:column;}
.card-news .thumb{height:130px; background:linear-gradient(135deg, var(--c-primary-600), var(--c-accent-600)); position:relative;}
.card-news .thumb svg{position:absolute; inset:0; margin:auto; width:36px; height:36px; opacity:.55;}
/* padding 16px giữa khối thông tin và box bao quanh; các phần bên trong
   (chip loại tin, ngày, tiêu đề, mô tả) cách nhau 12px. */
.card-news .body{padding:var(--sp-4); display:flex; flex-direction:column; gap:var(--sp-3);}
.card-news .date{font-size:var(--fs-xs); color:var(--text-secondary); font-family:var(--font-numeric); font-variant-numeric:tabular-nums;}
.card-news h3,.card-news h4{font-size:var(--fs-base); line-height:1.4;}
.card-news h3 a,.card-news h4 a{color:inherit; text-decoration:none;}
.card-news h3 a:hover,.card-news h4 a:hover{color:var(--brand);}
.card-news p{font-size:var(--fs-base); color:var(--text-secondary); margin:0;}

/* Thẻ dịch vụ (lắp đặt, sửa chữa...) */
.card-service{padding:var(--sp-5); display:flex; gap:var(--sp-4);}
/* Màu nền của số phải tự đạt 3:1 chứ không dựa vào -webkit-text-stroke:
   viền chữ là thuộc tính ngoài chuẩn, tắt là số biến mất. --c-primary-100
   trước đây chỉ 1.30:1 trên nền trắng. */
.card-service .num{font-family:var(--font-numeric); font-variant-numeric:tabular-nums; font-size:var(--fs-lg); color:var(--c-primary-500); font-weight:700; -webkit-text-stroke:1px var(--brand); flex:none;}
.card-service h2,.card-service h3,.card-service h4{font-size:var(--fs-base); margin-bottom:4px;}
.card-service p{font-size:var(--fs-base); color:var(--text-secondary); margin:0;}

/* ============ STATS — số liệu vận hành ============ */
.stat-grid{display:grid; grid-template-columns:repeat(auto-fit,minmax(160px,1fr)); gap:1px; background:var(--border-default); border:1px solid var(--border-default); border-radius:var(--radius-lg); overflow:hidden;}
.stat{background:var(--bg-surface); padding:var(--sp-5); text-align:center;}
.stat .num{font-family:var(--font-numeric); font-variant-numeric:tabular-nums; font-size:var(--fs-2xl); font-weight:600; color:var(--brand-strong); }
.stat .lbl{font-size:var(--fs-xs); color:var(--text-secondary); margin-top:4px; text-transform:uppercase; letter-spacing:.05em;}

/* ============ TABLE — biểu giá / lịch sử hoá đơn ============ */
table.tariff{width:100%; border-collapse:collapse; font-family:var(--font-body); font-size:var(--fs-base); background:var(--bg-surface);}
table.tariff th{text-align:left; background:var(--bg-tint); color:var(--brand-strong); font-size:var(--fs-xs); text-transform:uppercase; letter-spacing:.05em; padding:var(--sp-3) var(--sp-4); font-weight:700;}
table.tariff td{padding:var(--sp-3) var(--sp-4); border-top:1px solid var(--border-default);}
table.tariff td.amount{font-family:var(--font-numeric); font-variant-numeric:tabular-nums; text-align:right; }
table.tariff th.amount{text-align:right;}
table.tariff tr:hover td{background:var(--bg-sunken);}

/* ============ TABS ============ */
/* Cuộn ngang khi nhiều tab: 5 tab lọc chuyên mục làm tràn trang ở 375px.
   Các tab là <button> nên vẫn tới được bằng bàn phím, vùng cuộn tự đi theo focus. */
/* Kiểu "folder tab" cho .tabs dùng ĐỘC LẬP (không gắn panel, vd lọc chuyên
   mục tin tức): tab đang chọn nổi trắng, viền dưới của .tabs làm đường nền
   cho các tab chưa chọn. Khi tab cần GẮN LIỀN vào khung nội dung bên dưới
   thành một khối — xem .tab-group ngay dưới, không dùng cách này vì hai lần
   thử trước (margin âm, rồi top+z-index đè 1px) đều để lộ sai khác nhỏ giữa
   trình duyệt/tuỳ tab đang chọn, không chắc liền mạch 100%. */
.tabs{display:flex; gap:var(--sp-2); border-bottom:1px solid var(--border-default); overflow-x:auto; scrollbar-width:thin; -webkit-overflow-scrolling:touch;}
.tab{white-space:nowrap;}
.tab{padding:10px var(--sp-4); font-size:var(--fs-sm); font-weight:600; color:var(--text-secondary); cursor:pointer; background:none; font-family:var(--font-body);
  border:1px solid transparent; border-bottom:none; border-radius:var(--radius-md) var(--radius-md) 0 0; position:relative;}
.tab.active,.tab[aria-selected="true"]{color:var(--brand); background:var(--bg-surface); border-color:var(--border-default); border-bottom:none; top:1px; z-index:1;}

/* ============ TAB GẮN LIỀN PANEL (.tab-group) ============ */
/* Chốt 2026-09-09: bỏ hẳn cách "che 1px bằng top/z-index" — vẫn là ghép hai
   hình vẽ riêng (viền của .tab và viền của .panel) nên phụ thuộc pixel-cho-
   pixel, dễ lệch. Thay bằng MỘT khung duy nhất bao ngoài cả .tabs lẫn các
   .tab-panel: viền + bo góc + đổ bóng chỉ khai báo ở .tab-group; .tabs và
   .panel bên trong không tự vẽ viền/bo góc/bóng riêng nữa (giống cách
   .panel>.post-feature đã bỏ khung riêng khi lồng trong .panel, xem trên).
   overflow:hidden trên .tab-group tự cắt mọi thứ bên trong đúng theo hình bo
   góc của khung ngoài — tab đang chọn dù nằm sát mép nào cũng không lộ góc
   vuông hay góc cong sai, vì phần thừa bị cắt vật lý chứ không phải canh tay. */
.tab-group{border:1px solid var(--border-default); border-radius:var(--radius-lg); box-shadow:var(--shadow-sm); overflow:hidden; background:var(--bg-surface);}
.tab-group .tabs{background:var(--bg-sunken); border-bottom:none; padding:0; margin:0;}
.tab-group .tab.active,.tab-group .tab[aria-selected="true"]{border:none; top:0;}
.tab-group .tab-panel{padding-top:0;}
.tab-group .tab-panel>.panel{border:none; border-radius:0; box-shadow:none; background:none;}

/* ============ PAGINATION / BREADCRUMB ============ */
/* overflow-x:auto thay vì để flex bóp nhỏ nút khi nhiều trang (vd 8 trang ở
   "Tất cả") không đủ chỗ trên màn hình hẹp — bóp nhỏ làm nút lệch khỏi 40px
   đã chốt và khó bấm hơn; cuộn ngang giữ đúng kích thước, đúng tinh thần
   .table-wrap đã dùng cho bảng rộng. */
.pagination{display:flex; gap:6px; align-items:center; overflow-x:auto; -webkit-overflow-scrolling:touch;}
.page-btn{width:40px; height:40px; flex-shrink:0; border-radius:var(--radius-sm); border:1px solid var(--border-default); background:var(--bg-surface); color:var(--text-secondary); font-size:var(--fs-sm); font-family:var(--font-numeric); font-variant-numeric:tabular-nums; cursor:pointer; display:flex; align-items:center; justify-content:center; text-decoration:none;}
/* .active giữ cho ví dụ tĩnh trong components.html; trang thật (tin-tuc.html)
   phân trang bằng JS chỉ đặt aria-current="page", không thêm class .active —
   một cơ chế đánh dấu trạng thái, không lặp lại kiểu hai cơ chế của .tab cũ. */
.page-btn.active,.page-btn[aria-current="page"]{background:var(--brand); color:#fff; border-color:var(--brand);}
.breadcrumb{display:flex; gap:8px; align-items:center; font-size:var(--fs-sm); color:var(--text-secondary);}
.breadcrumb a{color:var(--text-secondary); text-decoration:none;}
.breadcrumb a:hover{color:var(--brand);}
.breadcrumb .sep{color:var(--text-secondary);} /* --c-neutral-400 chỉ 2.61:1 trên trắng, 2.38:1 trên .crumb-bar */
.breadcrumb .current{color:var(--text-primary); font-weight:600;}

/* ============ SITE HEADER MODULE ============ */
.site-header{background:var(--bg-surface); border-radius:var(--radius-lg); overflow:hidden; border:1px solid var(--border-default);}
.topbar{background:var(--brand-strong); color:#fff; font-size:var(--fs-xs); padding:6px var(--sp-5); display:flex; justify-content:space-between; align-items:center; flex-wrap:wrap; gap:8px;}
.topbar .links{display:flex; gap:var(--sp-4);}
.topbar a{color:#fff; opacity:.85; text-decoration:none;}
.topbar a:hover{opacity:1;}
.mainbar{display:flex; align-items:center; justify-content:space-between; padding:var(--sp-3) var(--sp-5); gap:var(--sp-5); flex-wrap:wrap;}
.mainbar .logo-wrap{display:flex; align-items:center; gap:10px; text-decoration:none;}
.mainbar .logo-wrap svg{width:38px; height:38px;}
.mainbar .logo-wrap img.logo-horizontal{height:68px; width:auto; display:block; flex:none;}
.mainbar .logo-wrap b{font-family:var(--font-display); font-size:var(--fs-md); color:var(--brand-strong); display:block; letter-spacing:.01em;}
.mainbar .logo-wrap span{font-size:10px; color:var(--text-secondary); letter-spacing:.06em; text-transform:uppercase;}
/* gap 2px: thang --sp-* bắt đầu từ 4px nên đây là giá trị viết thẳng, có chủ ý.
   Khoảng cách thị giác giữa chữ hai mục vẫn là 14 + 2 + 14 = 30px nhờ đệm ngang
   của mỗi mục (padding:9px 14px, xem .mainnav--upper>li>a/button); gap chỉ là
   khe giữa hai khung nền bo góc lúc hover/active, để hai khung không dính nhau. */
/* align-items:center — không có dòng này, li mặc định stretch bằng chiều cao
   ô Trang chủ (44px), còn chữ bên trong lại chỉ cao bằng nội dung thật của nó
   rồi dán lên đỉnh ô đã bị kéo giãn, nên lệch tâm dọc so với ô Trang chủ. */
.mainnav{display:flex; align-items:center; gap:2px; list-style:none; margin:0; padding:0;}
.mainnav a{text-decoration:none; color:var(--text-primary); font-size:var(--fs-sm); font-weight:600;}
.mainnav a:hover{color:var(--brand);}
/* Ẩn/hiện menu dưới 1024px do khối ĐIỀU HƯỚNG MOBILE ở cuối file lo. */

/* ============ HERO MODULE ============ */
.hero-mod{border-radius:var(--radius-lg); overflow:hidden; position:relative; background:linear-gradient(120deg, var(--c-primary-900), var(--c-primary-600) 60%, var(--c-accent-600)); padding:var(--sp-8) var(--sp-7); color:#fff; isolation:isolate;}
.hero-mod::after{content:''; position:absolute; inset:0; background:radial-gradient(circle at 85% 20%, rgba(255,255,255,.18), transparent 55%); z-index:-1;}
.hero-mod .eyebrow-hero{font-size:var(--fs-xs); text-transform:uppercase; letter-spacing:.12em; color:var(--c-accent-300); font-weight:700; margin-bottom:var(--sp-3); display:block;}
.hero-mod h3{color:#fff; font-size:var(--fs-2xl); max-width:480px; margin-bottom:var(--sp-4);}
.hero-mod p{color:rgba(255,255,255,.85); max-width:440px; margin-bottom:var(--sp-5); font-size:var(--fs-base);}
.hero-mod .actions{display:flex; gap:var(--sp-3); flex-wrap:wrap;}
.hero-mod .btn-secondary{background:rgba(255,255,255,.12); border-color:rgba(255,255,255,.4); color:#fff;}
.hero-mod .btn-secondary:hover{background:rgba(255,255,255,.2); border-color:#fff;}

/* ============ FOOTER MODULE ============ */
.site-footer{background:var(--brand-strong); color:rgba(255,255,255,.85); border-radius:var(--radius-lg); padding:var(--sp-7) var(--sp-6) var(--sp-5); font-size:var(--fs-base);}
.footer-grid{display:grid; grid-template-columns:1.4fr 1fr 1fr 1.1fr; gap:var(--sp-6); margin-bottom:var(--sp-6);}
@media (max-width:760px){ .footer-grid{grid-template-columns:1fr 1fr;} }
/* h2, không phải h5: nội dung chính luôn kết thúc ở cấp h4 sâu nhất, và
   h2 sau bất kỳ cấp nào cũng không phải "nhảy cấp" (chỉ nhảy khi ĐI SÂU
   hơn 1 cấp — quay lại cấp nông hơn luôn hợp lệ, coi như mở khối mới). */
.site-footer h2{color:#fff; font-family:var(--font-display); font-size:var(--fs-sm); text-transform:uppercase; letter-spacing:.06em; margin-bottom:var(--sp-3);}
.site-footer ul{list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:8px;}
.site-footer a{color:rgba(255,255,255,.75); text-decoration:none;}
.site-footer a:hover{color:#fff;}
.footer-bottom{border-top:1px solid rgba(255,255,255,.15); padding-top:var(--sp-4); display:flex; justify-content:space-between; flex-wrap:wrap; gap:8px; font-size:var(--fs-xs); color:rgba(255,255,255,.6);}

/* logo mark dùng lại trong header/preview */
.logo-mark{color:var(--brand);}

/* ============ UTILITY: xếp chồng nhiều box thông tin ============ */
/* Dùng khi nhiều alert/card/panel xếp dọc thay vì lưới — giữ đúng
   khoảng cách 32px giữa các box theo quy ước ở đầu file. */
.stack-boxes{display:flex; flex-direction:column; gap:var(--gap-box);}
/* Dùng để xếp các NHÓM thành phần con bên trong một box (không phải giữa các box) */
.stack-group{display:flex; flex-direction:column; gap:var(--sp-4);}


/* =====================================================================
   THÀNH PHẦN BỔ SUNG — dựng lại 2026-09-07 sau khi file bị ghi đè.
   Giữ đúng quy ước khoảng cách 32 / 24 / 16 / 8 ở đầu file.
   ===================================================================== */

/* ============ CHỮ CHỈ DÀNH CHO TRÌNH ĐỌC MÀN HÌNH ============ */
.sr-only{position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0;}
/* Tiện ích dùng chung: giữ 1 cụm ngắn không bao giờ xuống dòng giữa chừng —
   vd 1 khoảng năm "2006 – 2013". Khác với \u00a0 (khoảng trắng không ngắt):
   dấu gạch ngang (– hoặc -) tự thân đã là điểm ngắt dòng hợp lệ theo chuẩn
   Unicode line-breaking (UAX #14) bất kể ký tự đứng sau nó là space hay
   nbsp, nên chỉ nbsp quanh dấu gạch ngang KHÔNG đủ để chặn ngắt dòng ngay
   sau nó — phải bọc nguyên cụm bằng white-space:nowrap (2026-09-13, phát
   hiện khi thêm mốc "2006 – 2013" ở phần Hình thành và phát triển). */
.nowrap{white-space:nowrap;}

/* ============ SKIP LINK ============ */
.skip-link{position:absolute; left:-9999px; top:0; z-index:100; background:var(--brand); color:#fff; padding:10px 16px; border-radius:0 0 var(--radius-sm) 0; font-size:var(--fs-sm); font-weight:600; text-decoration:none;}
.skip-link:focus{left:0;}

/* ============ ICON (sprite Solar — xem design-system/icons.md) ============ */
/* Không đặt fill/stroke ở đây: icon linear khai báo fill="none" bằng thuộc tính,
   mà CSS đè lên thuộc tính — đặt fill sẽ biến chúng thành khối đặc. */
.icon{display:inline-block; width:1.25em; height:1.25em; flex:none; vertical-align:-.15em;}
.icon-sm{width:16px; height:16px;}
.icon-md{width:24px; height:24px;}
.icon-lg{width:52px; height:52px;}

/* ============ KHUNG ẢNH CHỜ — ghi rõ kích thước ảnh cần ============ */
.img-ph{display:flex; flex-direction:column; align-items:center; justify-content:center; gap:var(--sp-2); padding:var(--sp-5); text-align:center;
  background:var(--bg-tint); border:1px dashed var(--border-strong); border-radius:var(--radius-md); color:var(--text-secondary);}
.img-ph b{font-family:var(--font-numeric); font-variant-numeric:tabular-nums; font-size:var(--fs-md); font-weight:600; color:var(--brand-strong); letter-spacing:.02em;}
.img-ph span{font-size:var(--fs-xs); line-height:1.5;}
.img-ph--dark{background:rgba(255,255,255,.07); border-color:rgba(255,255,255,.35); color:rgba(255,255,255,.75);}
.img-ph--dark b{color:#fff;}
.img-ph img{width:100%; height:100%; object-fit:cover; border-radius:inherit;}
/* Khi đã có ảnh thật thay cho khung chờ: bỏ viền đứt nét + đệm của trạng thái
   "chờ ảnh", ảnh tràn kín khung và phóng nhẹ khi rê chuột. */
.img-ph--photo{padding:0; border:none; overflow:hidden;}
.img-ph--photo img{transition:transform .4s var(--ease);}
.img-ph--photo:hover img{transform:scale(1.05);}

/* ============ ẢNH GIỚI THIỆU CHỒNG LỆCH (ảnh chính lệch phải, ảnh phụ lệch
   trái + thấp hơn, góc trên-phải ảnh phụ khuất dưới góc dưới-trái ảnh chính) ============ */
/* Ảnh chính (portrait, có viền trắng) lệch về bên phải, chỉ chiếm ~68% bề
   rộng nên chừa khoảng trống bên trái cho ảnh phụ. Ảnh phụ (landscape, không
   viền) lệch trái, kéo lên bằng margin-top âm để góc trên-phải của nó khuất
   một phần dưới góc dưới-trái ảnh chính, phần dưới còn lại vẫn lộ ra ngoài.
   .about-visual__main cần position:relative + z-index để chắc chắn nó được
   vẽ đè lên ảnh phụ — nếu không, ảnh phụ đứng sau trong DOM sẽ tự vẽ đè
   ngược lại lên ảnh chính. */
.about-visual{display:flex; flex-direction:column;}
.about-visual__main{position:relative; z-index:1; width:68%; margin-left:auto; border:6px solid var(--bg-surface); border-radius:var(--radius-lg); box-shadow:var(--shadow-lg); overflow:hidden;}
.about-visual__accent{width:50%; margin-top:calc(-1 * var(--sp-8)); border-radius:var(--radius-lg); box-shadow:var(--shadow-lg); overflow:hidden;}

/* ============ SCROLL REVEAL — khối xuất hiện khi cuộn tới ============
   Tăng cường dần: trạng thái ẩn chỉ bật khi <html> có .js-reveal (gắn bằng JS
   sớm nhất có thể) — không có JS thì .reveal hiện sẵn như bình thường, không
   mất nội dung. .reveal-group đánh số thứ tự con để so le thời điểm xuất hiện.
   Tôn trọng prefers-reduced-motion: tắt hẳn hiệu ứng, hiện ngay không cần cuộn. */
.js-reveal .reveal{opacity:0; transform:translateY(28px); transition:opacity .6s var(--ease), transform .6s var(--ease);}
.js-reveal .reveal.is-visible{opacity:1; transform:none;}
.js-reveal .reveal-group .reveal:nth-child(2){transition-delay:.08s;}
.js-reveal .reveal-group .reveal:nth-child(3){transition-delay:.16s;}
.js-reveal .reveal-group .reveal:nth-child(4){transition-delay:.24s;}
@media (prefers-reduced-motion: reduce){
  .js-reveal .reveal{opacity:1; transform:none; transition:none;}
}

/* ============ TOPBAR: tên công ty · mạng xã hội · tìm kiếm · ngôn ngữ ============ */
.topbar .brandline{font-size:var(--fs-xs); text-transform:uppercase; letter-spacing:.06em; font-weight:600;}
.topbar-tools{display:flex; align-items:center; gap:var(--sp-4); flex-wrap:wrap;}
/* Hotline trên topbar (2026-09-14) — đặt trước khối social/search, dùng lại
   đúng ico-phone như .footer-hotline. Icon 20x20 (to hơn .icon-sm 16px mặc
   định — ghi đè riêng tại đây, không đổi .icon-sm chung vì nơi khác vẫn cần
   giữ 16px, vd nút tìm kiếm cạnh nó). Nhãn "Hotline:" in đậm; số điện thoại
   to + đậm hẳn lên để dễ đọc/dễ bấm gọi ngay trên một dải mảnh, dùng
   font-numeric + tabular-nums để không lệch độ rộng ký tự giữa các số. */
.topbar-hotline{display:flex; align-items:center; gap:6px; color:#fff; opacity:.85; text-decoration:none; white-space:nowrap;}
.topbar-hotline:hover{opacity:1;}
.topbar-hotline svg{flex:none; width:20px; height:20px;}
.topbar-hotline__label{font-weight:700;}
/* 15px không khớp bậc nào trong thang --fs-* hiện có (--fs-sm 13px / --fs-base
   16px) nên để giá trị riêng theo đúng yêu cầu khách, không đổi token chung.
   Yêu cầu khách 2026-09-14. */
.topbar-hotline__number{font-family:var(--font-numeric); font-variant-numeric:tabular-nums; font-weight:700; font-size:15px;}
.topbar-social{display:flex; gap:var(--sp-2);}
.topbar-social a{display:flex; width:26px; height:26px; align-items:center; justify-content:center; border-radius:var(--radius-sm);}
.topbar-social a:hover{background:rgba(255,255,255,.14); opacity:1;}
.topbar-search{display:flex; align-items:center; background:rgba(255,255,255,.1); border:1px solid rgba(255,255,255,.28); border-radius:var(--radius-sm); padding:2px 4px 2px 10px;}
/* font-size chuẩn tối thiểu 16px cho chữ nội dung/nhập liệu — --fs-xs (12px)
   trước đây vừa dưới ngưỡng đọc, vừa khiến Safari iOS tự động zoom khi focus
   input có font-size <16px, một lỗi UX thật chứ không chỉ thẩm mỹ. */
.topbar-search input{background:transparent; border:none; color:#fff; font-family:var(--font-body); font-size:var(--fs-base); padding:5px 0; width:150px;}
.topbar-search input::placeholder{color:rgba(255,255,255,.6);}
/* Chốt theo yêu cầu khách 2026-09-09: bỏ hẳn viền focus của ô tìm kiếm topbar,
   kể cả khi điều hướng bằng bàn phím — không còn dấu hiệu nhận biết ô đang
   được focus bằng mắt. Vi phạm WCAG 2.4.7 (Focus Visible, mức AA); đã báo lại
   trước khi áp dụng. Xem GAPS.md mục A8. */
.topbar-search input:focus-visible{outline:none;}
.topbar-search button{display:flex; align-items:center; background:none; border:none; color:#fff; cursor:pointer; padding:4px 6px;}

/* ============ MENU CHÍNH: menu con, chữ hoa, ô trang chủ ============ */
.mainnav>li{position:relative;}
.mainnav>li>a,.mainnav>li>button{display:block; padding:10px 0;}
/* Mục cha có menu con (.has-sub) là <button>, không phải <a>: bấm vào không điều
   hướng đi đâu, chỉ các mục trong .subnav mới là liên kết thật. */
.mainnav>li>button{background:none; border:none; margin:0; font:inherit; color:inherit; cursor:pointer; text-align:left;}
/* Mũi tên xuống cạnh mỗi mục có menu con -- báo hiệu "còn nội dung bên dưới"
   ở cả desktop lẫn mobile. Trên mobile mũi tên còn xoay 180deg theo
   aria-expanded để làm chỉ báo mở/rút gọn cho accordion (xem khối 1024px). */
.mainnav>li>button{display:inline-flex; align-items:center; gap:4px;}
/* Mũi tên chỉ cần trên mobile (làm chỉ báo mở/rút gọn cho accordion) --
   ẩn mặc định, chỉ hiện trong khối 1024px bên dưới. Desktop giữ nguyên
   chỉ chữ, logo + menu vẫn một hàng như yêu cầu trước đó, không thêm icon. */
.has-sub__chevron{display:none; flex:none; transition:transform .15s var(--ease);}
/* Đệm ngang + bo góc luôn có mặt ở cả hai trạng thái — chỉ nền/màu chữ đổi khi
   active, để khung không đổi kích thước lúc chuyển trạng thái. */
.mainnav--upper>li>a,.mainnav--upper>li>button{text-transform:uppercase; letter-spacing:.04em; font-weight:700; font-size:var(--fs-base);
  padding:9px 14px; border-radius:var(--radius-md); transition:background .15s var(--ease), color .15s var(--ease);}
/* Nền nhạt khi hover/focus, không chỉ đổi màu chữ: trước đây chỉ đổi màu chữ,
   quá yếu để phân biệt với mục "đang ở trang này" (nền đặc). Khi hai mục cạnh
   nhau — một mục đang ở trang đó (nền đặc) và một mục đang hover để mở menu con
   (trước đây chỉ đổi màu chữ) — mắt bị hút vào nền đặc, tưởng menu con vừa mở
   thuộc về mục đó. Nền nhạt tách bạch rõ "đang xem trang này" (đặc) khỏi "đang
   trỏ chuột vào đây" (nhạt), hai trạng thái nhìn ngay ra là khác nhau. */
/* li:hover (không phải a:hover/button:hover): giữ nền nhạt suốt khi con trỏ
   đang ở trong menu con — a:hover tắt ngay khi rời khỏi chính cái nút, làm mục
   cha trông như "hết hover" trong khi menu con của nó vẫn đang mở, dễ tưởng
   nhầm sang mục bên cạnh lần nữa. */
.mainnav--upper>li:hover>a,.mainnav--upper>li:hover>button,
.mainnav--upper>li>a:focus-visible,.mainnav--upper>li>button:focus-visible,
.mainnav--upper>li.has-sub:focus-within>a,.mainnav--upper>li.has-sub:focus-within>button{
  background:var(--bg-tint); color:var(--brand);}
/* Mục đang active: khung nền màu brand + chữ trắng — cùng kiểu với ô Trang chủ
   lúc active, để cả thanh menu có một ngôn ngữ "đang ở đây" thống nhất. */
.mainnav--upper>li>a[aria-current="page"],
.mainnav--upper>li>button[aria-current="page"]{background:var(--brand); color:#fff;}
.mainnav--upper>li>a[aria-current="page"]:hover,
.mainnav--upper>li>button[aria-current="page"]:hover{background:var(--c-primary-700); color:#fff;}
/* Mở menu con bằng cả :hover và :focus-within — chỉ hover thì bàn phím không mở được.
   Cách mục cha 8px (--sp-2) để nhìn rõ đây là hai khối tách biệt — trước đây
   dán sát (top:100%) khiến menu con trông như một phần nối dài của mục cha,
   dễ nhầm sang mục bên cạnh khi có hai mục liền kề đều có menu con. */
.subnav{position:absolute; top:calc(100% + var(--sp-2)); left:0; min-width:230px; list-style:none; margin:0; padding:var(--sp-2); background:var(--bg-surface); border:1px solid var(--border-default); border-radius:var(--radius-md); box-shadow:var(--shadow-md); display:none; z-index:20;}
/* Cầu vô hình lấp đúng khoảng cách 8px vừa thêm ở trên: không có nó, con trỏ
   đi từ mục cha xuống menu con sẽ đi qua một dải không thuộc <li> lẫn .subnav,
   khiến :hover tắt giữa chừng và menu con đóng lại trước khi tới nơi. Dải này
   không có nền/viền, chỉ giữ trạng thái hover liền mạch qua khoảng trống. */
.subnav::before{content:''; position:absolute; top:calc(var(--sp-2) * -1); left:0; right:0; height:var(--sp-2);}
/* Canh đúng theo mép của chính mục cha, không xoè quá mép — trước đây lệch
   thêm 12px ra ngoài mép để chữ trong menu con thẳng hàng con chữ mục cha,
   nhưng đúng 12px đó là phần đã tràn sang mục liền kề, gây nhầm "menu con của
   ai" giữa hai mục cạnh nhau đều có menu con (Cổ đông ↔ Tin tức). */
/* Mục nửa phải thanh menu (Hỗ trợ khách hàng, Cổ đông): menu con canh theo mép
   PHẢI của chính mục đó, xoè sang trái thay vì sang phải. */
.subnav--right{left:auto; right:0;}
.mainnav>li:hover>.subnav,.mainnav>li:focus-within>.subnav{display:block;}
.subnav a{display:block; padding:8px 12px; border-radius:var(--radius-sm); font-size:var(--fs-base); font-weight:500; color:var(--text-primary); text-decoration:none; white-space:nowrap;}
.subnav a:hover{background:var(--brand); color:#fff;}
/* Viết đủ .mainnav>li.nav-home>a để thắng .mainnav>li>a và
   .mainnav--upper>li>a[aria-current] ở cùng độ đặc hiệu — không dùng !important.
   Thiếu bậc này thì icon nhà bị tô xanh trên nền xanh và biến mất. */
.mainnav>li.nav-home>a{display:flex; align-items:center; justify-content:center; width:44px; height:44px; padding:0; border-radius:var(--radius-md); color:var(--text-primary);}
.mainnav>li.nav-home>a:hover{background:var(--bg-tint); color:var(--brand);}
.mainnav>li.nav-home>a[aria-current="page"]{background:var(--brand); color:#fff;}
/* Nhãn "Trang chủ" cạnh icon — chỉ HIỆN THỊ trên drawer mobile (xem khối
   1024px): ô tròn chỉ icon hợp với thanh ngang desktop (đứng cạnh 7 mục chữ
   hoa khác), nhưng lạc lõng giữa danh sách hàng dọc đầy đủ chữ của drawer.
   Mặc định dùng kỹ thuật .sr-only (không phải display:none): icon trong link
   này là aria-hidden, nếu ẩn luôn nhãn bằng display:none thì link Trang chủ
   ở desktop mất tên gọi cho trình đọc màn hình — .sr-only giữ chữ cho trình
   đọc màn hình, chỉ ẩn khỏi mắt thường. */
.nav-home__label{position:absolute; width:1px; height:1px; padding:0; margin:-1px; overflow:hidden; clip:rect(0 0 0 0); white-space:nowrap; border:0;}

/* ============ Ô TÌM KIẾM TRONG THANH CHÍNH ============ */
/* Chỉ hiện trên mobile (xem .header-search-toggle trong khối 1024px bên
   dưới) — desktop vẫn dùng .topbar-search như cũ, ẩn hẳn ở đây để không lặp
   hai ô tìm kiếm trên cùng một trang. */
.search-form{display:none;}
.search-form .input{padding:8px 12px; font-size:var(--fs-sm); min-width:200px;}
.search-form .btn{flex:none;}

/* ============ ĐIỀU HƯỚNG MOBILE ============ */
/* Menu chính 8 mục chữ hoa không vừa một hàng từ 1024px trở xuống, nên nút Menu
   bật ở 1024 chứ không phải 760. Theme bật/tắt .is-open bằng 6 dòng JS trong
   assets/js/nav.js; không có JS thì menu vẫn hiện, không mất điều hướng. */
.nav-toggle{display:none; align-items:center; gap:var(--sp-2); background:var(--bg-surface); border:1px solid var(--border-strong); border-radius:var(--radius-md); padding:8px 12px; font-family:var(--font-body); font-size:var(--fs-sm); font-weight:600; color:var(--text-primary); cursor:pointer;}
.header-search-toggle{display:none;}
/* Bọc icon tìm kiếm + nút Menu thành một cặp riêng, khoảng cách giữa hai icon
   hẹp hơn gap chung của .mainbar (24px, dành cho khoảng cách giữa các khối
   lớn) — hai icon tiện ích đứng sát nhau không cần khoảng đó, và ở màn hình
   Android phổ biến 360px, logo + gap 24px + hai icon 44px + gap 24px đã VỪA
   ĐỦ tràn dòng (đo thực tế: cần tối thiểu 360.5px, chỉ vừa khít ở 375px,
   không còn margin an toàn). Gộp .header-actions với gap 8px bên trong bù
   lại khoảng chênh này. */
.header-actions{display:none;}
.nav-toggle .bars{display:block; width:18px; height:2px; background:currentColor; position:relative;}
.nav-toggle .bars::before,.nav-toggle .bars::after{content:''; position:absolute; left:0; width:18px; height:2px; background:currentColor;}
.nav-toggle .bars::before{top:-6px;} .nav-toggle .bars::after{top:6px;}
/* Thanh tiêu đề "Danh mục" + nút đóng riêng của drawer mobile — chỉ có ý nghĩa
   khi .mainnav trở thành drawer (xem khối 1024px bên dưới), ẩn hẳn ở desktop
   vì .mainnav khi đó nằm ngay trong hàng ngang của header, không cần tiêu đề
   hay nút đóng riêng. */
.mainnav__head{display:none;}
/* Nền mờ phía sau drawer mobile — phần tử riêng, anh em của <nav>, không phải
   con của nó. Xem lý do (thứ tự vẽ CSS) trong ghi chú tại nav:has() bên dưới.
   Ẩn/hiện bằng thuộc tính [hidden] do JS toggle cùng lúc với .mainnav.is-open
   (initNavToggle trong include-partials.js / nav.js), không dùng class riêng. */
.nav-backdrop{display:none;}
@media (max-width:1024px){
  /* Bỏ hẳn topbar (dải xanh navy trên cùng: tên công ty, mạng xã hội, ô tìm
     kiếm) trên mobile — chỉ còn logo + icon tìm kiếm + nút Menu trên một
     dòng. Tìm kiếm chuyển xuống .header-search-toggle trong .mainbar (xem
     bên dưới), không mất chức năng, chỉ đổi chỗ. Yêu cầu khách 2026-09-10. */
  .topbar{display:none;}
  /* Menu chỉ còn icon, bỏ chữ "Menu" (giờ là .sr-only trong markup) --
     nút vuông 44px khớp cỡ chạm tối thiểu đã dùng cho .nav-home. Logo thu
     nhỏ để nằm cùng hàng với nút Menu thay vì bị đẩy xuống dòng riêng (ảnh
     logo 68px cao + nút Menu có chữ trước đây rộng hơn cả hàng ở màn hình
     hẹp). Yêu cầu khách 2026-09-10. */
  .nav-toggle{display:inline-flex; width:44px; height:44px; padding:0; justify-content:center; gap:0;}
  /* Cao thêm 6px (40px -> 46px) theo yêu cầu khách 2026-09-11, chiều rộng
     tự co giãn theo tỉ lệ gốc (329:82, không set width riêng — trình duyệt
     tự tính từ thuộc tính width/height gốc trên thẻ <img>). Khách yêu cầu
     ban đầu +16px (56px) nhưng lúc đó logo rộng ra ~225px, không đủ chỗ
     đứng cùng dòng với 2 icon (tìm kiếm + menu, 44px mỗi icon + 8px gap)
     ở các màn hình phổ biến 360-390px — bị đẩy xuống dòng 2 (đã gửi ảnh
     minh hoạ cho khách xem, khách chọn giảm mức tăng). +6px (46px) là mức
     tối đa còn đủ chỗ 1 dòng ở mốc hẹp nhất đã đo trong dự án (360px, xem
     ghi chú "màn hình Android phổ biến 360px" cùng khối này) mà vẫn còn dư
     ~7px, không sát mép như bản 40px cũ. */
  .mainbar .logo-wrap img.logo-horizontal{height:46px;}
  /* Icon tìm kiếm đứng trước nút Menu (bên trái, cùng hàng) -- bấm để bung ô
     nhập bên dưới, không phải ô nhập luôn hiện sẵn như topbar cũ (quá rộng
     cho một hàng chỉ có logo + hai icon). Chỉ để icon trần, không khung/viền
     (khác .nav-toggle) — nền nhạt chỉ xuất hiện khi hover/đang bung để vẫn có
     phản hồi chạm, không phải một khối cố định giữa hàng. Yêu cầu khách
     2026-09-10. */
  .header-search-toggle{display:inline-flex; align-items:center; justify-content:center; width:44px; height:44px;
    background:none; border:none; border-radius:var(--radius-md); color:var(--text-primary); cursor:pointer;}
  .header-search-toggle:hover{background:var(--bg-tint); color:var(--brand);}
  .header-search-toggle[aria-expanded="true"]{background:var(--bg-tint); color:var(--brand);}
  /* Icon tìm kiếm + nút Menu gộp một cặp, gap hẹp hơn (8px) thay vì gap chung
     của .mainbar — xem lý do (đo thực tế hụt bề rộng ở 360px) tại
     .header-actions phía trên. */
  .header-actions{display:flex; align-items:center; gap:8px; order:2; margin-left:auto;}
  /* Nút Menu và ô tìm kiếm về cùng một dòng, menu bung xuống dưới — không xếp
     lại thì header cao ba dòng và đẩy nội dung xuống dưới màn hình đầu. */
  /* Logo và nút Menu cùng một dòng: header dán ở đỉnh nên mỗi dòng thừa là một
     dòng nội dung bị che suốt lúc cuộn. Gộp lại giữ header ~76px như desktop. */
  /* column-gap giữa logo và cụm 2 icon giảm còn 8px (thay vì 24px mặc định
     kế thừa từ .mainbar) -- logo cao 46px rộng ra ~185px, cộng 2 icon 44px +
     8px gap nội bộ đã gần lấp đầy 360px (mốc Android hẹp nhất đã đo trong dự
     án, xem ghi chú .header-actions phía trên); giữ nguyên gap 24px thì tràn
     dòng ở 360-375px, phải xuống 2 dòng phá lại yêu cầu "logo/icon cùng 1
     dòng". 8px khớp luôn với gap nội bộ của .header-actions nên không tạo
     thêm một khoảng cách mới trong hệ thống. Yêu cầu khách 2026-09-11. */
  .mainbar{flex-wrap:wrap; row-gap:var(--sp-3); column-gap:var(--sp-2);}
  .mainbar .logo-wrap{order:1;}
  .search-form{display:flex; gap:var(--sp-2); align-items:center; order:3; flex:1 1 100%;}
  .search-form[hidden]{display:none;}
  /* <nav> lúc đóng phải display:none (không chỉ ẩn nội dung con) --
     trước đây <nav> vẫn là 1 flex item thật (order:4, width:100%) dù rỗng,
     nên .mainbar bị flex-wrap tính thành 2 "dòng": dòng 1 (logo + 2 icon),
     dòng 2 (chính <nav>, cao 0px vì .mainnav bên trong display:none). Dù
     dòng 2 cao 0, row-gap giữa 2 dòng vẫn cộng thêm khoảng trống CHỈ Ở PHÍA
     DƯỚI logo/icon (dòng 2 luôn nằm sau dòng 1), khiến logo/icon bị dồn lên
     sát mép trên thay vì nằm giữa .mainbar theo chiều dọc. Bỏ hẳn <nav> khỏi
     luồng flex khi đóng thì .mainbar chỉ còn đúng 1 dòng, align-items:center
     lúc đó mới canh giữa logo/icon đúng theo cả khối .mainbar. Lúc mở,
     nav:has(>.mainnav.is-open) bên dưới tự override display:flex +
     position:fixed nên vẫn hoạt động như cũ. Yêu cầu khách 2026-09-11. */
  .mainbar>nav{display:none;}
  .mainbar>.mainnav{width:100%;}
  /* Drawer trượt từ phải, che một phần màn hình + nền mờ phía sau, thay cho
     bảng đổ xuống full-width trước đây — theo mẫu khách gửi 2026-09-10 (kiểu
     "Category" drawer của app ngân hàng tham khảo). <nav> (không phải
     .mainnav) là khung drawer: dùng :has() để biến <nav> thành khung cố định
     CHỈ KHI .mainnav con của nó đang .is-open, không cần thêm class hay sửa
     JS ở tầng <nav>. .mainnav__head (tiêu đề "Danh mục" + nút X) là hàng cố
     định phía trên trong khung này, .mainnav bên dưới nó mới là phần cuộn
     riêng — gộp cả hai vào một khung fixed duy nhất, không đặt position:fixed
     riêng cho .mainnav như bản trước.
     top:var(--topbar-h) thay vì 0: khung bắt đầu ngay dưới topbar, đúng độ
     cao mà .mainbar (chứa nút Menu) đang đứng, để nút X trong .mainnav__head
     hiện ra ĐÚNG VỊ TRÍ nút Menu lúc chưa bấm, không nhảy lên tận đỉnh màn
     hình. Từ 2026-09-10 topbar đã ẩn hẳn ở mốc này (xem .topbar{display:none}
     phía trên) nên --topbar-h giờ đo ra 0 — giữ nguyên biến (không đổi thành
     số 0 viết thẳng) để nếu sau này topbar quay lại ở một mốc màn hình nào
     đó, khoảng cách vẫn tự đúng mà không cần sửa lại chỗ này. Biến đo thật
     bằng JS (initStickyHeader/sticky.js); 0px là fallback lúc chưa có JS. */
  nav:has(>.mainnav.is-open){
    display:flex; flex-direction:column;
    position:fixed; top:var(--topbar-h, 0px); right:0; bottom:0; left:auto; width:min(86vw, 360px);
    z-index:29; background:var(--bg-surface); box-shadow:var(--shadow-lg);
  }
  .nav-backdrop:not([hidden]){display:block; position:fixed; inset:0; z-index:28; background:rgba(14,27,38,.5);}
  /* Nền mờ: BẮT BUỘC là phần tử anh em độc lập của <nav>, không phải ::before
     con của <nav>. Thử trước bằng ::before + z-index:-1 (cùng kỹ thuật đã dùng
     ở .hero-mod::after) rồi phát hiện KHÔNG hợp: theo thứ tự vẽ CSS 2.1 Phụ
     lục E, con có z-index âm chỉ vẽ dưới NỘI DUNG THƯỜNG của cha, nhưng luôn vẽ
     TRÊN nền/viền của chính phần tử cha đó — tức toàn bộ khung drawer (vốn
     cũng là <nav>) bị chính nền mờ của nó phủ lên, drawer không còn nền trắng
     đục mà bị xám mờ y hệt phần nền phía sau. Tách thành phần tử `.nav-backdrop`
     riêng (anh em của <nav>, không phải con) thì không vướng giới hạn "luôn
     vẽ trên nền cha" đó — z-index 28 (thấp hơn 29 của <nav>) so sánh trực
     tiếp giữa hai phần tử ngang hàng, drawer vẽ đè lên nền mờ bình thường. */
  nav:has(>.mainnav.is-open) .mainnav__head{
    display:flex; align-items:center; justify-content:space-between;
    padding:var(--sp-5); flex:none; border-bottom:1px solid var(--border-default);
  }
  .mainnav__title{font-family:var(--font-display); font-weight:700; font-size:var(--fs-xl); color:var(--brand-strong);}
  .mainnav__close{display:flex; align-items:center; justify-content:center; width:40px; height:40px; flex:none;
    background:none; border:none; border-radius:var(--radius-md); color:var(--text-primary); cursor:pointer;}
  .mainnav__close:hover{background:var(--bg-tint);}
  /* Bung menu mobile thành một tấm cuộn riêng bên trong khung drawer, không
     phải một khối chèn vào luồng trang. flex:1 + min-height:0 để .mainnav
     chiếm hết phần còn lại của khung (dưới .mainnav__head) và tự cuộn riêng
     khi menu dài hơn màn hình — overscroll-behavior:contain chặn cuộn tràn
     sang trang khi chạm đáy/đỉnh danh sách. Ghi nhận từ khách 2026-09-10. */
  .mainnav{display:none; flex-direction:column; align-items:stretch; gap:0; width:100%;}
  .mainnav.is-open{display:flex; flex:1 1 auto; min-height:0; margin-top:0; overflow-y:auto; overscroll-behavior:contain; -webkit-overflow-scrolling:touch;}
  /* Viền ngăn cách đặt trên CẢ <li> (không chỉ trên hàng nút cha): mục có menu
     con khi mở ra hiện .subnav ngay dưới nút, viền cũ nằm giữa nút cha và menu
     con của chính nó trông như đang ngăn cách hai thứ thuộc cùng một nhóm --
     đặt trên <li> thì viền luôn rơi đúng sau khi hết cả nhóm (nút + menu con),
     dù đang mở hay đang gập. Theo mẫu khách gửi 2026-09-10. */
  .mainnav>li{border-bottom:1px solid var(--border-default);}
  .mainnav>li:last-child{border-bottom:none;}
  .mainnav>li>a,.mainnav>li>button{padding:14px var(--sp-5); width:100%;}
  /* Mục Trang chủ: đổi từ ô tròn chỉ icon (kiểu thanh ngang desktop) sang một
     hàng đầy đủ như mọi mục khác trong drawer — chỉ icon giữa danh sách toàn
     chữ trông như thiếu nhãn, không rõ bấm vào đâu. Cùng độ đặc hiệu với rule
     desktop ở trên (2 lớp + 1 thẻ) và đứng sau nên thắng, không cần !important. */
  .mainnav>li.nav-home>a{width:100%; height:auto; justify-content:flex-start; gap:var(--sp-3); padding:14px var(--sp-5); border-radius:0;}
  .nav-home__label{position:static; width:auto; height:auto; margin:0; overflow:visible; clip:auto; white-space:normal; font-weight:700; font-size:var(--fs-md);}
  /* Chữ hoa + letter-spacing là kiểu thanh menu ngang desktop — trong drawer
     dọc, chữ thường dễ đọc hơn ở cỡ lớn, đúng tinh thần mẫu khách gửi. Bỏ
     bo góc/full-bleed hết chiều ngang: mục active là một dải màu chạy hết
     chiều ngang drawer, đúng kiểu danh sách di động, không phải viên thuốc
     lơ lửng giữa hàng. */
  .mainnav--upper>li>a,.mainnav--upper>li>button{padding:14px var(--sp-5); border-radius:0;
    text-transform:none; letter-spacing:normal; font-size:var(--fs-md);}
  /* Accordion trên mobile: mỗi danh mục con mặc định thu gọn, bấm vào nút cha
     mới bung .subnav của riêng nó (JS trong include-partials.js chỉ đổi
     aria-expanded, không đụng .is-open của .mainnav) -- menu dài (Dịch vụ,
     Thanh toán, Hỗ trợ khách hàng, Cổ đông, Tin tức) không còn liệt kê hết một
     lúc, đỡ phải cuộn qua nhiều màn hình mới tới mục cần tìm. Ghi nhận từ
     khách 2026-09-10. */
  /* Cân padding hai phía của menu con. Trước đây chỉ chừa bên trái nên nền
     hover/focus chạy sát mép phải, còn chữ lại dính vào mép nền. */
  .subnav{position:static; display:none; min-width:0; border:none; box-shadow:none;
    padding:var(--sp-2) var(--sp-4) var(--sp-3);}
  .subnav a{padding:10px var(--sp-3); border-radius:var(--radius-md); white-space:normal; line-height:1.4;}
  .has-sub>button[aria-expanded="true"]+.subnav{display:block;}
  /* :focus-within ở trên (dùng cho dropdown desktop) tự khớp luôn khi CHÍNH nút
     .has-sub đang được focus -- không riêng gì link con trong .subnav. Trên
     mobile, bấm nút để đóng lại (aria-expanded=false) vẫn giữ focus trên nút
     đó nên nếu không viết đè, mục vừa đóng lại bị :focus-within ép mở lại.
     Cùng độ đặc hiệu với rule đó (3 lớp + 1 thẻ) và đứng sau trong file nên
     thắng, ép đóng đúng theo aria-expanded. */
  .has-sub>button:not([aria-expanded="true"])+.subnav{display:none;}
  .has-sub>button{justify-content:space-between;}
  .has-sub__chevron{display:inline-block;}
  .has-sub>button[aria-expanded="true"] .has-sub__chevron{transform:rotate(180deg);}
  .search-form .input{min-width:0; height:52px;}
  /* Nút gửi chỉ chứa icon: khóa vuông bằng đúng chiều cao ô tìm kiếm, không
     kế thừa padding ngang của .btn-sm làm nút thành hình chữ nhật. */
  .search-form .btn{width:52px; height:52px; min-width:52px; min-height:52px; padding:0; aspect-ratio:1;}
}

/* ============ PAGE HERO — đầu trang con ============ */
.page-hero{background:var(--bg-tint); border-bottom:1px solid var(--border-default); padding:var(--sp-7) 0 var(--sp-6); border-radius:var(--radius-lg);}
.page-hero h1{font-size:var(--fs-2xl); margin-bottom:var(--sp-3);}
.page-hero p{color:var(--text-secondary); max-width:640px;}
.page-hero .breadcrumb{margin-bottom:var(--sp-4);}

/* ============ BỐ CỤC BÀI VIẾT (nội dung + cột phải) ============ */
.article-layout{display:grid; grid-template-columns:minmax(0,1fr) 320px; gap:var(--gap-box); align-items:start;}
@media (max-width:1024px){ .article-layout{grid-template-columns:minmax(0,1fr);} }
.article-header{margin-bottom:var(--sp-5); padding-bottom:var(--sp-5); border-bottom:1px solid var(--border-default);}
.article-header h1{font-size:1.75rem; margin-bottom:var(--sp-3); line-height:1.3;} /* 28px theo yêu cầu khách 2026-09-13 — không khớp bậc token nào (--fs-xl 26px/--fs-2xl 33px) nên để giá trị riêng cho đúng ý khách, không đổi token chung */
.article-meta{display:flex; flex-wrap:wrap; align-items:center; gap:var(--sp-2) var(--sp-4); font-size:var(--fs-sm); color:var(--text-secondary);}
.article-meta time{font-family:var(--font-numeric); font-variant-numeric:tabular-nums;}
.article-meta .sep{color:var(--text-secondary);} /* như trên: dấu phân cách vẫn là chữ hiện, phải đạt 4.5:1 */

/* Tiêu đề bài viết (h1): khách chốt cỡ chữ cụ thể 28px desktop / 22px mobile
   (2026-09-13) — không trùng bậc nào trong thang --fs-* hiện có nên dùng thẳng
   rem tại đây, không thêm token mới vào tokens.css vì đây là yêu cầu riêng cho
   đúng 1 chỗ, không phải một bậc dùng lại nhiều nơi. */
@media (max-width:760px){
  .article-header h1{font-size:1.375rem; line-height:1.3;}
}

/* ============ PROSE — style cho the_content của WordPress ============ */
/* Biên tập viên gõ trong trình soạn thảo, không gắn class. Mọi style nội dung
   bài viết phải nằm ở đây, không rải rác trong CSS từng trang. */
.prose{font-size:var(--fs-base); line-height:1.75; color:var(--text-primary);}
.prose>*+*{margin-top:var(--sp-4);}
.prose h2{font-size:var(--fs-xl); margin-top:var(--sp-7);}
.prose h3{font-size:var(--fs-lg); margin-top:var(--sp-6);}
/* h2/h3/h4 luôn có margin-top riêng ở trên (khoảng cách với đoạn trước) — nếu
   tiêu đề lại là phần tử ĐẦU TIÊN trong .prose (không có gì phía trước) thì
   margin đó chỉ đẩy khối xuống vô lý, không tạo khoảng cách với ai cả. */
.prose>:first-child{margin-top:0;}
.prose h4{font-size:var(--fs-md); margin-top:var(--sp-5);}
.prose a{color:var(--text-link); text-underline-offset:3px;}
.prose ul,.prose ol{padding-left:var(--sp-5); display:flex; flex-direction:column; gap:var(--sp-2);}
.prose li::marker{color:var(--brand);}
.prose blockquote{border-left:3px solid var(--brand); background:var(--bg-tint); padding:var(--sp-4) var(--sp-5); border-radius:0 var(--radius-md) var(--radius-md) 0; color:var(--text-secondary);}
.prose img,.prose figure img{border-radius:var(--radius-md);}
.prose figcaption{font-size:var(--fs-sm); color:var(--text-secondary); margin-top:var(--sp-2); text-align:center;}
.prose code{background:var(--bg-sunken); padding:2px 6px; border-radius:var(--radius-sm); font-size:.9em; font-family:var(--font-mono);}
.prose hr{border:none; border-top:1px solid var(--border-default); margin:var(--sp-6) 0;}
.prose table{width:100%; border-collapse:collapse; font-size:var(--fs-sm);}
.prose th{background:var(--bg-tint); text-align:left; padding:var(--sp-3) var(--sp-4); font-size:var(--fs-xs); text-transform:uppercase; letter-spacing:.05em; color:var(--brand-strong);}
.prose td{padding:var(--sp-3) var(--sp-4); border-top:1px solid var(--border-default);}

/* ============ THẺ TỪ KHOÁ / ĐIỀU HƯỚNG BÀI ============ */
.tag-list{display:flex; flex-wrap:wrap; gap:var(--sp-2); margin-top:var(--sp-5);}
.tag{font-size:var(--fs-xs); font-weight:600; padding:4px 12px; border-radius:var(--radius-pill); background:var(--bg-sunken); border:1px solid var(--border-default); color:var(--text-secondary); text-decoration:none;}
.tag:hover{border-color:var(--brand); color:var(--brand);}
.article-nav{display:grid; grid-template-columns:1fr 1fr; gap:var(--gap-box); margin-top:var(--gap-box);}
@media (max-width:640px){ .article-nav{grid-template-columns:1fr;} }
.article-nav a{background:var(--bg-surface); border:1px solid var(--border-default); border-radius:var(--radius-md); padding:var(--sp-5); text-decoration:none; display:block;}
.article-nav a:hover{border-color:var(--brand);}
.article-nav .dir{font-size:var(--fs-xs); color:var(--text-secondary); display:block; margin-bottom:4px;}
.article-nav .ttl{font-size:var(--fs-sm); font-weight:600; color:var(--text-primary);}
.article-nav .next{text-align:right;}

/* ============ DANH SÁCH TIN DẠNG DÒNG (trang lưu trữ) ============ */
.post-list{display:flex; flex-direction:column; gap:var(--gap-box);}
.post-item{display:grid; grid-template-columns:180px minmax(0,1fr); gap:var(--sp-5); align-items:start; margin-bottom:var(--gap-box);}
.post-item:last-child{margin-bottom:0;}
/* Trước đây ≤640px đổi hẳn sang 1 cột (ảnh full-width nằm trên, chữ nằm dưới)
   vì cột ảnh cố định 180px + gap 24px chỉ còn quá ít chỗ cho chữ ở khổ máy hẹp.
   Khách muốn GIỮ dạng danh sách ảnh-trái/chữ-phải ngay cả trên mobile (giống
   kiểu list "Việc thường làm" bên cột phụ) — nên thay vì bỏ hẳn cột, thu nhỏ
   cột ảnh xuống 96px + giảm gap còn --sp-3 (12px) để chữ vẫn đủ chỗ đọc được
   ở khổ 360-390px (còn lại ~220-250px cho tiêu đề + mô tả, đã test bằng
   Playwright/ảnh chụp thấy ổn, không bị vỡ chữ). */
@media (max-width:640px){
  .post-item{grid-template-columns:96px minmax(0,1fr); gap:var(--sp-3);}
}
.post-item .thumb{aspect-ratio:16 / 9; border-radius:var(--radius-md); background:linear-gradient(135deg, var(--c-primary-600), var(--c-accent-600));}
.post-item .date{font-size:var(--fs-xs); color:var(--text-secondary); font-family:var(--font-numeric); font-variant-numeric:tabular-nums;}
.post-item h3{font-size:var(--fs-md); margin:6px 0;}
.post-item h3 a{color:var(--text-primary); text-decoration:none;}
.post-item h3 a:hover{color:var(--brand);}
.post-item p{font-size:var(--fs-base); color:var(--text-secondary);}
@media (max-width:640px){
  /* Mobile bỏ hẳn đoạn mô tả, chỉ còn ảnh + tiêu đề (yêu cầu khách 2026-09-13) —
     danh sách gọn hơn, mỗi mục thấp lại, xem được nhiều tin hơn trong 1 màn
     hình. align-items đổi center vì giờ chỉ còn 1 dòng chữ ngắn, canh giữa
     theo chiều dọc so với ảnh cho cân đối (căn top như cũ sẽ lệch lên trên). */
  .post-item{align-items:center;}
  .post-item h3{font-size:var(--fs-base); margin:0;}
  .post-item p{display:none;}
}

/* ============ WIDGET CỘT PHẢI ============ */
/* overflow:hidden bắt buộc: .widget-title bleed ra sát mép bằng margin âm rồi
   tự bo hai góc trên của CHÍNH NÓ — nếu .widget (cha) không cắt theo đúng góc
   bo của mình, hai đường bo (cha và .widget-title) không trùng khít tuyệt đối
   ở mức pixel, lộ một góc vuông nhỏ. Cắt ở .widget là nguồn bo duy nhất, con
   bên trong tràn ra sao cũng bị gọt đúng theo một đường cong đó. */
.widget{background:var(--bg-surface); border:1px solid var(--border-default); border-radius:var(--radius-lg); padding:var(--sp-5); margin-bottom:var(--gap-box); overflow:hidden;}
.widget--tint{background:var(--bg-tint);}
/* ============ WIDGET QUẢNG BÁ DỊCH VỤ (ẢNH + LIÊN KẾT) ============ */
/* Ảnh 1680×640 (21:8) từ outputs/service-banners-21x8/ — khách chừa nửa trái trống
   để tự thêm chữ sau; đến lúc đó chỉ cần lưu đè đúng tên file trong
   mockup/images/, không cần sửa HTML.
   Cập nhật 2026-09-09: bỏ khối chú thích (CTA text + mũi tên) hiển thị dưới
   ảnh theo yêu cầu — .widget-promo__cta giờ dùng .sr-only (xem components.css
   dòng .sr-only) nên vẫn còn trong DOM cho trình đọc màn hình, chỉ ẩn thị
   giác. Đổi ở include-partials.js (renderWidgetPromo). */
.widget-promo{padding:0;}
.widget-promo__link{display:block; color:inherit; text-decoration:none;}
.widget-promo__img{aspect-ratio:21 / 8; background:var(--bg-sunken);}
.widget-promo__img img{width:100%; height:100%; object-fit:cover; display:block;}
.widget-promo__cta{font-family:var(--font-display); font-weight:700; font-size:var(--fs-base); color:var(--brand-strong);}
/* Tiêu đề widget — theo bản Figma khách gửi 2026-09-08.
   1) nền — gradient 90deg xanh nước nhạt sang xanh lá nhạt (token gần nhất
      với #EBF6FA/#D9F7E2 của Figma, chênh lệch dưới 3 đơn vị mỗi kênh màu,
      không lập token riêng cho một chỗ dùng duy nhất);
   2) hoạ tiết mờ bên phải — nằm CHUNG một khai báo `background` với (1), là
      hai radial-gradient xếp TRƯỚC linear-gradient nền (lớp liệt kê trước vẽ
      trên, theo đúng thứ tự nguồn của CSS `background`), ba màu
      #F5F5F5/#8AF4AD/#00AB38 đúng theo Figma, mờ dần bằng chính các mốc màu
      của gradient (0% đặc → trong suốt), không dùng filter:blur();
   3) chữ tiêu đề (không viết hoa, không letter-spacing — khác bản trước) và
      ::after — vệt sóng nhỏ, sắc nét, cắt từ hoạ tiết logo, cùng file SVG với
      bản trước nhưng bỏ opacity:.5 vì Layer_1 trong Figma không mờ.

   ĐÃ BỎ filter:blur() VÀ CẢ ẢNH PNG DỰNG SẴN THAY THẾ NÓ. filter:blur() lúc
   đầu đúng trên máy dùng để kiểm (Chrome headless, dựng bằng phần mềm vì
   chạy cờ --disable-gpu) nhưng khách báo không đổi dù đã sửa CSS nhiều lần,
   kể cả sau khi tải lại — tức không phải cache. Đổi sang ảnh PNG dựng sẵn vẫn
   không khớp ảnh khách chụp: ảnh khách thấy có viền cứng như vùng chữ nhật bo
   góc, không mềm loang như bên máy kiểm. Kết luận: `filter` VÀ việc co giãn
   một ảnh bằng background-size đều đi qua đường dựng hình phụ thuộc GPU thật
   của máy — phần mềm (đầu dựng để kiểm) và phần cứng (trình duyệt thật của
   khách) có thể ra hai kết quả khác nhau với CÙNG một file CSS, nên không có
   cách "sửa cho đúng" bằng cách chỉnh trị số, phải đổi hẳn kỹ thuật. Bản này
   không có filter, không có ảnh — chỉ radial-gradient/linear-gradient thuần
   CSS, thứ được đặc tả rất chặt và không có "đường dựng hình phụ" nào để hai
   máy chạy khác nhau. Nếu cần đổi vị trí/độ mờ của hoạ tiết, sửa thẳng ba
   radial-gradient trong `background` bên dưới — không thêm lại filter hay
   ảnh nền cho khối này. */
.widget-title{
  margin:calc(var(--sp-5) * -1) calc(var(--sp-5) * -1) var(--sp-5);
  padding:15px var(--sp-5) 12px;
  background:
    radial-gradient(ellipse 55% 65% at 78% 30%, rgba(0,171,56,.45) 0%, rgba(0,171,56,0) 72%),
    radial-gradient(ellipse 50% 60% at 55% 85%, rgba(138,244,173,.4) 0%, rgba(138,244,173,0) 72%),
    radial-gradient(ellipse 40% 55% at 30% 5%, rgba(245,245,245,.6) 0%, rgba(245,245,245,0) 72%),
    linear-gradient(90deg, var(--c-primary-50), var(--c-accent-100));
  color:var(--brand-strong);
  font-family:var(--font-display); font-weight:700; font-size:var(--fs-lg); line-height:1.2;
  border-bottom:1px solid var(--border-default);
  border-radius:var(--radius-lg) var(--radius-lg) 0 0;
  display:flex; flex-direction:column; align-items:flex-start; justify-content:center; gap:0;
}
.widget-title::after{
  content:''; flex:none; width:72px; height:6px; margin-top:2px;
  background:url("data:image/svg+xml,%3Csvg version=%221.1%22 xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 138.9 10%22%3E %3Cg%3E %3Cpath fill=%22%2300649F%22 d=%22M0,7.1c0,0,19-4.3,39.9-3.7c11.8,0.4,23.9,3.9,34.6,5.2c13.3,1.7,24.1,1.4,26.1,1.3c6.5-0.3,8.5-1,8.5-1 s-19.2,0.4-34-3.8S40.4-1.8,22.5,1.4S0,7.1,0,7.1L0,7.1z%22/%3E %3Cpath fill=%22%2300AB38%22 d=%22M67.2,0.9c0,0,11.8,1,19.8,3.3c26.8,7.7,51.9-2.5,51.9-2.5S116.1,6.8,100.9,4C81,0.3,67.2,0.9,67.2,0.9 L67.2,0.9z%22/%3E %3C/g%3E %3C/svg%3E") no-repeat left center/contain;
}
.widget-list{list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:var(--sp-4);}
.widget-list a{font-size:var(--fs-base); color:var(--text-primary); text-decoration:none; display:block;}
.widget-list a:hover{color:var(--brand);}
/* Đánh dấu chuyên mục đang lọc — dùng ở widget "Chuyên mục" trang tin-tuc.html,
   nơi JS lọc bài viết thay cho .tabs (không có URL riêng cho từng chuyên mục
   nên không dùng aria-current="page", chỉ đánh dấu trạng thái UI). */
.widget-list a[aria-current]{color:var(--brand); font-weight:700;}
.widget-list .date{font-size:var(--fs-xs); color:var(--text-secondary); font-family:var(--font-numeric); font-variant-numeric:tabular-nums; display:block; margin-top:2px;}

/* ============ VÙNG CUỘN NGANG CHO BẢNG RỘNG ============ */
/* Markup bắt buộc: <div class="table-wrap" role="region" tabindex="0"
   aria-label="Bảng biểu giá nước, cuộn ngang để xem thêm cột"> */
.table-wrap{max-width:100%; overflow-x:auto; overflow-y:hidden; border:1px solid var(--border-default); border-radius:var(--radius-md); -webkit-overflow-scrolling:touch;}
.table-wrap:focus-visible{outline:2px solid var(--brand); outline-offset:2px;}
.table-wrap table{min-width:560px;}

/* ============ TRẠNG THÁI RỖNG / KHÔNG TÌM THẤY ============ */
.empty-state{text-align:center; padding:var(--sp-8) var(--sp-5); background:var(--bg-surface); border:1px dashed var(--border-strong); border-radius:var(--radius-lg);}
.empty-state .icon-wrap{width:52px; height:52px; margin:0 auto var(--sp-4); border-radius:50%; background:var(--bg-tint); color:var(--brand); display:flex; align-items:center; justify-content:center;}
/* Minh hoạ trạng thái rỗng dùng chung (images/nodata.svg) — ảnh đã có sẵn
   khung nền tròn mờ riêng nên không bọc trong .icon-wrap như icon nhỏ. */
.empty-state__img{width:120px; height:120px; margin:0 auto var(--sp-4); display:block;}
.empty-state h2,.empty-state h3{font-size:var(--fs-md); margin-bottom:var(--sp-2);}
.empty-state p{font-size:var(--fs-base); color:var(--text-secondary); max-width:420px; margin:0 auto var(--sp-5);}

/* ============ ACCORDION — hỏi đáp ============ */
/* Dùng <details>/<summary> gốc: đóng mở được bằng bàn phím, không cần JS. */
.accordion{display:flex; flex-direction:column; gap:var(--gap-box);}
.acc-item{background:var(--bg-surface); border:1px solid var(--border-default); border-radius:var(--radius-md); overflow:hidden;}
.acc-item>summary{cursor:pointer; padding:var(--sp-4) var(--sp-5); font-weight:600; font-size:var(--fs-base); list-style:none; display:flex; justify-content:space-between; align-items:center; gap:var(--sp-4);}
.acc-item>summary::-webkit-details-marker{display:none;}
.acc-item>summary::after{content:'+'; color:var(--brand); font-size:var(--fs-lg); font-weight:400; flex:none;}
.acc-item[open]>summary::after{content:'−';}
.acc-item>summary:hover{background:var(--bg-tint);}
.acc-body{padding:0 var(--sp-5) var(--sp-5); font-size:var(--fs-base); color:var(--text-secondary);}

/* ============ DANH SÁCH BƯỚC — thủ tục lắp đặt, sang tên ============ */
.step-list{list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:var(--sp-5);}
.step-list li{display:grid; grid-template-columns:36px minmax(0,1fr); gap:var(--sp-4); align-items:start;}
.step-list .no{width:36px; height:36px; border-radius:50%; background:var(--bg-tint); color:var(--brand); font-family:var(--font-numeric); font-variant-numeric:tabular-nums; font-weight:600; display:flex; align-items:center; justify-content:center; font-size:var(--fs-sm);}
.step-list h3,.step-list h4{font-size:var(--fs-base); margin-bottom:4px;}
.step-list p{font-size:var(--fs-base); color:var(--text-secondary);}

/* ============ DANH SÁCH VĂN BẢN TẢI VỀ ============ */
.file-list{list-style:none; margin:0; padding:0; display:flex; flex-direction:column;}
.file-item{display:flex; align-items:center; gap:var(--sp-4); padding:var(--sp-4) 0; border-bottom:1px solid var(--border-default);}
.file-item .ext{flex:none; font-family:var(--font-numeric); font-size:var(--fs-xs); font-weight:600; padding:6px 10px; border-radius:var(--radius-sm); background:var(--bg-tint); color:var(--brand-strong); text-transform:uppercase;}
.file-item .meta{flex:1; min-width:0;}
.file-item .meta a{font-size:var(--fs-base); font-weight:600; color:var(--text-primary); text-decoration:none;}
.file-item .meta a:hover{color:var(--brand);}
.file-item .meta span{display:block; font-size:var(--fs-xs); color:var(--text-secondary); margin-top:2px;}

/* ============ DANH SÁCH CÓ DẤU TÍCH ============ */
.check-list{list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:var(--sp-3);}
.check-list li{display:flex; gap:var(--sp-3); align-items:flex-start; font-size:var(--fs-base);}
.check-list svg{flex:none; margin-top:2px; color:var(--c-accent-600);}
.check-list a{color:var(--text-primary); text-decoration:none;}
.check-list a:hover{color:var(--brand); text-decoration:underline;}

/* Modifier .check-list--cols2: dùng cho danh sách dài (vd "Ngành nghề kinh
   doanh" trang giới thiệu) — chia 2 cột trên desktop, mỗi cột 5 mục, và mục
   thứ N cột trái phải thẳng hàng với mục thứ N cột phải (yêu cầu 2026-09-13).
   grid-auto-flow:column + grid-template-rows:repeat(5,auto) tự đưa mục 1-5
   vào cột 1, 6-10 vào cột 2; mỗi hàng grid tự giãn theo ô cao nhất giữa 2
   cột nên 2 mục cùng hàng luôn ngang nhau, không cần chỉnh tay. Breakpoint
   1024px dùng chung với .two-col để đồng bộ — dưới mốc đó quay lại xếp
   chồng 1 cột như .check-list gốc. */
@media (min-width:1025px){
  .check-list--cols2{display:grid; grid-template-columns:1fr 1fr; grid-template-rows:repeat(5,auto); grid-auto-flow:column; column-gap:var(--sp-8); row-gap:var(--sp-3);}
}

/* ============ THÔNG BÁO CẤP NƯỚC — dòng lịch cắt nước ============ */
.notice-item{display:flex; gap:var(--sp-4); padding:var(--sp-4) 0; border-bottom:1px solid var(--border-default); align-items:flex-start;}
.notice-item .when{flex:none; width:76px; text-align:center; font-family:var(--font-numeric); font-variant-numeric:tabular-nums; background:var(--bg-tint); border-radius:var(--radius-md); padding:var(--sp-2);}
.notice-item .when .d{display:block; font-size:var(--fs-lg); font-weight:600; color:var(--brand-strong); line-height:1.1;}
.notice-item .when .m{display:block; font-size:var(--fs-xs); color:var(--text-secondary);}
.notice-item>div:not(.when){flex:1; min-width:0;}
.notice-item .badge{flex:none; margin-bottom:6px;}
.notice-item h4{font-size:var(--fs-base); margin-bottom:4px;}
.notice-item h4 a{color:var(--text-primary); text-decoration:none;}
.notice-item h4 a:hover{color:var(--brand);}
.notice-item .area{font-size:var(--fs-sm); color:var(--text-secondary);}
.notice-item .hours{font-family:var(--font-numeric); font-variant-numeric:tabular-nums; font-size:var(--fs-sm); color:var(--text-primary);}

/* ============ LIÊN KẾT RỜI TRANG — sang cổng tra cứu CSKH ============ */
/* Chữ "(mở cổng CSKH)" là bắt buộc, không thay bằng riêng cái icon. */
.link-external::after{content:'↗'; margin-left:4px; font-size:.9em;}
.link-external .out{font-size:var(--fs-xs); color:var(--text-secondary); font-weight:400;}

/* ============ FOOTER: 2 cột, khối hotline, nút về đầu trang ============ */
.footer-grid--2{grid-template-columns:1fr 1.8fr;}
.footer-brand .footer-logo{display:inline-flex; align-items:center; justify-content:center; width:108px; height:108px; background:#fff; border-radius:var(--radius-md); padding:12px;}
.footer-brand .footer-logo img{width:100%; height:100%; object-fit:contain; display:block;}
.footer-brand b{display:block; font-family:var(--font-display); font-size:var(--fs-md); color:#fff; text-transform:uppercase; letter-spacing:.04em; line-height:1.4; margin-top:var(--sp-4);}
.footer-hotline{display:block; margin-top:var(--sp-4);}
.footer-hotline .lbl{font-size:var(--fs-xs); text-transform:uppercase; letter-spacing:.06em; color:var(--c-accent-300);}
.footer-hotline a{display:block; font-family:var(--font-numeric); font-variant-numeric:tabular-nums; font-size:var(--fs-xl); font-weight:600; color:#fff; text-decoration:none; margin-top:2px;}
/* .site-footer ul (0,1,1) đè .contact-list (0,1,0) — phải nâng bằng tiền tố
   .site-footer, không dùng !important. grid-auto-flow:column để đọc theo cột. */
.site-footer .contact-list{display:grid; grid-template-rows:repeat(3,auto); grid-auto-flow:column; justify-content:start; gap:var(--sp-3) var(--sp-7); list-style:none; margin:0; padding:0;}
.site-footer .contact-list li{display:flex; gap:var(--sp-3); align-items:flex-start; color:rgba(255,255,255,.8);}
.site-footer .contact-list svg{flex:none; margin-top:2px; color:var(--c-accent-300);}
/* Nút về đầu trang: cũng dùng bậc 700 cho mũi tên trắng đủ tương phản */
.to-top{position:fixed; right:var(--sp-5); bottom:var(--sp-5); z-index:40; width:48px; height:48px; border-radius:var(--radius-md); background:var(--c-accent-700); color:#fff; display:flex; align-items:center; justify-content:center; box-shadow:var(--shadow-md);}
.to-top:hover{background:var(--c-accent-800);}

/* ============ BOTTOM NAV — thanh điều hướng nhanh (mobile) ============
   5 lối tắt hay dùng nhất: Trang chủ, Dịch vụ, Thanh toán, CSKH (trỏ tới
   /ho-tro-khach-hang, cùng data-nav-key với mục "Hỗ trợ khách hàng" trên
   .mainnav để cùng lúc bật trạng thái active ở cả 2 nơi), Liên hệ. Chỉ hiện
   ≤760px (khác mốc 1024px của .nav-toggle) — từ 761px trở lên vẫn còn đủ
   chỗ hiện menu ngang đầy đủ hoặc ít nhất khoảng trống rộng rãi hơn nhiều so
   với điện thoại, một thanh cố định dưới đáy kiểu app di động sẽ thừa/lạc
   lõng ở khổ máy tính bảng. z-index thấp hơn .nav-backdrop (28) một bậc để
   khi mở menu, nền mờ full-viewport tự phủ luôn lên thanh này — không cần
   thêm rule ẩn riêng lúc drawer mở. Yêu cầu khách 2026-09-11. */
.bottom-nav{display:none;}
@media (max-width:760px){
  .bottom-nav{
    display:flex; position:fixed; left:0; right:0; bottom:0; z-index:25;
    height:var(--bottomnav-h); padding-bottom:env(safe-area-inset-bottom, 0px);
    background:var(--bg-surface); border-top:1px solid var(--border-default);
    box-shadow:var(--shadow-md);
  }
  .bottom-nav__item{
    flex:1 1 0; display:flex; flex-direction:column; align-items:center; justify-content:center;
    gap:2px; min-width:0; padding:6px 2px; text-decoration:none; color:var(--text-secondary);
    font-size:11px; font-weight:600; line-height:1.2; text-align:center;
  }
  .bottom-nav__item .icon{color:currentColor;}
  .bottom-nav__item:hover{color:var(--brand);}
  .bottom-nav__item[aria-current="page"]{color:var(--brand);}
}

/* .topbar{justify-content:center}, .topbar-search input{width:110px} và
   .topbar .brandline{display:none} (từng ở đây, mốc 760/640) đã bỏ: topbar
   ẩn hẳn từ 1024px xuống (xem .topbar{display:none} ở khối ĐIỀU HƯỚNG MOBILE)
   nên ba rule đó không bao giờ còn chạm tới nữa. Yêu cầu khách 2026-09-10. */
@media (max-width:760px){
  .footer-grid--2{grid-template-columns:1fr;}
  .site-footer .contact-list{grid-template-rows:none; grid-auto-flow:row;}
  /* bottom nâng theo --bottomnav-h: từ 2026-09-11 có thêm thanh .bottom-nav
     cố định ở đáy màn hình cùng mốc ≤760px -- giữ nguyên bottom:var(--sp-4)
     cũ thì nút này chìm sau/đè lên thanh đó. */
  .to-top{right:var(--sp-4); bottom:calc(var(--bottomnav-h) + var(--sp-3));}
}
@media (max-width:640px){
  /* Bỏ dòng tagline dưới wordmark: nó dài 230px, đẩy nút Menu xuống dòng thứ hai
     và làm header dán cao gấp đôi. Wordmark NAWARUCO vẫn còn. */
  .mainbar .logo-wrap span{display:none;}
}


/* =====================================================================
   BỔ SUNG cho các trang trong (theo design-system/page-specs.md)
   ===================================================================== */

/* ============ MENU NEO TRONG TRANG (anchor navigation) ============ */
/* Khung layout dung chung ca 2 phien ban (mobile: vien thuoc rieng tung muc;
   desktop: segment gop chung 1 khung -- xem 2 khoi @media ben duoi). Khong
   dung position:sticky tren chinh .anchor-nav: header da sticky o top:0, dan
   them mot dai nua buoc phai biet chieu cao header bang con so cung, va con
   so do sai ngay khi header doi -- .anchor-nav-wrap (site.css) moi la noi
   khai bao sticky, dung bien --header-h do bang JS. Menu neo nam trong
   luong, cuon theo trang (qua .anchor-nav-wrap). */
.anchor-nav{display:flex; gap:8px; width:fit-content; max-width:100%; overflow-x:auto; -webkit-overflow-scrolling:touch;}
/* Ẩn thanh cuộn hệ thống: dải ô này ngắn và luôn cuộn được bằng chạm/trackpad,
   thanh cuộn xám hiện thường trực (đặc biệt trên mobile) trông như một thanh
   tiến trình bị lỗi hơn là gợi ý "còn nội dung bên phải" — bỏ hẳn ở mọi kích
   thước màn hình, không riêng mobile. */
.anchor-nav{scrollbar-width:none; -ms-overflow-style:none;}
.anchor-nav::-webkit-scrollbar{display:none;}
.anchor-nav a{display:block; flex:none; padding:9px 16px; border-radius:var(--radius-md); white-space:nowrap;
  font-family:var(--font-body); font-size:var(--fs-md); font-weight:600; color:var(--text-secondary);
  text-decoration:none; transition:background .12s var(--ease), color .12s var(--ease), border-color .12s var(--ease), box-shadow .12s var(--ease);}
/* Đích của liên kết neo phải chừa chỗ cho header dán ở đỉnh, nếu không tiêu đề
   section nhảy lên nằm dưới header và người dùng tưởng bấm không ăn. */
/* Chừa chỗ cho header dán + menu neo dán + hai lần khoảng cách 20px. Thiếu nó
   thì bấm vào mục neo, tiêu đề section nhảy lên nằm dưới hai thanh đó. */
.anchor-target{scroll-margin-top:calc(var(--header-h, 76px) + var(--anchor-h, 54px) + var(--gap-box) * 2);}

/* ≤760px (mobile): "button tab" -- mỗi mục tự vẽ viền/nền của chính nó, không
   có khung thẻ bo góc bọc ngoài cả dải. Mục đang xem là viên thuốc nền tint,
   các mục còn lại đồng loạt có viền nhạt — không chỉ đổi màu chữ khi active, vì
   trên chạm không có trạng thái hover, dễ trông như chỉ một mục là "bấm được".
   Đồng bộ với `.tab-group .tab` ở trang dịch vụ lắp đặt — cùng dùng kiểu viên
   thuốc riêng trên mobile. Yêu cầu khách 2026-09-10. */
@media (max-width:760px){
  .anchor-nav a{border:1px solid var(--border-default); background:var(--bg-surface);}
  .anchor-nav a:hover{background:var(--bg-sunken); color:var(--brand);}
  .anchor-nav a[aria-current="true"]{background:var(--bg-tint); color:var(--brand); border-color:var(--bg-tint);}
}
@media (max-width:640px){
  .anchor-nav{width:100%;}
  .anchor-nav a{padding:9px 12px;}
}

/* >760px (desktop/tablet): quay lại dạng segment như bản đầu — MỘT khung
   ngoài duy nhất (nền sunken + viền + bo góc), các mục BÊN TRONG KHÔNG tự vẽ
   viền riêng nữa — khác bản đầu tiên (trước 2026-09-10) là va viền cả khung
   ngoài LẬN từng mục cùng lúc, nhìn như hộp lồng hộp. Lần này chỉ khung ngoài
   có viền, mục đang chọn phân biệt thuần bằng màu nền + bóng nhẹ (nổi lên như
   segmented control thật), không tái diễn lỗi cũ. Yêu cầu khách 2026-09-11: giữ
   dạng viên thuốc trên mobile, riêng desktop quay lại dạng segment. */
@media (min-width:761px){
  .anchor-nav{background:var(--bg-surface); border:1px solid var(--border-default); border-radius:var(--radius-md); padding:4px; gap:2px;}
  .anchor-nav a{border-radius:calc(var(--radius-md) - 2px);}
  .anchor-nav a:hover{color:var(--brand);}
  /* Muc dang chon: nen dam mau thuong hieu + chu trang -- dung lai dung
     token da dung cho trang thai active cua .mainnav--upper/.nav-home
     (xem .mainnav--upper>li>a[aria-current="page"] o tren) de dong bo mau
     "active" trong toan site, khong tu bia mau moi. Yeu cau khach 2026-09-11:
     nen trang cho ca dai, muc chon noi bat tuong phan ro. */
  .anchor-nav a[aria-current="true"]{background:var(--brand); color:#fff;}
  .anchor-nav a[aria-current="true"]:hover{background:var(--c-primary-700); color:#fff;}
}

/* ============ MỐC THỜI GIAN (Hình thành và phát triển) ============ */
.timeline{list-style:none; margin:0; padding:0; position:relative;}
.timeline::before{content:''; position:absolute; left:76px; top:8px; bottom:8px; width:2px; background:var(--border-default);}
.timeline li{position:relative; display:grid; grid-template-columns:60px minmax(0,1fr); gap:var(--sp-6); padding-bottom:var(--sp-6);}
.timeline li:last-child{padding-bottom:0;}
.timeline .year{font-family:var(--font-numeric); font-variant-numeric:tabular-nums; font-weight:600; font-size:var(--fs-base); color:var(--brand-strong); text-align:right; padding-top:2px;}
.timeline .dot{position:absolute; left:71px; top:6px; width:12px; height:12px; border-radius:50%; background:var(--brand); border:2px solid var(--bg-surface); z-index:1;}
.timeline h3,.timeline h4{font-size:var(--fs-base); margin-bottom:4px;}
.timeline p{font-size:var(--fs-base); color:var(--text-secondary);}
@media (max-width:640px){
  .timeline::before{left:5px;}
  .timeline li{grid-template-columns:minmax(0,1fr); gap:var(--sp-2); padding-left:var(--sp-6);}
  .timeline .year{text-align:left;}
  .timeline .dot{left:0;}
}

/* ============ DANH SÁCH THÔNG TIN CÓ ICON (trên nền sáng) ============ */
/* Bản nền sáng của .contact-list ở footer — dùng cho trang Liên hệ. */
.info-list{list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:var(--sp-4);}
.info-list li{display:flex; gap:var(--sp-4); align-items:flex-start;}
.info-list svg{flex:none; margin-top:2px; color:var(--brand);}
.info-list .lbl{display:block; font-size:var(--fs-xs); text-transform:uppercase; letter-spacing:.06em; color:var(--text-secondary); margin-bottom:2px;}
.info-list strong{font-size:var(--fs-base); font-weight:600;}
.info-list a{color:var(--text-primary); text-decoration:none;}
.info-list a:hover{color:var(--brand);}

/* ============ LƯỚI BIỂU MẪU ============ */
/* Form dài xếp 2 cột trên desktop; .field-full chiếm cả hàng. */
.form-grid{display:grid; grid-template-columns:1fr 1fr; gap:var(--gap-box);}
.form-grid .field{max-width:none;}
.form-grid .field-full{grid-column:1 / -1;}
.form-actions{display:flex; gap:var(--sp-3); align-items:center; flex-wrap:wrap; margin-top:var(--sp-5);}
.form-note{font-size:var(--fs-xs); color:var(--text-secondary);}
@media (max-width:640px){ .form-grid{grid-template-columns:1fr;} }

/* ============ Ô TẢI ẢNH LÊN ============ */
/* Chưa nối backend: chỉ là input file có style, xem ghi chú trong trang. */
.file-drop{display:flex; flex-direction:column; align-items:center; gap:var(--sp-2); padding:var(--sp-5); text-align:center; border:1px dashed var(--border-strong); border-radius:var(--radius-md); background:var(--bg-sunken); color:var(--text-secondary); font-size:var(--fs-sm); cursor:pointer;}
.file-drop:hover,.file-drop:focus-within{border-color:var(--brand); background:var(--bg-tint);}
.file-drop svg{color:var(--brand);}
.file-drop input{position:absolute; width:1px; height:1px; opacity:0;}

/* ============ TRANG CHUYỂN TIẾP ============ */
.redirect-box{max-width:560px; margin:0 auto; text-align:center; background:var(--bg-surface); border:1px solid var(--border-default); border-radius:var(--radius-lg); padding:var(--sp-8) var(--sp-6);}
.redirect-box .spinner{width:44px; height:44px; margin:0 auto var(--sp-5); border:3px solid var(--c-primary-100); border-top-color:var(--brand); border-radius:50%; animation:spin 1s linear infinite;}
@keyframes spin{to{transform:rotate(360deg);}}
/* h2, không phải h1: .redirect-box luôn đứng sau .page-banner h1 của chính
   trang ("Tra cứu hoá đơn"/"Thanh toán trực tuyến"), h1 thứ hai là trùng cấp. */
.redirect-box h2{font-size:var(--fs-xl); margin-bottom:var(--sp-3);}
.redirect-box p{color:var(--text-secondary); font-size:var(--fs-base); margin-bottom:var(--sp-5);}
.redirect-box .dest{display:inline-flex; align-items:center; gap:var(--sp-2); background:var(--bg-tint); border-radius:var(--radius-md); padding:var(--sp-3) var(--sp-4); font-size:var(--fs-sm); font-weight:600; color:var(--brand-strong); margin-bottom:var(--sp-5);}

/* =====================================================================
   BỔ SUNG cho trang Liên hệ (bố cục theo ảnh mẫu khách chọn)
   ===================================================================== */

/* ============ TIÊU ĐỀ CÓ GẠCH NHẤN ============ */
/* Tiêu đề navy kèm vệt sóng nước bên dưới — cùng hoạ tiết với .widget-title::after
   ở sidebar (cắt từ logo, xanh dương + xanh lá), thay cho gạch pill phẳng trước
   đây để đồng nhất với các title module sidebar. Dùng cho tên công ty,
   "Gửi yêu cầu liên hệ", "Sơ đồ đường đi". */
.heading-rule{margin-bottom:var(--sp-5);}
.heading-rule>h2,.heading-rule>h1,.heading-rule>h3{color:var(--brand-strong); margin-bottom:var(--sp-1);}
.heading-rule::after{
  content:''; display:block; width:72px; height:6px;
  background:url("data:image/svg+xml,%3Csvg version=%221.1%22 xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 138.9 10%22%3E %3Cg%3E %3Cpath fill=%22%2300649F%22 d=%22M0,7.1c0,0,19-4.3,39.9-3.7c11.8,0.4,23.9,3.9,34.6,5.2c13.3,1.7,24.1,1.4,26.1,1.3c6.5-0.3,8.5-1,8.5-1 s-19.2,0.4-34-3.8S40.4-1.8,22.5,1.4S0,7.1,0,7.1L0,7.1z%22/%3E %3Cpath fill=%22%2300AB38%22 d=%22M67.2,0.9c0,0,11.8,1,19.8,3.3c26.8,7.7,51.9-2.5,51.9-2.5S116.1,6.8,100.9,4C81,0.3,67.2,0.9,67.2,0.9 L67.2,0.9z%22/%3E %3C/g%3E %3C/svg%3E") no-repeat left center/contain;
}

/* ============ KÊNH LIÊN HỆ NHANH (Zalo · Messenger · Hotline) ============ */
.channel-list{display:grid; grid-template-columns:repeat(auto-fit, minmax(210px,1fr)); gap:var(--gap-box); list-style:none; margin:0; padding:0;}
.channel{display:flex; align-items:center; gap:var(--sp-3); padding:var(--sp-3) var(--sp-4);
  background:var(--bg-surface); border:1px solid var(--border-default); border-radius:var(--radius-md);
  box-shadow:var(--shadow-sm); text-decoration:none; color:inherit;
  transition:border-color .12s var(--ease), box-shadow .12s var(--ease);}
.channel:hover{border-color:var(--brand); box-shadow:var(--shadow-md);}
/* Ô logo: chỗ để thay bằng logo chính thức của Zalo / Messenger khi bàn giao —
   xem ghi chú trong design-system/icons.md */
.channel__logo{flex:none; width:34px; height:34px; display:flex; align-items:center; justify-content:center;}
.channel__logo--zalo{font-family:var(--font-display); font-weight:700; font-size:var(--fs-sm); color:#0068FF; letter-spacing:-.02em; width:auto;}
.channel__logo--messenger{color:#0084FF;}
.channel__logo--phone{color:var(--c-danger);}
.channel__body{min-width:0;}
.channel__name{display:block; font-size:var(--fs-sm); font-weight:700; color:var(--text-primary);}
.channel__hours{display:block; font-size:var(--fs-xs); color:var(--text-secondary); margin-top:2px;}

/* ============ BẢN ĐỒ ĐƯỜNG ĐI ============ */
.map-embed{position:relative; border:1px solid var(--border-default); border-radius:var(--radius-lg); overflow:hidden; background:var(--bg-sunken);}
.map-embed iframe{display:block; width:100%; height:520px; border:0;}
/* Khung chờ cao đúng bằng bản đồ thật để bản demo không dựng ra một khối cao
   hơn thực tế — xem trước sai kích thước thì duyệt bố cục cũng sai theo. */
.map-embed .img-ph{aspect-ratio:auto; height:520px; border:none; border-radius:0;}
@media (max-width:1024px){ .map-embed iframe,.map-embed .img-ph{height:420px;} }
@media (max-width:760px){ .map-embed iframe,.map-embed .img-ph{height:320px;} }


/* =====================================================================
   BỔ SUNG trang Tin tức: bài nổi bật và tin nhỏ trong cột phải
   ===================================================================== */

/* ============ BÀI NỔI BẬT (đầu trang danh sách tin) ============ */
.post-feature{display:block; background:var(--bg-surface); border:1px solid var(--border-default);
  border-radius:var(--radius-lg); overflow:hidden; text-decoration:none; color:inherit;
  transition:border-color .12s var(--ease), box-shadow .12s var(--ease);}
.post-feature:hover{border-color:var(--brand); box-shadow:var(--shadow-md);}
.post-feature .thumb,.post-feature .img-ph{aspect-ratio:16 / 9; border-radius:0; border-left:none; border-right:none; border-top:none;}
.post-feature .body{padding:var(--sp-5); display:flex; flex-direction:column; gap:var(--sp-3);}
.post-feature h2{font-size:var(--fs-xl); line-height:1.3; color:var(--brand-strong);}
.post-feature p{font-size:var(--fs-base); color:var(--text-secondary);}
.post-feature .more{font-size:var(--fs-sm); font-weight:700; color:var(--text-link);}
@media (max-width:640px){ .post-feature h2{font-size:var(--fs-lg);} }

/* ============ TIN NHỎ TRONG WIDGET (ảnh vuông + tiêu đề + ngày) ============ */
.widget-news{list-style:none; margin:0; padding:0; display:flex; flex-direction:column; gap:var(--sp-4);}
.widget-news li{display:grid; grid-template-columns:84px minmax(0,1fr); gap:var(--sp-3); align-items:start;}
.widget-news .thumb,.widget-news .img-ph{aspect-ratio:4 / 3; border-radius:var(--radius-sm); padding:0; min-height:0;}
.widget-news .img-ph b,.widget-news .img-ph span{display:none;}
.widget-news a{font-size:var(--fs-base); font-weight:600; line-height:1.4; color:var(--text-primary); text-decoration:none; display:block;}
.widget-news a:hover{color:var(--brand);}
.widget-news .date{display:block; margin-top:4px; font-size:var(--fs-xs); color:var(--text-secondary);
  font-family:var(--font-numeric); font-variant-numeric:tabular-nums;}

/* Danh sách chuyên mục có số bài */
.widget-list .count{float:right; font-size:var(--fs-xs); color:var(--text-secondary); font-family:var(--font-numeric); font-variant-numeric:tabular-nums;}
.widget-list li{border-bottom:1px solid var(--border-default); padding-bottom:var(--sp-3);}
.widget-list li:last-child{border-bottom:none; padding-bottom:0;}


/* ============ NGOẠI LỆ NGẮT DÒNG: tiêu đề ngắn, căn giữa ============ */
/* Chỉ những chỗ này mới dùng text-wrap:balance — tiêu đề 3–6 từ, căn giữa hoặc
   đứng một mình, chia đều hai dòng trông cân hơn. Mọi tiêu đề trong luồng đọc
   (thẻ tin, danh sách, bài viết) dùng `pretty` để không ngắt dòng sớm. */
.sec-title h2,.empty-state h2,.empty-state h3,.page-banner h1,.cta-band h2,.redirect-box h2{text-wrap:balance;}


/* ============ BÀI NỔI BẬT NẰM TRONG KHUNG DANH SÁCH ============ */
/* Khi .post-feature đặt trong .panel thì nó không còn là một thẻ riêng: bỏ viền,
   bo góc và đổ bóng, chỉ giữ một đường kẻ ngăn với danh sách bên dưới — để bài
   nổi bật và các tin sau đọc như một khối liền mạch, không rời rạc. */
.panel>.post-feature{border:none; box-shadow:none; border-radius:0; background:none;
  padding-bottom:var(--gap-box); border-bottom:1px solid var(--border-default); margin-bottom:var(--gap-box);}
.panel>.post-feature:hover{box-shadow:none;}
/* Chỉ bo góc. Không đặt border ở đây: khai báo này đặc hiệu hơn .img-ph--photo
   nên nó từng vẽ lại đường nét đứt của khung ảnh chờ lên cả ảnh thật. */
.panel>.post-feature .img-ph,.panel>.post-feature .thumb{border-radius:var(--radius-md);}
.panel>.post-feature .body{padding:var(--sp-5) 0 0;}


/* ============ TAB CÓ NỘI DUNG (tablist + tabpanel) ============ */
/* .tabs trước đây chỉ là dải nút trang trí. Bản này là tab thật: mỗi nút điều
   khiển một panel, đánh dấu bằng aria-selected thay vì class .active để trình
   đọc màn hình biết tab nào đang mở. JS 20 dòng ở assets/js/tabs.js.
   Trạng thái chọn của .tab đã gộp về một chỗ ở khối TABS phía trên (kiểu
   folder tab) — không lặp lại rule ở đây nữa. */
/* Bỏ khoảng cách gap-box: kiểu folder tab cần panel dính liền ngay dưới tab
   đang chọn, không có khe hở. .panel giữ nguyên viền + bo góc bình thường —
   viền trên của .panel chính là đường nền chung cho các tab chưa chọn (xem
   .tabs:has(~.tab-panel) ở khối TABS phía trên); tab đang chọn che 1px viền
   này bằng top+z-index, không cần .panel tự chỉnh hình dạng riêng. */
.tab-panel{padding-top:0;}
.tab-panel[hidden]{display:none;}
/* .post-feature (display:block) và .post-item (display:grid) đè lên quy tắc mặc
   định [hidden]{display:none} của trình duyệt, nên khi lọc chuyên mục chúng vẫn
   hiện. Phải khai báo lại tường minh — không dùng !important. */
.post-feature[hidden],.post-item[hidden],.empty-state[hidden],.pagination[hidden],.tabs[hidden]{display:none;}
/* Nhóm tab rộng: cho phép cuộn ngang trên mobile, nút vẫn tới được bằng bàn phím */
.tabs--lg .tab{font-size:var(--fs-lg); padding:var(--sp-4) var(--sp-5);}


/* ≤760px: bỏ khung .tab-group — đồng bộ với .panel đã bỏ khung ở
   mọi trang khác (.panel:not(.panel--tint) trong site.css, yêu cầu khách
   2026-09-10); nếu không thì .tab-group vẫn còn viền/bo góc/đổ bóng
   trong khi .panel bên trong nó đã rỗng khung — một hộp viền ngoài
   không "khớp" với gì bên trong. .tabs cũng không thể giữ nguyên dạng
   "folder tab liền khung" (chỉ hợp lý khi có khung nối liền bên dưới) nên
   đổi sang từng viên thuốc riêng, đúng kiểu .anchor-nav ở trang giới
   thiệu (mỗi mục tự có viền/nền, mục đang chọn là viên nền tint) — hai
   trang trông đồng bộ. Yêu cầu khách 2026-09-11. */
@media (max-width:760px){
  .tab-group{border:none; border-radius:0; box-shadow:none; background:none;}
  .tab-group .tabs{background:none; margin:0 0 var(--gap-box); gap:var(--sp-2);
    scrollbar-width:none; -ms-overflow-style:none;}
  .tab-group .tabs::-webkit-scrollbar{display:none;}
  .tab-group .tab{border:1px solid var(--border-default); background:var(--bg-surface);
    border-radius:var(--radius-md); font-size:var(--fs-md); padding:9px 14px; top:0;}
  .tab-group .tab.active,.tab-group .tab[aria-selected="true"]{
    background:var(--bg-tint); color:var(--brand); border:1px solid var(--bg-tint);}
}


/* ============ MỐC NĂM CHO KHO TÀI LIỆU ============ */
/* Nhãn năm nằm trên một đường kẻ chạy hết bề ngang — dùng cho các trang kho tài
   liệu theo năm (đại hội cổ đông, công bố thông tin, báo cáo tài chính).
   Ảnh mẫu dùng nhãn màu cam; ở đây là navy của wordmark, vì bộ nhận diện
   NAWARUCO không có màu cam. */
.year-head{display:flex; align-items:center; gap:0; margin-bottom:var(--gap-box);}
.year-head__label{flex:none; padding:var(--sp-2) var(--sp-4); background:var(--brand-strong); color:#fff;
  font-family:var(--font-display); font-size:var(--fs-sm); font-weight:700; text-transform:uppercase; letter-spacing:.05em;
  border-radius:var(--radius-sm) var(--radius-sm) 0 0;}
.year-head__rule{flex:1; height:1px; background:var(--border-strong); align-self:flex-end;}
/* Nhóm tài liệu của một năm, cách mốc năm kế tiếp bằng khoảng cách giữa các module */
.year-group + .year-head{margin-top:var(--sp-8);}
/* Ngăn Safari trên iPhone tự phóng to trang khi người dùng chạm vào trường nhập.
   iOS chỉ auto-zoom khi cỡ chữ thực tế của input nhỏ hơn 16px. Giữ khả năng
   pinch-to-zoom để không làm mất tính năng trợ năng của trình duyệt. */
@media (max-width:1024px){
  input,select,textarea{font-size:16px!important;}
}

/* ============ SƠ ĐỒ TỔ CHỨC (orgchart) — trang giới thiệu ============
   Dựng bằng CSS Grid thuần (không ảnh, không SVG, không JS). Mỗi ".oc-row"
   là 1 hàng lưới 5 cột bằng nhau — cột giữa (cột 3) luôn là tâm ngang của
   toàn sơ đồ (= 50%), nên trục dọc chính chỉ cần đặt cố định ở left:50%,
   không phải tính theo từng ô. Nhánh trái/phải (Ban kiểm soát, 2 Phó Tổng
   Giám đốc) đặt ở cột 1-2 / cột 4-5, ép sát biên trong (justify-self:
   end/start) nên mép hộp luôn rơi đúng ranh giới 40%/60% — từ đó đường nối
   ngang chỉ cần 2 số cố định (40%→50%, 50%→60%), không cần đo theo nội dung
   chữ dài ngắn khác nhau. Hàng "spread" gom trục dọc lại thành 1 thanh ngang
   rộng 10%→90% để chia đều xuống 5 phòng ban (tâm mỗi ô 5 cột: 10/30/50/70/
   90%) — .oc-stub-1..5 khớp đúng các mốc này.
   Toàn khối gắn role="img" + aria-label mô tả bằng văn bản (xem gioi-thieu.
   html) — mọi phần tử con là trình bày lại nội dung đó nên đều aria-hidden. */
.orgchart{display:flex; flex-direction:column; gap:0;}
.oc-row{position:relative; display:grid; grid-template-columns:repeat(5,1fr);}
.oc-box{border:1px solid var(--c-primary-100); background:var(--bg-tint); color:var(--brand-strong); font-weight:700; text-align:center; border-radius:var(--radius-md); padding:10px 16px; line-height:1.35; position:relative; z-index:1;}
.oc-box--top{grid-column:1/-1; justify-self:center; font-size:var(--fs-base); max-width:300px;}
.oc-box--side{grid-column:1/3; justify-self:end; font-size:var(--fs-sm); max-width:220px;}
.oc-box--side-r{grid-column:4/6; justify-self:start;}
.oc-box--dept{grid-column:span 1; justify-self:stretch; margin-inline:6px; font-size:var(--fs-sm); font-weight:600;}
.oc-box--note{grid-column:1/-1; justify-self:center; font-size:var(--fs-xs); font-weight:400; color:var(--text-secondary); background:var(--bg-surface); border-style:dashed; max-width:340px;}

/* Hàng có hộp phụ (Ban kiểm soát / 2 Phó TGĐ) cần đủ cao để hộp không đụng
   hộp ở hàng trên/dưới, và căn hộp theo chiều dọc vào giữa hàng. */
.oc-row--branch,.oc-row--branch2{min-height:76px; align-items:center;}
.oc-row--link{height:28px;}
.oc-row--spread{height:34px;}
.oc-row--note{margin-top:var(--sp-4);}

/* Đường nối — chỉ 2 hình: dọc (trục chính) và ngang (nhánh rẽ). Tất cả toạ độ
   tính theo % của chính hàng chứa nó (xem giải thích ở trên). */
.oc-vline{position:absolute; left:calc(50% - 1px); width:2px; background:var(--c-primary-400);}
.oc-vline--thru{top:0; bottom:0;}
.oc-vline--top{top:0; height:50%;}
.oc-hline{position:absolute; top:calc(50% - 1px); height:2px; background:var(--c-primary-400);}
.oc-hline--l{left:40%; width:10%;}
.oc-hline--r{left:50%; width:10%;}
.oc-hline--bar{left:10%; width:80%;}
.oc-stub{position:absolute; top:50%; bottom:0; width:2px; background:var(--c-primary-400);}
.oc-stub-1{left:calc(10% - 1px);} .oc-stub-2{left:calc(30% - 1px);} .oc-stub-3{left:calc(50% - 1px);}
.oc-stub-4{left:calc(70% - 1px);} .oc-stub-5{left:calc(90% - 1px);}

/* ≤1024px (đồng bộ mốc với .two-col/.check-list--cols2): sơ đồ phân nhánh
   5 cột không có chỗ hiển thị đúng trên màn hình hẹp — chuyển thành danh
   sách xếp chồng theo đúng thứ tự phân cấp (đã đúng sẵn trong DOM), bỏ hết
   đường nối, dùng viền trái + thụt lề nhẹ để gợi ý cấp bậc thay cho đường kẻ. */
@media (max-width:1024px){
  .orgchart{gap:var(--sp-3);}
  .oc-row{display:block;}
  .oc-row--link,.oc-row--spread{display:none;}
  .oc-row--branch,.oc-row--branch2{min-height:0;}
  .oc-vline,.oc-hline,.oc-stub{display:none;}
  /* width:auto (không phải 100%) — .oc-box--side/--dept/--note còn có thêm
     margin-left để thụt lề gợi ý cấp bậc; width:100% + margin-left sẽ cộng dồn
     margin ra NGOÀI 100% đó và tràn ngang, phải để trình duyệt tự co bề rộng
     theo margin như 1 khối block bình thường.
     PHẢI reset thêm justify-self:auto — phát hiện 2026-09-24: justify-self
     (CSS Box Alignment) không chỉ tác dụng lên ô lưới, mà còn áp dụng cho cả
     khối block bình thường MIỄN LÀ width là auto (đúng như vừa đổi ở trên).
     Không reset thì .oc-box--top/--side/--side-r/--dept/--note vẫn giữ
     nguyên justify-self:center/end/start từ layout lưới desktop, làm mỗi hộp
     tự canh lệch trái/phải/giữa khác nhau trên mobile dù margin-left bằng
     nhau — 2 hộp "Phó Tổng Giám đốc" từng lệch hẳn 2 vị trí khác nhau vì 1
     hộp có justify-self:end (hộp trái, theo layout desktop) còn hộp kia có
     justify-self:start (hộp phải). grid-column reset kèm cho chắc dù property
     này không có tác dụng ngoài lưới. */
  .oc-box{display:block; width:auto; max-width:none; margin:0 0 var(--sp-2); text-align:left; border-left:3px solid var(--brand); border-radius:0 var(--radius-md) var(--radius-md) 0; justify-self:auto; grid-column:auto;}
  .oc-box--side{margin-left:var(--sp-5); border-left-color:var(--c-primary-400);}
  .oc-box--dept{margin-left:var(--sp-6); border-left-color:var(--c-primary-400);}
  .oc-row--note{margin-top:0;}
  .oc-box--note{margin-left:var(--sp-6); border-left-style:dashed; text-align:left;}
}

/* ============ MOBILE FORM + MENU — OVERRIDE CUỐI FILE ============
   Đặt cuối cascade để mọi trang con mở từ liên kết "Xem thêm" nhận cùng kết
   quả, kể cả khi các class .btn-sm/.subnav desktop có độ ưu tiên cao hơn. */
@media (max-width:1024px){
  form.search-form>input.input{
    flex:1 1 auto; width:calc(100% - 60px); min-width:0; height:52px;
    font-size:16px!important;
  }
  form.search-form>button.btn{
    flex:0 0 52px!important; width:52px!important; max-width:52px;
    height:52px!important; min-width:52px; min-height:52px;
    padding:0!important; aspect-ratio:1 / 1; border-radius:var(--radius-md);
  }
  .mainnav .subnav{
    width:100%; margin:0; padding:var(--sp-2) var(--sp-4) var(--sp-4)!important;
    box-sizing:border-box;
  }
  .mainnav .subnav>li>a{
    display:block; width:100%; margin:0; padding:12px 14px!important;
    border-radius:var(--radius-md); white-space:normal; line-height:1.4;
    box-sizing:border-box;
  }
}
