﻿@charset "UTF-8";
/* ============================================================
   HKD Admin — entry SCSS (Themes/Common)
   Compile -> wwwroot/css/common-all.css (xem compilerconfig.json của Client).
   Server chỉ host; toàn bộ giao diện (razor + scss) nằm ở project Client.

   Quy tắc (theo CLAUDE.md):
   - Token/framework:      _variables.scss
   - Component dùng chung: _components.scss
   - App shell (sidebar):  _app-shell.scss
   - Page lớn:             _page-[ten-page].scss — mỗi trang một file, import dưới đây
============================================================ */
/* ============================================================
   Design tokens — shadcn / Linear / Vercel inspired
   Zinc neutrals + single indigo accent. Light + Dark.

   Cách chọn giao diện (theo thứ tự ưu tiên):
     1. data-theme="light" | "dark" trên <html>  -> người dùng tự chọn
     2. prefers-color-scheme của hệ điều hành    -> khi chưa chọn
============================================================ */
/* ---- Token không phụ thuộc sáng/tối ---- */
:root {
  /* Radius (minimal, rounded-lg) */
  --radius-sm: 6px;
  --radius: 8px;
  --radius-lg: 12px;
  /* Layout */
  --sidebar-width: 256px;
  --topnav-height: 56px;
  --header-height: 60px;
  --content-max-width: 1400px;
  --transition: 0.15s ease;
  /* Sidebar (app shell kiểu shadcn "sidebar-07") */
  --sidebar-width-icon: 48px; /* bề rộng khi thu gọn còn icon */
  --sidebar-inset-header: 64px; /* header vùng nội dung */
  --sidebar-inset-header-sm: 48px; /* header khi sidebar thu gọn */
  --sidebar-primary: var(--accent);
  --sidebar-primary-foreground: var(--accent-foreground);
}

/* ---- 1. Mặc định: sáng ---- */
:root {
  color-scheme: light;
  /* Neutrals (zinc) */
  --background: #fafafa; /* app canvas */
  --surface: #ffffff; /* cards, header, sidebar */
  --surface-2: #f4f4f5; /* subtle fills / hover  (zinc-100) */
  --border: #e4e4e7; /* zinc-200 */
  --border-strong: #d4d4d8; /* zinc-300 */
  --foreground: #18181b; /* zinc-900 */
  --muted-foreground: #52525b; /* zinc-600 */
  --muted-foreground-2: #a1a1aa; /* zinc-400 */
  /* Accent — dark indigo */
  --accent: #4f46e5; /* indigo-600 */
  --accent-hover: #4338ca; /* indigo-700 */
  --accent-foreground: #ffffff;
  --accent-subtle: rgba(79, 70, 229, 0.10);
  --accent-subtle-hover: rgba(79, 70, 229, 0.16);
  --ring: rgba(79, 70, 229, 0.35);
  /* Semantic */
  --success: #059669; /* emerald-600 */
  --success-subtle: rgba(5, 150, 105, 0.12);
  --danger: #dc2626;
  --danger-subtle: rgba(220, 38, 38, 0.12);
  --warning: #d97706;
  --warning-subtle: rgba(217, 119, 6, 0.14);
  /* Shadows — subtle, borders do the heavy lifting */
  --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.04);
  --shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.06), 0 1px 2px -1px rgba(0, 0, 0, 0.04);
  /* Bóng hắt NGƯỢC LÊN (offset âm) — cho thanh nút dính đáy (.form-page-footer).
     Đậm hơn --shadow vì nhiệm vụ của nó là tách hẳn thanh nút khỏi nội dung đang
     trượt qua bên dưới, không phải nhấn nhẹ một cái thẻ. */
  --shadow-up: 0 -6px 16px -6px rgba(0, 0, 0, 0.12);
  /* Sidebar */
  --sidebar: #ffffff;
  --sidebar-foreground: #18181b;
  --sidebar-muted: #71717a; /* zinc-500 */
  --sidebar-border: #e4e4e7;
  --sidebar-accent: #f4f4f5; /* hover/active nền */
  --sidebar-accent-foreground: #18181b;
}

/* ---- 2. Hệ điều hành đang tối và người dùng CHƯA chọn "sáng" ---- */
@media (prefers-color-scheme: dark) {
  :root:not([data-theme=light]) {
    color-scheme: dark;
    --background: #09090b; /* zinc-950 */
    --surface: #18181b; /* zinc-900 */
    --surface-2: #27272a; /* zinc-800 */
    --border: #27272a; /* zinc-800 */
    --border-strong: #3f3f46; /* zinc-700 */
    --foreground: #fafafa;
    --muted-foreground: #a1a1aa; /* zinc-400 */
    --muted-foreground-2: #71717a; /* zinc-500 */
    --accent: #6366f1; /* indigo-500 */
    --accent-hover: #818cf8; /* indigo-400 */
    --accent-foreground: #ffffff;
    --accent-subtle: rgba(99, 102, 241, 0.16);
    --accent-subtle-hover: rgba(99, 102, 241, 0.24);
    --ring: rgba(99, 102, 241, 0.45);
    --success: #10b981; /* emerald-500 — sáng hơn cho nền tối */
    --success-subtle: rgba(16, 185, 129, 0.16);
    --danger: #f87171; /* red-400 */
    --danger-subtle: rgba(248, 113, 113, 0.16);
    --warning: #f59e0b; /* amber-500 */
    --warning-subtle: rgba(245, 158, 11, 0.18);
    --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.40);
    --shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.50), 0 1px 2px -1px rgba(0, 0, 0, 0.40);
    /* Đục hơn hẳn bản sáng: nền tối gần đen thì bóng đen mờ 0.12 không nhìn thấy gì,
       thanh nút sẽ trông như dính liền vào nội dung phía dưới. */
    --shadow-up: 0 -8px 20px -6px rgba(0, 0, 0, 0.60);
    --sidebar: #18181b; /* zinc-900 */
    --sidebar-foreground: #fafafa;
    --sidebar-muted: #a1a1aa; /* zinc-400 */
    --sidebar-border: #27272a; /* zinc-800 */
    --sidebar-accent: #27272a;
    --sidebar-accent-foreground: #fafafa;
  }
}
/* ---- 3. Người dùng chọn tường minh (thắng cả OS) ---- */
:root[data-theme=light] {
  color-scheme: light;
  /* Neutrals (zinc) */
  --background: #fafafa; /* app canvas */
  --surface: #ffffff; /* cards, header, sidebar */
  --surface-2: #f4f4f5; /* subtle fills / hover  (zinc-100) */
  --border: #e4e4e7; /* zinc-200 */
  --border-strong: #d4d4d8; /* zinc-300 */
  --foreground: #18181b; /* zinc-900 */
  --muted-foreground: #52525b; /* zinc-600 */
  --muted-foreground-2: #a1a1aa; /* zinc-400 */
  /* Accent — dark indigo */
  --accent: #4f46e5; /* indigo-600 */
  --accent-hover: #4338ca; /* indigo-700 */
  --accent-foreground: #ffffff;
  --accent-subtle: rgba(79, 70, 229, 0.10);
  --accent-subtle-hover: rgba(79, 70, 229, 0.16);
  --ring: rgba(79, 70, 229, 0.35);
  /* Semantic */
  --success: #059669; /* emerald-600 */
  --success-subtle: rgba(5, 150, 105, 0.12);
  --danger: #dc2626;
  --danger-subtle: rgba(220, 38, 38, 0.12);
  --warning: #d97706;
  --warning-subtle: rgba(217, 119, 6, 0.14);
  /* Shadows — subtle, borders do the heavy lifting */
  --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.04);
  --shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.06), 0 1px 2px -1px rgba(0, 0, 0, 0.04);
  /* Bóng hắt NGƯỢC LÊN (offset âm) — cho thanh nút dính đáy (.form-page-footer).
     Đậm hơn --shadow vì nhiệm vụ của nó là tách hẳn thanh nút khỏi nội dung đang
     trượt qua bên dưới, không phải nhấn nhẹ một cái thẻ. */
  --shadow-up: 0 -6px 16px -6px rgba(0, 0, 0, 0.12);
  /* Sidebar */
  --sidebar: #ffffff;
  --sidebar-foreground: #18181b;
  --sidebar-muted: #71717a; /* zinc-500 */
  --sidebar-border: #e4e4e7;
  --sidebar-accent: #f4f4f5; /* hover/active nền */
  --sidebar-accent-foreground: #18181b;
}

:root[data-theme=dark] {
  color-scheme: dark;
  --background: #09090b; /* zinc-950 */
  --surface: #18181b; /* zinc-900 */
  --surface-2: #27272a; /* zinc-800 */
  --border: #27272a; /* zinc-800 */
  --border-strong: #3f3f46; /* zinc-700 */
  --foreground: #fafafa;
  --muted-foreground: #a1a1aa; /* zinc-400 */
  --muted-foreground-2: #71717a; /* zinc-500 */
  --accent: #6366f1; /* indigo-500 */
  --accent-hover: #818cf8; /* indigo-400 */
  --accent-foreground: #ffffff;
  --accent-subtle: rgba(99, 102, 241, 0.16);
  --accent-subtle-hover: rgba(99, 102, 241, 0.24);
  --ring: rgba(99, 102, 241, 0.45);
  --success: #10b981; /* emerald-500 — sáng hơn cho nền tối */
  --success-subtle: rgba(16, 185, 129, 0.16);
  --danger: #f87171; /* red-400 */
  --danger-subtle: rgba(248, 113, 113, 0.16);
  --warning: #f59e0b; /* amber-500 */
  --warning-subtle: rgba(245, 158, 11, 0.18);
  --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.40);
  --shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.50), 0 1px 2px -1px rgba(0, 0, 0, 0.40);
  /* Đục hơn hẳn bản sáng: nền tối gần đen thì bóng đen mờ 0.12 không nhìn thấy gì,
     thanh nút sẽ trông như dính liền vào nội dung phía dưới. */
  --shadow-up: 0 -8px 20px -6px rgba(0, 0, 0, 0.60);
  --sidebar: #18181b; /* zinc-900 */
  --sidebar-foreground: #fafafa;
  --sidebar-muted: #a1a1aa; /* zinc-400 */
  --sidebar-border: #27272a; /* zinc-800 */
  --sidebar-accent: #27272a;
  --sidebar-accent-foreground: #fafafa;
}

/* ============================================================
   Base + component library (dùng chung) — shadcn look
============================================================ */
*, *::before, *::after {
  box-sizing: border-box;
}

html, body {
  height: 100%;
  margin: 0;
  padding: 0;
}

body {
  background: var(--background);
  color: var(--foreground);
  font-family: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
  font-size: 14px;
  line-height: 1.5;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
}

h1, h2, h3, h4 {
  margin: 0;
  font-weight: 600;
  letter-spacing: -0.011em;
  color: var(--foreground);
}

a {
  color: inherit;
  text-decoration: none;
}

::selection {
  background: var(--accent-subtle);
}

/* Scrollbar */
::-webkit-scrollbar {
  width: 10px;
  height: 10px;
}

::-webkit-scrollbar-thumb {
  background: var(--border-strong);
  border-radius: 999px;
  border: 3px solid transparent;
  background-clip: content-box;
}
::-webkit-scrollbar-thumb:hover {
  background: var(--muted-foreground-2);
  background-clip: content-box;
}

::-webkit-scrollbar-track {
  background: transparent;
}

/* ---- Page header ---- */
.page-header {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 16px;
  flex-wrap: wrap;
}

.page-title {
  font-size: 22px;
  font-weight: 600;
  letter-spacing: -0.02em;
}

.page-subtitle {
  margin-top: 4px;
  font-size: 13.5px;
  color: var(--muted-foreground);
}

.header-actions-row {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-wrap: wrap;
}

/* ---- Buttons ---- */
.btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  height: 38px;
  padding: 0 16px;
  border-radius: var(--radius);
  font-size: 13.5px;
  font-weight: 500;
  border: 1px solid transparent;
  cursor: pointer;
  text-decoration: none;
  white-space: nowrap;
  transition: background var(--transition), border-color var(--transition), color var(--transition);
  /* Nút đang xử lý hoặc chưa đủ điều kiện submit (VD: chưa tick điều khoản) */
}
.btn:focus-visible {
  outline: 2px solid var(--ring);
  outline-offset: 2px;
}
.btn i {
  font-size: 13px;
}
.btn:disabled {
  opacity: 0.6;
  cursor: not-allowed;
}

.btn-primary {
  background: var(--accent);
  color: var(--accent-foreground);
}

.btn-primary:hover {
  background: var(--accent-hover);
}

.btn-outline {
  background: var(--surface);
  color: var(--foreground);
  border-color: var(--border);
}

.btn-outline:hover {
  background: var(--surface-2);
  border-color: var(--border-strong);
}

.btn-ghost {
  background: transparent;
  color: var(--muted-foreground);
}

.btn-ghost:hover {
  background: var(--surface-2);
  color: var(--foreground);
}

/* Nút hành động nguy hiểm dạng viền (Xóa trong bảng...) */
.btn-outline-danger {
  background: var(--surface);
  color: var(--danger);
  border-color: var(--border);
}

.btn-outline-danger:hover {
  background: var(--danger-subtle);
  border-color: var(--danger);
}

/* Nút nguy hiểm dạng đặc — nút hành động trong AlertDialog xác nhận xóa/gỡ */
.btn-danger {
  background: var(--danger);
  color: #fff;
}

.btn-danger:hover {
  filter: brightness(0.92);
}

.btn-sm {
  height: 32px;
  padding: 0 12px;
  font-size: 13px;
}

.btn-icon {
  width: 38px;
  padding: 0;
}

/* Nút icon cỡ nhỏ vuông 32px — hành động Sửa/Xóa trong bảng (kèm title làm tooltip) */
.btn-sm.btn-icon {
  width: 32px;
}

/* ---- Card ---- */
.card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm);
}

.card-pad {
  padding: 20px;
}

.card-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 16px 20px;
  border-bottom: 1px solid var(--border);
}

.card-title {
  font-size: 14px;
  font-weight: 600;
}

.card-body {
  padding: 16px 20px;
}

.card-footer {
  padding: 14px 20px;
  border-top: 1px solid var(--border);
}

/* ---- Bento grid ---- */
.bento {
  display: grid;
  grid-template-columns: repeat(12, 1fr);
  gap: 16px;
}

.bento > .col-3 {
  grid-column: span 3;
}

.bento > .col-4 {
  grid-column: span 4;
}

.bento > .col-6 {
  grid-column: span 6;
}

.bento > .col-8 {
  grid-column: span 8;
}

.bento > .col-12 {
  grid-column: span 12;
}

/* Grid mặc định đã CĂNG CAO các ô .col-* bằng nhau trong 1 hàng (align-items: stretch),
   nhưng .card bên trong không tự cao theo — card ngắn hơn (VD biểu đồ doanh thu cạnh danh
   sách 5 sản phẩm) để hở khoảng trắng phía dưới. Ép .card cao 100% ô của nó + xếp flex-column
   để phần thân co giãn lấp khoảng hở (xem .chart-placeholder ở _page-dashboard.scss). */
.bento > [class*=col-] > .card {
  height: 100%;
  display: flex;
  flex-direction: column;
}

@media (max-width: 1080px) {
  .bento > [class*=col-] {
    grid-column: span 6;
  }
}
@media (max-width: 640px) {
  .bento {
    gap: 12px;
  }
  .bento > [class*=col-] {
    grid-column: span 12;
  }
}
/* ---- Stat card ---- */
.stat {
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: 20px;
}

.stat-top {
  display: flex;
  align-items: center;
  justify-content: space-between;
}

.stat-label {
  font-size: 12.5px;
  font-weight: 500;
  color: var(--muted-foreground);
}

.stat-icon {
  width: 34px;
  height: 34px;
  border-radius: var(--radius);
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--surface-2);
  color: var(--muted-foreground);
  font-size: 14px;
}

.stat-value {
  font-size: 26px;
  font-weight: 600;
  letter-spacing: -0.02em;
  line-height: 1.1;
}

.stat-meta {
  font-size: 12.5px;
  color: var(--muted-foreground);
  display: flex;
  align-items: center;
  gap: 8px;
}

.stat-delta {
  font-weight: 500;
  display: inline-flex;
  align-items: center;
  gap: 4px;
}

.stat-delta.up {
  color: var(--success);
}

.stat-delta.down {
  color: var(--danger);
}

/* ---- Badge ---- */
.badge {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  height: 22px;
  padding: 0 9px;
  border-radius: 999px;
  font-size: 11.5px;
  font-weight: 500;
  border: 1px solid var(--border);
  background: var(--surface-2);
  color: var(--muted-foreground);
  white-space: nowrap;
}

.badge-accent {
  background: var(--accent-subtle);
  color: var(--accent);
  border-color: transparent;
}

.badge-success {
  background: var(--success-subtle);
  color: var(--success);
  border-color: transparent;
}

.badge-warning {
  background: var(--warning-subtle);
  color: var(--warning);
  border-color: transparent;
}

.badge-danger {
  background: var(--danger-subtle);
  color: var(--danger);
  border-color: transparent;
}

.badge-dot::before {
  content: "";
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: currentColor;
}

/* ---- Table ---- */
.table {
  width: 100%;
  border-collapse: collapse;
  font-size: 13.5px;
}

.table th {
  text-align: left;
  padding: 10px 12px;
  font-weight: 500;
  font-size: 12px;
  color: var(--muted-foreground);
  border-bottom: 1px solid var(--border);
}

.table td {
  padding: 13px 12px;
  border-bottom: 1px solid var(--border);
}

.table tbody tr:last-child td {
  border-bottom: none;
}

.table tbody tr {
  transition: background var(--transition);
}

.table tbody tr:hover {
  background: var(--surface-2);
}

.table .num {
  text-align: right;
  font-variant-numeric: tabular-nums;
}

.cell-strong {
  font-weight: 500;
  color: var(--foreground);
}

.cell-muted {
  color: var(--muted-foreground);
}

/* ---- List rows ---- */
.list {
  display: flex;
  flex-direction: column;
}

.list-row {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 12px 0;
  border-bottom: 1px solid var(--border);
}

.list-row:last-child {
  border-bottom: none;
}

.avatar {
  width: 38px;
  height: 38px;
  flex-shrink: 0;
  border-radius: var(--radius);
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--surface-2);
  color: var(--muted-foreground);
  font-size: 15px;
}

.grow {
  flex: 1;
  min-width: 0;
}

.truncate {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* ---- Chặn truy cập ----
   Razor: Pages/PageContent.razor (nhánh _isDeny) */
.deny-container {
  display: flex;
  justify-content: center;
  padding: 48px 16px;
}
.deny-container .card {
  max-width: 520px;
  width: 100%;
}
.deny-container .card-title {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  color: var(--danger);
}

.deny-box {
  text-align: center;
  font-size: 13.5px;
  line-height: 1.7;
  color: var(--muted-foreground);
}

/* ============================================================
   FORM PRIMITIVES — dùng chung nhiều page (đăng nhập, đăng ký, thanh toán...)
   Razor: Pages/Auth/Login.razor, Pages/Auth/Register.razor
============================================================ */
/* Nhóm các field xếp dọc */
.field-group {
  display: flex;
  flex-direction: column;
  gap: 20px;
}

.field {
  display: flex;
  flex-direction: column;
  gap: 7px;
}

/* Hai field nằm cạnh nhau trên một hàng (VD: giá bán | giá gốc) */
.field-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
}
@media (max-width: 520px) {
  .field-row {
    grid-template-columns: 1fr;
  }
}

/* Hàng 3 ô — địa giới Tỉnh / Quận / Phường.
   Razor: Pages/Config/Components/ModalCauHinhVanChuyen.razor */
.field-row-3 {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 12px;
  /* Trong modal hẹp, 3 select cạnh nhau thì tên tỉnh/huyện bị cắt gần hết */
}
@media (max-width: 720px) {
  .field-row-3 {
    grid-template-columns: 1fr;
  }
}

/* Dòng label có thêm link phụ bên phải (VD: "Quên mật khẩu?") */
.field-label-row {
  display: flex;
  align-items: center;
  gap: 8px;
}

.field-label {
  font-size: 13.5px;
  font-weight: 500;
  color: var(--foreground);
}

/* ============================================================
   BỐ CỤC TRANG FORM "TẠO / SỬA" — 2 cột + thanh nút dính đáy.
   Dùng chung mọi trang tạo/sửa dạng trang riêng (song song với modal):
   Pages/Product/PageTaoSanPham.razor, Pages/Order/PageTaoDonHang.razor.
============================================================ */
/* 2 cột: nội dung chính bên trái, thông tin phụ (giá, thanh toán...) bên phải */
.form-page-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 540px;
  gap: 16px;
  align-items: start;
}
@media (max-width: 1100px) {
  .form-page-layout {
    grid-template-columns: 1fr;
  }
}

.form-page-main,
.form-page-side {
  display: flex;
  flex-direction: column;
  gap: 16px;
  min-width: 0;
}

/* ============================================================
   Ô ẢNH SẢN PHẨM TRONG BẢNG (11/08/2026)
   Razor: Pages/Product/Components/ListSanPham.razor
          Pages/Order/PageChiTietDonHang.razor
   Chuyển từ _page-san-pham.scss lên đây khi trang thứ hai dùng tới.
============================================================ */
/* Đặt `width` trên <th> chứ không trên <td>: bảng dùng layout tự động, khai ở ô tiêu đề
   là trình duyệt chốt bề rộng cột ngay từ đầu — khai ở <td> thì mỗi dòng đòi một kiểu và
   cột co giãn theo dòng có ảnh rộng nhất. */
.th-thumb {
  width: 64px;
}

.td-thumb {
  /* Ô ảnh luôn cao 48px nên hàng cao hơn ô chữ; canh giữa cho ảnh thẳng hàng với tên. */
  vertical-align: middle;
}

/* Khung bọc do NƠI GỌI quyết định — ProductThumb chỉ render thẻ <img> trần
   (xem chú thích trong Components/ProductThumb.razor). */
.product-row-thumb {
  display: block;
  width: 48px;
  height: 48px;
  overflow: hidden;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  /* Nền cho ảnh trong suốt (PNG) và cho khoảng trống lúc ảnh chưa tải xong —
     dùng biến nên chế độ tối tự đúng. */
  background: var(--surface-2);
  /* Ảnh MẶC ĐỊNH (chưa có ảnh) — mờ nhẹ để nó lùi về sau tên sản phẩm.
     Không cần đổi `object-fit` như bên storefront: khung ở đây VUÔNG 48×48 mà ảnh mặc
     định cũng là glyph vuông nên `cover` chẳng xén gì. Bên kia khung 4:3 mới phải xử lý. */
}
.product-row-thumb img {
  display: block;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.product-row-thumb img.is-placeholder {
  opacity: 0.75;
}

/* ============================================================
   HÀNG NHÃN — GIÁ TRỊ trong thẻ cột phụ (11/08/2026)
   Razor: Pages/Order/PageChiTietDonHang.razor
   Nhãn trái, giá trị phải — kiểu bảng thông tin, khác `.order-info-grid` (lưới nhiều ô).
============================================================ */
.order-info-stack {
  display: flex;
  flex-direction: column;
}

.order-info-line {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 16px;
  padding: 9px 0;
  border-bottom: 1px solid var(--border);
  font-size: 13.5px;
  /* Nhãn không co, giá trị nhận hết phần còn lại và canh PHẢI — địa chỉ hay ghi chú dài
     thì xuống dòng trong phần của nó chứ không đẩy nhãn vỡ. */
  /* Dòng phụ (trạng thái vận đơn, "Thu lúc...") nằm dưới giá trị chính, không nối đuôi. */
}
.order-info-line:last-child {
  border-bottom: 0;
  padding-bottom: 0;
}
.order-info-line .order-info-label {
  flex-shrink: 0;
  color: var(--muted-foreground);
}
.order-info-line .order-info-value {
  min-width: 0;
  text-align: right;
  word-break: break-word;
}
.order-info-line .list-sub-line {
  display: block;
  margin-top: 3px;
}

/* Thanh nút dính đáy khung nội dung — form dài, khỏi phải cuộn xuống cuối để lưu.

   11/08 — dựng lại cho tách bạch hẳn với nội dung cuộn phía dưới:
   ~~border: 1px solid; border-radius: var(--radius-lg); box-shadow: var(--shadow-sm);~~
   Bản cũ là một thẻ card bo tròn trôi lơ lửng — nội dung trượt qua dưới nó nhìn như
   lỗi hiển thị, và bóng đổ XUỐNG (shadow-sm) thì hắt vào đúng chỗ chẳng có gì.

   Bản mới: dải chạy hết chiều ngang, chỉ kẻ viền TRÊN, bóng hắt LÊN (offset âm) —
   mắt đọc ra ngay "nội dung đang chui xuống dưới thanh này". */
.form-page-footer {
  position: sticky;
  bottom: 0;
  z-index: 5;
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 8px;
  margin-top: 16px;
  padding: 12px 16px;
  /* Bo nhẹ hai góc DƯỚI thôi: hai góc trên phải vuông thì dải mới liền mạch với
     mép nội dung bên trên. */
  /* Bóng hắt LÊN. Đi qua biến `--shadow-up` (khai trong _variables.scss) chứ không
     cắm mã màu ở đây: bóng đen nhạt trên nền tối gần như vô hình, nên bản tối cần
     độ đục khác hẳn. Khai bằng biến thì cả hai cách bật chế độ tối (người dùng tự
     chọn + theo hệ điều hành) đều đúng, viết `[data-theme="dark"] .x` thì chỉ trúng
     cách thứ nhất. */
}

/* Dấu * đỏ đứng sau label của field BẮT BUỘC — quy ước dùng chung toàn app.
   Dùng: <label class="field-label" for="x">Tên trường <span class="field-required">*</span></label>
   Chỉ gắn cho field mà bỏ trống/không chọn là KHÔNG hợp lệ (text/select/password
   bắt buộc, checkbox-group cần chọn ≥1) — không gắn cho field số có giá trị mặc
   định hợp lệ (VD phí ship = 0, số lượng = 1). */
.field-required {
  color: var(--danger);
  margin-left: 2px;
}

.field-hint {
  font-size: 12.5px;
  color: var(--muted-foreground);
}

.field-error {
  font-size: 12.5px;
  color: var(--danger);
}

/* Input / select / textarea */
.input {
  width: 100%;
  height: 38px;
  padding: 0 12px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface);
  color: var(--foreground);
  font-family: inherit;
  font-size: 13.5px;
  transition: border-color var(--transition), box-shadow var(--transition);
}
.input::placeholder {
  color: var(--muted-foreground-2);
}
.input:hover:not(:disabled) {
  border-color: var(--border-strong);
}
.input:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: 0 0 0 3px var(--ring);
}
.input:disabled {
  background: var(--surface-2);
  color: var(--muted-foreground-2);
  cursor: not-allowed;
}
.input[aria-invalid=true] {
  border-color: var(--danger);
}
.input[aria-invalid=true]:focus {
  box-shadow: 0 0 0 3px var(--danger-subtle);
}

textarea.input {
  height: auto;
  min-height: 90px;
  padding: 10px 12px;
  line-height: 1.6;
  resize: vertical;
}

/* Select: bỏ mũi tên mặc định của hệ điều hành, vẽ lại bằng SVG inline để
   khớp màu token ở cả chế độ sáng và tối.
   CHỈ áp cho select DẠNG DROPDOWN (không có thuộc tính size) — select[size]
   (VD ô chọn khách hàng nhiều dòng ở ModalTaoDonHang/PageTaoDonHang) là danh
   sách cuộn hiện sẵn, không phải dropdown nên mũi tên này vô nghĩa và làm nó
   lệch khỏi design system (đã gặp lỗi hiển thị thật — xem HKD_NghiepVu_TaoDonHang.md).
   Razor: Pages/Auth/PageDangKy.razor (ô chọn gói dịch vụ) */
select.input:not([size]) {
  padding-right: 34px;
  cursor: pointer;
  appearance: none;
  -webkit-appearance: none;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%2371717a' stroke-width='1.6' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M4 6l4 4 4-4'/%3E%3C/svg%3E");
  background-repeat: no-repeat;
  background-position: right 10px center;
  background-size: 16px 16px;
}

/* Danh sách bung ra do hệ điều hành vẽ (cả dropdown lẫn listbox), phải set màu
   để không bị trắng trên nền tối. */
select.input option {
  background: var(--surface);
  color: var(--foreground);
}

/* Ô mật khẩu có nút hiện/ẩn */
.input-affix {
  position: relative;
  display: flex;
  align-items: center;
}
.input-affix .input {
  padding-right: 40px;
}

.input-affix-btn {
  position: absolute;
  right: 4px;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  height: 30px;
  border: 0;
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--muted-foreground);
  font-size: 13px;
  cursor: pointer;
  transition: background var(--transition), color var(--transition);
}
.input-affix-btn:hover {
  background: var(--surface-2);
  color: var(--foreground);
}

/* Checkbox + nhãn nằm ngang */
.field-check {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 13.5px;
  color: var(--muted-foreground);
  cursor: pointer;
}

.checkbox {
  width: 16px;
  height: 16px;
  flex-shrink: 0;
  accent-color: var(--accent);
  cursor: pointer;
}

/* Đường kẻ ngăn có chữ ở giữa — "Hoặc tiếp tục với" */
.field-separator {
  display: flex;
  align-items: center;
  gap: 12px;
  font-size: 12.5px;
  color: var(--muted-foreground);
}
.field-separator::before, .field-separator::after {
  content: "";
  flex: 1;
  height: 1px;
  background: var(--border);
}

/* Thông báo kết quả thao tác (lỗi đăng nhập, API lỗi...) — dùng chung nhiều page.
   Razor: Pages/Auth/PageDangNhap.razor, Pages/Auth/PageDangKy.razor,
          Pages/Subscription/PageGoiDichVu.razor
   Class con theo _typeMessage: alert-danger | alert-success */
.alert {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  padding: 10px 12px;
  border: 1px solid transparent;
  border-radius: var(--radius);
  font-size: 13px;
  line-height: 1.5;
}
.alert i {
  margin-top: 2px;
  font-size: 13px;
}

.alert-danger {
  background: var(--danger-subtle);
  color: var(--danger);
}

.alert-success {
  background: var(--success-subtle);
  color: var(--success);
}

/* Dải NHẮC (không phải lỗi, không phải cảnh báo) — chỉ dẫn người dùng làm bước tiếp theo.
   Razor: Pages/Inventory/PageKhoHang.razor (tab Tồn kho: nhắc chọn kho trước khi nhập/xuất) */
.alert-info {
  background: var(--accent-subtle);
  color: var(--accent);
}

/* Nút chiếm hết chiều ngang */
.btn-block {
  width: 100%;
}

/* ============================================================
   EMPTY STATE — trạng thái trống toàn trang, dùng chung
   Razor: Pages/PageContent.razor (chưa có cửa hàng -> nhắc tạo trước)
============================================================ */
.empty-state-container {
  display: flex;
  flex: 1;
  align-items: center;
  justify-content: center;
  padding: 48px 16px;
}

.empty-state {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 10px;
  width: 100%;
  max-width: 420px;
  padding: 40px 32px;
  text-align: center;
}
.empty-state .btn {
  margin-top: 8px;
}

.empty-state-icon {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 56px;
  height: 56px;
  border-radius: 50%;
  background: var(--accent-subtle);
  color: var(--accent);
  font-size: 22px;
}

.empty-state-title {
  font-size: 16px;
  font-weight: 600;
}

.empty-state-desc {
  margin: 0;
  font-size: 13.5px;
  line-height: 1.6;
  color: var(--muted-foreground);
  text-wrap: balance;
}

/* ============================================================
   MODAL — hộp thoại dùng chung (form tạo/sửa nhanh trên mọi page)
   Razor: Layout/CreateStoreModal.razor
============================================================ */
.modal-backdrop {
  position: fixed;
  inset: 0;
  z-index: 90;
  background: rgba(0, 0, 0, 0.5);
}

.modal {
  /* Căn giữa bằng inset:0 + margin:auto (KHÔNG dùng transform) — "height: fit-content" để
     margin dọc auto thật sự chia đều (margin dọc auto chỉ centering khi height không phải
     "auto" theo spec, fit-content thoả điều kiện này). Cố ý tránh `transform` ở đây: bất kỳ
     phần tử có `transform` sẽ trở thành containing block mới cho MỌI con cháu `position:
     fixed` bên trong nó — modal này lại có thể lồng modal khác bên trong (VD: AlbumPickerModal
     mở từ trong modal "Ảnh banner" ở ThemeSectionsEditor.razor) nên modal con sẽ bị neo và
     CẮT theo khung nhỏ của modal cha (kèm overflow:hidden) — đúng lỗi "modal bị lỗi" (ảnh
     trôi nổi không khung/backdrop) người dùng gặp 20/08/2026. */
  position: fixed;
  inset: 0;
  margin: auto;
  z-index: 100;
  display: flex;
  flex-direction: column;
  width: calc(100vw - 32px);
  max-width: 480px;
  height: fit-content;
  max-height: calc(100vh - 48px);
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow);
  overflow: hidden;
  /* form bên trong cũng phải co giãn để modal-body tự cuộn khi cao quá */
}
.modal > form {
  display: flex;
  flex-direction: column;
  min-height: 0;
}

/* Modal rộng cho form nhiều nội dung (VD: chọn quyền theo module) */
.modal--wide {
  max-width: 640px;
}

/* Modal RẤT rộng — lưới ảnh nhiều cột cần chỗ (Album ảnh) */
.modal--xl {
  max-width: 960px;
}

/* ============================================================
   ALBUM PICKER — lưới ảnh chọn lại từ Album cửa hàng + tab tải ảnh lên
   Razor: Components/AlbumPickerModal.razor
============================================================ */
.album-picker-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
  gap: 12px;
  margin-top: 14px;
  margin-bottom: 14px;
}

.album-picker-item {
  position: relative;
  aspect-ratio: 1;
  border-radius: var(--radius);
  overflow: hidden;
}

.album-picker-select {
  display: block;
  width: 100%;
  height: 100%;
  padding: 0;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface-2);
  cursor: pointer;
  transition: border-color var(--transition);
}
.album-picker-select:hover {
  border-color: var(--accent);
}

.album-picker-thumb {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

/* Dấu xoá — góc trên phải, luôn hiện (không chỉ lúc hover) để dễ bấm trên cảm ứng. */
.album-picker-delete {
  position: absolute;
  top: 6px;
  right: 6px;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  border: 0;
  border-radius: 50%;
  background: rgba(0, 0, 0, 0.55);
  color: #fff;
  font-size: 11px;
  cursor: pointer;
  transition: background var(--transition);
}
.album-picker-delete:hover {
  background: var(--danger);
}
.album-picker-delete:disabled {
  cursor: default;
  opacity: 0.7;
}

.album-upload-pane {
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.album-upload-dropzone {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 240px;
  border: 1px dashed var(--border-strong);
  border-radius: var(--radius);
  background: var(--surface);
  cursor: pointer;
  transition: border-color var(--transition), background-color var(--transition);
}
.album-upload-dropzone:hover {
  border-color: var(--accent);
  background: var(--accent-subtle);
}
.album-upload-dropzone input[type=file] {
  display: none;
}

.album-upload-body {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  text-align: center;
}

.album-upload-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  margin-bottom: 2px;
  border-radius: 50%;
  background: var(--accent-subtle);
  color: var(--accent);
  font-size: 18px;
}

.album-upload-text {
  font-size: 13.5px;
  font-weight: 500;
  color: var(--foreground);
}

.album-upload-sub {
  font-size: 12px;
  color: var(--muted-foreground);
}

.modal-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 16px 20px;
  border-bottom: 1px solid var(--border);
}

.modal-title {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 15px;
  font-weight: 600;
}
.modal-title i {
  color: var(--accent);
  font-size: 14px;
}

.modal-close {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  border: 0;
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--muted-foreground);
  font-size: 13px;
  cursor: pointer;
  transition: background var(--transition), color var(--transition);
}
.modal-close:hover {
  background: var(--surface-2);
  color: var(--foreground);
}

.modal-body {
  padding: 20px;
  overflow-y: auto;
}

.modal-footer {
  display: flex;
  justify-content: flex-end;
  gap: 8px;
  padding: 14px 20px;
  border-top: 1px solid var(--border);
  background: var(--surface-2);
}

/* Modal rộng — dùng khi thân modal có bảng dữ liệu
   Razor: Pages/Product/Components/ModalBienThe.razor */
.modal-lg {
  max-width: 720px;
}

/* Modal mở CHỒNG lên một modal khác (sửa biến thể trên modal quản lý biến thể).
   z-index cao hơn .modal (100) nhưng phải THẤP hơn .alert-dialog (110/120) để
   hộp xác nhận xoá vẫn nổi lên trên cùng.
   Razor: Pages/Product/Components/ModalSuaBienThe.razor */
.modal-backdrop-stacked {
  z-index: 104;
}

.modal-stacked {
  z-index: 105;
}

/* ============================================================
   STOCK BADGE — số tồn kho, đỏ khi hết hàng
   Razor: Pages/Inventory/PageKhoHang.razor,
          Pages/Product/Components/ModalBienThe.razor
============================================================ */
.stock-badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 40px;
  height: 22px;
  padding: 0 8px;
  border-radius: 999px;
  font-size: 12.5px;
  font-weight: 600;
}
.stock-badge.in {
  background: var(--success-subtle);
  color: var(--success);
}
.stock-badge.low {
  background: var(--warning-subtle);
  color: var(--warning);
}
.stock-badge.out {
  background: var(--danger-subtle);
  color: var(--danger);
}

/* Badge trung tính — loại giao dịch "Điều chỉnh" ở bảng lịch sử kho */
.badge-muted {
  background: var(--surface-2);
  color: var(--muted-foreground);
  border-color: transparent;
}

/* Biến thể CHƯA KHAI khối lượng — cảnh báo ngay tại dòng vì thiếu là không tạo được
   vận đơn. Màu cam (không phải đỏ): sản phẩm vẫn bán bình thường, chỉ vướng khi giao
   bằng đơn vị vận chuyển.
   Razor: Pages/Product/Components/ModalBienThe.razor */
.variant-no-weight {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  color: var(--warning);
  font-size: 12.5px;
  white-space: nowrap;
}

/* Ô select/input thu nhỏ đặt trong thanh công cụ của card
   Razor: Pages/Inventory/PageKhoHang.razor */
.input-sm {
  height: 32px;
  padding: 0 10px;
  font-size: 13px;
  width: auto;
  min-width: 150px;
}

/* .input-sm truyền qua Class="input-sm" của SingleSelect: div wrapper không có
   height riêng nên phải ghìm ở wrapper + truyền kích thước xuống trigger bên trong. */
.input-sm.single-select {
  width: auto;
  min-width: 150px;
  flex: none;
}
.input-sm.single-select .single-select-trigger {
  height: 32px;
  padding: 0 10px;
  font-size: 13px;
}

/* Phụ đề nhỏ cạnh tiêu đề card */
.card-subtitle {
  font-size: 12.5px;
  color: var(--muted-foreground);
}

/* Số thay đổi tồn kho: tăng xanh, giảm đỏ */
.qty-up {
  color: var(--success);
  font-weight: 600;
}

.qty-down {
  color: var(--danger);
  font-weight: 600;
}

.nowrap {
  white-space: nowrap;
}

/* ============================================================
   FORM THÊM BIẾN THỂ — trong ModalBienThe, dưới bảng biến thể
   Razor: Pages/Product/Components/ModalBienThe.razor
============================================================ */
.variant-list {
  margin-bottom: 20px;
}

.variant-form-title {
  font-size: 14px;
  font-weight: 600;
  margin-bottom: 12px;
  padding-top: 16px;
  border-top: 1px solid var(--border);
}

/* Tiêu đề khối đầu tiên không cần vạch ngăn phía trên */
.variant-form-title-first {
  padding-top: 0;
  border-top: 0;
}

.variant-hint {
  display: block;
  margin: -4px 0 12px;
}

/* Một dòng khai báo tùy chọn: tên · giá trị · nút bỏ */
.variant-option-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.6fr) auto;
  gap: 12px;
  align-items: end;
  margin-bottom: 10px;
}
.variant-option-row .variant-option-remove {
  margin-bottom: 2px;
}

.variant-option-actions {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 4px;
}

/* Ô nhập số trong bảng xem trước — canh phải cho dễ so giá */
.input-num {
  text-align: right;
  min-width: 110px;
}

/* Ô nhập kèm một nút hành động bên phải (VD nút sinh SKU, nút Thêm URL ảnh)
   Razor: Pages/Product/PageTaoSanPham.razor
        · Pages/Product/Components/ModalSuaPhienBan.razor */
.input-with-action {
  display: flex;
  align-items: center;
  gap: 8px;
}
.input-with-action .input {
  flex: 1;
  min-width: 0;
}
.input-with-action .btn {
  flex-shrink: 0;
}

.variant-removed {
  margin-top: 12px;
}

@media (max-width: 640px) {
  .variant-option-row {
    grid-template-columns: 1fr auto;
  }
}
/* ============================================================
   TRIAL BANNER — thanh cảnh báo dùng thử, nổi dưới-giữa màn hình
   Razor: Layout/TrialBanner.razor (gắn trong MainLayout, hiện khi IsTrial)
   z-index dưới modal/alert-dialog để không đè hộp thoại.
============================================================ */
.trial-banner {
  position: fixed;
  bottom: 20px;
  left: 50%;
  transform: translateX(-50%);
  z-index: 80;
  display: flex;
  align-items: center;
  gap: 12px;
  max-width: calc(100vw - 32px);
  padding: 10px 12px 10px 16px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: 999px;
  box-shadow: var(--shadow);
}

.trial-banner-icon {
  color: var(--warning);
  font-size: 14px;
}

.trial-banner-text {
  font-size: 13.5px;
  font-weight: 500;
  white-space: nowrap;
}

.trial-banner-close {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  border: 0;
  border-radius: 999px;
  background: transparent;
  color: var(--muted-foreground);
  font-size: 13px;
  cursor: pointer;
  transition: background var(--transition), color var(--transition);
}
.trial-banner-close:hover {
  background: var(--surface-2);
  color: var(--foreground);
}

/* ============================================================
   DATE INPUT — ô chọn ngày kiểu shadcn/ui "Date Picker — Input"
   Razor: Components/DateInput.razor
   z-index 106/107: trên .modal (100) và .modal-stacked (105), dưới
   .alert-dialog (110/120) — chọn ngày trong modal vẫn nổi trên modal đó,
   nhưng hộp xác nhận (nếu bật lên đồng thời) vẫn ở trên cùng.
============================================================ */
.date-input {
  position: relative;
}

/* Nền TRONG SUỐT chỉ để bắt sự kiện bấm-ra-ngoài, không phải overlay tối màn
   hình như .modal-backdrop — cùng kỹ thuật, khác mục đích. */
.date-picker-backdrop {
  position: fixed;
  inset: 0;
  z-index: 106;
  background: transparent;
}

.date-picker-popover {
  position: absolute;
  z-index: 107;
  top: calc(100% + 6px);
  right: 0;
  width: 264px;
  padding: 12px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow);
}

.date-picker-caption {
  display: grid;
  grid-template-columns: auto 1fr 1fr auto;
  align-items: center;
  gap: 4px;
  margin-bottom: 10px;
}

.date-picker-nav {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--surface);
  color: var(--muted-foreground);
  font-size: 11px;
  cursor: pointer;
  transition: background var(--transition), color var(--transition);
}
.date-picker-nav:hover {
  background: var(--surface-2);
  color: var(--foreground);
}

.date-picker-select {
  height: 28px;
  padding: 0 6px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--surface);
  color: var(--foreground);
  font-size: 12.5px;
  cursor: pointer;
}

.date-picker-weekdays {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  margin-bottom: 4px;
}
.date-picker-weekdays span {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 26px;
  font-size: 11px;
  font-weight: 600;
  color: var(--muted-foreground-2);
}

.date-picker-days {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
  gap: 2px;
}

.date-picker-day {
  display: flex;
  align-items: center;
  justify-content: center;
  height: 30px;
  border: 0;
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--foreground);
  font-size: 12.5px;
  font-variant-numeric: tabular-nums;
  cursor: pointer;
  transition: background var(--transition), color var(--transition);
  /* Ngày thuộc tháng trước/sau hiện mờ nhưng vẫn bấm chọn được */
}
.date-picker-day:hover {
  background: var(--surface-2);
}
.date-picker-day.is-outside {
  color: var(--muted-foreground-2);
}
.date-picker-day.is-today {
  box-shadow: inset 0 0 0 1px var(--border-strong);
}
.date-picker-day.is-selected {
  background: var(--accent);
  color: var(--accent-foreground);
}
.date-picker-day.is-selected:hover {
  background: var(--accent);
}

.date-picker-footer {
  display: flex;
  justify-content: space-between;
  gap: 8px;
  margin-top: 10px;
  padding-top: 10px;
  border-top: 1px solid var(--border);
}

/* ============================================================
   SINGLE SELECT — ô chọn 1 giá trị kiểu shadcn Combobox, thay
   <select class="input"> khi cần tick chọn tường minh + (tuỳ chọn) tìm kiếm.
   Razor: Components/SingleSelect.razor
   z-index 106/107: cùng tầng với DateInput popover — nổi trên modal
   (100/105), dưới alert-dialog (110/120). Menu neo left+right:0 (khớp đúng
   chiều rộng ô trigger) để không lặp lại bẫy tràn mép của DateInput.
============================================================ */
.single-select {
  position: relative;
}

.single-select-trigger {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  width: 100%;
  font: inherit;
  text-align: left;
  cursor: pointer;
  appearance: none;
}
.single-select-trigger:disabled {
  background: var(--surface-2);
  color: var(--muted-foreground-2);
  cursor: not-allowed;
}

.single-select-value {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.single-select-caret {
  flex-shrink: 0;
  font-size: 10px;
  color: var(--muted-foreground);
}

.single-select-backdrop {
  position: fixed;
  inset: 0;
  z-index: 106;
  background: transparent;
}

.single-select-menu {
  position: absolute;
  z-index: 107;
  top: calc(100% + 6px);
  left: 0;
  right: 0;
  max-height: 280px;
  display: flex;
  flex-direction: column;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow);
  overflow: hidden;
}

.single-select-search {
  flex-shrink: 0;
  padding: 8px;
  border-bottom: 1px solid var(--border);
}
.single-select-search .input {
  width: 100%;
}

.single-select-options {
  overflow-y: auto;
  padding: 4px;
}

.single-select-option {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  width: 100%;
  padding: 8px 10px;
  border: 0;
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--foreground);
  font-size: 13.5px;
  text-align: left;
  cursor: pointer;
  transition: background var(--transition), color var(--transition);
}
.single-select-option:hover {
  background: var(--surface-2);
}
.single-select-option.is-selected {
  color: var(--accent);
  font-weight: 500;
}
.single-select-option i {
  font-size: 11px;
  color: var(--accent);
}

.single-select-empty {
  padding: 12px 10px;
  font-size: 12.5px;
  color: var(--muted-foreground);
  text-align: center;
}

/* ============================================================
   ALERT DIALOG — hộp thoại xác nhận kiểu shadcn (thay confirm() của JS)
   Razor: Components/AlertDialog.razor
   Nằm TRÊN modal thường (z-index cao hơn) vì có thể được gọi từ trong modal
   (VD xác nhận lưu thay đổi khi sửa vai trò). Bấm nền không đóng.
============================================================ */
.alert-dialog-backdrop {
  position: fixed;
  inset: 0;
  z-index: 110;
  background: rgba(0, 0, 0, 0.5);
}

.alert-dialog {
  position: fixed;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  z-index: 120;
  width: calc(100vw - 32px);
  max-width: 420px;
  padding: 20px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow);
}

.alert-dialog-title {
  margin: 0;
  font-size: 15px;
  font-weight: 600;
}

.alert-dialog-desc {
  margin: 8px 0 0;
  font-size: 13px;
  line-height: 1.5;
  color: var(--muted-foreground);
}

.alert-dialog-footer {
  display: flex;
  justify-content: flex-end;
  gap: 8px;
  margin-top: 20px;
}

/* ============================================================
   PRODUCT TOUR — spotlight onboarding cho member mới
   Razor: Layout/ProductTour.razor
   Cơ chế: .tour-spotlight đè lên phần tử đích, box-shadow toả 9999px
   của nó chính là lớp nền tối; tooltip đặt cạnh theo inline style.
============================================================ */
/* Lớp chặn thao tác toàn trang (trong suốt — màu tối do spotlight vẽ) */
.tour-overlay {
  position: fixed;
  inset: 0;
  z-index: 200;
}

/* Vùng sáng — di chuyển mượt giữa các bước nhờ transition vị trí/kích thước */
.tour-spotlight {
  position: fixed;
  z-index: 201;
  border-radius: var(--radius);
  box-shadow: 0 0 0 9999px rgba(0, 0, 0, 0.6), 0 0 0 2px var(--accent); /* viền accent quanh phần tử đích */
  transition: top 0.35s ease, left 0.35s ease, width 0.35s ease, height 0.35s ease;
}

.tour-tooltip {
  position: fixed;
  z-index: 202;
  display: flex;
  flex-direction: column;
  gap: 8px;
  width: min(320px, 100vw - 32px);
  padding: 16px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow);
  transition: top 0.35s ease, left 0.35s ease;
}

.tour-title {
  font-size: 14.5px;
  font-weight: 600;
  letter-spacing: -0.01em;
}

.tour-desc {
  margin: 0;
  font-size: 13px;
  line-height: 1.65;
  color: var(--muted-foreground);
}

.tour-dots {
  display: flex;
  gap: 6px;
  margin: 2px 0;
}

.tour-dot {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--border-strong);
  transition: background var(--transition), width var(--transition);
}

.tour-dot--active {
  width: 18px;
  border-radius: 999px;
  background: var(--accent);
}

/* "Bỏ qua" neo trái, Quay lại/Tiếp neo phải */
.tour-actions {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  margin-top: 2px;
}

.tour-actions-right {
  display: flex;
  gap: 6px;
}

/* ============================================================
   TOAST — thông báo góc phải dưới, tự ẩn
   Razor: Components/ToastHost.razor (gắn trong MainLayout)
============================================================ */
.toast-host {
  position: fixed;
  right: 16px;
  bottom: 16px;
  z-index: 300; /* trên cả modal (100) và tour (202) */
  display: flex;
  flex-direction: column;
  gap: 8px;
  max-width: min(360px, 100vw - 32px);
}

.toast {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  padding: 12px 14px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow);
  font-size: 13.5px;
  line-height: 1.5;
  animation: toast-in 0.25s ease;
}
.toast > i:first-child {
  margin-top: 2px;
  font-size: 14px;
}

.toast--success > i:first-child {
  color: var(--success);
}

.toast--danger > i:first-child {
  color: var(--danger);
}

.toast-text {
  flex: 1;
  min-width: 0;
}

.toast-close {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 22px;
  height: 22px;
  border: 0;
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--muted-foreground);
  font-size: 11px;
  cursor: pointer;
}
.toast-close:hover {
  background: var(--surface-2);
  color: var(--foreground);
}

@keyframes toast-in {
  from {
    opacity: 0;
    transform: translateY(8px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
/* ============================================================
   LIST TOOLBAR PRIMITIVES — cho các trang danh sách
   Razor: Components/Search.razor, SelectPageSize.razor, Pagination.razor
============================================================ */
/* Ô tìm kiếm có icon + nút xoá */
.search-box {
  position: relative;
  display: flex;
  align-items: center;
  width: min(280px, 100%);
}

.search-box-icon {
  position: absolute;
  left: 11px;
  font-size: 12px;
  color: var(--muted-foreground-2);
  pointer-events: none;
}

.search-box-input {
  padding-left: 32px;
  padding-right: 30px;
}

.search-box-clear {
  position: absolute;
  right: 4px;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  border: 0;
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--muted-foreground);
  font-size: 11px;
  cursor: pointer;
}
.search-box-clear:hover {
  background: var(--surface-2);
  color: var(--foreground);
}

/* Chọn số dòng mỗi trang */
.select-page-size {
  display: flex;
  align-items: center;
  gap: 8px;
  white-space: nowrap;
}

.select-page-size-label {
  font-size: 13px;
  color: var(--muted-foreground);
}

.select-page-size-input {
  width: auto;
  min-width: 64px;
}

/* Bọc bảng: cuộn ngang trên màn hẹp thay vì vỡ layout */
.table-wrap {
  overflow-x: auto;
}

/* Ô báo rỗng giữa bảng */
.table-empty {
  padding: 32px 12px !important;
  color: var(--muted-foreground);
  text-align: center;
}

/* Dòng phụ mờ dưới ô chính (email dưới tên khách, SKU dưới tên sản phẩm...) */
.list-sub-line {
  margin-top: 2px;
  font-size: 12px;
}

/* Icon nhỏ đi kèm số liệu trong ô bảng (VD: sao điểm tích lũy) */
.list-cell-icon {
  margin-right: 2px;
  font-size: 11px;
  color: var(--muted-foreground-2);
}

/* Cột thao tác cuối bảng */
.table-actions-col {
  width: 1%;
  text-align: right;
  white-space: nowrap;
}

/* Nhiều nút hành động (sửa/xoá...) trong cùng ô — mỗi nút thường nằm trong 1 khối
   @if riêng nên không có khoảng trắng nào giữa 2 <button>, cần khai gap tay. */
.table-actions-col button + button {
  margin-left: 8px;
}

/* Header card của trang danh sách: SelectPageSize trái, Search phải
   (card-header đã flex space-between — chỉ thêm wrap cho màn hẹp) */
.list-toolbar {
  gap: 12px;
  flex-wrap: wrap;
}

/* Cụm bên phải toolbar: ô tìm kiếm + nút làm mới (nút vuông cao bằng input) */
.list-toolbar-right {
  display: flex;
  align-items: center;
  gap: 8px;
}
.list-toolbar-right .btn-icon {
  height: 38px;
  width: 38px;
}

/* Chân card danh sách: dòng đếm trái, phân trang phải */
.list-footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  flex-wrap: wrap;
}

.list-footer-info {
  font-size: 13px;
  color: var(--muted-foreground);
  white-space: nowrap;
}

/* Phân trang — shadcn Pagination mẫu 1: nút ghost, trang hiện tại viền outline */
.pagination {
  display: flex;
  align-items: center;
  gap: 4px;
  flex-wrap: wrap;
}

.pagination-link {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  min-width: 34px;
  height: 34px;
  padding: 0 8px;
  border: 1px solid transparent;
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--foreground);
  font: inherit;
  font-size: 13.5px;
  cursor: pointer;
  transition: background var(--transition), border-color var(--transition);
}
.pagination-link:hover:not(:disabled) {
  background: var(--surface-2);
}
.pagination-link:disabled {
  color: var(--muted-foreground-2);
  cursor: not-allowed;
}
.pagination-link i {
  font-size: 10px;
}

/* Trang hiện tại — viền outline như shadcn isActive */
.pagination-link--active {
  border-color: var(--border);
  background: var(--surface);
  font-weight: 500;
}
.pagination-link--active:hover:not(:disabled) {
  background: var(--surface);
}

.pagination-nav {
  padding: 0 10px;
}

.pagination-ellipsis {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 34px;
  height: 34px;
  color: var(--muted-foreground-2);
  font-size: 11px;
}

/* Link dạng chữ có gạch chân khi hover */
.link-underline {
  color: inherit;
  text-decoration: none;
  text-underline-offset: 3px;
}
.link-underline:hover {
  text-decoration: underline;
}

/* ============================================================
   TABS — thanh chuyển mục dùng chung
   Razor: Components/Tabs.razor (đang dùng ở Pages/Config/PageCauHinh.razor)
   Chỉ là thanh tab; phần thân do trang tự dựng.
============================================================ */
.tabs {
  display: flex;
  gap: 4px;
  padding: 4px;
  background: var(--surface-2);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  overflow-x: auto;
  /* BẮT BUỘC: .inset-body là flex column có chiều cao giới hạn nên con của nó co
     được theo chiều dọc. Card không bị co vì min-height:auto = chiều cao nội dung,
     NHƯNG phần tử có overflow khác visible (overflow-x ở trên) thì min-height tự
     động về 0 → thanh tab bị bóp dẹp thành một vệt mỏng. Khoá lại bằng flex-shrink. */
  flex-shrink: 0;
}

.tab-item {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 8px 16px;
  border: none;
  border-radius: calc(var(--radius) - 2px);
  background: transparent;
  color: var(--muted-foreground);
  font-size: 13.5px;
  font-weight: 500;
  white-space: nowrap;
  cursor: pointer;
  transition: background var(--transition), color var(--transition);
}
.tab-item:hover {
  color: var(--foreground);
  background: var(--surface);
}
.tab-item.is-active {
  background: var(--surface);
  color: var(--foreground);
  box-shadow: var(--shadow-sm);
}
.tab-item i {
  font-size: 13px;
}

/* Chấm tròn báo mục đã cấu hình (xanh) hay chưa (xám) */
.tab-dot {
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--border);
  flex-shrink: 0;
}
.tab-dot.is-on {
  background: var(--success);
}

/* ============================================================
   FIELD HELP — dấu "?" cạnh nhãn ô nhập (10/08/2026)
   Razor: Components/FieldHelp.razor
   Thay cho .field-hint khi lời giải thích DÀI: hint dài in thẳng dưới ô làm form
   loãng ra, mắt phải nhảy qua vài dòng chữ xám mới tới ô tiếp theo.
============================================================ */
.field-help {
  position: relative;
  display: inline-flex;
  margin-left: 5px;
  vertical-align: middle;
}

.field-help-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 15px;
  height: 15px;
  padding: 0;
  border: 1px solid var(--border);
  border-radius: 50%;
  background: var(--surface-2);
  color: var(--muted-foreground);
  font-size: 10px;
  font-weight: 700;
  line-height: 1;
  cursor: pointer;
}
.field-help-btn:hover, .field-help-btn:focus-visible {
  border-color: var(--accent);
  color: var(--accent);
}
.field-help-btn:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 1px;
}

/* Nền phủ toàn màn khi ĐANG MỞ bằng bấm — bấm ra ngoài là đóng.
   z-index thấp hơn bảng giải thích để bấm trong bảng không bị nuốt. */
.field-help-backdrop {
  position: fixed;
  inset: 0;
  z-index: 60;
}

/* Bảng giải thích: neo dưới dấu ?, canh trái theo nó.
   ⚠️ `white-space: normal` là bắt buộc — .field-label của một số form đặt nowrap,
   không gỡ thì cả đoạn giải thích nằm trên MỘT dòng chạy dài khỏi màn hình. */
.field-help-panel {
  position: absolute;
  top: calc(100% + 6px);
  left: -6px;
  z-index: 61;
  width: 280px;
  padding: 9px 11px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface);
  box-shadow: 0 10px 24px rgba(0, 0, 0, 0.14);
  color: var(--muted-foreground);
  font-size: 12.5px;
  font-weight: 400;
  line-height: 1.55;
  white-space: normal;
  text-align: left;
  opacity: 0;
  visibility: hidden;
  transition: opacity 0.12s ease;
}
.field-help-panel b {
  color: var(--foreground);
}
.field-help-panel code {
  padding: 1px 4px;
  border-radius: 3px;
  background: var(--surface-2);
  font-size: 11.5px;
}

/* Hai đường mở: rê chuột (desktop) hoặc bấm (mọi thiết bị, kể cả cảm ứng) */
.field-help:hover .field-help-panel,
.field-help-panel.is-open {
  opacity: 1;
  visibility: visible;
}

/* Ô sát mép phải: lật bảng sang trái để không tràn khỏi card */
.field-row .field:last-child .field-help-panel {
  left: auto;
  right: -6px;
}

/* ============================================================
   CKEDITOR 5 — khung bao và chiều cao (12/08/2026)
   Razor: Pages/Blog/PageTaoBaiViet.razor      (.editor-blog-content)
          Pages/Product/PageTaoSanPham.razor   (.editor-product-description)

   ⚠️ CSS của CHÍNH CKEditor nằm TRONG `main.js` (webpack chèn <style> lúc chạy), không
   phải một file .css riêng — đừng đi tìm để thêm <link>, không có đâu.

   Ở đây chỉ khai phần dự án cần: bo góc khớp .input, và CHIỀU CAO TỐI THIỂU. Không đặt
   chiều cao thì CKEditor mở ra cao đúng một dòng, chủ shop phải gõ mới thấy nó giãn.

   🔴 GIỚI HẠN ĐÃ BIẾT: giao diện CKEditor luôn sáng, KHÔNG theo chế độ tối của trang.
   Đổi được nhưng phải ghi đè cả bộ biến `--ck-color-*` — chưa làm.
============================================================ */
.vnh-ckeditor5 .ck.ck-editor__main > .ck-editor__editable {
  border-bottom-left-radius: var(--radius);
  border-bottom-right-radius: var(--radius);
}
.vnh-ckeditor5 .ck.ck-toolbar {
  border-top-left-radius: var(--radius);
  border-top-right-radius: var(--radius);
}

/* Nội dung bài viết: ô soạn dài, chủ shop viết cả bài trong đó */
.editor-blog-content .ck-editor__editable {
  min-height: 420px;
}

/* Mô tả sản phẩm: ngắn hơn, và nó nằm chung cột với Tên + Giá + Thuộc tính nên cao quá
   là đẩy khối Phiên bản xuống khỏi tầm mắt. */
.editor-product-description .ck-editor__editable {
  min-height: 260px;
}

/* Trang tĩnh (Giới thiệu/Chính sách/Liên hệ, 17/08 đợt 3): mỗi trang chỉ có một khối
   CKEditor chiếm hết card, không tranh chỗ với cột nào khác. */
.editor-static-page .ck-editor__editable {
  min-height: 420px;
}

/* ============================================================
   HKD Admin — app shell (top-nav + sidebar). shadcn look.
============================================================ */
#app-layout {
  display: flex;
  flex-direction: column;
  height: 100vh;
  overflow: hidden;
  background: var(--background);
}

/* ---- TOP NAV ---- */
#top-nav {
  display: flex;
  align-items: center;
  height: var(--topnav-height);
  padding: 0 20px;
  background: var(--surface);
  border-bottom: 1px solid var(--border);
  flex-shrink: 0;
}
#top-nav .logo-area {
  display: flex;
  align-items: center;
  gap: 10px;
  width: calc(var(--sidebar-width) - 20px);
  flex-shrink: 0;
  text-decoration: none;
}
#top-nav .logo-icon {
  width: 30px;
  height: 30px;
  border-radius: var(--radius);
  display: flex;
  align-items: center;
  justify-content: center;
  font-size: 15px;
  color: var(--accent-foreground);
  background: var(--accent);
}
#top-nav .logo-text {
  font-size: 15px;
  font-weight: 600;
  letter-spacing: -0.01em;
  color: var(--foreground);
  white-space: nowrap;
}
#top-nav .logo-text span {
  color: var(--muted-foreground);
  font-weight: 500;
}
#top-nav .topnav-right {
  display: flex;
  align-items: center;
  gap: 4px;
  margin-left: auto;
}

.topnav-icon-btn {
  width: 36px;
  height: 36px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: var(--radius);
  color: var(--muted-foreground);
  font-size: 15px;
  text-decoration: none;
  transition: background var(--transition), color var(--transition);
}
.topnav-icon-btn:hover {
  background: var(--surface-2);
  color: var(--foreground);
}

/* Icon SVG nét mỏng (Components/AppIcon.razor, 09/08) — SVG không ăn font-size
   như icon font nên phải chốt cỡ ở đây. Màu đi theo `currentColor` của nút bọc,
   nên hover + chế độ tối tự đúng, không cần khai lại. */
.app-icon {
  width: 20px;
  height: 20px;
  display: block;
  flex-shrink: 0;
}

/* Bản nhỏ cho nút thao tác trong bảng danh sách (sửa/khoá/xoá/xem) */
.app-icon--sm {
  width: 15px;
  height: 15px;
}

/* ---- BODY ---- */
#main-body {
  display: flex;
  flex: 1;
  min-height: 0;
}

/* ---- SIDEBAR ---- */
#sidebar {
  width: var(--sidebar-width);
  flex-shrink: 0;
  display: flex;
  flex-direction: column;
  background: var(--surface);
  border-right: 1px solid var(--border);
  overflow: hidden;
}

.sidebar-loading {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px;
  color: var(--muted-foreground);
  font-size: 16px;
}

.sidebar-section-title {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 16px 20px 8px;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--muted-foreground-2);
}
.sidebar-section-title.sidebar-error-title {
  flex-direction: column;
  align-items: flex-start;
  color: var(--danger);
}

.sidebar-debug-msg {
  font-size: 10px;
  font-weight: 400;
  color: var(--muted-foreground-2);
  text-transform: none;
  letter-spacing: 0;
}

.sidebar-scroll {
  flex: 1;
  overflow-y: auto;
  overflow-x: hidden;
  padding: 6px 12px 16px;
}

.menu-label {
  padding: 14px 8px 6px;
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.03em;
  text-transform: uppercase;
  color: var(--muted-foreground-2);
}

.menu-item {
  display: block;
  position: relative;
}

.menu-item-link {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 10px;
  border-radius: var(--radius);
  font-size: 13.5px;
  font-weight: 500;
  color: var(--muted-foreground);
  text-decoration: none;
  cursor: pointer;
  user-select: none;
  transition: background var(--transition), color var(--transition);
}
.menu-item-link i:not(.menu-chevron) {
  width: 16px;
  text-align: center;
  font-size: 14px;
  flex-shrink: 0;
}
.menu-item-link .menu-chevron {
  margin-left: auto;
  font-size: 10px;
  opacity: 0.6;
  transition: transform var(--transition);
}
.menu-item-link:hover {
  background: var(--surface-2);
  color: var(--foreground);
}
.menu-item-link.active {
  background: var(--accent-subtle);
  color: var(--accent);
  font-weight: 600;
}
.menu-item-link.open .menu-chevron {
  transform: rotate(90deg);
}

.menu-badge {
  margin-left: auto;
  min-width: 20px;
  height: 20px;
  padding: 0 6px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  border-radius: 999px;
  background: var(--accent-subtle);
  color: var(--accent);
  font-size: 11px;
  font-weight: 600;
}

.menu-item-link:has(.menu-chevron) .menu-badge {
  margin-left: 0;
}

.sub-menu {
  list-style: none;
  margin: 2px 0 2px;
  padding: 0;
  max-height: 0;
  overflow: hidden;
  transition: max-height 0.2s ease;
}
.sub-menu.expanded {
  max-height: 500px;
}
.sub-menu .menu-item-link {
  padding-left: 38px;
  font-size: 13px;
}

/* ---- CONTENT ---- */
#content-area {
  flex: 1;
  overflow-y: auto;
}

.content-inner {
  padding: 28px 32px;
  max-width: var(--content-max-width);
  margin: 0 auto;
}

@media (max-width: 768px) {
  #top-nav .logo-area {
    width: auto;
  }
  #sidebar {
    position: absolute;
    z-index: 90;
    height: calc(100vh - var(--topnav-height));
    box-shadow: var(--shadow);
  }
  .content-inner {
    padding: 20px 16px;
  }
}
/* ============================================================
   HKD Admin — App shell: sidebar thu gọn còn icon.
   Port của shadcn/ui block "sidebar-07" sang Blazor + SCSS.

   Tĩnh, không cần JS:
     - Thu gọn sidebar  -> checkbox ẩn #sidebar-state + <label> làm trigger
     - Submenu / dropdown -> <details> + <summary> (native HTML)
============================================================ */
/* ---- Màn hình chờ tải WebAssembly ----
   View: Views/Home/ClientIndex.cshtml (project Server)
   Chỉ hiện trong lúc tải runtime, sau đó Blazor thay thế toàn bộ #app. */
.app-loading {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 16px;
  min-height: 100vh;
  background: var(--background);
  color: var(--muted-foreground);
}

.app-loading-spinner {
  width: 34px;
  height: 34px;
  border: 3px solid var(--border);
  border-top-color: var(--accent);
  border-radius: 50%;
  animation: app-loading-spin 0.7s linear infinite;
}

.app-loading-text {
  font-size: 13.5px;
}

@keyframes app-loading-spin {
  to {
    transform: rotate(360deg);
  }
}
/* ---- Checkbox giữ trạng thái thu gọn (đặt NGAY TRƯỚC .app-shell) ---- */
.sidebar-state {
  position: absolute;
  width: 1px;
  height: 1px;
  margin: -1px;
  padding: 0;
  border: 0;
  opacity: 0;
  overflow: hidden;
  clip: rect(0 0 0 0);
  white-space: nowrap;
}

/* ---- Khung báo lỗi của Blazor ----
   Razor: Layout/MainLayout.razor (project Client)

   Khai báo global thay vì dùng CSS isolation (MainLayout.razor.css cũ):
     - `display: none` phải chắc chắn có, vì nếu nó hiện dạng static block thì
       đẩy cao body -> cả trang cuộn được -> sidebar và header trôi theo.
     - Layout đã chuyển sang project Client, không phụ thuộc bundle isolation của
       Server nữa cho an toàn.
   Blazor tự gán display:block inline khi có lỗi, nên phần dưới là lúc nó hiện. */
#blazor-error-ui {
  position: fixed;
  display: none;
  bottom: 0;
  left: 0;
  z-index: 1000;
  width: 100%;
  padding: 10px 20px 11px;
  background: var(--warning-subtle);
  color: var(--foreground);
  border-top: 1px solid var(--warning);
  box-shadow: 0 -1px 2px rgba(0, 0, 0, 0.2);
  font-size: 13.5px;
}
#blazor-error-ui .reload {
  margin-left: 8px;
  text-decoration: underline;
  text-underline-offset: 3px;
  cursor: pointer;
}
#blazor-error-ui .dismiss {
  position: absolute;
  right: 12px;
  top: 8px;
  cursor: pointer;
}

/* Shell cố định trong viewport: sidebar và header KHÔNG cuộn,
   chỉ .inset-body cuộn. */
.app-shell {
  display: flex;
  width: 100%;
  height: 100vh;
  overflow: hidden;
  background: var(--background);
}

/* ============================================================
   SIDEBAR
============================================================ */
.app-sidebar {
  position: relative;
  z-index: 20;
  display: flex;
  flex-direction: column;
  flex-shrink: 0;
  width: var(--sidebar-width);
  height: 100%;
  background: var(--sidebar);
  color: var(--sidebar-foreground);
  border-right: 1px solid var(--sidebar-border);
  transition: width var(--transition);
}

.sidebar-header,
.sidebar-footer {
  position: relative;
  /* mốc định vị cho dropdown */
  z-index: 2;
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: 8px;
}

.sidebar-footer {
  border-top: 1px solid var(--sidebar-border);
}

/* ---- Hàng thương hiệu + nút thu gọn ở ĐẦU sidebar (09/08) ----
   Razor: Layout/AppSidebar.razor. Mở rộng: logo giãn hết, nút nằm sát mép phải.
   Thu gọn: xem khối .sidebar-state:checked bên dưới (nút chồng lên logo). */
.sb-brand-row {
  position: relative;
  display: flex;
  align-items: center;
  gap: 4px;
}

.sb-brand {
  flex: 1;
  min-width: 0;
}

.sidebar-content {
  flex: 1;
  min-height: 0;
  display: flex;
  flex-direction: column;
  gap: 4px;
  padding: 4px 0;
  overflow-x: hidden;
  overflow-y: auto;
}

/* ---- Trạng thái nạp / lỗi của menu JSON ----
   Razor: Layout/SidebarMenu.razor */
.sidebar-loading {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 20px;
  color: var(--sidebar-muted);
  font-size: 15px;
}

.sidebar-menu-error {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin: 8px;
  padding: 10px 12px;
  border: 1px solid var(--danger);
  border-radius: var(--radius-sm);
  background: var(--danger-subtle);
  color: var(--danger);
  font-size: 12px;
  line-height: 1.5;
  word-break: break-word;
}

.sidebar-menu-error-detail {
  color: var(--sidebar-muted);
  font-size: 10.5px;
}

/* ---- Group ---- */
.sb-group {
  display: flex;
  flex-direction: column;
  padding: 4px 8px;
}

.sb-group-label {
  display: flex;
  align-items: center;
  height: 32px;
  padding: 0 8px;
  font-size: 11.5px;
  font-weight: 500;
  color: var(--sidebar-muted);
  white-space: nowrap;
}

/* ---- Menu ---- */
.sb-menu {
  display: flex;
  flex-direction: column;
  gap: 2px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.sb-menu-item {
  position: relative;
  display: block;
}

.sb-menu-button {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  height: 32px;
  padding: 0 8px;
  border: 0;
  border-radius: var(--radius-sm);
  background: transparent;
  color: inherit;
  font: inherit;
  font-size: 13.5px;
  font-weight: 400;
  text-align: left;
  text-decoration: none;
  cursor: pointer;
  overflow: hidden;
  transition: background var(--transition), color var(--transition);
  /* icon dẫn đầu — <i> của FontAwesome HOẶC <svg> của <AppIcon> (09/08: menu
     sidebar chuyển hết sang SVG nét mỏng, xem Components/AppIcon.razor) */
  /* SVG không ăn font-size như icon font -> phải chốt cỡ */
  /* Nhãn chữ — giãn hết chỗ còn lại. Loại trừ .sb-tile (ô logo/avatar cố định). */
}
.sb-menu-button > i:first-child,
.sb-menu-button > svg:first-child {
  flex-shrink: 0;
  width: 16px;
  font-size: 14px;
  text-align: center;
  color: var(--sidebar-muted);
}
.sb-menu-button > svg:first-child {
  height: 16px;
}
.sb-menu-button > span:not(.sb-tile) {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.sb-menu-button:hover {
  background: var(--sidebar-accent);
  color: var(--sidebar-accent-foreground);
}
.sb-menu-button:hover > i:first-child,
.sb-menu-button:hover > svg:first-child {
  color: var(--sidebar-accent-foreground);
}
.sb-menu-button:focus-visible {
  outline: 2px solid var(--ring);
  outline-offset: -2px;
}
.sb-menu-button.active {
  background: var(--accent-subtle);
  color: var(--accent);
  font-weight: 500;
}
.sb-menu-button.active > i:first-child,
.sb-menu-button.active > svg:first-child {
  color: var(--accent);
}
.sb-menu-button.is-muted {
  color: var(--sidebar-muted);
}

/* Nút "Đăng xuất" ở chân sidebar — căn giữa + đỏ để tách khỏi menu điều hướng
   thường (yêu cầu user, khoanh đỏ trong ảnh chụp). Razor: Layout/AppSidebar.razor. */
.sb-menu-button--logout {
  justify-content: center;
  color: var(--danger);
}
.sb-menu-button--logout:hover {
  color: var(--danger);
  background: var(--danger-subtle);
}

/* Nút cao (team switcher / user) */
.sb-menu-button--lg {
  height: 48px;
  padding: 0 8px;
  gap: 8px;
}

/* Khối 2 dòng: tên + dòng phụ */
.sb-menu-text {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  line-height: 1.25;
}

.sb-menu-title {
  font-size: 13.5px;
  font-weight: 500;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.sb-menu-sub-title {
  font-size: 11.5px;
  color: var(--sidebar-muted);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Ô vuông logo / avatar */
.sb-tile {
  display: flex;
  flex-shrink: 0;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  border-radius: var(--radius-sm);
  background: var(--sidebar-primary);
  color: var(--sidebar-primary-foreground);
  font-size: 14px;
}

.sb-tile--muted {
  background: var(--sidebar-accent);
  color: var(--sidebar-foreground);
}

/* Icon phụ cuối dòng (chevron) */
.sb-trailing {
  flex-shrink: 0;
  margin-left: auto;
  font-size: 11px;
  color: var(--sidebar-muted);
  transition: transform var(--transition);
}

/* ---- Submenu (collapsible) ---- */
.sb-collapsible > summary {
  list-style: none;
}
.sb-collapsible > summary::-webkit-details-marker {
  display: none;
}
.sb-collapsible > summary::marker {
  content: "";
}
.sb-collapsible[open] > summary .sb-trailing {
  transform: rotate(90deg);
}

.sb-menu-sub {
  display: flex;
  flex-direction: column;
  gap: 2px;
  margin: 2px 0 2px 22px;
  padding: 0 0 0 10px;
  border-left: 1px solid var(--sidebar-border);
  list-style: none;
}

.sb-menu-sub-button {
  display: flex;
  align-items: center;
  height: 28px;
  padding: 0 8px;
  border-radius: var(--radius-sm);
  color: var(--sidebar-muted);
  font-size: 13px;
  text-decoration: none;
  white-space: nowrap;
  transition: background var(--transition), color var(--transition);
}
.sb-menu-sub-button:hover {
  background: var(--sidebar-accent);
  color: var(--sidebar-accent-foreground);
}
.sb-menu-sub-button.active {
  color: var(--accent);
  font-weight: 500;
}

/* ---- Nút hành động "..." cuối dòng (hiện khi hover) ---- */
.sb-menu-action {
  position: absolute;
  top: 4px;
  right: 4px;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  border: 0;
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--sidebar-muted);
  font-size: 12px;
  cursor: pointer;
  opacity: 0;
  transition: opacity var(--transition), background var(--transition);
}
.sb-menu-action:hover {
  background: var(--sidebar-accent);
  color: var(--sidebar-accent-foreground);
}
.sb-menu-action:focus-visible {
  opacity: 1;
  outline: 2px solid var(--ring);
  outline-offset: -2px;
}

.sb-menu-item:hover .sb-menu-action,
.sb-menu-item .sb-dropdown[open] .sb-menu-action {
  opacity: 1;
}

/* ============================================================
   DROPDOWN (native <details>)
============================================================ */
.sb-dropdown {
  position: relative;
}
.sb-dropdown > summary {
  list-style: none;
  cursor: pointer;
}
.sb-dropdown > summary::-webkit-details-marker {
  display: none;
}
.sb-dropdown > summary::marker {
  content: "";
}
.sb-dropdown[open] > summary.sb-menu-button {
  background: var(--sidebar-accent);
  color: var(--sidebar-accent-foreground);
}

.sb-dropdown-menu {
  position: absolute;
  z-index: 60;
  min-width: 224px;
  padding: 4px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: var(--shadow);
}

/* Mở xuống dưới (team switcher ở header) */
.sb-dropdown-menu--down {
  top: calc(100% + 4px);
  left: 0;
}

/* Mở lên trên (user ở footer) */
.sb-dropdown-menu--up {
  bottom: calc(100% + 4px);
  left: 0;
}

/* Neo phải, hẹp (hành động của gian hàng) */
.sb-dropdown-menu--end {
  top: calc(100% + 2px);
  right: 0;
  min-width: 176px;
}

.sb-dropdown-label {
  padding: 6px 8px;
  font-size: 11.5px;
  font-weight: 500;
  color: var(--muted-foreground);
}

.sb-dropdown-item {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  padding: 7px 8px;
  border: 0;
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--foreground);
  font: inherit;
  font-size: 13.5px;
  text-align: left;
  text-decoration: none;
  cursor: pointer;
  transition: background var(--transition);
  /* icon dẫn đầu — <i> FontAwesome HOẶC <svg> của <AppIcon> (09/08: dropdown tài
     khoản chuyển sang icon nét mỏng) */
  /* SVG không ăn font-size như icon font -> chốt cỡ */
  /* Mục đang chọn trong menu con (VD giao diện đang dùng) — JS tô lúc menu mở ra,
     xem `hkdTheme.markThemeMenu`. */
}
.sb-dropdown-item > i:first-child,
.sb-dropdown-item > svg:first-child {
  width: 16px;
  font-size: 13px;
  text-align: center;
  color: var(--muted-foreground);
}
.sb-dropdown-item > svg:first-child {
  height: 16px;
}
.sb-dropdown-item:hover {
  background: var(--surface-2);
}
.sb-dropdown-item.is-danger {
  color: var(--danger);
}
.sb-dropdown-item.is-danger > i:first-child,
.sb-dropdown-item.is-danger > svg:first-child {
  color: var(--danger);
}
.sb-dropdown-item.is-active {
  color: var(--accent);
  font-weight: 600;
}
.sb-dropdown-item.is-active > i:first-child,
.sb-dropdown-item.is-active > svg:first-child {
  color: var(--accent);
}

/* ---- MENU CON trong dropdown (Giao diện → Sáng / Tối / Theo hệ thống) ----
   Razor: Layout/NavUser.razor

   Là <details> lồng trong <details>, nên `position: relative` của `.sb-dropdown` đã có
   sẵn làm mốc — menu con chỉ việc neo theo nó. */
.sb-dropdown--sub {
  /* summary của menu con dùng luôn dáng .sb-dropdown-item, chỉ cần đẩy mũi tên ra cuối */
}
.sb-dropdown--sub > summary {
  display: flex;
  align-items: center;
  gap: 8px;
}
.sb-dropdown--sub[open] > summary {
  background: var(--surface-2);
}

.sb-dropdown-caret {
  margin-left: auto;
  font-size: 10px;
  color: var(--muted-foreground-2);
}

/* Bay SANG PHẢI thay vì xổ xuống: menu tài khoản đã mở NGƯỢC LÊN từ chân sidebar, xổ
   thêm xuống nữa thì menu con chui ra ngoài đáy màn hình.
   Neo `bottom: 0` để mục cuối của menu con thẳng hàng với mục vừa bấm. */
.sb-dropdown-menu--sub {
  left: calc(100% + 4px);
  bottom: 0;
  min-width: 180px;
}

/* Màn hẹp: sidebar sát mép trái, menu con bay sang phải vẫn đủ chỗ — nhưng khi sidebar
   thu gọn còn icon thì đổi sang xổ xuống dưới cho khỏi đè nội dung. */
@media (max-width: 768px) {
  .sb-dropdown-menu--sub {
    left: 0;
    bottom: auto;
    top: calc(100% + 2px);
  }
}
.sb-dropdown-sep {
  height: 1px;
  margin: 4px 0;
  background: var(--border);
}

.sb-dropdown-shortcut {
  margin-left: auto;
  font-size: 11.5px;
  color: var(--muted-foreground-2);
  letter-spacing: 0.04em;
}

/* ============================================================
   VÙNG NỘI DUNG (SidebarInset)
============================================================ */
.app-inset {
  display: flex;
  flex-direction: column;
  flex: 1;
  min-width: 0;
  min-height: 0;
  /* cho phép .inset-body co lại và tự cuộn */
}

/* Header nằm NGOÀI vùng cuộn nên luôn đứng yên khi cuộn nội dung */
.inset-header {
  z-index: 10;
  display: flex;
  align-items: center;
  gap: 8px;
  height: var(--sidebar-inset-header);
  flex-shrink: 0;
  padding: 0 16px;
  background: var(--background);
  border-bottom: 1px solid var(--border);
  transition: height var(--transition);
}

.inset-header-right {
  display: flex;
  align-items: center;
  gap: 4px;
  margin-left: auto;
}

/* Vùng duy nhất cuộn được */
.inset-body {
  flex: 1;
  min-height: 0;
  overflow-y: auto;
  overflow-x: hidden;
  display: flex;
  flex-direction: column;
  gap: 16px;
  padding: 16px;
}

/* Footer dải copyright ở đáy layout admin */
.app-footer {
  flex-shrink: 0;
  text-align: center;
  padding: 10px 16px;
  font-size: 13px;
  line-height: 1.5;
}
.app-footer strong {
  font-weight: 700;
}

/* ---- Trigger thu gọn sidebar ---- */
.sidebar-trigger {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 28px;
  height: 28px;
  border-radius: var(--radius-sm);
  color: var(--muted-foreground);
  font-size: 14px;
  cursor: pointer;
  transition: background var(--transition), color var(--transition);
  /* Icon panel-left nhỏ hơn mặc định .app-icon cho vừa nút 28px */
}
.sidebar-trigger .app-icon {
  width: 17px;
  height: 17px;
}
.sidebar-trigger:hover {
  background: var(--surface-2);
  color: var(--foreground);
}

/* Bản ở đầu SIDEBAR (mặc định) và bản ở header CHỈ CHO MOBILE — xem chú thích
   trong MainLayout.razor về lý do phải giữ hai chỗ. */
.sidebar-trigger--mobile {
  display: none;
}

.sidebar-trigger--rail {
  color: var(--sidebar-muted);
}
.sidebar-trigger--rail:hover {
  background: var(--sidebar-accent);
  color: var(--sidebar-foreground);
}

.inset-separator {
  width: 1px;
  height: 16px;
  flex-shrink: 0;
  margin: 0 4px;
  background: var(--border);
}

/* ---- Bộ chuyển cửa hàng trên topbar ----
   Razor: Layout/ShopSwitcher.razor (đặt trong MainLayout, giữa trigger và breadcrumb).
   Dropdown tái dùng .sb-dropdown-menu / .sb-dropdown-item của sidebar. */
.store-switcher {
  position: relative;
  /* mốc định vị cho dropdown */
  flex-shrink: 0;
}

/* Dòng chờ trong lúc gọi API danh sách cửa hàng */
.store-switcher-loading {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 0 8px;
  color: var(--muted-foreground);
  font-size: 12.5px;
  white-space: nowrap;
}
.store-switcher-loading i {
  font-size: 11px;
}

.store-switcher-trigger {
  display: flex;
  align-items: center;
  gap: 8px;
  height: 32px;
  padding: 0 8px;
  border: 0;
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--foreground);
  font: inherit;
  font-size: 13.5px;
  font-weight: 500;
  cursor: pointer;
  transition: background var(--transition);
}
.store-switcher-trigger:hover {
  background: var(--surface-2);
}
.store-switcher-trigger:focus-visible {
  outline: 2px solid var(--ring);
  outline-offset: -2px;
}
.store-switcher-trigger > .fa-chevron-down {
  font-size: 10px;
  color: var(--muted-foreground);
}

.store-switcher-name {
  max-width: 220px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* Ô logo nhỏ của cửa hàng đang chọn */
.store-switcher-tile {
  display: flex;
  flex-shrink: 0;
  align-items: center;
  justify-content: center;
  width: 24px;
  height: 24px;
  border-radius: var(--radius-sm);
  background: var(--accent-subtle);
  color: var(--accent);
  font-size: 12px;
}

/* Lớp phủ trong suốt phía sau dropdown — bấm ra ngoài là đóng (không cần JS) */
.store-switcher-backdrop {
  position: fixed;
  inset: 0;
  z-index: 55;
  /* ngay dưới .sb-dropdown-menu (60) */
  background: transparent;
}

.store-switcher-menu {
  top: calc(100% + 4px);
  left: 0;
}

/* Dấu check ở cửa hàng đang chọn */
.store-switcher-check {
  margin-left: auto;
  font-size: 11px;
  color: var(--accent);
}

/* ĐÃ BỎ (08\08\2026): `.theme-toggle` + cặp `.theme-icon-light/-dark`.
   Nút mặt trăng trên header đã thay bằng mục "Giao diện" trong dropdown tài khoản
   (`NavUser.razor`) — ở đó chọn thẳng Sáng / Tối / Theo hệ thống nên không còn cần
   cặp icon tự đổi theo giao diện hiện hành nữa. */
/* ---- Breadcrumb ---- */
.breadcrumb {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 0;
  padding: 0;
  list-style: none;
  font-size: 13.5px;
  color: var(--muted-foreground);
  min-width: 0;
}

.breadcrumb-link {
  color: var(--muted-foreground);
  text-decoration: none;
  white-space: nowrap;
}
.breadcrumb-link:hover {
  color: var(--foreground);
}

.breadcrumb-sep {
  font-size: 10px;
  color: var(--muted-foreground-2);
}

.breadcrumb-current {
  color: var(--foreground);
  font-weight: 500;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}

/* ============================================================
   TRẠNG THÁI THU GỌN (collapsible = icon)
============================================================ */
.sidebar-state:checked ~ .app-shell {
  /* Ẩn mọi phần chữ — trừ .sb-tile (ô logo/avatar) vẫn phải thấy */
  /* Nút chỉ còn icon, canh giữa */
  /* ĐẦU SIDEBAR khi thu gọn: bề ngang chỉ đủ MỘT ô icon, nên nút mở lại được xếp
     CHỒNG lên ô logo. Bình thường ẩn; rê chuột vào vùng đầu sidebar thì logo mờ
     đi và nút hiện ra để bấm mở (yêu cầu user 09/08).
     ⚠️ Dùng opacity + pointer-events chứ KHÔNG display:none — display không có
     transition nên icon sẽ nháy cụp, và phần tử ẩn hẳn thì hover không bắt được. */
  /* Nhóm "Gian hàng" ẩn hẳn khi thu gọn (giống sidebar-07) */
  /* Tooltip tên menu khi chỉ còn icon — đọc từ data-tooltip (SidebarMenu.razor).
     position: fixed để THOÁT vùng cuộn overflow của sidebar (absolute sẽ bị cắt);
     left neo theo mép phải sidebar icon, dọc theo vị trí tĩnh của chính nút.
     Chỉ desktop: mobile checked nghĩa là sidebar MỞ đầy đủ chữ. */
  /* Menu 2 CẤP khi sidebar thu gọn (VD "Website" -> Tên miền / Giao diện).
     Quy tắc ẩn `.sb-menu-sub` bên trên làm nhóm con KHÔNG TỚI ĐƯỢC lúc gập: bấm
     vào chỉ mở <details> ra mà danh sách con vẫn display:none.
     Nên khi ĐANG MỞ thì cho nó bật ra bên phải như một bảng nổi.

     Dùng [open] (bấm) chứ KHÔNG dùng :hover — nội dung của <details> đang đóng
     nằm trong slot bị trình duyệt ẩn, đặt display trên <ul> không thắng được.
     position: fixed để thoát vùng cuộn của sidebar, cùng cách với tooltip ở trên. */
  /* Dropdown bật ra bên phải để không bị bó trong 48px */
  /* Header vùng nội dung thấp lại */
}
.sidebar-state:checked ~ .app-shell .app-sidebar {
  width: var(--sidebar-width-icon);
}
.sidebar-state:checked ~ .app-shell .sb-group-label,
.sidebar-state:checked ~ .app-shell .sb-menu-text,
.sidebar-state:checked ~ .app-shell .sb-trailing,
.sidebar-state:checked ~ .app-shell .sb-menu-sub,
.sidebar-state:checked ~ .app-shell .sb-menu-action,
.sidebar-state:checked ~ .app-shell .sb-menu-button > span:not(.sb-tile) {
  display: none;
}
.sidebar-state:checked ~ .app-shell .sb-menu-button {
  justify-content: center;
  gap: 0;
  padding: 0;
}
.sidebar-state:checked ~ .app-shell .sb-menu-button--lg {
  height: 32px;
}
.sidebar-state:checked ~ .app-shell .sb-tile {
  width: 28px;
  height: 28px;
  font-size: 13px;
}
.sidebar-state:checked ~ .app-shell .sb-brand-row .sidebar-trigger--rail {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  opacity: 0;
  pointer-events: none;
  background: var(--sidebar-accent);
  transition: opacity var(--transition);
}
.sidebar-state:checked ~ .app-shell .sb-brand-row .sb-brand {
  transition: opacity var(--transition);
}
.sidebar-state:checked ~ .app-shell .sb-brand-row:hover .sb-brand {
  opacity: 0;
}
.sidebar-state:checked ~ .app-shell .sb-brand-row:hover .sidebar-trigger--rail {
  opacity: 1;
  pointer-events: auto;
}
.sidebar-state:checked ~ .app-shell .sb-group {
  padding: 4px 8px;
}
.sidebar-state:checked ~ .app-shell .sb-group--hide-collapsed {
  display: none;
}
@media (min-width: 769px) {
  .sidebar-state:checked ~ .app-shell .sb-menu-button[data-tooltip]:hover::after {
    content: attr(data-tooltip);
    position: fixed;
    left: calc(var(--sidebar-width-icon) + 10px);
    z-index: 130;
    padding: 5px 10px;
    border-radius: var(--radius-sm);
    background: var(--foreground);
    color: var(--background);
    font-size: 12px;
    font-weight: 500;
    white-space: nowrap;
    box-shadow: var(--shadow);
    pointer-events: none;
  }
}
@media (min-width: 769px) {
  .sidebar-state:checked ~ .app-shell .sb-collapsible[open] > .sb-menu-sub {
    display: flex;
    position: fixed;
    left: var(--sidebar-width-icon);
    z-index: 130;
    min-width: 180px;
    margin: 0;
    padding: 6px;
    border: 1px solid var(--sidebar-border);
    border-radius: var(--radius);
    background: var(--sidebar);
    box-shadow: var(--shadow);
  }
}
.sidebar-state:checked ~ .app-shell .sb-dropdown-menu {
  left: calc(100% + 6px);
  right: auto;
}
.sidebar-state:checked ~ .app-shell .sb-dropdown-menu--down {
  top: 0;
}
.sidebar-state:checked ~ .app-shell .sb-dropdown-menu--up {
  bottom: 0;
}
.sidebar-state:checked ~ .app-shell .inset-header {
  height: var(--sidebar-inset-header-sm);
}

/* ============================================================
   MOBILE — sidebar thành lớp phủ, checkbox đảo nghĩa thành "mở"
============================================================ */
@media (max-width: 768px) {
  .app-sidebar {
    position: fixed;
    top: 0;
    left: 0;
    width: var(--sidebar-width);
    transform: translateX(-100%);
    box-shadow: var(--shadow);
    transition: transform var(--transition);
  }
  /* Sidebar trượt ra ngoài màn hình khi đóng -> nút mở PHẢI nằm ở header */
  .sidebar-trigger--mobile {
    display: flex;
  }
  .sidebar-state:checked ~ .app-shell {
    /* Mobile "checked" = sidebar MỞ ĐẦY ĐỦ, không phải thu gọn icon — nên hoàn
       nguyên kiểu chồng-lên-logo của bản desktop: nút về lại cạnh logo, hover
       KHÔNG làm mờ thương hiệu. */
    /* Trên mobile: mở là hiện đầy đủ chữ, KHÔNG thu gọn icon.
       Ghi rõ display cho từng thành phần thay vì dùng `revert`, vì
       selector `> span:not(.sb-tile)` có specificity cao hơn `.sb-menu-text`. */
  }
  .sidebar-state:checked ~ .app-shell .app-sidebar {
    width: var(--sidebar-width);
    transform: translateX(0);
  }
  .sidebar-state:checked ~ .app-shell .sb-brand-row .sidebar-trigger--rail {
    position: static;
    width: 28px;
    height: 28px;
    opacity: 1;
    pointer-events: auto;
    background: transparent;
  }
  .sidebar-state:checked ~ .app-shell .sb-brand-row:hover .sb-brand {
    opacity: 1;
  }
  .sidebar-state:checked ~ .app-shell .sb-group-label {
    display: flex;
  }
  .sidebar-state:checked ~ .app-shell .sb-menu-sub {
    display: flex;
  }
  .sidebar-state:checked ~ .app-shell .sb-menu-action {
    display: flex;
  }
  .sidebar-state:checked ~ .app-shell .sb-trailing {
    display: inline-block;
  }
  .sidebar-state:checked ~ .app-shell .sb-group--hide-collapsed {
    display: flex;
  }
  .sidebar-state:checked ~ .app-shell .sb-menu-button > span:not(.sb-tile) {
    display: block;
  }
  .sidebar-state:checked ~ .app-shell .sb-menu-button > span.sb-menu-text {
    display: flex;
  }
  .sidebar-state:checked ~ .app-shell .sb-menu-button {
    justify-content: flex-start;
    gap: 10px;
    padding: 0 8px;
  }
  .sidebar-state:checked ~ .app-shell .sb-menu-button--lg {
    height: 48px;
    gap: 8px;
  }
  .sidebar-state:checked ~ .app-shell .sb-tile {
    width: 32px;
    height: 32px;
    font-size: 14px;
  }
  .sidebar-state:checked ~ .app-shell .sb-dropdown-menu {
    left: 0;
    right: auto;
  }
  .sidebar-state:checked ~ .app-shell .inset-header {
    height: var(--sidebar-inset-header);
  }
  .inset-body {
    padding: 12px;
  }
}
/* ============================================================
   LOGO CỬA HÀNG ở bộ chuyển cửa hàng (10/08/2026)
   Razor: Layout/ShopSwitcher.razor
   ~~.store-switcher-tile~~ (ô vuông icon cửa hàng) BỎ: shop nào cũng một hình
   giống hệt nhau, nhìn vào không phân biệt được gì mà vẫn chiếm chỗ.
   Chưa khai logo thì không vẽ gì — chỉ còn tên shop.
============================================================ */
.store-switcher-logo {
  height: 22px;
  max-width: 84px;
  object-fit: contain;
  flex-shrink: 0;
}

/* Logo từng dòng cửa hàng trong dropdown — thay icon fa-store mặc định khi cửa
   hàng đó có LogoUrl. Vuông nhỏ để thẳng hàng với icon các mục khác trong menu. */
.sb-dropdown-item-logo {
  width: 16px;
  height: 16px;
  border-radius: var(--radius-sm);
  object-fit: contain;
  flex-shrink: 0;
}

/* Icon con mắt đứng chỗ mũi tên gập/mở của nhóm Website — mở website bán hàng.
   Razor: Layout/SidebarMenu.razor */
.sb-trailing-link {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  padding: 2px 4px;
  border-radius: var(--radius-sm);
  transition: background var(--transition), color var(--transition);
  /* Nút này KHÔNG xoay theo trạng thái mở/gập như mũi tên — nó là link, không phải
     chỉ báo trạng thái. Ghi đè quy tắc xoay 90° của .sb-collapsible[open]. */
}
.sb-trailing-link:hover, .sb-trailing-link:focus-visible {
  background: var(--sidebar-accent);
  color: var(--sidebar-foreground);
}
.sb-collapsible[open] > summary .sb-trailing-link {
  transform: none;
}

/* ============================================================
   DATE RANGE INPUT — ô chọn KHOẢNG NGÀY (10/08/2026)
   Razor: Components/DateRangeInput.razor
   Port mẫu "Range Picker" của shadcn/ui:
   ui.shadcn.com/docs/components/base/date-picker#range-picker

   Khác `.date-picker-*` của <DateInput> (chọn MỘT ngày) nên đặt tiền tố riêng
   `.date-range-*` — dùng chung class thì sửa cái này vỡ cái kia.
============================================================ */
.date-range {
  position: relative;
}

/* ---- Nút mở lịch (thay cho ô gõ tay của DateInput) ---- */
.date-range-trigger {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  min-width: 230px;
  font: inherit;
  text-align: left;
  cursor: pointer;
  appearance: none;
}
.date-range-trigger:disabled {
  background: var(--surface-2);
  color: var(--muted-foreground-2);
  cursor: not-allowed;
}

.date-range-icon {
  flex-shrink: 0;
  font-size: 13px;
  color: var(--muted-foreground);
}

.date-range-label {
  flex: 1;
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  /* Chưa chọn gì thì chữ nhạt như placeholder của <input> — nút này đóng vai ô nhập */
}
.date-range-label.is-placeholder {
  color: var(--muted-foreground-2);
}

.date-range-clear {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 18px;
  height: 18px;
  border-radius: 50%;
  color: var(--muted-foreground);
  font-size: 10px;
  cursor: pointer;
  transition: background var(--transition), color var(--transition);
}
.date-range-clear:hover {
  background: var(--surface-2);
  color: var(--foreground);
}

/* ---- Lớp phủ bắt "bấm ra ngoài" — cùng cách DateInput/SingleSelect đang dùng ---- */
.date-range-backdrop {
  position: fixed;
  inset: 0;
  z-index: 106;
}

.date-range-popover {
  position: absolute;
  z-index: 107;
  top: calc(100% + 6px);
  /* Neo mép PHẢI: ô lọc nằm bên phải thanh công cụ, mở sang trái mới không tràn */
  right: 0;
  padding: 12px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow);
}

/* ---- Mốc chọn nhanh ---- */
.date-range-presets {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  padding-bottom: 10px;
  margin-bottom: 10px;
  border-bottom: 1px solid var(--border);
}

.date-range-preset {
  padding: 5px 10px;
  border: 1px solid var(--border);
  border-radius: 999px;
  background: var(--surface);
  color: var(--muted-foreground);
  font-size: 12px;
  font-family: inherit;
  cursor: pointer;
  transition: border-color var(--transition), background var(--transition), color var(--transition);
}
.date-range-preset:hover {
  border-color: var(--border-strong);
  color: var(--foreground);
}
.date-range-preset.is-active {
  border-color: var(--accent);
  background: var(--accent-subtle);
  color: var(--accent);
  font-weight: 500;
}

/* ---- Hai tháng cạnh nhau (đúng mẫu shadcn) ---- */
.date-range-calendars {
  display: flex;
  gap: 16px;
}

.date-range-calendar {
  width: 240px;
}

.date-range-caption {
  display: grid;
  grid-template-columns: 28px 1fr 28px;
  align-items: center;
  gap: 4px;
  margin-bottom: 10px;
}

.date-range-month-label {
  text-align: center;
  font-size: 13px;
  font-weight: 600;
  color: var(--foreground);
}

.date-range-nav {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 28px;
  height: 28px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--surface);
  color: var(--muted-foreground);
  font-size: 11px;
  cursor: pointer;
  transition: border-color var(--transition), color var(--transition);
}
.date-range-nav:hover {
  border-color: var(--border-strong);
  color: var(--foreground);
}

/* Giữ chỗ ở phía KHÔNG có nút điều hướng, để nhãn tháng của hai lịch thẳng hàng nhau */
.date-range-nav-spacer {
  display: block;
  width: 28px;
  height: 28px;
}

/* Nút "tháng sau" dự phòng cho màn hẹp — ẩn khi còn đủ hai lịch (nút thật nằm ở
   lịch thứ hai). Xem chú thích trong DateRangeInput.razor. */
.date-range-nav--narrow {
  display: none;
}

.date-range-weekdays,
.date-range-days {
  display: grid;
  grid-template-columns: repeat(7, 1fr);
}

.date-range-weekdays {
  margin-bottom: 4px;
}
.date-range-weekdays span {
  text-align: center;
  font-size: 11px;
  font-weight: 500;
  color: var(--muted-foreground-2);
}

/* ---- Ô ngày ----
   `gap: 0` + bo góc chỉ ở hai đầu: dải giữa phải LIỀN MẠCH, có khe hở thì trông như
   những ô rời rạc chứ không ra một khoảng. */
.date-range-days {
  gap: 0;
  row-gap: 2px;
}

.date-range-day {
  position: relative;
  height: 32px;
  border: 0;
  border-radius: var(--radius-sm);
  background: transparent;
  color: var(--foreground);
  font-size: 12.5px;
  font-family: inherit;
  cursor: pointer;
  transition: background var(--transition), color var(--transition);
  /* Ngày của tháng trước/sau — vẫn bấm được nhưng mờ đi để không hút mắt */
  /* Hôm nay: chỉ gạch chân mảnh, không tô nền — nền để dành cho khoảng đang chọn */
  /* Dải Ở GIỮA — nền nhạt, vuông góc để nối liền các ô */
  /* Hai đầu — nền đặc, bo góc phía ngoài */
  /* Khoảng chỉ một ngày (bắt đầu = kết thúc) — bo tròn cả hai phía */
  /* Hai đầu đang tô đặc thì gạch "hôm nay" màu nhấn chìm nghỉm — đổi sang trắng */
}
.date-range-day:hover {
  background: var(--surface-2);
}
.date-range-day.is-outside {
  color: var(--muted-foreground-2);
}
.date-range-day.is-today::after {
  content: "";
  position: absolute;
  left: 50%;
  bottom: 4px;
  width: 12px;
  height: 2px;
  transform: translateX(-50%);
  border-radius: 2px;
  background: var(--accent);
}
.date-range-day.is-in-range {
  background: var(--accent-subtle);
  border-radius: 0;
  color: var(--foreground);
}
.date-range-day.is-start, .date-range-day.is-end {
  background: var(--accent);
  color: var(--accent-foreground);
  font-weight: 600;
}
.date-range-day.is-start {
  border-radius: var(--radius-sm) 0 0 var(--radius-sm);
}
.date-range-day.is-end {
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
}
.date-range-day.is-start.is-end {
  border-radius: var(--radius-sm);
}
.date-range-day.is-start::after, .date-range-day.is-end::after {
  background: var(--accent-foreground);
}
.date-range-day.is-start:hover, .date-range-day.is-end:hover {
  background: var(--accent-hover);
}

/* ---- Chân bảng ---- */
.date-range-footer {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin-top: 10px;
  padding-top: 10px;
  border-top: 1px solid var(--border);
}

.date-range-hint {
  font-size: 12px;
  color: var(--muted-foreground);
}

.date-range-footer-actions {
  display: flex;
  align-items: center;
  gap: 6px;
}

/* ---- Màn hẹp: gập còn MỘT tháng ----
   Hai tháng ~500px, dưới ngưỡng này là tràn ra ngoài khung nội dung. Người dùng vẫn
   chọn được khoảng vắt tháng bằng nút điều hướng, chỉ mất phần tiện. */
@media (max-width: 640px) {
  .date-range-calendars {
    flex-direction: column;
    gap: 12px;
  }
  .date-range-calendar {
    width: 100%;
  }
  /* Ẩn lịch thứ hai, và bật nút "tháng sau" dự phòng ở lịch còn lại — nút thật nằm
     trong lịch vừa bị ẩn. */
  .date-range-calendar:nth-child(2) {
    display: none;
  }
  .date-range-nav--narrow {
    display: flex;
  }
  .date-range-popover {
    width: max-content;
    max-width: calc(100vw - 32px);
  }
}
/* ---- Page-specific styles ---- */
/* ============================================================
   Trang Dashboard — phần riêng của trang (phần chung nằm ở _components.scss)
============================================================ */
/* Hàng bộ lọc thời gian — 21/08/2026, dưới page-header, trên .bento. */
.dashboard-filter-row {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 10px;
  flex-wrap: wrap;
}

/* Chọn nhanh Tuần/Tháng/Năm — 3 nút gộp thành một khối, viền chung. */
.dashboard-period-toggle {
  display: flex;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  overflow: hidden;
}

.dashboard-period-btn {
  padding: 8px 16px;
  border: none;
  border-right: 1px solid var(--border);
  background: var(--surface);
  color: var(--muted-foreground);
  font-size: 13px;
  font-weight: 500;
  cursor: pointer;
  transition: background var(--transition), color var(--transition);
}
.dashboard-period-btn:last-child {
  border-right: none;
}
.dashboard-period-btn:hover {
  background: var(--surface-2);
  color: var(--foreground);
}
.dashboard-period-btn.is-active {
  background: var(--accent);
  color: var(--accent-foreground);
}

/* Vùng biểu đồ giữ chỗ: khối tỉ lệ 16/9 nền mờ, giống placeholder của sidebar-07.
   flex: 1 (thay height cố định) để co giãn lấp hết chỗ trống khi .card cao hơn nội dung tự
   nhiên của nó (VD card bên cạnh có nhiều dòng hơn) — xem .bento > [class*="col-"] > .card
   ở _components.scss. min-height giữ lại để card không bị bóp quá thấp khi hàng ngắn. */
.chart-placeholder {
  display: flex;
  align-items: flex-end;
  gap: 6px;
  flex: 1;
  min-height: 220px;
  padding: 20px;
}

.chart-bar {
  flex: 1;
  min-width: 0;
  border-radius: var(--radius-sm) var(--radius-sm) 0 0;
  background: var(--accent-subtle);
  transition: background var(--transition);
}
.chart-bar:hover {
  background: var(--accent-subtle-hover);
}
.chart-bar.is-peak {
  background: var(--accent);
}

.chart-legend {
  display: flex;
  align-items: center;
  gap: 16px;
  padding: 0 20px 16px;
  font-size: 12.5px;
  color: var(--muted-foreground);
}

.chart-legend-item {
  display: inline-flex;
  align-items: center;
  gap: 6px;
}

.chart-swatch {
  width: 10px;
  height: 10px;
  border-radius: 3px;
  background: var(--accent);
}
.chart-swatch.is-subtle {
  background: var(--accent-subtle);
}

/* Khối giữ chỗ trống (dùng khi chưa có nội dung) */
.block-placeholder {
  border-radius: var(--radius-lg);
  background: var(--surface-2);
  border: 1px solid var(--border);
}

.block-placeholder--video {
  aspect-ratio: 16/9;
}

.block-placeholder--tall {
  min-height: 320px;
}

/* ============================================================
   TRANG ĐĂNG NHẬP — port shadcn/ui block "login-04"
   Razor: Pages/Auth/Login.razor, Layout/LayoutDangNhap.razor
   Bố cục: card 2 cột (form | panel thương hiệu), 1 cột trên mobile.
============================================================ */
.auth-shell {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  min-height: 100vh;
  padding: 24px;
  background: var(--surface-2);
}

/* login-04: max-w-sm ở mobile, max-w-4xl từ md trở lên */
.auth-wrap {
  display: flex;
  flex-direction: column;
  gap: 24px;
  width: 100%;
  max-width: 384px;
}

.auth-card {
  overflow: hidden;
  padding: 0;
}

.auth-grid {
  display: grid;
  grid-template-columns: 1fr;
}

/* ---- Nửa bên trái: form ---- */
.auth-form {
  padding: 24px;
}

.auth-head {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  text-align: center;
}

.auth-title {
  font-size: 22px;
  font-weight: 600;
  letter-spacing: -0.02em;
}

.auth-desc {
  margin: 0;
  font-size: 13.5px;
  color: var(--muted-foreground);
  text-wrap: balance;
}

/* Link phụ nằm cuối dòng label (VD: "Quên mật khẩu?") */
.auth-label-link {
  margin-left: auto;
  font-size: 13px;
  color: var(--muted-foreground);
  text-decoration: none;
  text-underline-offset: 3px;
}
.auth-label-link:hover {
  text-decoration: underline;
  color: var(--foreground);
}

/* 3 nút đăng nhập mạng xã hội xếp ngang */
.auth-social {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 12px;
}

.auth-social .btn {
  padding: 0;
  font-size: 15px;
}

/* Dòng "Chưa có tài khoản? Đăng ký" */
.auth-footnote {
  font-size: 13.5px;
  color: var(--muted-foreground);
  text-align: center;
}
.auth-footnote a {
  color: var(--foreground);
  font-weight: 500;
  text-decoration: underline;
  text-underline-offset: 3px;
}

/* Dòng điều khoản nằm dưới card */
.auth-terms {
  padding: 0 24px;
  font-size: 12.5px;
  line-height: 1.7;
  color: var(--muted-foreground);
  text-align: center;
  text-wrap: balance;
}
.auth-terms a {
  text-decoration: underline;
  text-underline-offset: 3px;
}
.auth-terms a:hover {
  color: var(--foreground);
}

/* ---- Nửa bên phải: panel thương hiệu ----
   login-04 dùng <img src="/placeholder.svg">. HKD chưa có ảnh thật nên thay bằng
   panel gradient theo màu accent — tự đúng ở cả chế độ sáng và tối, không cần asset. */
.auth-visual {
  display: none; /* chỉ hiện từ md trở lên */
  position: relative;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 16px;
  padding: 40px;
  text-align: center;
  background: radial-gradient(120% 120% at 80% 0%, var(--accent-subtle-hover) 0%, transparent 60%), linear-gradient(160deg, var(--accent) 0%, var(--accent-hover) 100%);
  color: var(--accent-foreground);
  border-left: 1px solid var(--border);
}

.auth-visual-icon {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 56px;
  height: 56px;
  border-radius: var(--radius-lg);
  background: rgba(255, 255, 255, 0.16);
  font-size: 24px;
}

.auth-visual-title {
  font-size: 18px;
  font-weight: 600;
  color: inherit;
}

.auth-visual-desc {
  margin: 0;
  max-width: 260px;
  font-size: 13.5px;
  line-height: 1.7;
  opacity: 0.9;
  text-wrap: balance;
}

.auth-visual-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin: 8px 0 0;
  padding: 0;
  list-style: none;
  font-size: 13px;
  text-align: left;
}
.auth-visual-list li {
  display: flex;
  align-items: center;
  gap: 8px;
  opacity: 0.92;
}
.auth-visual-list i {
  font-size: 11px;
}

/* ---- Từ md (768px) trở lên: card rộng, chia 2 cột ---- */
@media (min-width: 768px) {
  .auth-shell {
    padding: 40px;
  }
  .auth-wrap {
    max-width: 896px;
  }
  .auth-grid {
    grid-template-columns: 1fr 1fr;
  }
  .auth-form {
    padding: 32px;
  }
  .auth-visual {
    display: flex;
  }
}
/* ============================================================
   MẬT KHẨU — quên / đặt lại / đổi mật khẩu (09/08/2026)
   Razor: Pages/Auth/PageQuenMatKhau.razor
          Pages/Auth/PageDatLaiMatKhau.razor
          Pages/Profile/PageDoiMatKhau.razor

   Hai trang đầu dùng chung khung `.auth-shell` / `.auth-wrap` của trang đăng nhập
   (_page-dang-nhap.scss) — ở đây chỉ thêm phần RIÊNG, không định nghĩa lại.
============================================================ */
/* Trang quên/đặt lại chỉ có MỘT cột form, hẹp hơn card 2 cột của trang đăng nhập */
.auth-wrap--narrow {
  max-width: 420px;
}

/* ---- Biểu tượng trạng thái (đang kiểm / thành công / link hỏng) ---- */
.auth-state-icon {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 52px;
  height: 52px;
  margin-bottom: 4px;
  border-radius: 50%;
  background: var(--surface-2);
  color: var(--muted-foreground);
  font-size: 22px;
}

.auth-state-icon--success {
  background: var(--success-subtle);
  color: var(--success);
}

.auth-state-icon--danger {
  background: var(--danger-subtle);
  color: var(--danger);
}

/* ---- Khối nhắc "kiểm tra cả hộp thư rác" ---- */
.auth-hint {
  margin-top: 16px;
  padding: 12px 14px;
  border-radius: var(--radius);
  background: var(--surface-2);
  color: var(--muted-foreground);
  font-size: 13px;
  line-height: 1.6;
}

/* Nút trông như link — dùng cho "Nhập lại" ở màn đã gửi email.
   Phải là <button> chứ không phải <a>: nó không điều hướng đi đâu, chỉ đổi trạng thái
   của chính trang này. */
.btn-link {
  padding: 0;
  border: 0;
  background: transparent;
  color: var(--accent);
  font: inherit;
  text-decoration: underline;
  cursor: pointer;
}
.btn-link:hover {
  color: var(--accent-hover);
}

/* ============================================================
   TRANG ĐỔI MẬT KHẨU (trong app shell, có sidebar)
============================================================ */
.doi-mat-khau-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 320px;
  gap: 20px;
  align-items: start;
  max-width: 900px;
}

.doi-mat-khau-note {
  background: var(--surface-2);
}

.doi-mat-khau-note-title {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 0 0 10px;
  font-size: 14px;
  font-weight: 600;
  color: var(--foreground);
}
.doi-mat-khau-note-title i {
  color: var(--accent);
}

.doi-mat-khau-note-list {
  margin: 0;
  padding-left: 18px;
  color: var(--muted-foreground);
  font-size: 13px;
  line-height: 1.7;
}

/* Màn hẹp: khối lưu ý xuống dưới form thay vì ép hai cột chật cứng */
@media (max-width: 860px) {
  .doi-mat-khau-layout {
    grid-template-columns: minmax(0, 1fr);
  }
}
/* ============================================================
   PAGE GÓI DỊCH VỤ — Styles riêng cho trang "Gói dịch vụ của tôi"
   Razor: Pages/Subscription/PageGoiDichVu.razor
   Bảng giá dạng lưới 3 cột; gói đang dùng viền accent + ribbon "Gói hiện tại".
============================================================ */
/* Ô báo đang tải danh sách gói */
.plan-loading {
  display: flex;
  align-items: center;
  gap: 10px;
  color: var(--muted-foreground);
  font-size: 13.5px;
}

.plan-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 16px;
  align-items: stretch;
}

.plan-card {
  position: relative;
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: 24px 20px 20px;
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  background: var(--surface);
  transition: border-color var(--transition), box-shadow var(--transition);
  /* Nút hành động dính đáy card để 3 card cao bằng nhau */
}
.plan-card:hover {
  border-color: var(--border-strong);
}
.plan-card > .btn {
  margin-top: auto;
}

/* Gói admin đang dùng */
.plan-card--current {
  border-color: var(--accent);
  box-shadow: 0 0 0 1px var(--accent);
}
.plan-card--current:hover {
  border-color: var(--accent);
}

/* Gói cao nhất khi đang ở gói thấp hơn */
.plan-card--recommend {
  border-color: var(--accent-subtle-hover);
}

/* Nhãn góc phải trên: "Gói hiện tại" / "Khuyên dùng" */
.plan-ribbon {
  position: absolute;
  top: 12px;
  right: 12px;
  padding: 3px 10px;
  border-radius: 999px;
  background: var(--accent);
  color: var(--accent-foreground);
  font-size: 11.5px;
  font-weight: 500;
  white-space: nowrap;
}

.plan-ribbon--recommend {
  background: var(--accent-subtle);
  color: var(--accent);
}

.plan-name {
  font-size: 15px;
  font-weight: 600;
  letter-spacing: -0.01em;
}

.plan-price {
  font-size: 24px;
  font-weight: 600;
  letter-spacing: -0.02em;
  line-height: 1.2;
}
.plan-price small {
  font-size: 12.5px;
  font-weight: 400;
  color: var(--muted-foreground);
}

.plan-desc {
  margin: 0;
  font-size: 13px;
  line-height: 1.6;
  color: var(--muted-foreground);
}

.plan-features {
  display: flex;
  flex-direction: column;
  gap: 8px;
  margin: 4px 0 8px;
  padding: 0;
  list-style: none;
  font-size: 13px;
}
.plan-features li {
  display: flex;
  align-items: center;
  gap: 8px;
}
.plan-features i {
  font-size: 11px;
  color: var(--accent);
}

/* Ghi chú gia hạn / nâng cấp dưới bảng giá */
.plan-note {
  display: flex;
  align-items: center;
  gap: 8px;
  margin: 0;
  font-size: 12.5px;
  color: var(--muted-foreground);
}
.plan-note i {
  color: var(--warning);
}

/* ---- Responsive: 1 cột trên màn hẹp ---- */
@media (max-width: 900px) {
  .plan-grid {
    grid-template-columns: 1fr;
  }
}
/* ============================================================
   GÓI ĐANG DÙNG + LỊCH SỬ MUA GÓI (12/08/2026)
   Razor: Pages/Subscription/PageGoiDichVu.razor
   Tiền tố: `.plan-current-*` (khối gói hiện tại) · `.ph-*` (bảng lịch sử)
============================================================ */
.plan-current {
  margin-bottom: 20px;
}

.plan-current-head {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
  margin-bottom: 14px;
}

.plan-current-label {
  font-size: 12px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--muted-foreground);
}

.plan-current-name {
  font-size: 17px;
  font-weight: 700;
  color: var(--foreground);
}

.plan-current-dates {
  display: flex;
  align-items: flex-end;
  gap: 16px;
  flex-wrap: wrap;
}

.plan-current-date {
  display: flex;
  flex-direction: column;
  gap: 3px;
}

.plan-current-date-label {
  font-size: 11.5px;
  color: var(--muted-foreground);
}

.plan-current-date-value {
  font-size: 15px;
  font-weight: 600;
  color: var(--foreground);
  /* Hết hạn tô cảnh báo — thứ chủ shop cần thấy ngay. */
}
.plan-current-date-value.is-expired {
  color: var(--danger);
}

.plan-current-arrow {
  padding-bottom: 3px;
  color: var(--muted-foreground-2);
}

.plan-current-daysleft {
  padding-bottom: 3px;
  font-size: 13px;
  color: var(--success);
}

.plan-current-note {
  margin: 12px 0 0;
  font-size: 12.5px;
  color: var(--muted-foreground);
}

/* ---- Bảng lịch sử mua gói ---- */
.plan-history {
  margin-top: 20px;
}

.plan-history-table .ph-th-num,
.plan-history-table .ph-td-num {
  text-align: right;
  white-space: nowrap;
}
.plan-history-table .ph-th-code {
  width: 165px;
}
.plan-history-table .ph-th-type {
  width: 95px;
}
.plan-history-table .ph-th-date {
  width: 195px;
}
.plan-history-table .ph-th-status {
  width: 130px;
}

.ph-code {
  padding: 2px 6px;
  border-radius: var(--radius-sm);
  background: var(--surface-2);
  border: 1px solid var(--border);
  font-size: 12px;
}

.ph-service {
  font-weight: 500;
  color: var(--foreground);
}

.ph-period,
.ph-dates {
  font-size: 12px;
  line-height: 1.6;
  color: var(--muted-foreground);
}

.ph-period {
  margin-top: 2px;
}

.ph-amount {
  font-weight: 600;
  color: var(--foreground);
}

/* Ngày thanh toán tô xanh: đây là mốc "tiền đã vào", khác ngày tạo đơn. */
.ph-paid {
  color: var(--success);
}

/* Khối chuyển khoản: số tài khoản là thứ đối soát nên để đậm nhất trong ô. */
.ph-bank {
  font-size: 12.5px;
  line-height: 1.55;
}

.ph-bank-acc {
  font-weight: 600;
  color: var(--foreground);
}

.ph-bank-name {
  font-weight: 400;
  color: var(--muted-foreground);
}

.ph-bank-owner,
.ph-bank-content {
  color: var(--muted-foreground);
}

.ph-muted {
  color: var(--muted-foreground-2);
}

.ph-td-empty {
  padding: 28px 12px;
  text-align: center;
  color: var(--muted-foreground);
}

/* ============================================================
   PAGE THANH TOÁN GÓI — Styles riêng cho trang thanh toán gói
   Razor: Pages/Subscription/PageThanhToanGoi.razor
   Bố cục: 2 cột — trái chọn gói + phương thức, phải tóm tắt đơn
   HOẶC khối hướng dẫn chuyển khoản (đơn treo) + QR VietQR.
   Màu đều đi qua token nên sáng/tối tự đổi theo theme.
============================================================ */
.checkout-loading {
  color: var(--muted-foreground);
  font-size: 13px;
}

.checkout-layout {
  display: grid;
  grid-template-columns: 1fr 340px;
  gap: 16px;
  align-items: start;
}
@media (max-width: 900px) {
  .checkout-layout {
    grid-template-columns: 1fr;
  }
}

.checkout-main {
  display: flex;
  flex-direction: column;
  gap: 16px;
}

/* ---- Chọn gói ---- */
.checkout-plans {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.checkout-plan {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 12px 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  cursor: pointer;
  transition: border-color var(--transition), background var(--transition);
}
.checkout-plan:hover {
  background: var(--surface-1);
}
.checkout-plan.checkout-plan--active {
  border-color: var(--accent);
  background: var(--accent-subtle);
}

.checkout-plan-info {
  display: flex;
  flex-direction: column;
  gap: 2px;
  flex: 1;
  min-width: 0;
}

.checkout-plan-name {
  font-weight: 600;
  font-size: 14px;
}

.checkout-plan-desc {
  font-size: 12.5px;
  color: var(--muted-foreground);
}

.checkout-plan-price {
  font-weight: 600;
  white-space: nowrap;
}

.checkout-plan-term {
  font-weight: 400;
  font-size: 12px;
  color: var(--muted-foreground);
}

/* ---- Phương thức thanh toán ---- */
.checkout-methods {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.checkout-method {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  font-size: 13.5px;
  cursor: pointer;
  transition: border-color var(--transition), background var(--transition);
}
.checkout-method > i {
  width: 18px;
  text-align: center;
  color: var(--muted-foreground);
}
.checkout-method:hover {
  background: var(--surface-1);
}
.checkout-method.checkout-method--active {
  border-color: var(--accent);
  background: var(--accent-subtle);
}

/* ---- Tóm tắt đơn ---- */
.checkout-summary-row {
  display: flex;
  justify-content: space-between;
  gap: 12px;
  padding: 8px 0;
  font-size: 13.5px;
  border-bottom: 1px solid var(--border);
}
.checkout-summary-row > span:first-child {
  color: var(--muted-foreground);
}

.checkout-summary-total {
  border-bottom: none;
  font-weight: 600;
  font-size: 15px;
}
.checkout-summary-total > span:first-child {
  color: var(--foreground);
}

.checkout-summary-note {
  margin: 8px 0 0;
  font-size: 12.5px;
  line-height: 1.5;
  color: var(--muted-foreground);
}
.checkout-summary-note > i {
  color: var(--accent);
  margin-right: 4px;
}

/* Phương thức chưa nối cổng (VNPay/MoMo) — mờ đi, không cho tưởng bấm được */
.checkout-method--disabled {
  opacity: 0.55;
  cursor: not-allowed;
}
.checkout-method--disabled:hover {
  background: transparent;
}

.checkout-method-soon {
  margin-left: auto;
}

.checkout-submit {
  width: 100%;
  margin-top: 14px;
}

/* ---- Khối hướng dẫn chuyển khoản (đơn treo) ---- */
.transfer-guide {
  margin-top: 14px;
  padding: 10px 12px;
  border: 1px dashed var(--border);
  border-radius: var(--radius);
  background: var(--surface-1);
}

.transfer-guide-row {
  display: flex;
  justify-content: space-between;
  gap: 12px;
  padding: 5px 0;
  font-size: 13px;
}
.transfer-guide-row > span:first-child {
  color: var(--muted-foreground);
  white-space: nowrap;
}
.transfer-guide-row > span:last-child {
  text-align: right;
  word-break: break-all;
}

.transfer-qr {
  margin-top: 14px;
  text-align: center;
}

/* Nền QR luôn TRẮNG kể cả chế độ tối — app ngân hàng quét nền tối dễ trượt */
.transfer-qr-img {
  width: 100%;
  max-width: 240px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: #fff;
  padding: 6px;
}

.transfer-qr-hint {
  margin: 6px 0 0;
  font-size: 12px;
  color: var(--muted-foreground);
}

/* Cảnh báo gói đang chọn khác đơn treo — màu warning (base chỉ có danger/success) */
.transfer-switch-alert {
  margin-top: 14px;
  background: var(--warning-subtle);
  color: var(--warning);
}

/* ============================================================
   CHỌN DANH MỤC — hộp tích danh mục trong form thêm/sửa sản phẩm
   Razor: Pages/Product/PageTaoSanPham.razor
   (ModalCreateProduct đã xoá 10/08 — user chốt dùng TRANG)
   Cha–con 1 cấp: danh mục con thụt vào và nhạt hơn.
============================================================ */
/* 11/08 — nâng trần từ ~~180px~~ lên 250px: cửa hàng nhiều danh mục thì khung cũ chỉ
   hiện ~5 dòng, phải cuộn ngay từ đầu. Vẫn phải có trần chứ không bỏ hẳn — danh sách
   dài tự do sẽ đẩy khối Ảnh bìa và nút Lưu xuống mất tầm mắt. */
.category-picker {
  max-height: 250px;
  overflow-y: auto;
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface);
  /* Thanh cuộn mỏng. Firefox dùng `scrollbar-*`, WebKit/Blink dùng `::-webkit-*` —
     phải khai cả hai, không có cái nào phủ được cả hai họ trình duyệt.
     Màu đi qua biến nên chế độ tối cũng đúng. */
  scrollbar-width: thin;
  scrollbar-color: var(--border-strong) transparent;
  /* Chỉ đậm lên khi con trỏ đang ở trong khung — lúc không dùng thì thanh cuộn
     không nên tranh sự chú ý với nội dung. */
}
.category-picker::-webkit-scrollbar {
  width: 6px;
}
.category-picker::-webkit-scrollbar-track {
  background: transparent;
}
.category-picker::-webkit-scrollbar-thumb {
  border-radius: 999px;
  background: var(--border-strong);
}
.category-picker:hover::-webkit-scrollbar-thumb {
  background: var(--muted-foreground-2);
}

.category-picker-empty {
  max-height: none;
  border-style: dashed;
  color: var(--muted-foreground);
  font-size: 13px;
}

.category-item {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 3px 0;
  font-size: 13.5px;
  cursor: pointer;
}

.category-item-child {
  padding-left: 22px;
  color: var(--muted-foreground);
}

/* ============================================================
   PAGE SẢN PHẨM — Styles riêng cho trang danh sách sản phẩm
   Razor: Pages/Product/PageSanPham.razor
   Bao gồm: ListSanPham (component chỉ dùng trong trang này).
   Toolbar/phân trang/bảng dùng class chung ở _components.scss.
============================================================ */
/* ============================================================
   THUỘC TÍNH → PHIÊN BẢN trên trang tạo sản phẩm (11/08/2026, đợt 2)
   Razor: Pages/Product/Components/ProductVariantBuilder.razor
   Dựng theo ảnh mẫu user gửi.
============================================================ */
/* Link chữ xanh ở góc phải thẻ ("Thêm thuộc tính") — là <button> chứ không phải <a> vì
   nó không dẫn đi đâu; bỏ hết dáng nút mặc định để trông đúng như một link. */
.btn-link-action {
  padding: 0;
  border: 0;
  background: none;
  color: var(--accent);
  font-size: 14px;
  font-weight: 500;
  cursor: pointer;
}
.btn-link-action:hover {
  text-decoration: underline;
}

.attr-hint {
  margin: 0;
  color: var(--muted-foreground);
  font-size: 13.5px;
}

.attr-add-more {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin-top: 12px;
}

/* Lưới 3 cột: tên · ô tag · nút xoá. Cột giữa co giãn, hai cột kia vừa nội dung. */
.attr-grid {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.attr-grid-head,
.attr-grid-row {
  display: grid;
  grid-template-columns: minmax(0, 220px) minmax(0, 1fr) 36px;
  gap: 12px;
  align-items: start;
}

.attr-grid-head {
  padding-bottom: 6px;
  border-bottom: 1px solid var(--border);
  color: var(--muted-foreground);
  font-size: 13px;
  font-weight: 600;
}

/* Cột phải của trang chỉ 540px — 3 cột cạnh nhau sẽ bóp ô tag còn vài chục pixel. */
@media (max-width: 900px) {
  .attr-grid-head {
    display: none;
  }
  .attr-grid-row {
    grid-template-columns: minmax(0, 1fr) 36px;
    grid-template-areas: "name  remove" "value value";
  }
  .attr-grid-row > :nth-child(1) {
    grid-area: name;
  }
  .attr-grid-row > :nth-child(2) {
    grid-area: value;
  }
  .attr-grid-row > :nth-child(3) {
    grid-area: remove;
  }
}
/* ---- Ô TAG: các viên chữ + ô nhập nằm chung một khung ---- */
.tag-input {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 6px;
  min-height: 38px;
  padding: 5px 8px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface);
  /* Khung sáng lên khi con trỏ đang ở ô nhập bên trong — cho giống một ô nhập thật. */
}
.tag-input:focus-within {
  border-color: var(--accent);
  box-shadow: 0 0 0 3px var(--accent-subtle);
}

.tag-chip {
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 2px 6px 2px 9px;
  border-radius: 999px;
  background: var(--accent-subtle);
  color: var(--accent);
  font-size: 12.5px;
  font-weight: 500;
}

.tag-chip-remove {
  border: 0;
  background: none;
  color: inherit;
  font-size: 15px;
  line-height: 1;
  padding: 0 2px;
  cursor: pointer;
  opacity: 0.7;
}
.tag-chip-remove:hover {
  opacity: 1;
}

/* Ô nhập trong khung tag: bỏ hết viền/nền của .input, khung ngoài đã lo phần đó. */
.tag-input-field {
  flex: 1 1 140px;
  min-width: 120px;
  border: 0;
  outline: none;
  background: none;
  color: var(--foreground);
  font-size: 13.5px;
  padding: 3px 2px;
}
.tag-input-field::placeholder {
  color: var(--muted-foreground-2);
}

/* ---- Danh sách phiên bản sinh ra ---- */
.variant-filter {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
  margin-bottom: 10px;
  font-size: 13px;
}

.variant-filter-label {
  color: var(--muted-foreground);
}

/* ~~.variant-filter-item~~ — 11/08 (đợt 3): bộ lọc từ chữ tĩnh thành <select> lọc thật.
   Giữ lại vì đây là kiểu chữ dùng cho "giá trị thuộc tính" nói chung; bỏ hẳn thì lần sau
   cần lại phải chế lại màu.
.variant-filter-item {
    color: var(--accent);
    font-weight: 500;
}
*/
/* Ô chọn của bộ lọc — hẹp hơn .input thường vì xếp ngang nhiều cái trên một hàng */
.variant-filter-select {
  width: auto;
  min-width: 140px;
  max-width: 220px;
  height: 30px;
  padding: 2px 8px;
  font-size: 12.5px;
}

.variant-plan-head {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 8px;
  padding: 8px 0;
  border-top: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
  font-weight: 600;
  font-size: 13.5px;
}

/* Ô tick "chọn tất cả" + số dòng đang chọn, nằm bên trái thanh đầu bảng phiên bản */
.variant-bulk-all {
  gap: 8px;
  font-weight: 600;
  font-size: 13.5px;
}

/* ~~.variant-bulk-actions / .variant-bulk-field~~ — BỎ 11/08: thanh "chọn thao tác + ô nhập
   + Áp dụng" ngay tại đây chỉ áp được MỘT giá trị cho mọi dòng. Nay là menu + modal. */
/* Menu "Chỉnh sửa" — hiện khi đã tick ít nhất một dòng */
.variant-bulk-menu {
  position: relative;
  font-weight: 400;
}

/* Nền trong suốt phủ toàn màn hình: bấm ra ngoài là đóng menu, khỏi cần JS bắt click-outside */
.variant-bulk-menu-backdrop {
  position: fixed;
  inset: 0;
  z-index: 20;
}

.variant-bulk-menu-list {
  position: absolute;
  top: calc(100% + 4px);
  right: 0;
  z-index: 21;
  min-width: 200px;
  padding: 4px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface);
  box-shadow: 0 8px 24px rgba(0, 0, 0, 0.12);
}

.variant-bulk-menu-item {
  display: block;
  width: 100%;
  padding: 8px 10px;
  border: 0;
  border-radius: var(--radius-sm);
  background: none;
  color: var(--foreground);
  font-size: 13.5px;
  text-align: left;
  cursor: pointer;
}
.variant-bulk-menu-item:hover {
  background: var(--surface-2);
}

.variant-plan-list {
  display: flex;
  flex-direction: column;
}

/* ---- Dòng phiên bản (dựng lại lần 2 — 11/08, theo ảnh mẫu user gửi) ----

     [☑] [ảnh]  đỏ / 128            Giá bán: 13.000.000 ₫
                ip-15               Có thể bán: 10

   Lịch sử để khỏi quay lại lối cũ:
     · bản 1: 2 cột, SKU xuống dưới tên, giá/tồn dọc bên phải → mỗi phiên bản chiếm hai
       hàng, ô tồn kéo hết bề ngang. User báo VỠ GIAO DIỆN.
     · bản 2: lưới ngang 4–5 cột toàn ô nhập.
     · bản 3 (hiện tại): CHỈ ĐỌC hoàn toàn, sửa qua menu "Chỉnh sửa" + modal. */
.variant-plan-row {
  display: grid;
  grid-template-columns: 16px 40px minmax(0, 1fr) auto;
  gap: 12px;
  align-items: center;
  padding: 8px 0;
  border-bottom: 1px solid var(--border);
  /* Dòng đang tick tô nền nhạt — nhìn ra ngay modal sắp sửa những dòng nào */
}
.variant-plan-row.is-selected {
  background: var(--surface-2);
}

/* Ô ảnh: bấm vào mở modal chọn/tải ảnh cho phiên bản đó */
.variant-plan-thumb {
  display: block;
  width: 40px;
  height: 40px;
  padding: 0;
  overflow: hidden;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--surface-2);
  cursor: pointer;
}
.variant-plan-thumb:hover {
  border-color: var(--accent);
}
.variant-plan-thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* Tên phiên bản + SKU xếp dọc */
.variant-plan-name {
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 2px;
}

/* Giá bán + tồn gom vào một khối, căn phải */
.variant-plan-money {
  display: flex;
  flex-direction: column;
  gap: 2px;
  align-items: flex-end;
  text-align: right;
}

/* Màn hẹp: khối giá/tồn xuống hàng dưới, thẳng cột với tên */
@media (max-width: 900px) {
  .variant-plan-row {
    grid-template-columns: 16px 40px minmax(0, 1fr);
  }
  .variant-plan-money {
    grid-column: 3;
    align-items: flex-start;
    text-align: left;
  }
}
.variant-plan-values {
  color: var(--accent);
  font-weight: 600;
  font-size: 13.5px;
}

/* ~~.variant-plan-pick / .variant-plan-sku / .variant-plan-readonly / .variant-plan-row-head
   / .variant-col-num / .variant-plan-action / .variant-plan-stock-input~~ — BỎ 11/08 khi
   dòng phiên bản chuyển sang CHỈ ĐỌC hoàn toàn (không còn ô nhập, không còn cột thao tác). */
/* SKU nằm DƯỚI tên phiên bản, chỉ xem */
.variant-plan-sku-text {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  color: var(--muted-foreground);
  font-size: 12.5px;
}

.variant-plan-price-text {
  font-size: 13px;
  white-space: nowrap;
}

.variant-plan-stock {
  color: var(--muted-foreground-2);
  font-size: 12.5px;
  white-space: nowrap;
}

/* ---- Modal sửa phiên bản (giá · tồn · SKU · khối lượng · ảnh) ----
   Razor: Pages/Product/Components/ModalSuaPhienBan.razor */
/* Khối "áp một giá trị cho tất cả" — ngăn với danh sách bên dưới bằng một đường kẻ */
.bulk-apply-all {
  padding-bottom: 12px;
  margin-bottom: 4px;
  border-bottom: 1px solid var(--border);
}

.bulk-apply-all-label {
  display: block;
  margin-bottom: 6px;
  color: var(--muted-foreground);
  font-size: 13px;
}

.bulk-apply-all-row {
  display: flex;
  align-items: center;
  gap: 8px;
  /* Ô nhập chiếm phần còn lại, nút giữ bề ngang theo chữ */
}
.bulk-apply-all-row > .input {
  flex: 1 1 auto;
  min-width: 0;
}
.bulk-apply-all-row > .btn {
  flex: 0 0 auto;
  white-space: nowrap;
}

.bulk-row-list {
  display: flex;
  flex-direction: column;
  /* Danh sách có thể dài (trần 200 tổ hợp) — cuộn trong thân modal */
  max-height: 320px;
  overflow-y: auto;
}

.bulk-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 260px);
  gap: 12px;
  align-items: center;
  padding: 8px 0;
  border-bottom: 1px solid var(--border);
}
.bulk-row:last-child {
  border-bottom: 0;
}

.bulk-row-name {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
  font-size: 13.5px;
}

/* Ô ảnh của từng dòng: xem trước nhỏ + ô chọn */
.bulk-row-image {
  display: flex;
  align-items: center;
  gap: 8px;
}
.bulk-row-image > .input {
  flex: 1 1 auto;
  min-width: 0;
}

.bulk-row-thumb {
  flex: 0 0 auto;
  width: 32px;
  height: 32px;
  overflow: hidden;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--surface-2);
}
.bulk-row-thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* Khối kéo thả rút gọn trong modal — khối đầy đủ cao gấp đôi, chiếm hết thân modal */
.dropzone-sm .dropzone-body {
  padding: 12px;
}

@media (max-width: 700px) {
  .bulk-row {
    grid-template-columns: minmax(0, 1fr);
  }
}
.variant-plan-foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding-top: 10px;
  font-size: 13.5px;
  font-weight: 600;
}

/* Ô mô tả trong bảng danh sách — cắt bớt khi dài, xem đủ ở trang chi tiết */
.product-desc {
  max-width: 420px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

/* ---- Cột ẢNH trong bảng ----
   ⚠️ ĐÃ CHUYỂN sang `_components.scss` (11/08/2026, cùng ngày tạo).
   Ban đầu chỉ trang Sản phẩm dùng nên đặt ở đây; nay trang Chi tiết đơn hàng dùng lại
   → theo quy tắc SCSS của dự án, class dùng chung nhiều trang phải nằm ở file chung.
   Tìm `.th-thumb` / `.td-thumb` / `.product-row-thumb` trong `_components.scss`. */
/* ---- Upload ảnh sản phẩm (PageTaoSanPham) ---- */
/* ~~.product-image-input~~ (ô InputFile trần) — BỎ 11/08, thay bằng khối kéo thả
   dưới đây. Giữ lại khai báo dạng chú thích để biết trước kia trông thế nào:
       .product-image-input { padding: 7px 10px; height: auto; }
   Xác minh không còn nơi nào dùng: grep -rn "product-image-input" Pages/ */
/* ---- Khối KÉO THẢ ảnh (Razor: Pages/Product/PageTaoSanPham.razor) ----

   Cấu trúc: .dropzone (khung) chứa
     · .dropzone-input — <InputFile> phủ TRONG SUỐT lên toàn khối
     · .dropzone-body  — icon + chữ, nằm dưới, không nhận chuột

   ⚠️ Thứ tự chồng lớp là điểm mấu chốt: input phải nằm TRÊN (z-index cao hơn) để vừa
   ăn cú bấm vừa ăn cú thả file; phần chữ để `pointer-events: none` cho chuột xuyên
   qua xuống input. Đảo lại là bấm vào giữa khối không mở được hộp chọn file. */
.dropzone {
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 132px;
  padding: 20px 16px;
  border: 1px dashed var(--border-strong);
  border-radius: var(--radius);
  background: var(--surface);
  transition: border-color var(--transition), background-color var(--transition);
  /* Đang rê file qua khối — cờ _isDraggingImage bật class này.
     Đậm hơn hẳn trạng thái hover để người dùng biết chắc "thả được ở đây". */
}
.dropzone:hover {
  border-color: var(--accent);
  background: var(--surface-2);
}
.dropzone.is-dragging {
  border-color: var(--accent);
  border-style: solid;
  background: var(--accent-subtle);
}

/* Input phủ kín, trong suốt. `cursor: pointer` để cả khối trông bấm được.
   font-size 0 chặn nút "Choose File" mặc định của trình duyệt đội chiều cao khối lên. */
.dropzone-input {
  position: absolute;
  inset: 0;
  z-index: 2;
  width: 100%;
  height: 100%;
  opacity: 0;
  font-size: 0;
  cursor: pointer;
}

.dropzone-body {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  text-align: center;
  /* Cho chuột xuyên qua xuống input phía trên — xem ghi chú ở .dropzone */
  pointer-events: none;
}

.dropzone-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 40px;
  height: 40px;
  margin-bottom: 2px;
  border-radius: 50%;
  background: var(--accent-subtle);
  color: var(--accent);
  font-size: 16px;
}

.dropzone-text {
  font-size: 13.5px;
  font-weight: 500;
  color: var(--foreground);
}

.dropzone-sub {
  font-size: 12px;
  color: var(--muted-foreground);
}

.upload-image-list {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin-top: 8px;
}

/* Một ảnh: thumbnail + tên + trạng thái + nút bỏ */
.upload-image-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 6px 8px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--surface-1);
}
.upload-image-item.upload-image-item--failed {
  border-color: var(--danger);
  background: var(--danger-subtle);
}

.upload-image-thumb {
  width: 36px;
  height: 36px;
  flex-shrink: 0;
  border-radius: var(--radius-sm);
  object-fit: cover;
  border: 1px solid var(--border);
}
.upload-image-thumb.upload-image-thumb--placeholder {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: var(--muted-foreground);
  font-size: 13px;
}

.upload-image-name {
  flex: 1;
  min-width: 0;
  font-size: 13px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.upload-image-status {
  font-size: 12px;
  color: var(--muted-foreground);
  white-space: nowrap;
}

/* ============================================================
   TRANG TẠO SẢN PHẨM (bản song song với modal)
   Razor: Pages/Product/PageTaoSanPham.razor
   Kèm: Pages/Product/Components/ProductAttributeEditor.razor (dùng cả ở modal)
============================================================ */
/* Bố cục 2 cột + thanh nút dính đáy dùng chung mọi trang form kiểu "tạo/sửa" đã
   chuyển sang .form-page-* trong Common/_components.scss (PageTaoSanPham dùng
   chung với PageTaoDonHang) — chỉ còn phần đặc thù sản phẩm ở đây. */
.product-form-description {
  min-height: 120px;
  resize: vertical;
}

/* ---- Bảng nhập thông số kỹ thuật ---- */
.attr-editor {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.attr-editor-note {
  margin-bottom: 12px;
}

.attr-editor-empty {
  padding: 14px;
  border: 1px dashed var(--border);
  border-radius: var(--radius);
  color: var(--muted-foreground);
  font-size: 13px;
}

.attr-row {
  display: grid;
  grid-template-columns: minmax(0, 1fr) minmax(0, 1.4fr) 34px;
  gap: 8px;
  align-items: center;
}
@media (max-width: 620px) {
  .attr-row {
    grid-template-columns: minmax(0, 1fr) 34px;
    /* Ô giá trị xuống dòng, chiếm hết chiều ngang trừ nút xoá */
  }
  .attr-row .input:nth-child(2) {
    grid-column: 1/-1;
  }
}

/* Dòng tiêu đề của bảng thông số */
.attr-row--head {
  font-size: 12px;
  font-weight: 600;
  color: var(--muted-foreground);
  text-transform: uppercase;
  letter-spacing: 0.02em;
}

.attr-editor-actions {
  display: flex;
  align-items: center;
  gap: 12px;
  flex-wrap: wrap;
  margin-top: 4px;
}

/* Danh sách biến thể CHỈ ĐỌC ở trang sửa — hiện thay ô nhập giá khi sản phẩm
   có nhiều biến thể (giá nằm ở từng biến thể, sửa ở modal Biến thể).
   Razor: Pages/Product/PageTaoSanPham.razor */
.variant-readonly-list {
  display: flex;
  flex-direction: column;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  overflow: hidden;
}

.variant-readonly-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  padding: 9px 12px;
  font-size: 13px;
}
.variant-readonly-row:not(:last-child) {
  border-bottom: 1px solid var(--border);
}

.variant-readonly-sku {
  font-family: ui-monospace, "Cascadia Code", Consolas, monospace;
  font-size: 12px;
  color: var(--muted-foreground);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.variant-readonly-price {
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  flex-shrink: 0;
}

/* ============================================================
   PAGE DANH MỤC — Styles riêng cho trang danh mục sản phẩm
   Razor: Pages/Category/PageDanhMuc.razor
   Bao gồm: ListDanhMuc, ModalDanhMuc (component chỉ dùng trong trang này).
   Bảng/modal/nút dùng class chung ở _components.scss.
============================================================ */
/* Icon folder trước tên danh mục gốc */
.category-root-icon {
  margin-right: 8px;
  font-size: 12px;
  color: var(--muted-foreground);
}

/* Tiền tố "└─" của danh mục con — thụt vào cho rõ phân cấp */
.category-child-prefix {
  margin: 0 8px 0 20px;
  color: var(--muted-foreground-2);
  font-size: 12px;
}

/* Ảnh đại diện danh mục trong bảng danh sách — thay icon folder/tiền tố khi có ảnh */
.category-thumb {
  width: 24px;
  height: 24px;
  margin-right: 8px;
  border-radius: var(--radius-sm);
  object-fit: cover;
  vertical-align: middle;
}

/* ============================================================
   PAGE KHO HANG — trang /kho-hang
   Razor: Pages/Inventory/PageKhoHang.razor
   Bao gồm: ModalTaoKho, ModalDieuChinhTon (chỉ dùng trong trang này)
   Lưu ý: .stock-badge nằm ở _components.scss vì modal Biến thể của trang
   Sản phẩm cũng dùng.
============================================================ */
/* ---- Đối soát: trạng thái khớp (không có dòng lệch nào) ---- */
.recon-ok {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 13.5px;
  color: var(--success);
}
.recon-ok i {
  font-size: 12px;
}

/* Bảng tồn kho có thể rất rộng khi xem "Tất cả kho" (mỗi kho một cột) —
   cho phép cuộn ngang trong card thay vì đẩy vỡ layout trang. */
.card .table-wrap {
  overflow-x: auto;
}

/* ---- Khối thông tin biến thể đang điều chỉnh (ModalDieuChinhTon) ---- */
.stock-target {
  padding: 12px 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface-2);
}
.stock-target .stock-target-name {
  font-size: 14px;
  font-weight: 600;
  /* Tên biến thể ("Trắng / M") đứng cạnh tên sản phẩm, nhạt hơn */
}
.stock-target .stock-target-name .stock-target-variant {
  margin-left: 6px;
  font-size: 12.5px;
  font-weight: 500;
  color: var(--muted-foreground);
}
.stock-target .stock-target-meta {
  margin-top: 4px;
  font-size: 12.5px;
  color: var(--muted-foreground);
}
.stock-target .stock-target-meta .sep {
  margin: 0 6px;
  color: var(--muted-foreground-2);
}
.stock-target .stock-target-meta strong {
  color: var(--foreground);
}

/* ---- Hai ô lọc của khối "Tồn kho theo biến thể" ----
   10/08 — đổi từ <select> thuần sang <SingleSelect> (yêu cầu user). Phải chốt bề rộng
   như `.order-status-filter` bên trang Đơn hàng: nút của SingleSelect co theo nội dung,
   không chốt thì chọn "Hết hàng" xong ô co lại, cả hàng công cụ nhảy chỗ.
   Razor: Pages/Inventory/PageKhoHang.razor */
.stock-level-filter {
  width: 170px;
  flex: none;
}

.inventory-filter {
  width: 190px;
  flex: none;
}

/* ============================================================
   SỬA NHANH TỒN KHO — nút bút chì trong ô + popover
   Razor: Pages/Inventory/PageKhoHang.razor (bảng "Tất cả kho")
        · Pages/Inventory/Components/PopoverDieuChinhTon.razor
============================================================ */
/* Nút trong ô: trông như con số bình thường, kèm bút chì LUÔN HIỆN.
   10/08 — user chốt bỏ kiểu ẩn-hiện-khi-rê-chuột: bút chì chỉ hiện lúc hover thì
   người dùng phải quét chuột khắp bảng mới biết ô nào bấm được (và trên màn cảm ứng
   thì không bao giờ thấy). Rê vào chỉ đổi màu + hiện viền.
   Không dùng .btn để nó không chiếm chỗ và không phá canh phải của cột số. */
.stock-cell-edit {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 2px 6px;
  border: 1px solid transparent;
  border-radius: var(--radius-sm);
  background: none;
  color: inherit;
  font: inherit;
  cursor: pointer;
  /* Bàn phím: viền phải thấy rõ */
}
.stock-cell-edit i {
  font-size: 11px;
  color: var(--muted-foreground-2);
  transition: color 0.12s ease;
}
.stock-cell-edit:hover, .stock-cell-edit:focus-visible {
  border-color: var(--border);
  background: var(--surface-2);
}
.stock-cell-edit:hover i, .stock-cell-edit:focus-visible i {
  color: var(--accent);
}
.stock-cell-edit:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: 1px;
}

/* Nền trong suốt phủ toàn màn: bấm ra ngoài là đóng popover. */
.stock-pop-backdrop {
  position: fixed;
  inset: 0;
  z-index: 90;
}

/* ⚠️ position: FIXED chứ không absolute — popover neo vào ô trong bảng mà
   `.table-wrap` có `overflow-x: auto`, đặt absolute là bị cắt mất.
   Toạ độ do JS đo (AppJscriptAccessor.getPopoverPosition) rồi gán qua style nội tuyến.
   ⚠️ width/height phải KHỚP PopoverWidth/PopoverHeight trong PageKhoHang.razor.cs —
   JS dùng hai số đó để kẹp popover vào trong màn hình. */
.stock-pop {
  position: fixed;
  z-index: 91;
  width: 300px;
  padding: 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface);
  box-shadow: 0 12px 28px rgba(0, 0, 0, 0.16);
  text-align: left;
}

.stock-pop-head {
  margin-bottom: 10px;
}
.stock-pop-head .stock-pop-name {
  display: block;
  font-size: 13.5px;
  font-weight: 600;
}
.stock-pop-head .stock-pop-meta {
  display: block;
  margin-top: 2px;
  font-size: 12px;
  color: var(--muted-foreground);
}

/* Hai ô "Điều chỉnh" / "Tồn kho mới" đứng cạnh nhau như ảnh mẫu */
.stock-pop-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 10px;
}

/* Ô Ghi chú nằm dưới hai ô số, chiếm trọn bề ngang popover */
.stock-pop-note {
  margin-top: 10px;
}

.stock-pop-hint {
  margin-top: 8px;
  font-size: 12px;
  color: var(--muted-foreground);
}

.stock-pop-error {
  margin-top: 8px;
  font-size: 12px;
  color: var(--danger);
}
.stock-pop-error i {
  font-size: 11px;
}

.stock-pop-footer {
  display: flex;
  justify-content: flex-end;
  gap: 8px;
  margin-top: 12px;
}

/* ============================================================
   MENU BA CHẤM của cột "Thao tác" (chế độ xem MỘT kho)
   Razor: Pages/Inventory/PageKhoHang.razor
   10/08 — gom 4 nút bày sẵn (Nhập · Xuất · Điều chỉnh · Chuyển kho) vào một menu.
============================================================ */
/* ⚠️ position: FIXED cùng lý do với .stock-pop — menu neo vào ô trong bảng mà
   `.table-wrap` có `overflow-x: auto`, đặt absolute là bị cắt mất.
   ⚠️ width phải KHỚP RowMenuWidth, và chiều cao mỗi mục phải khớp RowMenuItemHeight
   trong PageKhoHang.razor.cs — JS dùng hai số đó để kẹp menu vào trong màn hình.
   Dùng chung nền phủ `.stock-pop-backdrop`. */
.row-menu {
  position: fixed;
  z-index: 91;
  width: 210px;
  padding: 6px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface);
  box-shadow: 0 12px 28px rgba(0, 0, 0, 0.16);
  text-align: left;
}

/* Tên sản phẩm/biến thể ngay trong menu: mở menu ra là mất dấu hàng vừa bấm,
   không nhắc lại thì dễ thao tác nhầm sang biến thể khác. */
.row-menu-head {
  padding: 6px 10px 8px;
  border-bottom: 1px solid var(--border);
  margin-bottom: 4px;
}
.row-menu-head .row-menu-name {
  display: block;
  font-size: 13px;
  font-weight: 600;
}
.row-menu-head .row-menu-meta {
  display: block;
  margin-top: 1px;
  font-size: 11.5px;
  color: var(--muted-foreground);
}

.row-menu-item {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  height: 36px;
  padding: 0 10px;
  border: 0;
  border-radius: var(--radius-sm);
  background: none;
  color: var(--foreground);
  font: inherit;
  font-size: 13px;
  text-align: left;
  cursor: pointer;
}
.row-menu-item i {
  width: 14px;
  font-size: 12px;
  color: var(--muted-foreground);
  text-align: center;
}
.row-menu-item:hover, .row-menu-item:focus-visible {
  background: var(--surface-2);
}
.row-menu-item:hover i, .row-menu-item:focus-visible i {
  color: var(--accent);
}
.row-menu-item:focus-visible {
  outline: 2px solid var(--accent);
  outline-offset: -2px;
}

/* ============================================================
   PAGE NHÂN VIÊN & PHÂN QUYỀN — Styles riêng
   Razor: Pages/Staff/PageNhanVien.razor
   Bao gồm: ListNhanVien, ListVaiTro, ModalInviteStaff, ModalAssignRoles,
   ModalVaiTro (component chỉ dùng trong trang này).
============================================================ */
/* Icon vương miện trong badge "Chủ cửa hàng" */
.staff-owner-icon {
  margin-right: 4px;
  font-size: 10px;
}

/* Mã quyền (permission code) — chữ mono trong ô bảng catalog */
.perm-code {
  padding: 2px 6px;
  border-radius: var(--radius-sm);
  background: var(--surface-2);
  font-family: ui-monospace, "Cascadia Code", Consolas, monospace;
  font-size: 12px;
  color: var(--muted-foreground);
}

/* ---- Bảng vai trò (ListVaiTro): chip tổng quát + dòng chi tiết mở rộng ---- */
/* Chip "N quyền" trong cột Quyền được gán — bấm để mở/gập dòng chi tiết */
.role-perm-summary {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 10px;
  border: 1px solid var(--border);
  border-radius: 999px;
  background: var(--surface-1);
  color: var(--foreground);
  font-size: 12px;
  cursor: pointer;
}
.role-perm-summary:hover {
  background: var(--surface-2);
}
.role-perm-summary > .fa-key {
  font-size: 10px;
  color: var(--muted-foreground);
}

.role-perm-chevron {
  font-size: 10px;
  color: var(--muted-foreground);
  transition: transform 0.15s ease;
}
.role-perm-summary--open .role-perm-chevron {
  transform: rotate(90deg);
}

/* Dòng chi tiết quyền mở rộng ngay dưới dòng vai trò */
.role-detail-row > td {
  background: var(--surface-1);
  padding: 12px 16px;
}

.role-detail {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

/* Một module trong dòng chi tiết: tên module + các badge quyền */
.role-detail-module {
  display: flex;
  align-items: baseline;
  gap: 12px;
}
@media (max-width: 640px) {
  .role-detail-module {
    flex-direction: column;
    gap: 4px;
  }
}

.role-detail-module-name {
  min-width: 170px;
  font-size: 12px;
  font-weight: 600;
  color: var(--muted-foreground);
}
.role-detail-module-name > .fa-folder {
  margin-right: 4px;
}

/* ---- Catalog quyền: bố cục Accordion nhóm theo module (ListQuyen) ---- */
.perm-accordion {
  display: flex;
  flex-direction: column;
}

/* Dòng chờ / catalog trống */
.perm-accordion-empty {
  padding: 24px 16px;
  text-align: center;
  color: var(--muted-foreground);
  font-size: 13px;
}

.perm-group {
  border-bottom: 1px solid var(--border);
}
.perm-group:last-child {
  border-bottom: none;
}

.perm-group-header {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 12px 16px;
  cursor: pointer;
  list-style: none; /* bỏ mũi tên mặc định của <summary> */
  user-select: none;
}
.perm-group-header::-webkit-details-marker {
  display: none;
}
.perm-group-header:hover {
  background: var(--surface-2);
}
.perm-group-header > .fa-folder {
  color: var(--muted-foreground);
}

.perm-group-name {
  font-weight: 600;
  flex: 1;
}

/* Chevron xoay xuống khi nhóm đang mở */
.perm-group-chevron {
  font-size: 11px;
  color: var(--muted-foreground);
  transition: transform 0.15s ease;
}
.perm-group[open] .perm-group-chevron {
  transform: rotate(90deg);
}

.perm-group-body {
  padding: 4px 16px 12px;
}

/* Một hành động trong nhóm: tên + mã + nút Xóa */
.perm-row {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 8px 0 8px 26px; /* thụt theo icon folder của header */
  border-top: 1px solid var(--border);
}
.perm-row:first-child {
  border-top: none;
}

.perm-row-name {
  flex: 1;
  font-size: 13px;
}

/* Danh sách hành động của module trong ModalQuyen (chọn module -> tick hành động) */
.perm-action-list {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 12px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--surface-1);
}

.perm-action-item {
  display: flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
  font-size: 13px;
  /* Hành động đã có trong catalog — khoá lại, làm mờ */
}
.perm-action-item .perm-action-name {
  min-width: 140px;
}
.perm-action-item.perm-action-item--exists {
  cursor: default;
  opacity: 0.55;
}

/* Cụm badge vai trò / quyền trong ô bảng — xuống dòng được */
.staff-role-badges {
  display: inline-flex;
  gap: 4px;
  flex-wrap: wrap;
}

/* Lưới checkbox nhiều lựa chọn (vai trò, quyền) — 2 cột, mobile 1 cột */
.check-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px 16px;
}
@media (max-width: 520px) {
  .check-grid {
    grid-template-columns: 1fr;
  }
}

/* Nhóm quyền theo module trong ModalVaiTro */
.perm-module {
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
}
.perm-module + .perm-module {
  margin-top: 8px;
}

.perm-module-label {
  font-size: 11.5px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--muted-foreground);
}

/* Header module trong ModalVaiTro: checkbox "chọn tất cả" bên trái + badge x/y bên phải */
.perm-module-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  margin-bottom: 8px;
}

.perm-module-toggle {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  cursor: pointer;
  user-select: none;
}

/* ============================================================
   PAGE DON HANG — Styles riêng cho trang Đơn hàng
   Razor: Pages/Order/PageDonHang.razor + Pages/Order/PageTaoDonHang.razor (trang
   tạo đơn riêng, song song với ModalTaoDonHang — xem HKD_NghiepVu_TaoDonHang.md)
   Bao gồm: ModalChiTietDonHang + ModalTaoDonHang (component chỉ dùng trong trang này)
   Token màu dùng CSS variables nên tự áp cả chế độ sáng/tối.
============================================================ */
/* Ô tìm khách kiểu combobox (thay listbox size="4" cũ) — popover kết quả tái dùng
   CSS .single-select-menu/-options/-option, chỉ cần định vị đúng bề rộng Ô NHẬP
   (không phải cả .input-with-action, kẻo trùm luôn qua nút "Thêm mới").
   Razor: Components/CustomerSearchInput.razor */
.customer-search-input-wrap {
  position: relative;
  flex: 1;
  min-width: 0;
}

/* Dòng gợi ý mang tính cảnh báo (chưa có khách khớp, chưa cấu hình vận chuyển) */
.field-hint-warn {
  color: var(--warning);
}
.field-hint-warn i {
  margin-right: 4px;
}

/* ============================================================
   CHỌN LOẠI ĐƠN — Giao hàng / Bán tại quầy (ModalTaoDonHang)
   Radio thật để dùng được bàn phím, nhưng vẽ như hai nút bấm.
============================================================ */
.order-type-toggle {
  display: flex;
  gap: 8px;
  flex-wrap: wrap;
}

.order-type-option {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  height: 36px;
  padding: 0 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface);
  font-size: 13.5px;
  font-weight: 500;
  cursor: pointer;
  transition: border-color var(--transition), background var(--transition);
}
.order-type-option:hover {
  border-color: var(--border-strong);
  background: var(--surface-2);
}
.order-type-option.is-active {
  border-color: var(--accent);
  background: var(--accent-subtle);
  color: var(--accent);
}

/* Ô lọc trạng thái trên toolbar — .input mặc định width 100% nên phải ghìm lại */
.order-status-filter {
  width: 180px;
  flex: none;
}

/* Lưới thông tin đơn trong modal chi tiết */
.order-info-grid {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 12px 24px;
  margin-bottom: 16px;
}

.order-info-label {
  font-size: 12px;
  color: var(--muted-foreground-2);
  margin-bottom: 2px;
}

.order-info-value {
  font-size: 14px;
  color: var(--foreground);
}

/* Mã vận đơn hãng cấp — chữ đơn cách để nhân viên đọc/đối chiếu từng ký tự khi tra
   cứu trên web của hãng (mã GHN kiểu "L7A8B9" rất dễ nhầm 0 với O, 1 với l). */
.order-tracking-code {
  font-family: ui-monospace, "Cascadia Code", Consolas, monospace;
  letter-spacing: 0.4px;
}

/* Khối tổng kết tiền — dồn phải, dòng tổng in đậm */
/* ============================================================
   SỬA DÒNG HÀNG TRONG ĐƠN (11/08/2026)
   Razor: Pages/Order/PageChiTietDonHang.razor
   Chỉ hiện khi đơn còn Chờ xác nhận và chưa có vận đơn.
============================================================ */
/* Chú thích nhỏ cạnh tiêu đề thẻ — nói rõ vì sao khối này sửa được. */
.card-title-hint {
  margin-left: 8px;
  color: var(--muted-foreground-2);
  font-size: 12px;
  font-weight: 400;
}

/* Cột nút bỏ dòng — hẹp, canh giữa. */
.th-line-remove {
  width: 48px;
  text-align: center;
}

/* Bộ tăng/giảm số lượng ngay trong ô bảng. Nằm trong <td class="num"> nên phải
   `inline-flex` + canh phải cho thẳng cột với các ô số khác. */
.line-qty {
  display: inline-flex;
  align-items: center;
  gap: 6px;
}

.line-qty-value {
  min-width: 24px;
  text-align: center;
  font-variant-numeric: tabular-nums;
}

/* Nút tròn nhỏ ±. WebCustomer có class cùng tên nhưng hai phân hệ là hai bộ CSS
   riêng — sửa một bên không ảnh hưởng bên kia. */
.qty-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface);
  color: var(--foreground);
  font-size: 11px;
  cursor: pointer;
}
.qty-btn:hover:not(:disabled) {
  background: var(--surface-2);
}
.qty-btn:disabled {
  opacity: 0.45;
  cursor: not-allowed;
}

/* ---- Khối thêm sản phẩm ---- */
.order-items-add {
  margin-top: 14px;
  padding-top: 14px;
  border-top: 1px dashed var(--border);
}

/* Bốn thứ trên MỘT hàng ở màn rộng; `flex-wrap` cho nó tự xuống dòng khi hẹp thay vì
   ép media query — cột phụ của trang này đã 540px nên chỗ cho 4 ô là vừa khít. */
.order-items-add-fields {
  display: flex;
  align-items: flex-end;
  flex-wrap: wrap;
  gap: 10px;
  /* Ô số lượng không cần rộng bằng hai ô chọn kia. */
}
.order-items-add-fields .field {
  flex: 1 1 180px;
  min-width: 0;
  margin: 0;
}
.order-items-add-fields .field-qty {
  flex: 0 0 96px;
}

/* ---- Dải nhắc + nút lưu, chỉ hiện khi CÓ thay đổi chưa lưu ---- */
.order-items-actions {
  display: flex;
  align-items: center;
  justify-content: space-between;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 14px;
  padding-top: 12px;
  border-top: 1px solid var(--border);
}

.order-items-dirty {
  display: flex;
  align-items: flex-start;
  gap: 7px;
  color: var(--warning);
  font-size: 13px;
  line-height: 1.45;
}
.order-items-dirty i {
  margin-top: 2px;
  flex-shrink: 0;
}

.order-items-buttons {
  display: flex;
  align-items: center;
  gap: 8px;
  flex-shrink: 0;
}

/* ---- Mã khuyến mãi trên khối tiền ---- */
/* Mã hiện ngay cạnh nhãn "Mã khuyến mãi" — viên chữ nhỏ, dễ đọc ra mã nào đang áp. */
.order-voucher-code {
  display: inline-block;
  margin-left: 6px;
  padding: 1px 7px;
  border-radius: 999px;
  background: var(--accent-subtle, var(--surface-2));
  color: var(--foreground);
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.2px;
}

.order-voucher-apply {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 10px;
  margin-top: 14px;
  padding-top: 14px;
  border-top: 1px dashed var(--border);
}

/* ============================================================
   HÀNH TRÌNH ĐƠN HÀNG (11/08/2026)
   Razor: Components/OrderJourney.razor

   Dải chặng nằm ngang. KHÁC `.order-timeline` (nhật ký dọc ở cột phải): bên này chỉ trả
   lời "đơn đang đi tới đâu".
============================================================ */
.order-journey {
  display: flex;
  align-items: flex-start;
  margin-top: 8px;
}

/* Mỗi chặng chiếm phần bằng nhau; đường nối vẽ bằng ::before/::after của CHÍNH chặng —
   không dựng thẻ nối riêng, nhờ vậy chặng đầu/cuối chỉ việc ẩn nửa đường thừa của mình. */
.order-journey-step {
  position: relative;
  flex: 1 1 0;
  min-width: 0;
  text-align: center;
  padding: 0 4px;
  /* Chặng đầu không có gì ở bên trái, chặng cuối không có gì ở bên phải. */
  /* Đường nối TÔ MÀU theo chặng đã đi qua: nửa trái của một chặng thuộc về đoạn nối
     với chặng trước, nên chặng nào đã tới thì nửa trái của nó xanh. */
}
.order-journey-step::before, .order-journey-step::after {
  content: "";
  position: absolute;
  top: 19px; /* giữa nút 38px */
  height: 2px;
  background: var(--border);
}
.order-journey-step::before {
  left: 0;
  right: 50%;
}
.order-journey-step::after {
  left: 50%;
  right: 0;
}
.order-journey-step:first-child::before {
  display: none;
}
.order-journey-step:last-child::after {
  display: none;
}
.order-journey-step.is-done::before, .order-journey-step.is-current::before {
  background: var(--success);
}
.order-journey-step.is-done::after {
  background: var(--success);
}
.order-journey-step.is-cancelled::before {
  background: var(--danger);
}

.order-journey-node {
  position: relative;
  z-index: 1;
  width: 38px;
  height: 38px;
  margin: 0 auto 8px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  /* Nền phải ĐẶC để che đường nối chạy phía sau. */
  background: var(--surface-2);
  color: var(--muted-foreground-2);
  font-size: 14px;
  /* Viền cùng màu nền thẻ, tạo khoảng thở giữa nút và đường kẻ. */
  box-shadow: 0 0 0 4px var(--surface);
  /* Chặng ĐANG Ở: vòng sáng quanh nút để phân biệt với chặng đã qua — cùng màu nhưng
     người đọc cần biết đơn dừng ở đâu. */
}
.order-journey-step.is-done .order-journey-node {
  background: var(--success);
  color: #fff;
}
.order-journey-step.is-current .order-journey-node {
  background: var(--success);
  color: #fff;
  box-shadow: 0 0 0 4px var(--surface), 0 0 0 7px var(--success-subtle);
}
.order-journey-step.is-cancelled .order-journey-node {
  background: var(--danger);
  color: #fff;
}

.order-journey-label {
  font-size: 13px;
  font-weight: 600;
  line-height: 1.3;
  color: var(--muted-foreground);
}
.order-journey-step.is-done .order-journey-label, .order-journey-step.is-current .order-journey-label {
  color: var(--foreground);
}
.order-journey-step.is-cancelled .order-journey-label {
  color: var(--danger);
}

.order-journey-time {
  margin-top: 3px;
  font-size: 11.5px;
  color: var(--muted-foreground-2);
}

/* Cột hẹp: nhãn dễ vỡ chữ, thu nhỏ nút và chữ thay vì cho tràn ngang. */
@media (max-width: 720px) {
  .order-journey-node {
    width: 32px;
    height: 32px;
    font-size: 12px;
  }
  .order-journey-step::before,
  .order-journey-step::after {
    top: 16px;
  }
  .order-journey-label {
    font-size: 12px;
  }
  .order-journey-time {
    font-size: 11px;
  }
}
/* ============================================================
   MODAL CHỌN MÃ KHUYẾN MÃI (11/08/2026)
   Razor: Pages/Order/Components/ModalChonVoucher.razor

   Mã KHÔNG đủ điều kiện vẫn hiện, chỉ bị khoá + nêu lý do — chủ shop cần biết "còn thiếu
   bao nhiêu nữa" để quyết định bán thêm, lọc bỏ thì họ tưởng cửa hàng không có mã.
============================================================ */
.voucher-pick-list {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.voucher-pick {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  padding: 12px 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  background: var(--surface);
  /* Dòng bị khoá: nền chìm + chữ nhạt.
     ⚠️ KHÔNG dùng `opacity` cho cả khối — lý do "vì sao không dùng được" là thông tin
     QUAN TRỌNG NHẤT của dòng này, làm mờ nó đi là phản tác dụng. */
}
.voucher-pick.is-disabled {
  background: var(--surface-2);
  border-style: dashed;
}
.voucher-pick.is-disabled .voucher-pick-code,
.voucher-pick.is-disabled .voucher-pick-value {
  color: var(--muted-foreground);
}

.voucher-pick-main {
  min-width: 0;
}

.voucher-pick-head {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
}

.voucher-pick-code {
  font-weight: 600;
  letter-spacing: 0.3px;
}

.voucher-pick-value {
  padding: 1px 8px;
  border-radius: 999px;
  background: var(--accent-subtle, var(--surface-2));
  font-size: 12px;
  font-weight: 600;
}

.voucher-pick-name {
  margin-top: 3px;
  color: var(--muted-foreground);
  font-size: 13px;
}

/* Số tiền giảm THẬT cho đơn này — thứ chủ shop cần so, không phải "10%". */
.voucher-pick-save {
  margin-top: 4px;
  color: var(--success);
  font-size: 13px;
  font-weight: 600;
}

.voucher-pick-reason {
  display: flex;
  align-items: flex-start;
  gap: 6px;
  margin-top: 4px;
  color: var(--danger);
  font-size: 12.5px;
  line-height: 1.4;
}
.voucher-pick-reason i {
  margin-top: 2px;
  flex-shrink: 0;
}

.voucher-pick-meta {
  margin-top: 4px;
  color: var(--muted-foreground-2);
  font-size: 12px;
}

.voucher-pick-action {
  flex-shrink: 0;
}

/* Lý do hãng không báo được giá — thông tin, không phải lỗi của người dùng. */
.order-fee-note {
  display: flex;
  align-items: flex-start;
  gap: 7px;
  margin: 10px 0 0;
  color: var(--muted-foreground);
  font-size: 12.5px;
  line-height: 1.45;
}
.order-fee-note i {
  margin-top: 2px;
  flex-shrink: 0;
}

/* ~~align-items: flex-end~~ — BỎ 11/08/2026 (user chốt): bản cũ dồn cả cụm nhãn+số về
   bên phải, để lại một khoảng trống lớn bên trái còn nhãn thì dính sát số tiền.
   Nay mỗi hàng trải HẾT chiều ngang: nhãn sát mép trái, số sát mép phải. */
.order-summary {
  display: flex;
  flex-direction: column;
  gap: 6px;
  margin-top: 12px;
}

.order-summary-row {
  display: flex;
  align-items: baseline;
  justify-content: space-between;
  gap: 24px;
  font-size: 14px;
  color: var(--muted-foreground);
}
.order-summary-row span:last-child {
  min-width: 130px;
  text-align: right;
  flex-shrink: 0;
}
.order-summary-row.total {
  font-size: 15px;
  font-weight: 600;
  color: var(--foreground);
  border-top: 1px solid var(--border);
  padding-top: 6px;
}

/* Một dòng hàng trên form tạo đơn: sản phẩm | biến thể | SL | nút bỏ */
.order-create-row {
  display: grid;
  grid-template-columns: minmax(0, 2fr) minmax(0, 2fr) 90px 32px;
  gap: 8px;
  align-items: center;
  margin-bottom: 8px;
}

.order-create-qty {
  text-align: right;
}

/* Checkbox "Đã thu tiền" đứng ngang hàng với select phương thức */
.field-checkbox {
  display: flex;
  align-items: center;
  gap: 8px;
  height: 38px;
  font-size: 14px;
  color: var(--foreground);
  cursor: pointer;
}
.field-checkbox input[type=checkbox] {
  width: 16px;
  height: 16px;
  accent-color: var(--accent);
}

/* Hàng 3 ô địa giới Tỉnh/Thành — Quận/Huyện — Phường/Xã.
   Modifier của .field-row (2 cột) chứ KHÔNG sửa .field-row gốc.
   Razor: Pages/Order/Components/ModalTaoDonHang.razor + ModalChiTietDonHang.razor */
.field-row--3 {
  grid-template-columns: 1fr 1fr 1fr;
}
@media (max-width: 720px) {
  .field-row--3 {
    grid-template-columns: 1fr;
  }
}

/* ============================================================
   ORDER STATUS TIMELINE — lịch sử chuyển trạng thái đơn
   Razor: Components/OrderStatusTimeline.razor
   Dùng chung ModalChiTietDonHang + PageChiTietDonHang (2 nơi hiện chi tiết đơn).
============================================================ */
.order-timeline-title {
  font-size: 14px;
  font-weight: 600;
  margin: 16px 0 12px;
  padding-top: 16px;
  border-top: 1px solid var(--border);
}
.order-timeline-title i {
  margin-right: 6px;
  color: var(--accent);
}

.order-timeline {
  display: flex;
  flex-direction: column;
}

.order-timeline-item {
  position: relative;
  display: flex;
  gap: 12px;
  padding-bottom: 16px;
}
.order-timeline-item:not(:last-child)::before {
  content: "";
  position: absolute;
  left: 5px;
  top: 14px;
  bottom: 0;
  width: 1px;
  background: var(--border);
}
.order-timeline-item:last-child {
  padding-bottom: 0;
}

.order-timeline-dot {
  flex-shrink: 0;
  width: 11px;
  height: 11px;
  margin-top: 4px;
  border-radius: 50%;
  background: var(--accent);
  box-shadow: 0 0 0 3px var(--accent-subtle);
  /* Mốc đáng chú ý (09/08): hoàn tất/đã thu tiền xanh, huỷ/hoàn tiền đỏ */
}
.order-timeline-dot.is-success {
  background: var(--success);
  box-shadow: 0 0 0 3px var(--success-subtle);
}
.order-timeline-dot.is-danger {
  background: var(--danger);
  box-shadow: 0 0 0 3px var(--danger-subtle);
}

.order-timeline-content {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 4px;
}

/* .order-timeline-row/-arrow/-icon đã bỏ (09/08) — timeline viết thành CÂU kể việc
   đã xảy ra, không còn cặp badge "A → B" nối bằng mũi tên (user: khó hiểu). */
.order-timeline-title {
  font-size: 13.5px;
  font-weight: 500;
  color: var(--foreground);
}

.order-timeline-note {
  font-size: 12.5px;
  color: var(--muted-foreground);
}

.order-timeline-time {
  font-size: 12px;
  color: var(--muted-foreground-2);
}

.order-timeline-empty {
  padding: 12px 0;
  font-size: 13px;
  color: var(--muted-foreground);
  text-align: center;
}

/* ============================================================
   PAGE CẤU HÌNH CỬA HÀNG — Styles riêng
   Razor: Pages/Config/PageCauHinh.razor

   📌 `ListTenMien` / `ModalThemTenMien` vẫn nằm ở Pages/Config/Components (dùng chung),
   nhưng CARD Tên miền đã chuyển sang trang riêng `/ten-mien` từ 10/08 — style của chúng
   (`.domain-icon`, `.domain-name`) vì vậy dời sang `_page-ten-mien.scss` (13/08).
   ~~.domain-icon / .domain-name~~ — đừng khai lại ở đây, hai bản là hai chỗ phải sửa.
============================================================ */
/* ---- Danh sách cổng vận chuyển / thanh toán (card Cấu hình) ---- */
.provider-list {
  display: flex;
  flex-direction: column;
}

.provider-list-empty {
  padding: 24px 16px;
  text-align: center;
  color: var(--muted-foreground);
  font-size: 13px;
}

/* Một cổng: icon + tên/mã + badge trạng thái + nút Kết nối/Sửa */
.provider-row {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 12px 16px;
  border-bottom: 1px solid var(--border);
}
.provider-row:last-child {
  border-bottom: none;
}

.provider-row-tile {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 36px;
  height: 36px;
  flex-shrink: 0;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border);
  background: var(--surface-1);
  color: var(--muted-foreground);
  font-size: 14px;
  overflow: hidden;
}

/* Logo cổng thanh toán / nhà vận chuyển do quản trị NỀN TẢNG khai (12/08/2026).
   Razor: Pages/Config/PageCauHinh.razor

   `contain` + padding: logo của các hãng có tỷ lệ rất khác nhau (MoMo gần vuông, GHN nằm
   ngang) — `cover` sẽ cắt mất chữ. Padding để logo không dán sát viền ô.
   Ô đã `overflow: hidden` nên ảnh quá khổ cũng không phá bố cục hàng. */
.provider-row-logo {
  width: 100%;
  height: 100%;
  padding: 3px;
  object-fit: contain;
}

.provider-row-info {
  display: flex;
  flex-direction: column;
  gap: 2px;
  flex: 1;
  min-width: 0;
}

.provider-row-name {
  font-weight: 600;
  font-size: 13.5px;
}

.provider-row-code {
  font-family: ui-monospace, "Cascadia Code", Consolas, monospace;
  font-size: 11.5px;
  color: var(--muted-foreground);
}

.provider-row-badges {
  display: inline-flex;
  gap: 4px;
  flex-wrap: wrap;
}

/* ============================================================
   TAB CẤU HÌNH EMAIL
   Razor: Pages/Config/Components/TabCauHinhEmail.razor
============================================================ */
/* Banner giải thích nghiệp vụ đầu mỗi tab cấu hình */
.config-info-banner {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  margin: 0 20px 4px;
  padding: 12px 14px;
  border-left: 3px solid var(--accent);
  border-radius: var(--radius);
  background: var(--accent-subtle);
  color: var(--muted-foreground);
  font-size: 13px;
  line-height: 1.55;
}
.config-info-banner i {
  margin-top: 2px;
  color: var(--accent);
  flex-shrink: 0;
}

/* Thân form trong card cấu hình — card đã có padding riêng cho list nên form tự chừa */
.config-form {
  padding: 16px 20px 20px;
}

.config-form-actions {
  display: flex;
  justify-content: flex-end;
  gap: 8px;
  padding-top: 4px;
}

/* Khối "Gửi thử email" của TabCauHinhEmail — cách khối phía trên một nhịp rõ ràng */
.email-test-block {
  margin-top: 4px;
  padding-top: 12px;
  border-top: 1px dashed var(--border);
}

.email-test-message-success {
  color: var(--success);
}

.email-test-message-danger {
  color: var(--danger);
}

/* ============================================================
   TAB CẤU HÌNH BÁN HÀNG
   Razor: Pages/Config/Components/TabCauHinhBanHang.razor
============================================================ */
/* Câu diễn giải luật tính phí ship theo hai ô vừa gõ — đọc là biết checkout sẽ tính
   ra sao, khỏi phải mở website đặt thử. */
.checkout-fee-summary {
  display: flex;
  align-items: flex-start;
  gap: 10px;
  padding: 12px 14px;
  border: 1px dashed var(--border);
  border-radius: var(--radius);
  background: var(--muted);
  color: var(--foreground);
  font-size: 13px;
  line-height: 1.55;
}
.checkout-fee-summary i {
  margin-top: 2px;
  color: var(--muted-foreground);
  flex-shrink: 0;
}

/* ============================================================
   TAB CẤU HÌNH GIAO DIỆN (STOREFRONT)
   Razor: Pages/Config/Components/TabCauHinhGiaoDien.razor
============================================================ */
/* ---- Bố cục 2 cột: form thao tác | khung xem trước ---- */
.config-split {
  /* display: grid;
   grid-template-columns: minmax(0, 2fr) minmax(300px, 1fr);*/
  gap: 20px;
  align-items: start;
}

.config-split-main {
  min-width: 0;
}

/* Dính theo tầm mắt khi cuộn form bên trái xuống */
.config-split-side {
  position: sticky;
  top: 20px;
  min-width: 0;
}

/* Màn hẹp: xem trước xuống dưới form, thôi dính */
@media (max-width: 1200px) {
  .config-split {
    grid-template-columns: minmax(0, 1fr);
  }
  .config-split-side {
    position: static;
  }
}
/* Tiêu đề nhóm cấu hình trong cùng một tab (Bộ lọc… / Thẻ sản phẩm) */
.config-group-title {
  padding-top: 4px;
  font-size: 13px;
  font-weight: 600;
  color: var(--muted-foreground);
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

/* ---- Công tắc bật/tắt (toggle switch) ---- */
.switch-list {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.switch-row {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  padding: 14px 16px;
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  background: var(--surface);
  cursor: pointer;
  transition: border-color var(--transition), opacity var(--transition);
  /* Chỉ hàng có thể kéo-thả (nhóm bộ lọc) mới đổi con trỏ — hàng công tắc thường
     (thẻ sản phẩm...) không có draggable nên giữ nguyên con trỏ pointer. */
}
.switch-row:hover {
  border-color: var(--border-strong);
}
.switch-row[draggable=true] {
  cursor: grab;
}
.switch-row.is-dragging {
  opacity: 0.5;
}

/* Bọc icon kéo + nhãn làm MỘT nhóm — giữ .switch-row đúng 2 khối con (nhóm nhãn/nhóm
   công tắc) như hàng công tắc thường, để justify-content:space-between không xô lệch
   khi thêm icon kéo vào hàng bộ lọc. */
.switch-row-main {
  display: flex;
  align-items: center;
  gap: 10px;
  min-width: 0;
}

/* Icon "kéo để đổi thứ tự" trước nhãn công tắc — chỉ hàng bộ lọc có cái này. */
.switch-drag-handle {
  flex-shrink: 0;
  color: var(--muted-foreground);
  cursor: grab;
}

.switch-text {
  display: flex;
  flex-direction: column;
  gap: 3px;
  min-width: 0;
}

.switch-label {
  font-size: 13.5px;
  font-weight: 500;
  color: var(--foreground);
}

.switch-hint {
  font-size: 12.5px;
  color: var(--muted-foreground);
}

/* Công tắc dựng từ chính <input type="checkbox"> (ẩn ô gốc, vẽ track + thumb) —
   giữ được bàn phím/label/aria mà không cần JS. */
.switch {
  position: relative;
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
}
.switch input {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  margin: 0;
  opacity: 0;
  cursor: pointer;
}
.switch input:disabled {
  cursor: not-allowed;
}

.switch-track {
  display: inline-flex;
  align-items: center;
  width: 40px;
  height: 22px;
  padding: 2px;
  border-radius: 999px;
  background: var(--border-strong);
  transition: background var(--transition);
}

.switch-thumb {
  width: 18px;
  height: 18px;
  border-radius: 50%;
  background: var(--surface);
  box-shadow: var(--shadow-sm);
  transition: transform var(--transition);
}

.switch input:checked + .switch-track {
  background: var(--accent);
}

.switch input:checked + .switch-track .switch-thumb {
  transform: translateX(18px);
}

.switch input:focus-visible + .switch-track {
  box-shadow: 0 0 0 3px var(--ring);
}

.switch input:disabled + .switch-track {
  opacity: 0.55;
}

/* ---- Bảng khai các mức khoảng giá ---- */
.price-range-editor {
  display: flex;
  flex-direction: column;
  gap: 12px;
  align-items: flex-start;
  padding: 16px;
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  background: var(--surface-2);
}

.price-range-editor-head {
  display: flex;
  flex-direction: column;
  gap: 3px;
}

.price-range-empty {
  font-size: 13px;
  color: var(--muted-foreground);
}

.price-range-rows {
  display: flex;
  flex-direction: column;
  gap: 8px;
  width: 100%;
}

.price-range-row {
  display: grid;
  grid-template-columns: 22px minmax(0, 1fr) 14px minmax(0, 1fr) minmax(0, 1.1fr) 38px;
  align-items: center;
  gap: 8px;
}

.price-range-index {
  font-size: 12.5px;
  color: var(--muted-foreground-2);
  text-align: center;
}

.price-range-sep {
  color: var(--muted-foreground-2);
  text-align: center;
}

/* Nhãn xem trước đúng như storefront sẽ hiện */
.price-range-preview {
  font-size: 12.5px;
  color: var(--muted-foreground);
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.price-range-remove {
  color: var(--danger);
}
.price-range-remove:hover {
  color: var(--danger);
  background: var(--danger-subtle);
}

@media (max-width: 900px) {
  .price-range-row {
    grid-template-columns: 22px minmax(0, 1fr) minmax(0, 1fr) 38px;
  }
  .price-range-row .price-range-sep {
    display: none;
  }
  .price-range-row .price-range-preview {
    grid-column: 2/-1;
  }
}
/* ============================================================
   XEM TRƯỚC HIỂN THỊ (cột phải tab Giao diện)
   Razor: Pages/Config/Components/PreviewGiaoDien.razor

   Hai class, hai việc:
     • `.preview-scope`      — bộ style CHÉP TỪ STOREFRONT (thẻ sản phẩm, khối lọc).
                               Gắn ở cả khung thu gọn lẫn khung mở rộng.
     • `.preview-storefront` — chỉ BỐ CỤC của khung thu gọn (xếp dọc).
     • `.wireframe`          — chỉ BỐ CỤC của khung mở rộng (xem cuối file).

   ⚠️ Khối `.preview-scope` bên dưới là BẢN SAO style thẻ sản phẩm + khối lọc
   của STOREFRONT. Nguồn gốc:
     - Customer.Server/Styles/_shop.scss        (.product-card và con của nó)
     - Customer.Server/Styles/_page-san-pham.scss (.filter-*, .price-option*, .price-slider*)
   Hai phân hệ là 2 project WASM riêng, KHÔNG dùng chung file CSS được nên phải chép.
   SỬA GIAO DIỆN THẺ SẢN PHẨM THẬT THÌ NHỚ SỬA CẢ Ở ĐÂY, không thì xem trước sai.
   Bọc trong `.preview-scope` để không đụng class nào của Admin.
============================================================ */
.preview-panel {
  overflow: hidden;
}

.preview-body {
  padding: 16px 18px 18px;
}

.preview-note {
  margin: 0 0 14px;
  font-size: 12.5px;
  line-height: 1.55;
  color: var(--muted-foreground);
}

/* Nền xám nhạt tách hẳn khu xem trước khỏi khu thao tác.
   CHỈ lo BỐ CỤC của khung thu gọn — phần style chép từ storefront nằm ở
   `.preview-scope` bên dưới, vì khung mở rộng cũng cần đúng bộ style đó nhưng bố cục
   thì khác hẳn (lưới 2 cột thay vì xếp dọc). */
.preview-storefront {
  display: flex;
  flex-direction: column;
  gap: 12px;
  padding: 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  background: var(--surface-2);
}

.preview-header {
  /* .card-header đã space-between; chỉ giữ cho nút không bị bóp khi tiêu đề dài */
}
.preview-header .preview-expand-btn {
  flex-shrink: 0;
  white-space: nowrap;
}

.preview-block-label {
  font-size: 11px;
  font-weight: 600;
  color: var(--muted-foreground-2);
  text-transform: uppercase;
  letter-spacing: 0.05em;
}

.preview-off {
  padding: 12px 14px;
  border: 1px dashed var(--border-strong);
  border-radius: var(--radius);
  color: var(--muted-foreground);
  font-size: 12.5px;
  line-height: 1.55;
}

.preview-hint {
  display: flex;
  align-items: flex-start;
  gap: 7px;
  margin: 2px 0 0;
  font-size: 11.5px;
  line-height: 1.5;
  color: var(--muted-foreground-2);
}
.preview-hint i {
  margin-top: 2px;
  flex-shrink: 0;
}

/* ---- Bản sao: khối bộ lọc storefront ----
   Gắn vào `.preview-scope` (không phải `.preview-storefront`) để CẢ khung thu gọn lẫn
   khung mở rộng đều dùng chung một bộ style chép về; hai khung chỉ khác bố cục. */
.preview-scope {
  /* Ô "chỉ đọc" của bộ lọc giá là <span>, cần dựng lại dáng ô nhập */
  /* Thanh trượt TĨNH: 2 nút kéo là span, chỉ để xem hình dáng (bản thật là 2 input range) */
}
.preview-scope .input {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  height: 34px;
  padding: 0 10px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface);
  color: var(--muted-foreground);
  font-size: 12px;
}
.preview-scope .filter-section {
  padding: 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  background: var(--surface);
}
.preview-scope .filter-title {
  margin: 0 0 12px;
  font-size: 13.5px;
  font-weight: 600;
}
.preview-scope .filter-category-list {
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.preview-scope .filter-category-item {
  display: flex;
  align-items: center;
  padding: 7px 9px;
  border-radius: var(--radius-sm);
  color: var(--muted-foreground);
  font-size: 13px;
}
.preview-scope .filter-category-item.is-active {
  background: var(--accent-subtle);
  color: var(--accent);
  font-weight: 500;
}
.preview-scope .price-option-list {
  display: flex;
  flex-direction: column;
  gap: 2px;
  margin-bottom: 14px;
}
.preview-scope .price-option {
  display: flex;
  align-items: center;
  gap: 9px;
  padding: 6px 8px;
  border-radius: var(--radius);
  color: var(--muted-foreground);
  font-size: 12.5px;
}
.preview-scope .price-option-radio {
  flex-shrink: 0;
  width: 14px;
  height: 14px;
  border: 1.5px solid var(--border-strong);
  border-radius: 50%;
}
.preview-scope .price-option-label {
  min-width: 0;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.preview-scope .price-slider {
  position: relative;
  height: 22px;
}
.preview-scope .price-slider-track,
.preview-scope .price-slider-fill {
  position: absolute;
  top: 50%;
  height: 4px;
  border-radius: 999px;
  transform: translateY(-50%);
}
.preview-scope .price-slider-track {
  left: 0;
  right: 0;
  background: var(--surface-2);
  border: 1px solid var(--border);
}
.preview-scope .price-slider-fill {
  left: 0;
  right: 0;
  background: var(--accent);
}
.preview-scope .price-slider-knob {
  position: absolute;
  top: 50%;
  width: 14px;
  height: 14px;
  border: 2px solid var(--accent);
  border-radius: 50%;
  background: var(--surface);
  box-shadow: var(--shadow-sm);
  transform: translateY(-50%);
}
.preview-scope .price-slider-knob-min {
  left: 0;
}
.preview-scope .price-slider-knob-max {
  right: 0;
}
.preview-scope .price-slider-bounds {
  display: flex;
  justify-content: space-between;
  margin-bottom: 12px;
  font-size: 11px;
  color: var(--muted-foreground-2);
}
.preview-scope .filter-price-row {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 8px;
}

/* ---- Bản sao: thẻ sản phẩm storefront (_shop.scss .product-card) ---- */
.preview-scope {
  /* Nút trang trí — bản thật cũng là <span>, không phải nút bấm */
}
.preview-scope .product-card {
  display: flex;
  flex-direction: column;
  max-width: 240px;
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  background: var(--surface);
  overflow: hidden;
}
.preview-scope .product-thumb {
  position: relative;
  aspect-ratio: 4/3;
  display: flex;
  align-items: center;
  justify-content: center;
  background: var(--surface-2);
  color: var(--muted-foreground-2);
  font-size: 34px;
}
.preview-scope .product-thumb .badge {
  position: absolute;
  top: 10px;
  left: 10px;
}
.preview-scope .product-info {
  padding: 14px 16px 16px;
}
.preview-scope .product-name {
  font-size: 14px;
  font-weight: 500;
  color: var(--foreground);
}
.preview-scope .product-rating {
  margin-top: 6px;
  display: flex;
  align-items: center;
  gap: 2px;
  font-size: 11.5px;
}
.preview-scope .product-star-on {
  color: var(--warning);
}
.preview-scope .product-star-off {
  color: var(--muted-foreground-2);
}
.preview-scope .product-rating-value {
  margin-left: 5px;
  font-weight: 500;
  color: var(--foreground);
}
.preview-scope .product-rating-count {
  color: var(--muted-foreground-2);
}
.preview-scope .product-foot {
  margin-top: 12px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  flex-wrap: wrap;
}
.preview-scope .product-price {
  font-size: 15px;
  font-weight: 600;
  letter-spacing: -0.01em;
}
.preview-scope .product-price .old {
  margin-left: 6px;
  font-size: 12.5px;
  font-weight: 400;
  color: var(--muted-foreground-2);
  text-decoration: line-through;
}
.preview-scope .product-buy-now {
  flex-shrink: 0;
  height: 30px;
  padding: 0 12px;
  font-size: 12.5px;
  pointer-events: none;
}

/* ============================================================
   KHUNG XEM TRƯỚC MỞ RỘNG — "CONTEXTUAL WIREFRAME"
   Razor: Pages/Config/Components/PreviewGiaoDien.razor (khối @if (_isExpanded))

   Ý đồ: mô phỏng TOÀN BỘ trang /san-pham nhưng chỉ vẽ THẬT phần đang cấu hình được
   (cột lọc + một thẻ sản phẩm). Mọi phần khác — header, ô tìm kiếm, dropdown Sắp xếp,
   dòng "17 kết quả", 7 thẻ sản phẩm còn lại — chỉ là khối xám giữ chỗ.

   Vì sao không vẽ thật hết: vẽ đủ thì mắt không biết nhìn đâu để thấy công tắc vừa gạt
   có tác dụng gì; mà 8 thẻ sản phẩm thật sẽ giống hệt nhau, không thêm thông tin nào.
============================================================ */
/* Hộp thoại rộng hơn mọi modal khác của Admin: lưới 4 cột cần ~700px mới không vỡ,
   `.modal-lg` (720px) trừ padding thì thẻ còn quá hẹp. */
.modal--preview {
  max-width: 1100px;
}

/* ---- KHỐI XÁM GIỮ CHỖ ----
   Dùng cho MỌI phần không cấu hình được ở tab này. */
.skeleton-box {
  /* Màu cố định (không dùng token) là CÓ CHỦ Ý: khối này phải đọc ra là "chỗ trống
     chưa có nội dung", khác hẳn `--surface-2` vốn là màu nền của thẻ/khối thật.
     Dùng token thì khối giữ chỗ trông y như một khối thật đang rỗng. */
  background: #e2e8f0;
  border-radius: var(--radius);
  /* Không có chữ bên trong — thêm chiều cao tối thiểu để khối rỗng vẫn nhìn thấy
     được nếu nơi gọi quên đặt chiều cao. */
  min-height: 10px;
  animation: skeleton-pulse 1.6s ease-in-out infinite;
}

/* Nhấp nháy NHẸ bằng opacity (không đổi màu nền): đổi màu thì mỗi chỗ đặt skeleton
   trên nền khác nhau lại phải chỉnh lại dải màu, còn opacity chạy đúng ở mọi nền. */
@keyframes skeleton-pulse {
  0%, 100% {
    opacity: 1;
  }
  50% {
    opacity: 0.55;
  }
}
/* Tắt nhấp nháy cho người bật "giảm chuyển động" trong hệ điều hành — hiệu ứng lặp vô
   hạn trên nhiều khối cùng lúc là đúng loại gây khó chịu mà tuỳ chọn đó sinh ra để chặn. */
@media (prefers-reduced-motion: reduce) {
  .skeleton-box {
    animation: none;
  }
}
/* Ô vuông nhỏ minh hoạ trong câu chú thích đầu hộp thoại */
.preview-legend-skeleton {
  display: inline-block;
  width: 22px;
  height: 10px;
  vertical-align: middle;
  border-radius: 3px;
  background: #e2e8f0;
}

/* ---- BỐ CỤC WIREFRAME ---- */
.wireframe {
  display: flex;
  flex-direction: column;
  gap: 14px;
  padding: 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  background: var(--surface-2);
  /* ---- Header trang (giữ chỗ) ---- */
  /* Dải điều hướng chiếm phần giữa còn lại */
  /* ---- Thân trang: cột lọc | nội dung ----
     Cùng tỉ lệ với storefront thật (`.san-pham-layout`). */
  /* ---- Thanh công cụ (giữ chỗ) ---- */
  /* Dòng "17 kết quả" */
  /* ---- Lưới sản phẩm 4 cột ---- */
  /* Ô chứa thẻ THẬT: bản chép của storefront giới hạn `max-width: 240px` cho khung
     thu gọn — trong lưới phải bỏ giới hạn đó, không thì thẻ co lại lệch hẳn so với
     các ô xám bên cạnh. */
  /* Ô xám: chiều cao xấp xỉ thẻ thật (ảnh 4/3 + phần chữ) để lưới thành hình chữ
     nhật đều, không so le. Dùng `aspect-ratio` thay chiều cao cứng để ô co giãn
     cùng nhịp với thẻ thật khi hộp thoại đổi bề rộng. */
}
.wireframe__header {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 12px 14px;
  border-radius: var(--radius);
  background: var(--surface);
}
.wireframe__logo {
  width: 120px;
  height: 22px;
  flex-shrink: 0;
}
.wireframe__nav {
  height: 14px;
  flex: 1;
  max-width: 320px;
}
.wireframe__actions {
  width: 90px;
  height: 22px;
  flex-shrink: 0;
  margin-left: auto;
}
.wireframe__body {
  display: grid;
  grid-template-columns: 240px minmax(0, 1fr);
  gap: 16px;
  align-items: start;
  /* Tắt hết bộ lọc: bỏ luôn cột trái, lưới chiếm hết chiều ngang — đúng như
     `san-pham-layout-no-filter` bên storefront. Không để track rỗng: track của
     Grid vẫn chiếm chỗ dù không có phần tử nào. */
}
.wireframe__body--no-filter {
  grid-template-columns: minmax(0, 1fr);
}
.wireframe__sidebar {
  display: flex;
  flex-direction: column;
  gap: 12px;
  min-width: 0;
}
.wireframe__main {
  display: flex;
  flex-direction: column;
  gap: 14px;
  min-width: 0;
}
.wireframe__toolbar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  flex-wrap: wrap;
}
.wireframe__count {
  width: 88px;
  height: 18px;
  flex-shrink: 0;
}
.wireframe__toolbar-actions {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-left: auto;
}
.wireframe__search {
  width: 200px;
  height: 34px;
}
.wireframe__sort {
  width: 130px;
  height: 34px;
}
.wireframe__grid {
  display: grid;
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 14px;
}
.wireframe__cell {
  min-width: 0;
}
.wireframe__cell .product-card {
  max-width: none;
}
.wireframe__cell-skeleton {
  aspect-ratio: 3/4;
}

/* Màn hẹp: 4 cột thì mỗi thẻ chỉ còn hơn trăm px, thẻ thật vỡ chữ. Giảm dần số cột —
   khung mở rộng vẫn giữ đúng ý "một thẻ thật giữa lưới xám". */
@media (max-width: 900px) {
  .wireframe__body, .wireframe__body--no-filter {
    grid-template-columns: minmax(0, 1fr);
  }
  .wireframe__grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}
/* ---- Chế độ tối ----
   #e2e8f0 là màu slate sáng, trên nền zinc-950 nó thành mảng trắng chói — sáng hơn cả
   thẻ thật bên cạnh, thành ra khối giữ chỗ lại hút mắt hơn phần cần nhìn. */
@media (prefers-color-scheme: dark) {
  .skeleton-box,
  .preview-legend-skeleton {
    background: #33333b;
  }
}
/* ============================================================
   TAB HEADER & FOOTER của /giao-dien (10/08/2026)
   Razor: Pages/Website/Components/TabHeaderFooter.razor
   Bố cục theo bản đề xuất user duyệt: hai khối xếp đúng thứ tự trên website
   (đầu trang → chân trang) + khung xem trước tô đậm dải đang sửa.
============================================================ */
/* Số thứ tự 1/2 đứng trước tên khối — nối khối bên trái với dải bên khung xem trước */
.section-step {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 22px;
  height: 22px;
  margin-right: 8px;
  border-radius: var(--radius-sm);
  background: var(--accent-subtle);
  color: var(--accent);
  font-size: 12px;
  font-weight: 600;
  vertical-align: middle;
}

/* Tiêu đề khối "Chân trang" — đứng NGOÀI card vì ruột của nó là component
   TabCauHinhLienHe (tự dựng card riêng), không lồng được vào card-header. */
.section-heading {
  display: flex;
  align-items: center;
  margin: 20px 0 10px;
  font-size: 15px;
  font-weight: 600;
}
.section-heading .section-heading-desc {
  margin-left: 10px;
  font-size: 12.5px;
  font-weight: 400;
  color: var(--muted-foreground);
}

/* Ảnh logo đã chọn — nền ô caro nhạt để thấy được ảnh nền trong */
.logo-preview {
  display: flex;
  align-items: center;
  gap: 12px;
  margin-top: -4px;
  margin-bottom: 14px;
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface-2);
}

.logo-preview-img {
  max-width: 160px;
  max-height: 44px;
  object-fit: contain;
}

/* ---- Khung xem trước bố cục ---- */
.layout-preview {
  border: 1px solid var(--border);
  border-radius: var(--radius);
  overflow: hidden;
}

.layout-preview-band {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 10px;
  background: var(--accent-subtle);
  font-size: 11.5px;
  color: var(--accent);
  /* Dải chân trang: 3 cột giả xếp xuống dòng dưới nhãn */
}
.layout-preview-band .layout-preview-tag {
  flex-shrink: 0;
}
.layout-preview-band .layout-preview-brand {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin-left: auto;
  max-width: 60%;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
  font-weight: 500;
}
.layout-preview-band .layout-preview-logo {
  max-width: 60px;
  max-height: 18px;
  object-fit: contain;
}
.layout-preview-band .layout-preview-cart {
  flex-shrink: 0;
}
.layout-preview-band .layout-preview-cols {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 4px;
  flex: 1;
}
.layout-preview-band .layout-preview-cols span {
  height: 20px;
  border: 1px solid var(--accent);
  border-radius: 3px;
  opacity: 0.45;
}

.layout-preview-body {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: 90px;
  background: var(--surface-2);
}

.layout-preview-note {
  font-size: 11.5px;
  color: var(--muted-foreground-2);
}

/* Favicon xem trước ở ĐÚNG cỡ thật trên tab (16–32px) — phóng to lên thì chủ shop
   tưởng ảnh nét, tới lúc lên tab mới thấy vỡ. */
.favicon-preview-img {
  width: 32px;
  height: 32px;
  object-fit: contain;
}

/* ============================================================
   PAGE TÊN MIỀN — Styles riêng
   Razor: Pages/Website/PageTenMien.razor
   Bao gồm: ListTenMien + ModalThemTenMien (dùng chung, ở Pages/Config/Components),
            ModalDoiTenMien, ListLichSuDoiTenMien (Pages/Website/Components).

   📌 `.domain-icon` / `.domain-name` CHUYỂN TỪ `_page-cau-hinh.scss` sang đây (13/08):
   card Tên miền đã rời trang Cấu hình từ 10/08, style ở lại là lạc chỗ. Cả hai vẫn
   dùng chung giữa các component trên, nên để ở đầu file này.
============================================================ */
/* Icon quả cầu trước tên miền trong bảng */
.domain-icon {
  margin-right: 8px;
  color: var(--muted-foreground);
  font-size: 13px;
}

/* Tên miền — chữ mono cho dễ đối chiếu DNS.
   Chữ mono ở đây KHÔNG phải để cho đẹp: đối chiếu tên miền là việc soi từng ký tự
   ("shop-toi.vn" với "shop-tôi.vn", "rn" với "m"), mà font tỉ lệ thì gộp các ký tự
   hẹp lại làm khó nhìn ra khác biệt. */
.domain-name {
  font-family: ui-monospace, "Cascadia Code", Consolas, monospace;
  font-size: 13px;
}

/* ---- Dải nhắc "đang chờ nền tảng xử lý" (đầu card Tên miền) ---- */
.rename-pending {
  margin: 0 16px 16px;
}

/* ---- Bảng lịch sử đổi tên miền ---- */
.rename-th-date {
  width: 150px;
}

.rename-th-status {
  width: 260px;
}

.rename-td-date {
  color: var(--muted-foreground);
  font-size: 13px;
  white-space: nowrap;
}

/* Ghi chú của nền tảng dưới badge — lý do từ chối, hoặc xác nhận đã cấu hình xong */
.rename-note {
  margin-top: 6px;
  color: var(--muted-foreground);
  font-size: 12px;
  line-height: 1.5;
}

/* ---- Modal đổi tên miền: ba bước dạng dòng thời gian dọc ---- */
.rename-steps {
  display: flex;
  flex-direction: column;
  gap: 4px;
  margin: 0;
  padding: 0;
  list-style: none;
}

.rename-step {
  display: flex;
  gap: 14px;
  padding-bottom: 18px;
  position: relative;
}

/* Đường nối giữa các bước — vẽ bằng ::before của chính bước đó, không cần thẻ riêng.
   Bước CUỐI CÙNG bỏ đường nối, không thì có một đoạn kẻ thừa chạy xuống đáy modal. */
.rename-step::before {
  content: "";
  position: absolute;
  top: 30px;
  bottom: 0;
  left: 13px;
  width: 2px;
  background: var(--border);
}

.rename-step:last-child::before {
  display: none;
}

/* Chấm số thứ tự / dấu tick. `position: relative` + `z-index` để nó nằm ĐÈ lên
   đường nối phía sau, không bị vạch kẻ xuyên qua giữa. */
.rename-step-dot {
  position: relative;
  z-index: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 28px;
  height: 28px;
  border-radius: 50%;
  border: 2px solid var(--border);
  background: var(--card);
  color: var(--muted-foreground);
  font-size: 12px;
  font-weight: 600;
}

.rename-step--active .rename-step-dot {
  border-color: var(--accent);
  background: var(--accent);
  color: var(--accent-foreground);
}

.rename-step--done .rename-step-dot {
  border-color: #16a34a;
  background: #16a34a;
  color: #fff;
}

.rename-step-body {
  flex: 1;
  min-width: 0;
}

.rename-step-title {
  margin: 4px 0 6px;
  font-size: 14px;
  font-weight: 600;
}

.rename-step-desc {
  margin: 0 0 10px;
  color: var(--muted-foreground);
  font-size: 13px;
  line-height: 1.6;
}

/* Ô nhập + nút kiểm tra nằm cùng hàng, ô nhập co giãn lấp chỗ trống */
.rename-input-row {
  display: flex;
  gap: 8px;
  align-items: center;
  margin-bottom: 6px;
}

.rename-input {
  flex: 1;
  min-width: 0;
  font-family: ui-monospace, "Cascadia Code", Consolas, monospace;
}

/* Trên màn hẹp thì xếp dọc — nút "Kiểm tra" bị bóp lại là mất chữ */
@media (max-width: 560px) {
  .rename-input-row {
    flex-direction: column;
    align-items: stretch;
  }
}
/* ============================================================
   PAGE GIAO DIỆN — tab "Kho giao diện"
   Razor: Pages/Website/Components/TabKhoGiaoDien.razor

   Ba tab còn lại của trang (`Trang sản phẩm` · `Trang chủ` · `Header & Footer`) dùng
   `.config-split` sẵn có trong `_page-cau-hinh.scss` — không lặp lại ở đây.

   Toàn bộ màu lấy từ token của `_variables.scss` nên chế độ tối tự đúng theo,
   KHÔNG khai màu cứng ở file này.
============================================================ */
/* ---- Lưới thẻ mẫu giao diện ---- */
.theme-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));
  gap: 20px;
}

.theme-card {
  display: flex;
  flex-direction: column;
  overflow: hidden;
  border: 1px solid var(--border);
  border-radius: 12px;
  background: var(--surface);
  box-shadow: var(--shadow-sm);
  transition: border-color 0.15s ease, box-shadow 0.15s ease;
}

.theme-card:hover {
  border-color: var(--border-strong);
  box-shadow: var(--shadow);
}

/* Mẫu ĐANG DÙNG — viền accent + quầng nhẹ.
   Đánh dấu bằng VIỀN chứ không đổi nền: nền đổi thì ảnh xem trước bên trong bị lệch
   tông so với các thẻ khác, nhìn tưởng ảnh hỏng. */
.theme-card.is-current {
  border-color: var(--accent);
  box-shadow: 0 0 0 1px var(--accent);
}

/* ---- Ảnh xem trước ---- */
.theme-thumb {
  position: relative;
  height: 150px;
  background: var(--surface-2);
  border-bottom: 1px solid var(--border);
  overflow: hidden;
}

.theme-thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

/* Chưa có ảnh xem trước thì hiện MÃ MẪU — vẫn phân biệt được các thẻ với nhau,
   thay vì mấy ô xám giống hệt nhau. */
.theme-thumb-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 8px;
  height: 100%;
  color: var(--muted-foreground-2);
}

.theme-thumb-empty i {
  font-size: 26px;
}

.theme-thumb-empty span {
  font-size: 12px;
  font-weight: 600;
  font-family: ui-monospace, "Cascadia Code", Consolas, monospace;
}

.theme-badge-current {
  position: absolute;
  top: 10px;
  right: 10px;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  padding: 4px 10px;
  border-radius: 999px;
  background: var(--accent);
  color: var(--accent-foreground);
  font-size: 11px;
  font-weight: 600;
}

/* ---- Phần chữ ---- */
.theme-body {
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: 14px 16px 16px;
  flex: 1;
}

.theme-name {
  font-size: 14px;
  font-weight: 600;
  color: var(--foreground);
}

.theme-meta {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  font-size: 12px;
  color: var(--muted-foreground);
}

/* Mã mẫu = TÊN THƯ MỤC VIEW bên storefront, nên để chữ mono cho dễ soi từng ký tự
   khi đối chiếu với thư mục trên đĩa (cùng lý do với `.domain-name`). */
.theme-code {
  font-family: ui-monospace, "Cascadia Code", Consolas, monospace;
  padding: 2px 7px;
  border-radius: 5px;
  background: var(--surface-2);
  border: 1px solid var(--border);
  font-size: 11px;
}

.theme-version {
  color: var(--muted-foreground-2);
}

.theme-foot {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 10px;
  margin-top: auto;
  padding-top: 12px;
  border-top: 1px solid var(--border);
}

.theme-price {
  font-size: 13px;
  font-weight: 600;
  color: var(--success);
}

.btn-theme-apply {
  font-size: 12px;
  padding: 6px 14px;
  white-space: nowrap;
}

/* ---- Section 1: Bộ giao diện đang chọn (17/08/2026, user chốt tách khỏi lưới) ----
   Một hàng ngang: ảnh xem trước cỡ vừa + tên/mã/phiên bản + nút Chỉnh sửa — khác
   `.theme-card` (dọc, dùng cho lưới nhiều mẫu ở Section 2 cũ, nay Section 2 đổi
   sang dạng list `.provider-row` nên `.theme-card`/`.theme-grid` không còn dùng
   nhưng GIỮ LẠI phòng khi cần quay lại dạng lưới). */
.theme-active {
  display: flex;
  align-items: center;
  gap: 20px;
}

.theme-active-thumb {
  position: relative;
  width: 160px;
  height: 100px;
  flex-shrink: 0;
  border-radius: 10px;
  overflow: hidden;
  background: var(--surface-2);
  border: 1px solid var(--border);
}

.theme-active-thumb img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  display: block;
}

.theme-active-body {
  flex: 1;
  min-width: 0;
  display: flex;
  flex-direction: column;
  gap: 6px;
}

/* Badge "Đang dùng" khi KHÔNG neo trong ảnh (khác `.theme-badge-current` gốc, vốn
   position:absolute lên góc ảnh) — ở đây đứng dòng riêng phía trên tên mẫu. */
.theme-badge-inline {
  align-self: flex-start;
  position: static;
}

/* ---- Trạng thái rỗng / đang tải ---- */
.theme-empty {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 10px;
  padding: 40px 16px;
  color: var(--muted-foreground);
  font-size: 13px;
}

.theme-empty i {
  font-size: 26px;
  color: var(--muted-foreground-2);
}

/* ============================================================
   PAGE CHỈNH SỬA GIAO DIỆN — /giao-dien/chinh-sua
   Razor: Pages/Website/PageChinhSuaTheme.razor

   Bố cục CỘT SIDEBAR thay cho tab ngang. Nội dung đổi theo mục đang chọn ở cột
   phải — không tải lại trang.

   18/08/2026 (đợt sau) — sidebar chia RÕ 3 NHÓM bằng nhãn nhỏ
   (.theme-edit-nav-section-label): "Chung" / "Nội dung trang" / "Điều hướng".
   Lý do: mục "Menu điều hướng" đứng lẫn giữa các tab nội dung (Trang chủ/Giới
   thiệu/Chính sách/Liên hệ) khiến user nhầm các MỤC MENU họ tự đặt tên (VD cũng
   đặt tên "Giới thiệu"/"Chính sách" cho một mục menu) là con của tab cùng tên —
   trong khi thực ra không liên quan gì tới nhau. Tách nhãn nhóm để mắt hiểu ngay
   đây là 2 khái niệm khác nhau, không phải sửa lại tên hay cấu trúc dữ liệu.

   Toàn bộ màu lấy từ token của `_variables.scss` nên chế độ tối tự đúng theo,
   KHÔNG khai màu cứng ở file này.
============================================================ */
.theme-editor-shell {
  min-height: 100vh;
  background-color: var(--background);
  color: var(--foreground);
  display: flex;
  flex-direction: column;
}

.theme-editor-body {
  flex: 1;
  display: flex;
  flex-direction: column;
  padding: 20px 24px;
  max-width: 1600px;
  margin: 0 auto;
  width: 100%;
}

.theme-edit-layout {
  display: flex;
  flex: 1;
  width: 100%;
}

.theme-edit-sidebar {
  display: flex;
  flex-direction: column;
  gap: 2px;
  padding: 8px;
  background: var(--surface);
  position: sticky;
  top: 16px;
}
@media (max-width: 900px) {
  .theme-edit-sidebar {
    position: static;
    flex-direction: row;
    overflow-x: auto;
  }
}

.theme-edit-nav-item {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 12px;
  border: none;
  border-radius: calc(var(--radius) - 2px);
  background: transparent;
  color: var(--muted-foreground);
  font-size: 13.5px;
  font-weight: 500;
  text-align: left;
  text-decoration: none;
  white-space: nowrap;
  cursor: pointer;
  transition: background 0.15s ease, color 0.15s ease;
}

.theme-edit-nav-item i {
  width: 18px;
  text-align: center;
  color: var(--muted-foreground-2);
}

.theme-edit-nav-item:hover {
  background: var(--surface-2);
  color: var(--foreground);
}

.theme-edit-nav-item.is-active {
  background: var(--accent-subtle);
  color: var(--accent);
}

.theme-edit-nav-item.is-active i {
  color: var(--accent);
}

.theme-edit-nav-label {
  flex: 1;
}

.theme-edit-nav-badge {
  font-size: 10px;
  padding: 2px 6px;
  white-space: nowrap;
}

.theme-edit-content {
  min-width: 0;
}

/* Nhãn nhóm nhỏ trong sidebar — xem giải thích ở đầu file. Mục ĐẦU TIÊN không cần
   margin-top (đứng sát mép trên), các mục sau cách nhóm trước một khoảng rõ rệt. */
.theme-edit-nav-section-label {
  padding: 12px 12px 4px;
  font-size: 11px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--muted-foreground-2);
}

.theme-edit-nav-section-label:first-child {
  padding-top: 4px;
}

/* ---- Accordion cho từng Banner / Mục tính năng (17/08/2026, user chốt) ----
   Danh sách banner/feature có thể dài — thu gọn mặc định, bấm tiêu đề mới xổ ra,
   thay vì hiện hết mọi form cùng lúc. */
.theme-accordion-item {
  margin-bottom: 16px;
}

.theme-accordion-item:last-child {
  margin-bottom: 0;
}

.theme-accordion-header {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  width: 100%;
  cursor: pointer;
  user-select: none;
}

/* Chỉ kẻ đường phân cách với nội dung bên dưới khi ĐANG MỞ — thu gọn thì tiêu đề
   đứng một mình, kẻ viền lúc đó chỉ thừa. */
.theme-accordion-header.is-open {
  padding-bottom: 12px;
  margin-bottom: 16px;
  border-bottom: 1px solid var(--border);
}

.theme-accordion-title {
  display: flex;
  align-items: center;
  gap: 10px;
  min-width: 0;
  font-weight: 600;
  color: var(--accent);
  font-size: 14px;
}

.theme-accordion-title-text {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.theme-accordion-chevron {
  flex-shrink: 0;
  font-size: 12px;
  color: var(--muted-foreground-2);
}

/* ---- Trình xếp khối "Trang chủ" (18/08/2026, đợt "Sections") ----
   Mỗi khối (Banner/Feature/Text/Card/BlogPreview/PromoPreview) là một
   .section-block, tái dùng .theme-accordion-item làm khung ngoài. Nút Lên/
   Xuống/Ẩn-hiện/Xoá dùng chung .btn-icon-ghost đã có ở _page-menu-dieu-huong.scss
   (đăng ký chung trong common-all.scss nên khỏi khai lại). */
/* 20/08/2026 — bỏ hẳn cursor:pointer/user-select:none của bản trước: header KHÔNG còn bấm
   để mở/đóng gì nữa (đã bỏ accordion ngoài, nội dung LUÔN hiện), chỉ còn tay cầm kéo-thả +
   2 nút hành động riêng, giữ con trỏ mặc định để không gợi ý nhầm là bấm được cả dòng. */
.section-block-header {
  display: flex;
  align-items: center;
  gap: 10px;
}

/* Tên khối dùng màu chữ THƯỜNG, không phải màu nhấn — .theme-accordion-title dùng chung
   với accordion Feature/Chính sách khác trong cùng trang nên KHÔNG sửa thẳng class đó,
   chỉ ghi đè riêng trong phạm vi danh sách khối trang chủ (19/08/2026, theo yêu cầu user). */
.section-block-header .theme-accordion-title {
  color: var(--foreground);
}

.section-block-drag {
  flex-shrink: 0;
  font-size: 13px;
  color: var(--muted-foreground-2);
  cursor: grab;
}

.section-block-actions {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  gap: 2px;
  margin-left: auto;
}

/* Khối đang ẨN trên storefront — mờ đi để phân biệt với khối đang hiện,
   không dùng display:none vì vẫn phải bấm mở ra sửa được. */
.section-block-hidden {
  opacity: 0.55;
}

/* ============================================================
   Danh sách khối (trái) + palette "Thêm khối" LUÔN HIỆN (phải) — 20/08/2026.
   Trước đó nút "Thêm khối" mở dropdown che tạm thời (.add-section-wrap/.add-
   section-menu, ĐÃ BỎ) — user yêu cầu thu hẹp cột khối lại, đưa các lựa chọn
   thêm khối ra một cột riêng bên phải, LUÔN THẤY, bấm thẳng vào thẻ là thêm.
============================================================ */
.trangchu-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 360px;
  gap: 10px;
  align-items: start;
}
@media (max-width: 1100px) {
  .trangchu-layout {
    grid-template-columns: 1fr;
  }
}

.trangchu-blocks-col {
  min-width: 0;
}

.trangchu-addblock-col {
  position: sticky;
  top: 76px;
  display: flex;
  flex-direction: column;
  gap: 10px;
  padding: 14px;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
}
@media (max-width: 1100px) {
  .trangchu-addblock-col {
    position: static;
  }
}

.trangchu-addblock-title {
  margin: 0 0 2px;
  font-size: 12px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  color: var(--muted-foreground-2);
}

.trangchu-addblock-card {
  display: flex;
  align-items: center;
  gap: 10px;
  width: 100%;
  padding: 10px 12px;
  border: 1px solid var(--border);
  border-radius: calc(var(--radius) - 2px);
  background: var(--surface);
  color: var(--foreground);
  font-size: 13px;
  font-weight: 500;
  text-align: left;
  cursor: pointer;
  transition: background 0.15s ease, border-color 0.15s ease, color 0.15s ease;
}

.trangchu-addblock-card i {
  flex-shrink: 0;
  width: 18px;
  text-align: center;
  color: var(--muted-foreground-2);
}

.trangchu-addblock-card:hover {
  background: var(--surface-2);
  border-color: var(--accent);
  color: var(--accent);
}

.trangchu-addblock-card:hover i {
  color: var(--accent);
}

/* ============================================================
   XEM TRƯỚC TRỰC TIẾP + DẢI THẺ KÉO-THẢ — Banner/Tính năng/Thẻ
   (18/08/2026) — thay accordion mở-từng-cái-một cũ. Banner dùng
   .banner-live-preview (trượt qua từng slide); Tính năng/Thẻ dùng
   .grid-live-preview (lưới tĩnh, khớp cách chúng hiện trên storefront).
============================================================ */
.item-live-preview {
  margin-bottom: 12px;
}

.banner-live-preview {
  position: relative;
  height: 320px;
  border-radius: var(--radius);
  overflow: hidden;
  border: 1px solid var(--border);
  background: var(--surface-2);
}

.banner-live-pane {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: flex-end;
  background-size: cover;
  background-position: center;
  opacity: 0;
  transition: opacity 0.2s ease;
  pointer-events: none;
}

.banner-live-pane.is-active {
  opacity: 1;
  pointer-events: auto;
}

.banner-live-overlay {
  width: 100%;
  padding: 24px;
  display: flex;
  flex-direction: column;
  gap: 6px;
  background: linear-gradient(0deg, rgba(0, 0, 0, 0.6), transparent 80%);
}

/* Một dòng trong khung xem trước (Eyebrow/Tiêu đề/Mô tả) — bọc chữ + icon bút chì sửa
   tại chỗ (19/08/2026, thay hẳn form Title/Eyebrow/Mô tả nằm riêng bên dưới dải thẻ). */
.banner-live-field {
  display: flex;
  align-items: center;
  gap: 8px;
}
.banner-live-field .input, .banner-live-field .input.input-sm {
  max-width: 420px;
}

.banner-live-edit-btn {
  flex-shrink: 0;
  width: 24px;
  height: 24px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.25);
  color: #fff;
  font-size: 11px;
  cursor: pointer;
}

.banner-live-edit-btn:hover {
  background: rgba(255, 255, 255, 0.4);
}

/* Icon đổi ảnh — góc trên-phải khung xem trước, chỉ hiện ở slide đang chọn. */
.banner-live-image-btn {
  position: absolute;
  top: 12px;
  right: 12px;
  z-index: 1;
  width: 32px;
  height: 32px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: 50%;
  background: rgba(0, 0, 0, 0.55);
  color: #fff;
  font-size: 13px;
  cursor: pointer;
}

.banner-live-image-btn:hover {
  background: rgba(0, 0, 0, 0.75);
}

/* Icon "đường dẫn khi bấm ảnh" — góc trên-TRÁI khung xem trước (đối xứng với icon đổi ảnh
   ở góc trên-phải), chỉ dùng cho khối "Banner chỉ ảnh" (không có overlay chữ để đặt icon
   dây xích như .grid-live-link-btn của khối Card). */
.banner-live-link-btn {
  position: absolute;
  top: 12px;
  left: 12px;
  z-index: 1;
  width: 32px;
  height: 32px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: 50%;
  background: rgba(0, 0, 0, 0.55);
  color: #fff;
  font-size: 13px;
  cursor: pointer;
}

.banner-live-link-btn:hover {
  background: rgba(0, 0, 0, 0.75);
}

.banner-live-eyebrow {
  align-self: flex-start;
  padding: 2px 10px;
  border-radius: 999px;
  background: rgba(255, 255, 255, 0.18);
  color: #fff;
  font-size: 10px;
  font-weight: 700;
  text-transform: uppercase;
}

.banner-live-title {
  margin: 0;
  color: #fff;
  font-size: 22px;
  font-weight: 700;
}

.banner-live-description {
  margin: 0;
  max-width: 480px;
  color: rgba(255, 255, 255, 0.9);
  font-size: 13px;
  line-height: 1.5;
  overflow: hidden;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}

.banner-live-btn {
  align-self: flex-start;
  margin-top: 8px;
  padding: 8px 20px;
  border: none;
  border-radius: 999px;
  background: var(--accent);
  color: var(--accent-foreground);
  font-family: inherit;
  font-size: 13px;
  font-weight: 700;
  cursor: pointer;
}

/* Tiêu đề khối căn giữa (Eyebrow/Heading của Tính năng, Title của Thẻ) — NẰM LIỀN phía trên
   lưới mục, không tách accordion/hàng riêng (19/08/2026), khớp cách chúng hiện TRÊN storefront
   (cả hai đều `text-center`, xem `Theme_DoChoi/Home/Index.cshtml`). Dùng CHUNG một tên lớp cho
   cả Feature lẫn Card vì cùng một kiểu trình bày — không phải riêng của Tính năng dù tên biến
   code-behind (`_isEditingCardTitle`...) khác nhau theo từng khối. Nền trang thường (không
   phải overlay trên ảnh như Banner) nên dùng lại .btn-icon-ghost có sẵn cho icon bút chì. */
.block-heading-field {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 8px;
  margin-bottom: 8px;
  text-align: center;
}
.block-heading-field .input, .block-heading-field .input.input-sm {
  max-width: 420px;
}

.feature-general-eyebrow {
  font-size: 12px;
  font-weight: 700;
  text-transform: uppercase;
  color: var(--accent);
}

.block-heading {
  margin: 0;
  font-size: 18px;
  font-weight: 700;
  color: var(--foreground);
}

.feature-general-description {
  margin: 0;
  font-size: 13px;
  color: var(--muted-foreground);
}

/* Khối "Bài viết mới nhất" (BlogPreview) — KHÁC Feature/Card: storefront thật xếp Eyebrow/
   Heading CĂN TRÁI kèm link "Xem tất cả" bên phải (`flex justify-between`), không
   `text-center` như Feature/Card — xem `Theme_DoChoi/Home/Index.cshtml`. 20/08/2026. */
.blog-preview-header {
  display: flex;
  align-items: flex-start;
  justify-content: space-between;
  gap: 16px;
  margin-top: 12px;
}

.blog-preview-header-text {
  display: flex;
  flex-direction: column;
  min-width: 0;
  /* Nhỏ hơn bản Feature/Card (.feature-general-eyebrow/.block-heading gốc 12px/18px) —
     khối này còn có lưới thẻ bài viết bên dưới, chữ to bằng Feature/Card nhìn nặng. Chỉ
     override PHẠM VI trong khối này, không đổi 2 class gốc (Feature/Card vẫn giữ nguyên). */
}
.blog-preview-header-text .feature-general-eyebrow {
  font-size: 11px;
}
.blog-preview-header-text .block-heading {
  font-size: 16px;
}

/* 20/08/2026: đổi từ <span> tĩnh sang khối sửa-tại-chỗ (chữ liên kết) — CHỈ chữ sửa được,
   KHÔNG có ô url(../../Themes/Common/đường dẫn luôn cố định /blog, xem ThemeBlogPreviewSection.LinkText). */
.blog-preview-header-link {
  flex-shrink: 0;
  margin-top: 6px;
  display: inline-flex;
  align-items: center;
  gap: 4px;
  font-size: 12px;
  font-weight: 700;
  color: var(--accent);
  white-space: nowrap;
}
.blog-preview-header-link .input, .blog-preview-header-link .input.input-sm {
  max-width: 150px;
}

/* Giống .block-heading-field nhưng căn TRÁI — dùng riêng cho BlogPreview. */
.block-heading-field-left {
  display: flex;
  align-items: center;
  gap: 8px;
  margin-bottom: 4px;
}
.block-heading-field-left .input, .block-heading-field-left .input.input-sm {
  max-width: 320px;
}

/* Lưới xem trước bài viết THẬT (ảnh/tên/ngày đăng) — CHỈ hiển thị, không có nút sửa nào
   trên từng thẻ (khác lưới Feature/Card): nội dung bài viết sửa ở trang Blog, không sửa ở
   đây. */
.blog-preview-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
  gap: 12px;
}

.blog-preview-card {
  border: 1px solid var(--border);
  border-radius: 12px;
  background-color: var(--surface-2);
  overflow: hidden;
}

.blog-preview-card-thumb {
  aspect-ratio: 16/9;
  background-color: var(--surface);
  background-size: cover;
  background-position: center;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--muted-foreground);
  font-size: 22px;
}

.blog-preview-card-body {
  padding: 10px 12px;
}

.blog-preview-card-title {
  margin: 0 0 4px;
  font-size: 13px;
  font-weight: 700;
  color: var(--foreground);
  overflow: hidden;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}

.blog-preview-card-date {
  margin: 0;
  font-size: 11px;
  color: var(--muted-foreground);
}

/* Dùng chung cho trạng thái rỗng của BlogPreview lẫn PromoPreview (20/08/2026 — trước đó chỉ
   Blog có, đổi tên bỏ tiền tố "blog-" khi PromoPreview cũng dùng tới). */
.section-preview-empty {
  margin-top: 12px;
  padding: 16px;
  text-align: center;
  font-size: 12.5px;
  color: var(--muted-foreground);
  border: 1px dashed var(--border);
  border-radius: 12px;
}

/* Khối "Khuyến mãi" (PromoPreview) — 20/08/2026, cùng đợt làm giống BlogPreview. KHÁC hẳn:
   storefront không có Eyebrow, không có link "Xem tất cả" — chỉ icon `fa-tags` + 1 dòng tiêu
   đề (xem `Theme_DoChoi/Home/Index.cshtml`), nên không cần `.blog-preview-header`/`-header-
   text`/`-header-link`, chỉ cần icon + `.block-heading-field-left` (dùng lại, không đổi). */
.promo-preview-header {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-top: 12px;
}

.promo-preview-header-icon {
  color: var(--accent);
  font-size: 15px;
}

/* Lưới xem trước mã khuyến mãi THẬT — CHỈ hiển thị, không có nút sửa/nút "Lưu mã" như
   storefront (đó là hành động của khách, không có ý nghĩa ở màn xem trước quản trị). */
.promo-preview-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(220px, 1fr));
  gap: 12px;
}

.promo-preview-card {
  padding: 14px 16px;
  border: 1px dashed var(--accent);
  border-radius: 14px;
  background-color: var(--surface-2);
}

.promo-preview-code {
  display: inline-block;
  padding: 3px 10px;
  border: 1px solid var(--border);
  border-radius: 6px;
  font-family: monospace;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.03em;
  color: var(--accent);
  background-color: var(--surface);
}

.promo-preview-desc {
  margin: 8px 0 0;
  font-size: 12.5px;
  color: var(--muted-foreground);
  overflow: hidden;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}

.promo-preview-expiry {
  margin: 6px 0 0;
  font-size: 11px;
  color: var(--muted-foreground);
}

/* Lưới xem trước danh mục THẬT (khối "Danh mục nổi bật") — CHỈ hiển thị, không có nút sửa
   nào (danh mục sửa ở trang Danh mục). 20/08/2026. */
.category-preview-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
  gap: 12px;
  margin-top: 12px;
}

.category-preview-tile {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  padding: 16px 10px;
  border: 1px solid var(--border);
  border-radius: 12px;
  background-color: var(--surface-2);
  text-align: center;
}

.category-preview-icon {
  width: 44px;
  height: 44px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 10px;
  background-color: var(--surface);
  color: var(--accent);
  font-size: 18px;
}

.category-preview-name {
  font-size: 12.5px;
  font-weight: 700;
  color: var(--foreground);
}

.category-preview-count {
  font-size: 11px;
  color: var(--muted-foreground);
}

/* Lưới xem trước sản phẩm THẬT (khối "Sản phẩm nổi bật") — cùng nguyên tắc CategoryPreview. */
.product-preview-grid {
  display: grid;
  /* Chặn TRẦN 160px — trước dùng "1fr" nên khi có ÍT sản phẩm (VD chỉ 2), mỗi ô kéo giãn
     lấp đầy hết dòng, ảnh vuông (aspect-ratio 1:1) theo đó phóng to bất thường. 20/08/2026. */
  grid-template-columns: repeat(auto-fit, minmax(140px, 160px));
  gap: 12px;
  margin-top: 12px;
}

.product-preview-card {
  border: 1px solid var(--border);
  border-radius: 12px;
  background-color: var(--surface-2);
  overflow: hidden;
}

.product-preview-thumb {
  position: relative;
  aspect-ratio: 1/1;
  background-color: var(--surface);
  background-size: cover;
  background-position: center;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--muted-foreground);
  font-size: 22px;
}

/* Nhãn "-N%" góc trên-trái ảnh — chỉ hiện khi có giá gạch ngang cao hơn giá bán. 20/08/2026. */
.product-preview-discount-badge {
  position: absolute;
  top: 8px;
  left: 8px;
  padding: 3px 8px;
  border-radius: 999px;
  background-color: var(--danger);
  color: #fff;
  font-size: 10px;
  font-weight: 800;
}

.product-preview-body {
  padding: 10px 12px;
}

.product-preview-name {
  margin: 0 0 4px;
  font-size: 12.5px;
  font-weight: 700;
  color: var(--foreground);
  overflow: hidden;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}

/* Hàng giá + nút mua CHỈ ĐỂ XEM (không gắn @onclick, bấm không có tác dụng) — cho thấy đúng
   hình dạng thẻ sản phẩm thật trên storefront. 20/08/2026. */
.product-preview-price-row {
  display: flex;
  align-items: flex-end;
  justify-content: space-between;
  gap: 8px;
}

.product-preview-price-group {
  display: flex;
  flex-direction: column;
}

.product-preview-compare-price {
  font-size: 11px;
  font-weight: 700;
  color: var(--muted-foreground);
  text-decoration: line-through;
}

.product-preview-price {
  margin: 0;
  font-size: 13px;
  font-weight: 700;
  color: var(--accent);
}

.product-preview-cart-btn {
  flex-shrink: 0;
  width: 30px;
  height: 30px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: 50%;
  background-color: var(--accent);
  color: var(--accent-foreground);
  font-size: 11px;
  cursor: default;
}

.grid-live-preview {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(180px, 1fr));
  gap: 12px;
  margin-top: 12px;
}

.grid-live-tile {
  position: relative;
  height: 200px;
  border-radius: 12px;
  border: 1px solid var(--border);
  background-color: var(--surface-2);
  background-size: cover;
  background-position: center;
  overflow: hidden;
  display: flex;
  align-items: flex-end;
}

.grid-live-overlay {
  width: 100%;
  padding: 14px;
  display: flex;
  flex-direction: column;
  gap: 4px;
  background: linear-gradient(0deg, rgba(0, 0, 0, 0.65), transparent 75%);
}

.grid-live-title {
  color: #fff;
  font-size: 14px;
  font-weight: 700;
}

.grid-live-description {
  margin: 0;
  color: rgba(255, 255, 255, 0.9);
  font-size: 12px;
  line-height: 1.4;
  overflow: hidden;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  -webkit-box-orient: vertical;
}

.grid-live-cta {
  align-self: flex-start;
  margin-top: 4px;
  border: none;
  background: transparent;
  padding: 0;
  color: #fff;
  font-family: inherit;
  font-size: 11px;
  font-weight: 700;
  text-decoration: underline;
  cursor: pointer;
}

/* Một dòng trong lưới xem trước Tính năng/Thẻ (Tên/Mô tả) — bọc chữ + icon bút chì
   (19/08/2026, cùng hướng đã làm cho Banner). Khác Banner: MỌI mục trong lưới đều hiện
   cùng lúc (không có khái niệm "mục đang chọn" như Banner chỉ phóng to 1 slide), nên
   trạng thái sửa ở code-behind phải phân biệt CẢ mục lẫn trường, không chỉ tên trường
   như Banner. */
.grid-live-field {
  display: flex;
  align-items: center;
  gap: 6px;
}
.grid-live-field .input, .grid-live-field .input.input-sm {
  max-width: 100%;
}

.grid-live-edit-btn {
  flex-shrink: 0;
  width: 20px;
  height: 20px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.25);
  color: #fff;
  font-size: 9px;
  cursor: pointer;
}

.grid-live-edit-btn:hover {
  background: rgba(255, 255, 255, 0.4);
}

/* Icon đổi ảnh — góc trên-phải mỗi ô lưới (khác Banner: mọi ô đều hiện, không chỉ ô
   đang chọn, vì lưới Feature/Card hiện TẤT CẢ mục cùng lúc). */
.grid-live-image-btn {
  position: absolute;
  top: 8px;
  right: 8px;
  z-index: 1;
  width: 26px;
  height: 26px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: 50%;
  background: rgba(0, 0, 0, 0.55);
  color: #fff;
  font-size: 11px;
  cursor: pointer;
}

.grid-live-image-btn:hover {
  background: rgba(0, 0, 0, 0.75);
}

/* Icon "đường dẫn khi bấm thẻ" — Card không có tên nút như Feature (cả thẻ là link,
   không hiện chữ nút riêng trên storefront) nên chỉ cần icon, không phải nút chữ. */
.grid-live-link-btn {
  align-self: flex-start;
  margin-top: 4px;
  width: 22px;
  height: 22px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: 50%;
  background: rgba(255, 255, 255, 0.25);
  color: #fff;
  font-size: 10px;
  cursor: pointer;
}

.grid-live-link-btn:hover {
  background: rgba(255, 255, 255, 0.4);
}

.item-strip {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
  margin-bottom: 12px;
}

.item-strip-tile {
  position: relative;
  flex: 0 0 88px;
  height: 60px;
  border-radius: calc(var(--radius) - 2px);
  border: 2px solid var(--border);
  background-color: var(--surface-2);
  background-size: cover;
  background-position: center;
  cursor: grab;
  overflow: hidden;
}

.item-strip-tile.is-selected {
  border-color: var(--accent);
}

.item-strip-label {
  position: absolute;
  left: 4px;
  right: 22px;
  bottom: 3px;
  font-size: 10px;
  font-weight: 600;
  color: #fff;
  background: rgba(0, 0, 0, 0.55);
  padding: 1px 6px;
  border-radius: 999px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.item-strip-delete {
  position: absolute;
  top: 2px;
  right: 2px;
  width: 18px;
  height: 18px;
  border: none;
  border-radius: 50%;
  background: rgba(0, 0, 0, 0.55);
  color: #fff;
  font-size: 9px;
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
}

.item-strip-add {
  flex: 0 0 88px;
  height: 60px;
  border-radius: calc(var(--radius) - 2px);
  border: 1px dashed var(--border-strong);
  background: transparent;
  color: var(--muted-foreground);
  display: flex;
  align-items: center;
  justify-content: center;
  cursor: pointer;
}

.item-strip-add:hover {
  border-color: var(--accent);
  color: var(--accent);
}

.item-edit-panel {
  background: var(--surface-2);
  border-radius: var(--radius);
  padding: 12px;
}

/* ============================================================
   KHỐI "LƯỚI BỘ SƯU TẬP" (CollectionMosaic) — 21/08/2026, kiểu "Shop by
   Occasion": mỗi ô tự chọn cỡ Lớn/Vừa/Ngang (.mosaic-live-tile-*) thay vì
   lưới đều như .grid-live-preview của Card. Dùng lại NGUYÊN các class
   .grid-live-image-btn/.grid-live-overlay/.grid-live-field/.grid-live-title/
   .grid-live-edit-btn/.grid-live-link-btn ở trên — chỉ .mosaic-live-tile
   thay cho .grid-live-tile (khác nhau ở chỗ chiếm nhiều cột/dòng).
============================================================ */
.mosaic-live-preview {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  grid-auto-rows: 90px;
  grid-auto-flow: row dense;
  gap: 12px;
  margin-top: 12px;
}

.mosaic-live-tile {
  position: relative;
  border: 1px solid var(--border);
  background-color: var(--surface-2);
  background-size: cover;
  background-position: center;
  overflow: hidden;
  display: flex;
  align-items: flex-end;
}

/* Bo tròn góc ảnh — tuỳ chọn "Bo tròn góc ảnh" cạnh tiêu đề khối, mặc định BẬT (khớp
   ThemeCollectionMosaicSection.IsRounded = true). */
.mosaic-live-tile.is-rounded {
  border-radius: 12px;
}

.mosaic-live-tile-large {
  grid-column: span 2;
  grid-row: span 2;
}

.mosaic-live-tile-medium {
  grid-column: span 2;
  grid-row: span 1;
}

.mosaic-live-tile-wide {
  grid-column: span 4;
  grid-row: span 1;
}

/* Nhãn góc ảnh (VD "WEDDING") — pill nhỏ, tách khỏi .grid-live-title (tên ô). */
.grid-live-badge {
  align-self: flex-start;
  font-size: 10px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: #fff;
  background: rgba(255, 255, 255, 0.25);
  padding: 2px 8px;
  border-radius: 999px;
}

/* Chọn cỡ ô — 3 nút cố định, bấm trực tiếp trên khung xem trước, không qua modal. */
.mosaic-size-picker {
  position: absolute;
  top: 8px;
  left: 8px;
  z-index: 1;
  display: flex;
  gap: 4px;
}

.mosaic-size-btn {
  width: 22px;
  height: 22px;
  display: flex;
  align-items: center;
  justify-content: center;
  border: none;
  border-radius: 50%;
  background: rgba(0, 0, 0, 0.55);
  color: #fff;
  font-size: 10px;
  font-weight: 700;
  cursor: pointer;
}

.mosaic-size-btn:hover {
  background: rgba(0, 0, 0, 0.75);
}

.mosaic-size-btn.is-active {
  background: var(--accent);
  color: var(--accent-foreground);
}

/* Nút "Xem tất cả" ở header khối — bấm mở modal sửa URL (khác BlogPreview, chữ hiển thị
   luôn cố định "Xem tất cả", KHÔNG sửa tại chỗ như .blog-preview-header-link gốc). */
.mosaic-header-link-btn {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  border: none;
  background: transparent;
  padding: 0;
  font-size: 12px;
  font-weight: 700;
  color: var(--accent);
  cursor: pointer;
}

.mosaic-header-link-btn:hover {
  text-decoration: underline;
}

/* ============================================================
   KHỐI GẬP "CẤU HÌNH CHI TIẾT" — 21/08/2026, dùng cho tab "Trang sản phẩm"
   (bọc TabCauHinhGiaoDien) — chỉ là tuỳ chỉnh THÊM cho khối "Danh sách sản
   phẩm", không phải nội dung chính, nên gập lại ở cuối trang, bấm mới xổ ra.
   Cùng kỹ thuật <details> native với .perm-group (Pages/Staff), KHÁC ở chỗ
   đây là khối ĐỘC LẬP (card riêng) chứ không phải một dòng trong danh sách.
============================================================ */
.theme-edit-advanced {
  margin-top: 24px;
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  background: var(--surface);
  overflow: hidden;
}

.theme-edit-advanced-header {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 14px 18px;
  cursor: pointer;
  list-style: none;
  user-select: none;
}
.theme-edit-advanced-header::-webkit-details-marker {
  display: none;
}
.theme-edit-advanced-header:hover {
  background: var(--surface-2);
}
.theme-edit-advanced-header > .fa-sliders-h {
  color: var(--muted-foreground);
}

.theme-edit-advanced-title {
  font-weight: 600;
  flex: 1;
}

.theme-edit-advanced-chevron {
  font-size: 12px;
  color: var(--muted-foreground);
  transition: transform 0.15s ease;
}
.theme-edit-advanced[open] .theme-edit-advanced-chevron {
  transform: rotate(90deg);
}

.theme-edit-advanced-body {
  border-top: 1px solid var(--border);
  padding: 18px;
}

/* ============================================================
   PAGE QUẢN LÝ TRANG TUỲ CHỈNH
   Razor: Pages/Website/PageQuanLyTrang.razor
   Danh sách trang tuỳ chỉnh kiểu WordPress + form tạo trang inline.
============================================================ */
/* Card bao quanh form "Tạo trang mới" — mở ngay dưới nút, trước danh sách. */
.create-page-form {
  margin-bottom: 16px;
}

/* Đường dẫn dự kiến hiện khi gõ Tên trang — chỉ preview, server mới sinh slug thật. */
.create-page-slug-preview {
  margin: 0;
  font-size: 12.5px;
  color: var(--muted-foreground);
}

.create-page-slug-preview b {
  color: var(--foreground);
  font-weight: 600;
}

/* Cột "Thao tác" của bảng danh sách — cùng khuôn với .blog-actions (_page-blog.scss)
   nhưng khai RIÊNG ở đây theo quy tắc "page lớn tách file riêng", không tái dùng class
   của trang khác. */
.page-list-actions {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 2px;
}

/* ============================================================
   PAGE CHỈNH SỬA TRANG TUỲ CHỈNH (STUDIO EDITOR LAYOUT)
   Razor: Pages/Website/PageChinhSuaTrang.razor
   Topnav + Sidebar + Sticky Action Bar + Grid 8:4 System.
============================================================ */
/* Topnav trên cùng toàn màn hình */
.theme-editor-topnav {
  height: 56px;
  background: var(--surface);
  border-bottom: 1px solid var(--border);
  padding: 0 24px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  position: sticky;
  top: 0;
  z-index: 100;
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
}

.topnav-brand {
  display: flex;
  align-items: center;
  gap: 12px;
}

.topnav-logo {
  display: flex;
  align-items: center;
  gap: 8px;
  font-size: 16px;
  font-weight: 700;
  color: var(--accent);
  text-decoration: none;
}

.topnav-badge {
  font-size: 11px;
  font-weight: 600;
  padding: 2px 8px;
  border-radius: 999px;
  background: var(--accent-subtle);
  color: var(--accent);
  text-transform: uppercase;
}

.topnav-actions .topnav-link {
  display: flex;
  align-items: center;
  gap: 6px;
  font-size: 13px;
  font-weight: 500;
  color: var(--muted-foreground);
  text-decoration: none;
  transition: color 0.15s ease;
}

.topnav-actions .topnav-link:hover {
  color: var(--foreground);
}

/* Thân layout: Sidebar (trái) + Main Area (phải) */
.theme-editor-container {
  display: flex;
  flex: 1;
  min-height: calc(100vh - 56px);
}

.theme-edit-sidebar-wrap {
  width: 240px;
  flex-shrink: 0;
  position: sticky;
  background: var(--surface);
  border-right: 1px solid var(--border);
  padding: 16px 12px;
}
@media (max-width: 900px) {
  .theme-edit-sidebar-wrap {
    display: none;
  }
}

.theme-edit-main-area {
  flex: 1;
  min-width: 0;
  background: var(--background);
  display: flex;
  flex-direction: column;
}

/* Sticky Action Bar ở trên cùng của Main Area */
.sticky-action-bar {
  position: sticky;
  top: 0;
  z-index: 90;
  background: var(--surface);
  border-bottom: 1px solid var(--border);
  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
  padding: 14px 24px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
}

.action-bar-left {
  display: flex;
  flex-direction: column;
  gap: 2px;
}

.action-bar-title {
  margin: 0;
  font-size: 18px;
  font-weight: 700;
  color: var(--foreground);
}

.action-bar-subtitle {
  font-size: 12.5px;
  color: var(--muted-foreground);
}

.action-bar-right {
  display: flex;
  align-items: center;
  gap: 12px;
}

/* Container chứa Grid System 8:4 */
.main-grid-container {
  padding: 14px;
  flex: 1;
}

.grid-layout-8-4 {
  display: grid;
  gap: 24px;
  align-items: start;
}
@media (max-width: 1024px) {
  .grid-layout-8-4 {
    grid-template-columns: 1fr;
  }
}

.grid-main-8 {
  display: flex;
  flex-direction: column;
  gap: 24px;
  min-width: 0;
}

.editor-card {
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius);
  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);
}

/* Ô Slug có prefix /trang/ */
.input-prefix-group {
  display: flex;
  align-items: stretch;
}
.input-prefix-group .input {
  border-top-left-radius: 0;
  border-bottom-left-radius: 0;
}

.input-prefix-label {
  display: flex;
  align-items: center;
  padding: 0 10px;
  border: 1px solid var(--border);
  border-right: 0;
  border-top-left-radius: var(--radius);
  border-bottom-left-radius: var(--radius);
  background: var(--surface-2);
  color: var(--muted-foreground);
  font-size: 13.5px;
  white-space: nowrap;
}

/* Cấu hình SEO collapsible */
.seo-collapsible-toggle {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  border: 0;
  background: transparent;
  padding: 0;
  font-size: 14px;
  font-weight: 600;
  color: var(--foreground);
  cursor: pointer;
  text-align: left;
}

.seo-collapsible-body {
  margin-top: 16px;
}

.sections-subheader {
  margin-bottom: 16px;
}

.sections-subheader-title {
  font-size: 15px;
}

/* ============================================================
   MENU ĐIỀU HƯỚNG — mục "Menu điều hướng" trong /giao-dien/chinh-sua
   Razor: Pages/Website/PageChinhSuaTheme.razor (dời từ ~~PageMenu.razor~~,
          đã xoá 18/08/2026 — gộp vào trang Chỉnh sửa giao diện cho đỡ phải
          nhảy 2 trang riêng),
          Pages/Website/Components/MenuItemNode.razor

   Vị trí menu chọn bằng DẢI PILL NGANG phía trên khung nội dung (không phải cột
   sidebar riêng) — 18/08/2026 (đợt sau), user thấy 3-cột chỉ riêng mục Menu (khác
   mọi mục kia đều 2 cột) gây rối, đổi sang dải pill để giữ bố cục nhất quán với
   phần còn lại của trang.

   Toàn bộ màu lấy từ token của `_variables.scss` nên chế độ tối tự đúng theo.
============================================================ */
.menu-position-tabs {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  gap: 8px;
  margin-bottom: 16px;
}

.menu-position-pill {
  padding: 8px 16px;
  border: 1px solid var(--border);
  border-radius: 999px;
  background: var(--surface);
  color: var(--muted-foreground);
  font-size: 13px;
  font-weight: 500;
  cursor: pointer;
  transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}

.menu-position-pill:hover {
  border-color: var(--border-strong);
  color: var(--foreground);
}

.menu-position-pill.is-active {
  background: var(--accent-subtle);
  border-color: var(--accent);
  color: var(--accent);
}

.menu-position-pill-add {
  border-style: dashed;
}

.menu-position-pill-add:hover {
  border-color: var(--accent);
  color: var(--accent);
}

.menu-position-pill-form {
  display: flex;
  align-items: center;
  gap: 6px;
}

.menu-position-pill-wrap {
  display: flex;
  align-items: center;
  gap: 2px;
}

.menu-position-pill-edit {
  width: 26px;
  height: 26px;
  font-size: 11px;
}

.menu-position-role-badge {
  margin-left: 6px;
  padding: 1px 8px;
  border-radius: 999px;
  background: var(--surface-2);
  color: var(--muted-foreground);
  font-size: 11px;
  font-weight: 600;
}

.menu-position-pill.is-active .menu-position-role-badge {
  background: var(--accent);
  color: var(--accent-foreground);
}

.menu-content-toolbar {
  display: flex;
  justify-content: flex-end;
  margin-bottom: 16px;
}

/* ---- Cây mục menu (MenuItemNode.razor, tự đệ quy theo cấp) ---- */
.menu-node {
  border-top: 1px solid var(--border);
}

.menu-node:first-child {
  border-top: none;
}

.menu-node-header {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 4px;
  cursor: pointer;
  user-select: none;
}

.menu-node-header.is-open {
  background: var(--surface-2);
  border-radius: calc(var(--radius) - 2px);
}

.menu-node-drag {
  flex-shrink: 0;
  color: var(--muted-foreground-2);
  font-size: 12px;
  cursor: grab;
}

.menu-node-title {
  display: flex;
  align-items: center;
  gap: 8px;
  flex: 1;
  min-width: 0;
  font-weight: 500;
  color: var(--foreground);
  font-size: 13.5px;
}

.menu-node-title.menu-node-hidden {
  color: var(--muted-foreground-2);
  text-decoration: line-through;
  text-decoration-color: var(--muted-foreground-2);
}

.menu-node-title-text {
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

.menu-node-type {
  flex-shrink: 0;
  font-size: 10.5px;
  padding: 2px 7px;
}

.menu-node-actions {
  flex-shrink: 0;
  display: flex;
  align-items: center;
  gap: 2px;
}

.btn-icon-ghost {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 26px;
  height: 26px;
  border: none;
  border-radius: calc(var(--radius) - 3px);
  background: transparent;
  color: var(--muted-foreground);
  font-size: 12px;
  cursor: pointer;
  transition: background 0.15s ease, color 0.15s ease;
}

.btn-icon-ghost:hover {
  background: var(--surface-2);
  color: var(--foreground);
}

.btn-icon-ghost-danger:hover {
  background: var(--danger-subtle);
  color: var(--danger);
}

.menu-node-body {
  padding: 12px 12px 16px 32px;
  margin-bottom: 8px;
  border-radius: calc(var(--radius) - 2px);
  background: var(--surface-2);
}

.menu-node-form-actions {
  display: flex;
  gap: 8px;
  margin-top: 4px;
  justify-content: end;
}

/* ---- Ô tìm Sản phẩm/Bài viết theo tên (LinkType 3/5) — thay ô nhập ID tay,
   18/08/2026 (đợt sau cùng) ---- */
.menu-ref-selected {
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 10px;
  border: 1px solid var(--border);
  border-radius: calc(var(--radius) - 2px);
  background: var(--surface);
  font-size: 13px;
}

.menu-ref-selected i:first-child {
  color: var(--muted-foreground);
}

.menu-ref-selected span {
  flex: 1;
  font-weight: 500;
}

.menu-ref-search-results {
  margin-top: 4px;
  max-height: 220px;
  overflow-y: auto;
  border: 1px solid var(--border);
  border-radius: calc(var(--radius) - 2px);
  background: var(--surface);
}

.menu-ref-search-results li {
  border-bottom: 1px solid var(--border);
}

.menu-ref-search-results li:last-child {
  border-bottom: none;
}

.menu-ref-search-results li button {
  display: block;
  width: 100%;
  padding: 8px 10px;
  border: none;
  background: transparent;
  text-align: left;
  font-size: 13px;
  color: var(--foreground);
  cursor: pointer;
}

.menu-ref-search-results li button:hover {
  background: var(--surface-2);
}

/* ============================================================
   THÔNG BÁO — danh sách hộp thư + chuông trên header
   Razor: Pages/Notification/PageThongBao.razor
          Pages/Notification/PageThongBaoKhachHang.razor
          Layout/NotificationBell.razor
============================================================ */
/* ---- Danh sách thông báo ---- */
.notif-list {
  margin: 0;
  padding: 0;
  list-style: none;
}

.notif-item {
  display: flex;
  align-items: flex-start;
  gap: 12px;
  padding: 14px 20px;
  border-bottom: 1px solid var(--border);
  cursor: pointer;
  transition: background var(--transition);
  /* Chưa đọc: nền nhấn NHẸ + tiêu đề đậm. Không dùng màu mạnh — cả danh sách lúc mới
     mở thường chưa đọc hết, tô đậm quá thì thành một mảng màu chứ không còn là dấu nhắc. */
}
.notif-item:last-child {
  border-bottom: 0;
}
.notif-item:hover {
  background: var(--surface-2);
}
.notif-item.is-unread {
  background: var(--accent-subtle);
}
.notif-item.is-unread .notif-title {
  font-weight: 600;
  color: var(--foreground);
}
.notif-item.is-unread:hover {
  background: var(--accent-subtle-hover);
}

.notif-icon {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
  width: 34px;
  height: 34px;
  border-radius: 50%;
  background: var(--surface-2);
  color: var(--accent);
  font-size: 14px;
}

.notif-body {
  display: flex;
  flex-direction: column;
  gap: 3px;
  min-width: 0;
  flex: 1;
}

.notif-title {
  font-size: 14px;
  font-weight: 500;
  color: var(--foreground);
}

.notif-content {
  font-size: 13px;
  line-height: 1.5;
  color: var(--muted-foreground);
}

.notif-time {
  font-size: 11.5px;
  color: var(--muted-foreground-2);
}

/* Chấm tròn cuối dòng — dấu "chưa đọc" thứ hai bên cạnh nền nhấn, để người phân biệt
   màu kém vẫn nhận ra (nền nhấn rất nhạt). */
.notif-dot {
  flex-shrink: 0;
  width: 9px;
  height: 9px;
  margin-top: 6px;
  border-radius: 50%;
  background: var(--accent);
}

/* Dòng gợi ý dưới trạng thái rỗng — nói KHI NÀO sẽ có thông báo */
.table-empty-hint {
  margin-top: 6px;
  font-size: 12.5px;
  color: var(--muted-foreground-2);
}

/* ---- Chuông trên header ---- */
.notif-bell {
  /* Mốc định vị cho con số — .topnav-icon-btn không có position riêng */
  position: relative;
}

.notif-bell-badge {
  position: absolute;
  top: 2px;
  right: 2px;
  display: flex;
  align-items: center;
  justify-content: center;
  min-width: 16px;
  height: 16px;
  padding: 0 4px;
  border-radius: 999px;
  background: var(--danger);
  color: #fff;
  font-size: 10px;
  font-weight: 700;
  line-height: 1;
  /* Viền cùng màu nền header: con số đè lên icon chuông, không có viền thì hai thứ
     dính vào nhau thành một khối khó đọc. */
  border: 2px solid var(--surface);
  pointer-events: none;
}

/* ============================================================
   PAGE KHUYẾN MÃI — Styles riêng cho trang mã khuyến mãi
   Razor: Pages/Voucher/PageKhuyenMai.razor
   Bao gồm: ModalKhuyenMai (component chỉ dùng trong trang này).
   Bảng/modal/nút/badge dùng class chung ở _components.scss.

   Màu lấy hết từ biến của _variables.scss nên sáng/tối đều đọc được —
   không cắm mã màu cứng ở đây.
============================================================ */
/* Dải nhắc "ô nhập mã ở storefront chưa nối" ngay dưới tiêu đề trang */
.voucher-notice {
  margin-bottom: 16px;
}

.voucher-notice-icon {
  flex-shrink: 0;
}

/* Chuỗi mã ở cột đầu — cho chữ đều nét như mã đơn, dễ đối chiếu khi khách đọc mã */
.voucher-code {
  display: inline-block;
  padding: 2px 8px;
  border: 1px solid var(--border);
  border-radius: 6px;
  background: var(--surface-2);
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
  font-size: 12.5px;
  font-weight: 600;
  letter-spacing: 0.02em;
  color: var(--foreground);
}

/* Cụm 3 nút ở cột Thao tác — sát nhau, không xuống dòng khi bảng hẹp */
.voucher-actions {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 2px;
}

/* Công tắc đang BẬT tô màu nhấn để phân biệt ngay với nút tắt (xám) */
.voucher-toggle-on {
  color: var(--success);
}

/* Ô nhập mã trong modal: gõ chữ nào ra chữ hoa luôn cho khớp thứ server sẽ lưu.
   ⚠️ Chỉ đổi phần HIỆN, giá trị gửi lên vẫn nguyên văn — server mới là nơi chuẩn hoá. */
.voucher-code-input {
  text-transform: uppercase;
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
  letter-spacing: 0.02em;
}

/* Ô mô tả — thấp thôi, đây là ghi chú nội bộ chứ không phải nội dung dài */
.voucher-description {
  min-height: 60px;
  resize: vertical;
}

/* ============================================================
   PHẠM VI ÁP DỤNG & KHÁCH ĐƯỢC DÙNG (12/08/2026)
   Razor: Pages/Voucher/Components/ModalKhuyenMai.razor

   Viên chữ cho danh mục / sản phẩm / khách đã chọn. Cùng dáng với `.tag-chip` của khối
   Thuộc tính sản phẩm nhưng KHÔNG dùng lại class đó: bên kia nằm trong một khung nhập
   liệu (`.tag-input`), bên này đứng rời dưới ô chọn.
============================================================ */
.scope-chips {
  display: flex;
  flex-wrap: wrap;
  gap: 6px;
  margin-top: 8px;
}

.scope-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  max-width: 100%;
  padding: 4px 8px;
  border: 1px solid var(--border);
  border-radius: var(--radius-sm);
  background: var(--surface-2);
  color: var(--foreground);
  font-size: 12.5px;
  line-height: 1.4;
  /* Tên sản phẩm dài không được đẩy modal rộng ra */
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
.scope-chip i {
  flex-shrink: 0;
  color: var(--muted-foreground-2);
  font-size: 11px;
}

.scope-chip-remove {
  flex-shrink: 0;
  padding: 0 2px;
  border: 0;
  background: none;
  color: var(--muted-foreground-2);
  font-size: 15px;
  line-height: 1;
  cursor: pointer;
}
.scope-chip-remove:hover {
  color: var(--danger);
}

/* ============================================================
   PAGE BLOG — Styles riêng cho blog ở phân hệ quản trị
   Razor: Pages/Blog/PageBlog.razor · PageTaoBaiViet.razor
   Bao gồm: HtmlEditor · ThumbnailPicker · ModalDanhMucBlog
            (component chỉ dùng trong khu vực này).
   Bảng/modal/nút/badge dùng class chung ở _components.scss.

   Màu lấy hết từ biến của _variables.scss nên sáng/tối đều đọc được —
   không cắm mã màu cứng ở đây.
============================================================ */
/* ---- Bảng danh sách bài viết ---- */
.blog-th-thumb {
  width: 72px;
}

.blog-th-order {
  width: 80px;
}

/* Ô ảnh bìa ở bảng — khổ cố định để mọi dòng cao bằng nhau dù ảnh gốc mọi tỉ lệ */
.blog-row-thumb {
  display: block;
  width: 56px;
  height: 40px;
  border-radius: 6px;
  object-fit: cover;
  background: var(--surface-2);
}

/* Bài KHÔNG có ảnh bìa: ô giữ chỗ có icon, không phải khung ảnh vỡ */
.blog-row-thumb--empty {
  display: flex;
  align-items: center;
  justify-content: center;
  border: 1px dashed var(--border);
  color: var(--muted-foreground-2);
  font-size: 14px;
}

.blog-actions {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  gap: 2px;
}

/* ---- Trang tạo/sửa bài viết ---- */
/* Hai cột: nội dung bài rộng, cột phải là các thẻ điều khiển.
   Cột phải 320px cố định — hẹp hơn thì ô ngày và ô chọn danh mục bị bó. */
.blog-form-layout {
  display: grid;
  grid-template-columns: minmax(0, 1fr) 320px;
  gap: 16px;
  align-items: start;
}

.blog-form-main,
.blog-form-side {
  display: flex;
  flex-direction: column;
  gap: 16px;
  /* minmax(0, 1fr) ở trên + min-width 0 ở đây để textarea dài không đẩy giãn cột */
  min-width: 0;
}

.blog-form-actions {
  display: flex;
  align-items: center;
  gap: 8px;
}

/* Màn hẹp: về một cột, cột điều khiển xuống dưới nội dung */
@media (max-width: 1100px) {
  .blog-form-layout {
    grid-template-columns: 1fr;
  }
}
/* Ô tóm tắt / mô tả SEO — thấp, cho kéo cao thêm khi cần */
.blog-excerpt-input {
  min-height: 60px;
  resize: vertical;
}

/* ---- HtmlEditor (Pages/Blog/Components/HtmlEditor.razor) ---- */
.html-editor {
  display: flex;
  flex-direction: column;
  gap: 8px;
}

.html-editor-toolbar {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 4px;
  padding: 6px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: var(--surface-2);
}

/* Đẩy nút "Xem trước" sang mép phải, tách khỏi nhóm nút định dạng */
.html-editor-toolbar-gap {
  flex: 1;
}

.html-editor-btn {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  min-width: 32px;
  height: 32px;
  padding: 0 8px;
  border: 1px solid transparent;
  border-radius: 6px;
  background: transparent;
  color: var(--muted-foreground);
  font-size: 13px;
  cursor: pointer;
}
.html-editor-btn:hover:not(:disabled) {
  background: var(--surface);
  border-color: var(--border);
  color: var(--foreground);
}
.html-editor-btn:disabled {
  opacity: 0.5;
  cursor: default;
}
.html-editor-btn.is-active {
  background: var(--accent-subtle);
  border-color: transparent;
  color: var(--accent);
}

.html-editor-btn-text {
  font-size: 12.5px;
  font-weight: 600;
}

.html-editor-textarea {
  min-height: 320px;
  /* Nội dung là HTML thô: chữ đều nét thì đếm thẻ và tìm chỗ sai dễ hơn nhiều */
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, monospace;
  font-size: 13px;
  line-height: 1.6;
  resize: vertical;
}

/* Bản xem trước — dựng lại khoảng cách của thẻ HTML, vì reset chung đã bỏ hết
   margin mặc định của h2/h3/p/ul. Không dựng lại thì bản xem trước dính liền một
   khối và không nói được gì về bố cục thật. */
.html-editor-preview {
  min-height: 320px;
  padding: 16px;
  border: 1px solid var(--border);
  border-radius: 8px;
  background: var(--surface);
  color: var(--foreground);
  line-height: 1.7;
  overflow-wrap: break-word;
}
.html-editor-preview h2 {
  margin: 20px 0 8px;
  font-size: 20px;
  font-weight: 600;
}
.html-editor-preview h3 {
  margin: 16px 0 6px;
  font-size: 17px;
  font-weight: 600;
}
.html-editor-preview h4 {
  margin: 14px 0 6px;
  font-size: 15px;
  font-weight: 600;
}
.html-editor-preview p {
  margin: 0 0 12px;
}
.html-editor-preview ul, .html-editor-preview ol {
  margin: 0 0 12px;
  padding-left: 22px;
}
.html-editor-preview li {
  margin-bottom: 4px;
}
.html-editor-preview blockquote {
  margin: 0 0 12px;
  padding: 6px 0 6px 14px;
  border-left: 3px solid var(--border);
  color: var(--muted-foreground);
}
.html-editor-preview img {
  max-width: 100%;
  height: auto;
  border-radius: 8px;
}
.html-editor-preview a {
  color: var(--accent);
  text-decoration: underline;
}
.html-editor-preview table {
  width: 100%;
  margin-bottom: 12px;
  border-collapse: collapse;
}
.html-editor-preview th, .html-editor-preview td {
  padding: 6px 10px;
  border: 1px solid var(--border);
  text-align: left;
}

.html-editor-preview-empty {
  color: var(--muted-foreground-2);
}

/* ---- ThumbnailPicker (Pages/Blog/Components/ThumbnailPicker.razor) ---- */
.thumbnail-picker {
  display: flex;
  flex-direction: column;
  gap: 12px;
}

.thumbnail-picker-preview {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
  gap: 8px;
}

.thumbnail-picker-img {
  width: 100%;
  max-height: 180px;
  border: 1px solid var(--border);
  border-radius: 8px;
  object-fit: cover;
}

/* Đường dẫn hỏng: nói thành lời thay vì để trình duyệt vẽ khung ảnh vỡ */
.thumbnail-picker-broken {
  display: flex;
  align-items: center;
  gap: 8px;
  width: 100%;
  padding: 16px;
  border: 1px dashed var(--border);
  border-radius: 8px;
  color: var(--muted-foreground);
  font-size: 13px;
}

/* ============================================================
   PAGE ĐÁNH GIÁ SẢN PHẨM — màn duyệt đánh giá của chủ shop
   Razor: Pages/Review/PageDanhGiaSanPham.razor
   Bao gồm: ModalTraLoiDanhGia (component chỉ dùng trong trang này).
   Tabs/badge/nút/phân trang dùng class chung ở _components.scss.

   ⚠️ KHÔNG dựng dạng BẢNG: nội dung đánh giá dài ngắn thất thường, nhồi vào một ô
   `<td>` thì hoặc bị cắt cụt (không đọc nổi để quyết định duyệt) hoặc kéo dòng cao
   vống lên phá nhịp bảng. Dùng danh sách THẺ, mỗi đánh giá một khối.
============================================================ */
.review-list {
  display: flex;
  flex-direction: column;
}

.review-item {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 16px 18px;
}
.review-item + .review-item {
  border-top: 1px solid var(--border);
}

.review-item-head {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 10px;
}

.review-stars {
  display: inline-flex;
  gap: 2px;
  font-size: 13px;
}
.review-stars .is-on {
  color: #f59e0b;
}
.review-stars .is-off {
  color: var(--border-strong);
}

.review-customer {
  font-weight: 600;
  font-size: 13.5px;
  color: var(--foreground);
}

.review-date {
  font-size: 12px;
  color: var(--muted-foreground-2);
}

/* Nhãn "đã sửa" — khách đổi nội dung một bài có thể đã duyệt trước đó, đáng đọc kỹ
   hơn bài mới nên phải nổi lên chứ không lẫn vào chữ xám. */
.review-edited {
  padding: 1px 7px;
  border-radius: 999px;
  background: var(--warning-subtle);
  color: var(--warning);
  font-size: 11px;
  font-weight: 600;
}

.review-product {
  font-size: 12.5px;
  color: var(--accent);
  text-decoration: none;
}
.review-product:hover {
  text-decoration: underline;
}

.review-content {
  margin: 0;
  font-size: 13.5px;
  line-height: 1.65;
  color: var(--foreground);
  /* Nhận xét dán từ chỗ khác có thể là một chuỗi dài không dấu cách */
  overflow-wrap: anywhere;
  white-space: pre-line;
}

.review-content--empty {
  color: var(--muted-foreground-2);
  font-style: italic;
}

/* Ảnh khách đính kèm — chủ shop cần thấy trước khi duyệt */
.review-images {
  display: flex;
  flex-wrap: wrap;
  gap: 8px;
}

.review-image-thumb {
  width: 64px;
  height: 64px;
  border-radius: var(--radius-sm);
  border: 1px solid var(--border);
  object-fit: cover;
}

/* Câu trả lời của shop — thụt vào + vạch trái để tách khỏi lời khách */
.review-reply {
  margin-top: 2px;
  padding: 10px 12px;
  border-left: 3px solid var(--accent);
  border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
  background: var(--surface-2);
}

.review-reply-label {
  display: block;
  margin-bottom: 4px;
  font-size: 12px;
  font-weight: 600;
  color: var(--accent);
}

.review-reply-content {
  margin: 0;
  font-size: 13px;
  line-height: 1.6;
  color: var(--muted-foreground);
  overflow-wrap: anywhere;
  white-space: pre-line;
}

.review-actions {
  display: flex;
  align-items: center;
  flex-wrap: wrap;
  gap: 8px;
  margin-top: 4px;
}

/* ---- ModalTraLoiDanhGia ---- */
/* Trích lại lời khách trong modal — chủ shop khỏi phải nhớ đang trả lời cái gì */
.reply-quote {
  padding: 12px 14px;
  border: 1px solid var(--border);
  border-radius: var(--radius);
  background: var(--surface-2);
}

.reply-quote-head {
  display: flex;
  align-items: center;
  gap: 10px;
  margin-bottom: 6px;
}

.reply-quote-content {
  margin: 0;
  font-size: 13px;
  line-height: 1.6;
  color: var(--foreground);
  overflow-wrap: anywhere;
  white-space: pre-line;
}

.reply-quote-content--empty {
  color: var(--muted-foreground-2);
  font-style: italic;
}

.reply-content-input {
  min-height: 96px;
  resize: vertical;
}

/* ============================================================
   PAGE 404 — Không tìm thấy trang (shadcn look)
   Nút dùng class .btn .btn-primary / .btn .btn-outline từ _components.
============================================================ */
.page-404 {
  display: flex;
  align-items: center;
  justify-content: center;
  min-height: calc(100vh - var(--topnav-height) - 80px);
  padding: 24px;
}
.page-404 .p404-box {
  max-width: 420px;
  width: 100%;
  padding: 40px 32px;
  text-align: center;
  background: var(--surface);
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-sm);
}
.page-404 .p404-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 56px;
  height: 56px;
  margin-bottom: 20px;
  font-size: 22px;
  color: var(--accent);
  background: var(--accent-subtle);
  border-radius: var(--radius-lg);
}
.page-404 .p404-code {
  font-size: 44px;
  font-weight: 600;
  line-height: 1;
  letter-spacing: -0.03em;
  color: var(--foreground);
}
.page-404 .p404-title {
  margin: 10px 0 8px;
  font-size: 18px;
  font-weight: 600;
}
.page-404 .p404-desc {
  margin-bottom: 24px;
  font-size: 13.5px;
  line-height: 1.6;
  color: var(--muted-foreground);
}
.page-404 .p404-actions {
  display: flex;
  justify-content: center;
  gap: 10px;
  flex-wrap: wrap;
}

/* =========================================
   MARGIN TOP (Khoảng cách phía trên)
   ========================================= */
.mt-0 {
  margin-top: 0px !important;
}

.mt-1 {
  margin-top: 4px !important;
}

.mt-2 {
  margin-top: 8px !important;
}

.mt-3 {
  margin-top: 12px !important;
}

.mt-4 {
  margin-top: 16px !important;
}

.mt-5 {
  margin-top: 20px !important;
}

.mt-6 {
  margin-top: 24px !important;
}

.mt-8 {
  margin-top: 32px !important;
}

.mt-10 {
  margin-top: 40px !important;
}

/* =========================================
   MARGIN BOTTOM (Khoảng cách phía dưới)
   ========================================= */
.mb-0 {
  margin-bottom: 0px !important;
}

.mb-1 {
  margin-bottom: 4px !important;
}

.mb-2 {
  margin-bottom: 8px !important;
}

.mb-3 {
  margin-bottom: 12px !important;
}

.mb-4 {
  margin-bottom: 16px !important;
}

.mb-5 {
  margin-bottom: 20px !important;
}

.mb-6 {
  margin-bottom: 24px !important;
}

.mb-8 {
  margin-bottom: 32px !important;
}

.mb-10 {
  margin-bottom: 40px !important;
}

/* =========================================
   FONT SIZE (Kích thước chữ)
   ========================================= */
.fs-10 {
  font-size: 10px !important;
}

.fs-11 {
  font-size: 11px !important;
}

.fs-12 {
  font-size: 12px !important;
}

.fs-13 {
  font-size: 13px !important;
}

.fs-14 {
  font-size: 14px !important;
}

/* Cỡ chữ mặc định chuẩn */
.fs-15 {
  font-size: 15px !important;
}

.fs-16 {
  font-size: 16px !important;
}

.fs-18 {
  font-size: 18px !important;
}

.fs-20 {
  font-size: 20px !important;
}

.fs-24 {
  font-size: 24px !important;
}

.fs-28 {
  font-size: 28px !important;
}

.fs-32 {
  font-size: 32px !important;
}

/* =========================================
   TEXT ALIGNMENT (Căn chỉnh văn bản)
   ========================================= */
.text-left {
  text-align: left !important;
}

.text-center {
  text-align: center !important;
}

.text-right {
  text-align: right !important;
}

.text-justify {
  text-align: justify !important;
}

/* =========================================
   PADDING (Khoảng cách nệm)
   ========================================= */
/* Trục Y (Top & Bottom) */
.py-1 {
  padding-top: 4px !important;
  padding-bottom: 4px !important;
}

.py-2 {
  padding-top: 8px !important;
  padding-bottom: 8px !important;
}

.py-3 {
  padding-top: 12px !important;
  padding-bottom: 12px !important;
}

/* Trục X (Left & Right) */
.px-1 {
  padding-left: 4px !important;
  padding-right: 4px !important;
}

.px-2 {
  padding-left: 8px !important;
  padding-right: 8px !important;
}

.px-3 {
  padding-left: 12px !important;
  padding-right: 12px !important;
}

/* Toàn bộ 4 hướng */
.p-2 {
  padding: 8px !important;
}

.p-3 {
  padding: 12px !important;
}

.p-4 {
  padding: 16px !important;
}

/* =========================================
   FONT WEIGHT (Độ đậm nhạt)
   ========================================= */
.fw-light {
  font-weight: 300 !important;
}

.fw-normal {
  font-weight: 400 !important;
}

/* Mặc định */
.fw-medium {
  font-weight: 500 !important;
}

/* Đậm vừa - hay dùng cho tiêu đề phụ */
.fw-semibold {
  font-weight: 600 !important;
}

/* Khá đậm */
.fw-bold {
  font-weight: 700 !important;
}

/* Rất đậm - dùng cho Tổng tiền, Tên người dùng */
/* =========================================
   FLEXBOX & ALIGNMENT
   ========================================= */
.d-flex {
  display: flex !important;
}

/* Căn giữa theo chiều dọc (Rất hay dùng để icon và text không bị lệch nhau) */
.align-items-center {
  align-items: center !important;
}

/* Đẩy 2 phần tử ra 2 đầu (VD: Chữ "Tổng tiền" ở rìa trái, Số tiền ở rìa phải) */
.justify-content-between {
  justify-content: space-between !important;
}

/* Căn giữa toàn bộ theo chiều ngang */
.justify-content-center {
  justify-content: center !important;
}

/* Khoảng cách đều giữa các phần tử bên trong khối Flex */
.gap-1 {
  gap: 4px !important;
}

.gap-2 {
  gap: 8px !important;
}

.gap-3 {
  gap: 12px !important;
}

/* =========================================
   TEXT COLORS (Màu chữ trạng thái)
   ========================================= */
/* Màu xanh lá: Đã thanh toán, Giao hàng thành công, Tồn kho còn hàng */
.text-success {
  color: #16a34a !important;
}

/* Màu đỏ: Hủy đơn, Lỗi thanh toán, Hết hàng, Xóa dữ liệu */
.text-danger {
  color: #dc2626 !important;
}

/* Màu vàng cam: Chờ xử lý, Đang giao hàng, Công nợ */
.text-warning {
  color: #d97706 !important;
}

/* Màu xanh dương: Thông tin thêm, Đơn mới tạo, Link bấm được */
.text-info {
  color: #2563eb !important;
}

/* Màu xám nhạt: Chữ phụ, Ghi chú, Text bị vô hiệu hóa (Disabled) */
.text-muted {
  color: #6b7280 !important;
}

/* =========================================
   BACKGROUND COLORS (Màu nền)
   ========================================= */
.bg-success {
  background-color: #16a34a !important;
  color: white !important;
}

.bg-danger {
  background-color: #dc2626 !important;
  color: white !important;
}

.bg-warning {
  background-color: #f59e0b !important;
  color: white !important;
}

.bg-info {
  background-color: #3b82f6 !important;
  color: white !important;
}

.bg-muted {
  background-color: #f3f4f6 !important;
  color: #374151 !important;
}

/* =========================================
   BADGE & TAG COLORS (Nền nhạt + Chữ đậm)
   ========================================= */
/* Thường dùng kết hợp với .px-2 .py-1 và border-radius */
.badge-success {
  background-color: #dcfce7 !important;
  color: #166534 !important;
}

.badge-danger {
  background-color: #fee2e2 !important;
  color: #991b1b !important;
}

.badge-warning {
  background-color: #fef3c7 !important;
  color: #92400e !important;
}

.badge-info {
  background-color: #dbeafe !important;
  color: #1e40af !important;
}

/*# sourceMappingURL=data:application/json;charset=utf-8,%7B%22version%22:3,%22sourceRoot%22:%22%22,%22sources%22:%5B%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/common-all.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_variables.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_components.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_layout.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_app-shell.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_date-range.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-dashboard.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-dang-nhap.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-mat-khau.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-goi-dich-vu.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-thanh-toan-goi.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-san-pham.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-danh-muc.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-kho-hang.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-nhan-vien.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-don-hang.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-cau-hinh.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-ten-mien.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-giao-dien.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-chinh-sua-theme.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-quan-ly-trang.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-chinh-sua-trang.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-menu-dieu-huong.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-thong-bao.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-khuyen-mai.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-blog.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-danh-gia.scss%22,%22file:///C:/DaiVietSo/SaaS/HoKinhDoanh/Solution/WebAdmin/Vinahelp.HKD.Admin.Blazor/Vinahelp.HKD.Admin.Client/Themes/Common/_page-404.scss%22%5D,%22names%22:%5B%5D,%22mappings%22:%22;AAAC;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;ACAD;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AA+FA;AACA;AACI;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EAEA;AAEA;EACA;EACA;EACA;EAEA;EACA;;;AAGJ;AACA;EA9GI;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;AACA;AAAA;AAAA;EAGA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAsEJ;AACA;EACI;IApEA;IAEA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;IACA;IACA;IACA;IACA;IAEA;IACA;AACA;AAAA;IAEA;IAEA;IACA;IACA;IACA;IACA;IACA;;;AAmCJ;AACA;EAtHI;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;AACA;AAAA;AAAA;EAGA;AAEA;EACA;EACA;EACA;EACA;EACA;EACA;;;AA6EJ;EAzEI;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;AACA;AAAA;EAEA;EAEA;EACA;EACA;EACA;EACA;EACA;;;AC5FH;AAAA;AAAA;AAGD;EAAyB;;;AAEzB;EAAa;EAAc;EAAW;;;AAEtC;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EAAI;EAAgB;;;AAEpB;EAAc;;;AAEd;AACA;EAAsB;EAAa;;;AACnC;EACI;EACA;EACA;EACA;;AACA;EAAU;EAAuC;;;AAErD;EAA4B;;;AAE5B;AACA;EACI;EACA;EACA;EACA;EAEA;;;AAGJ;EAAc;EAAiB;EAAkB;;;AACjD;EAAiB;EAAiB;EAAmB;;;AACrD;EAAsB;EAAe;EAAqB;EAAU;;;AAEpE;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAKA;;AAHA;EAAkB;EAAgC;;AAClD;EAAI;;AAGJ;EACI;EACA;;;AAIR;EAAe;EAA2B;;;AAC1C;EAAqB;;;AAErB;EAAe;EAA4B;EAA0B;;;AACrE;EAAqB;EAA8B;;;AAEnD;EAAa;EAAyB;;;AACtC;EAAmB;EAA8B;;;AAEjD;AACA;EAAsB;EAA4B;EAAsB;;;AACxE;EAA4B;EAAkC;;;AAE9D;AACA;EAAc;EAA2B;;;AACzC;EAAoB;;;AAEpB;EAAU;EAAc;EAAiB;;;AACzC;EAAY;EAAa;;;AAEzB;AACA;EAAmB;;;AAEnB;AACA;EACI;EACA;EACA;EACA;;;AAGJ;EAAY;;;AAEZ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EAAc;EAAiB;;;AAC/B;EAAa;;;AACb;EAAe;EAAoB;;;AAEnC;AACA;EACI;EACA;EACA;;;AAGJ;EAAmB;;;AACnB;EAAmB;;;AACnB;EAAmB;;;AACnB;EAAmB;;;AACnB;EAAmB;;;AAEnB;AAAA;AAAA;AAAA;AAIA;EACI;EACA;EACA;;;AAGJ;EACI;IAA2B;;;AAE/B;EACI;IAAS;;EACT;IAA2B;;;AAG/B;AACA;EAAQ;EAAe;EAAwB;EAAW;;;AAE1D;EAAY;EAAe;EAAqB;;;AAChD;EAAc;EAAmB;EAAkB;;;AAEnD;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EAAc;EAAiB;EAAkB;EAAyB;;;AAC1E;EAAa;EAAmB;EAAgC;EAAe;EAAqB;;;AAEpG;EAAc;EAAkB;EAAsB;EAAqB;;;AAC3E;EAAiB;;;AACjB;EAAmB;;;AAEnB;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EAAiB;EAAmC;EAAuB;;;AAC3E;EAAiB;EAAmC;EAAuB;;;AAC3E;EAAiB;EAAmC;EAAuB;;;AAC3E;EAAiB;EAAmC;EAAuB;;;AAE3E;EACI;EACA;EAAY;EACZ;EACA;;;AAGJ;AACA;EAAS;EAAa;EAA2B;;;AAEjD;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EAAY;EAAoB;;;AAChC;EAAgC;;;AAChC;EAAkB;;;AAClB;EAAwB;;;AACxB;EAAc;EAAmB;;;AACjC;EAAe;EAAkB;;;AACjC;EAAc;;;AAEd;AACA;EAAQ;EAAe;;;AACvB;EACI;EACA;EACA;EACA;EACA;;;AAEJ;EAAuB;;;AAEvB;EACI;EAAa;EACb;EACA;EACA;EAAe;EAAqB;EACpC;EACA;EACA;;;AAGJ;EAAQ;EAAS;;;AACjB;EAAY;EAAkB;EAAyB;;;AAEvD;AAAA;AAEA;EACI;EACA;EACA;;AAEA;EAAQ;EAAkB;;AAC1B;EAAc;EAAsB;EAAqB;EAAU;;;AAGvE;EACI;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAKA;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;AAEA;EALJ;IAMQ;;;;AAIR;AAAA;AAEA;EACI;EACA;EACA;AAEA;;AACA;EANJ;IAOQ;;;;AAIR;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAMA;AACA;EACI;EACA;EACA;EACA;;AAEA;EANJ;IAOQ;;;;AAIR;AAAA;EAEI;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AAAA;AAAA;AAGA;EACI;;;AAGJ;AACI;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;AACA;AAAA;EAEA;AASA;AAAA;AAAA;;AAPA;EACI;EACA;EACA;EACA;;AAMJ;EACI;;;AAIR;AAAA;AAAA;AAAA;AAAA;AAKA;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;AAOA;AAAA;AAaA;;AAlBA;EACI;EACA;;AAKJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAIJ;EACI;EACA;;;AAIR;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AASA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAGA;AAAA;AAGA;AAAA;AAAA;AAAA;AAAA;;;AAQJ;AAAA;AAAA;AAAA;AAAA;AAKA;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAiB;;AAEjB;EAAyB;;AAEzB;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;;AACA;EAAU;;;AAIlB;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;AAEA;EAAS;;;AAGb;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;EAA8B;;;AAG5C;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;;AAEA;EAEI;EACA;EACA;EACA;;;AAIR;AAAA;AAAA;AAAA;AAIA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAI;EAAiB;;;AAGzB;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;;;AAGJ;AACA;EAAa;;;AAEb;AAAA;AAAA;AAAA;AAIA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAO;;;AAGX;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAIA;EACI;EACA;EACA;EACA;;;AAGJ;AACI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;EAQA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;;AACA;EACI;EACA;EACA;;;AAIR;AACA;EACI;;;AAGJ;AACA;EACI;;;AAGJ;AAAA;AAAA;AAAA;AAIA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;;AAIR;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;;AACV;EAAa;EAAiB;;;AAGlC;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;EAA6B;;AAEvC;EAAqB;;;AAGzB;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EAAI;EAAsB;;;AAG9B;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;EAA8B;;;AAG5C;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAEA;EAAY;;;AAEZ;AAAA;AAAA;AAAA;AAIA;EAA0B;;;AAC1B;EAAiB;;;AAEjB;AAAA;AAAA;AAAA;AAAA;AAKA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAO;EAAmC;;AAC1C;EAAQ;EAAmC;;AAC3C;EAAQ;EAAkC;;;AAG9C;AACA;EAAe;EAA8B;EAAgC;;;AAE7E;AAAA;AAAA;AAAA;AAIA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;;;AAIR;AACA;EAAiB;EAAmB;;;AAEpC;AACA;EAAU;EAAuB;;;AACjC;EAAY;EAAsB;;;AAElC;EAAU;;;AAEV;AAAA;AAAA;AAAA;AAIA;EAAgB;;;AAEhB;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EAA4B;EAAgB;;;AAE5C;EAAgB;EAAgB;;;AAEhC;AACA;EACI;EACA;EACA;EACA;EACA;;AAEA;EAAyB;;;AAG7B;EACI;EACA;EACA;EACA;;;AAGJ;AACA;EAAa;EAAmB;;;AAEhC;AAAA;AAAA;AAGA;EACI;EACA;EACA;;AAEA;EAAS;EAAS;;AAClB;EAAO;;;AAGX;EAAmB;;;AAEnB;EACI;IAAsB;;;AAG1B;AAAA;AAAA;AAAA;AAAA;AAKA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;EAA8B;;;AAG5C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACI;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;EAA8B;;;AAG5C;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAIA;;AAFA;EAAU;;AAGV;EAAe;;AAEf;EAAa;;AAEb;EACI;EACA;;AAEA;EAAU;;;AAIlB;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAa;EAA8B;EAAkC;;;AAGjF;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;AAEA;EAAS;;;AAGb;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;;AAEV;EAAgB;EAAsB;;AAEtC;EAAI;EAAiB;;;AAGzB;EACI;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AACA;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA,YACI,0DACoC;EACxC;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAIA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAkB;EAAiB;;;AAGvC;EAAkC;;;AAClC;EAAiC;;;AAEjC;EAAc;EAAS;;;AAEvB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;EAA8B;;;AAG5C;EACI;IAAO;IAAY;;EACnB;IAAK;IAAY;;;AAGrB;AAAA;AAAA;AAAA;AAKA;AACA;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;EAA8B;;;AAG5C;AACA;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AACA;EACI;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;;;AAGJ;AAAA;AAEA;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;AAEA;EAAY;EAAc;;;AAG9B;AACA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAyB;;AAEzB;EACI;EACA;;AAGJ;EAAI;;;AAGR;AACA;EACI;EACA;EACA;;AAEA;EAAyB;;;AAG7B;EAAkB;;;AAElB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;AAEA;EAAU;;;AAGd;AAAA;AAAA;AAAA;AAAA;AAKA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;AAAA;AAAA;AAAA;EAIA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;;;AAIR;AACA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;;;AAIR;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEI;EACA;;AAGJ;EAAkB;EAAkC;;;AAGxD;AAAA;AAEA;EACI;EACA;EACA;;;AAGJ;AAAA;AAAA;AAGA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAI;;AAEJ;EACI;EACA;EACA;EACA;;;AAIR;AACA;AAAA;EAEI;EACA;;;AAGJ;AACA;EACI;EACA;;;AAIJ;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAgBI;EACI;EACA;;AAGJ;EACI;EACA;;;AAIR;AACA;EACI;;;AAGJ;AAAA;AAEA;EACI;;;AAGJ;AAAA;AAEA;EACI;;;AC55DJ;AAAA;AAAA;AAGA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EAAO;EAAgC;;AAG3C;EACI;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;EAA8B;;;AAG5C;AAAA;AAAA;AAGA;EACI;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;;;AAGJ;AACA;EAAa;EAAe;EAAS;;;AAErC;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAwB;EAAwB;EAAyB;;;AAG7E;EAAqB;EAAiB;EAAkB;EAAkC;EAAsB;;;AAEhH;EAAkB;EAAS;EAAkB;EAAoB;;;AAEjE;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EAAa;EAAgB;;;AAE7B;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAuB;EAAa;EAAoB;EAAiB;;AACzE;EAAgB;EAAmB;EAAiB;EAAc;;AAElE;EAAU;EAA8B;;AAExC;EACI;EACA;EACA;;AAGJ;EAAuB;;;AAG3B;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEJ;EAAiD;;;AAEjD;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAa;;AAEb;EAAkB;EAAoB;;;AAG1C;AACA;EAAgB;EAAS;;;AAEzB;EACI;EACA;EACA;;;AAGJ;EACI;IAAsB;;EACtB;IAAW;IAAoB;IAAa;IAA4C;;EACxF;IAAiB;;;ACpNrB;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AASA;AAAA;AAAA;AAGA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;IACI;;;AAIR;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;;AAIR;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAGA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;AACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;AAAA;AAGA;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;AAAA;AAWA;AAKA;;AAdA;AAAA;EAEI;EACA;EACA;EACA;EACA;;AAIJ;EACI;;AAIJ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAEA;AAAA;EAEI;;AAIR;EACI;EACA;;AAGJ;EACI;EACA;EACA;;AAEA;AAAA;EAEI;;AAIR;EACI;;;AAIR;AAAA;AAEA;EACI;EACA;;AAEA;EACI;EACA;;;AAIR;AACA;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAEI;EACI;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;;;AAIR;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAGJ;EACI;EACA;EACA;;;AAIR;AAAA;EAEI;;;AAGJ;AAAA;AAAA;AAGA;EACI;;AAEA;EACI;EACA;;AAEA;EACI;;AAGJ;EACI;;AAIR;EACI;EACA;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;;;AAGJ;AACA;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;AAAA;AAUA;AAkBA;AAAA;;AA1BA;AAAA;EAEI;EACA;EACA;EACA;;AAIJ;EACI;;AAGJ;EACI;;AAGJ;EACI;;AAEA;AAAA;EAEI;;AAMR;EACI;EACA;;AAEA;AAAA;EAEI;;;AAKZ;AAAA;;AAAA;AAAA;AAKA;AAEI;;AACA;EACI;EACA;EACA;;AAGJ;EACI;;;AAIR;EACI;EACA;EACA;;;AAGJ;AAAA;AAAA;AAGA;EACI;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;IACI;IACA;IACA;;;AAIR;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAGA;EACI;EACA;EACA;EACA;EACA;AACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EAGA;EACA;EACA;EACA;;AAEA;EACI;;;AAKR;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;;AACA;EACI;EACA;;AAGJ;EACI;EACA;;;AAIR;AAAA;AAEA;EACI;;;AAGJ;EACI;;AAEA;EACI;EACA;;;AAIR;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAGA;EACI;AACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;;AAIR;EACI;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;AACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAKA;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;;;AAIR;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAGA;AAMI;AAUA;AAiBA;AAAA;AAAA;AAAA;AAAA;AAqCA;AAKA;AAAA;AAAA;AAAA;AAsBA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAwBA;AAcA;;AArIA;EACI;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAAA;EAMI;;AAIJ;EACI;EACA;EACA;;AAGJ;EACI;;AAGJ;EACI;EACA;EACA;;AASA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;;AAIA;EACI;;AAGJ;EACI;EACA;;AAKZ;EACI;;AAIJ;EACI;;AAOJ;EACI;IACI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;;AAYR;EACI;IACI;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;;AAKR;EACI;EACA;;AAGJ;EACI;;AAGJ;EACI;;AAIJ;EACI;;;AAIR;AAAA;AAAA;AAGA;EACI;IACI;IACA;IACA;IACA;IACA;IACA;IACA;;AAGJ;EACA;IACI;;EAGJ;AAMI;AAAA;AAAA;AAgBA;AAAA;AAAA;;EArBA;IACI;IACA;;EAMJ;IACI;IACA;IACA;IACA;IACA;IACA;;EAGJ;IACI;;EAMJ;IACI;;EAGJ;IACI;;EAGJ;IACI;;EAGJ;IACI;;EAGJ;IACI;;EAGJ;IACI;;EAGJ;IACI;;EAGJ;IACI;IACA;IACA;;EAGJ;IACI;IACA;;EAGJ;IACI;IACA;IACA;;EAGJ;IACI;IACA;;EAGJ;IACI;;EAIR;IACI;;;AAIR;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACI;EACA;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;AAQA;AAAA;;AANA;EAEI;EACA;;AAKJ;EACI;;;AC1pCR;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAUA;EACI;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;;AAIR;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;AAEA;;AACA;EAAmB;;;AAGvB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;EAA8B;;;AAG5C;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;AACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;EAAoC;;AAE9C;EACI;EACA;EACA;EACA;;;AAIR;AACA;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;EAAoC;;;AAGlD;AACA;EACI;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;;;AAGJ;AAAA;EAEI;EACA;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;EACA;;;AAIR;AAAA;AAAA;AAGA;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAIA;AAGA;AAaA;AAOA;AAWA;AAGA;;AAvCA;EAAU;;AAGV;EAAe;;AAGf;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;;AAIJ;EAEI;EACA;EACA;;AAGJ;EAAa;;AACb;EAAW;;AAGX;EAAoB;;AAGpB;EACkB;;AAElB;EACiB;;;AAGrB;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AAAA;AAAA;AAGA;EACI;IACI;IACA;;EAGJ;IACI;;AAGJ;AAAA;EAEA;IACI;;EAGJ;IACI;;EAGJ;IACI;IACA;;;AL9RR;AMjBA;AAAA;AAAA;AAIA;AACA;EACI;EACA;EACA;EACA;EACA;;;AAIJ;AACA;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;;AAIR;AAAA;AAAA;AAAA;AAIA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EAAU;;AACV;EAAY;;;AAGhB;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EAAc;;;AAGlB;AACA;EACI;EACA;EACA;;;AAGJ;EAA4B;;;AAC5B;EAA2B;;;ACxG3B;AAAA;AAAA;AAAA;AAAA;AAMA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AACA;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;;AAEA;EAAU;EAA4B;;;AAG1C;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;;AAIR;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;AAEA;EAAU;;;AAIlB;AAAA;AAAA;AAGA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,YACI;EAEJ;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAGJ;EAAI;;;AAGR;AACA;EACI;IAAc;;EAEd;IAAa;;EAEb;IAAa;;EAEb;IAAa;;EAEb;IAAe;;;AC9LnB;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAUA;AACA;EACI;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAGA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;;;AAGd;AAAA;AAAA;AAGA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAI;;;AAGR;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;IACI;;;ACvGR;AAAA;AAAA;AAAA;AAAA;AAMA;AACA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAIA;;AAFA;EAAU;;AAGV;EAAS;;;AAGb;AACA;EACI;EACA;;AAEA;EAAU;;;AAGd;AACA;EACI;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;;;AAIR;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAI;;;AAGR;AACA;EACI;IAAa;;;AAIjB;AAAA;AAAA;AAAA;AAAA;AAKA;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;AAEA;;AACA;EAAe;;;AAGnB;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AACA;EACI;;;AAKA;AAAA;EACa;EAAmB;;AAEhC;EAAc;;AACd;EAAc;;AACd;EAAc;;AACd;EAAgB;;;AAGpB;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EAAc;EAAkB;;;AAEhC;AAAA;EAEI;EACA;EACA;;;AAGJ;EAAa;;;AAEb;EAAa;EAAkB;;;AAE/B;AACA;EAAW;;;AAEX;AACA;EAAW;EAAmB;;;AAE9B;EAAe;EAAkB;;;AAEjC;EAAgB;EAAkB;;;AAElC;AAAA;EACmB;;;AAEnB;EAAY;;;AAEZ;EACI;EACA;EACA;;;AC1QJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EANJ;IAOQ;;;;AAIR;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;;AAEV;EACI;EACA;;;AAIR;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAM;EAAa;EAAoB;;AAEvC;EAAU;;AAEV;EACI;EACA;;;AAIR;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAqB;;;AAGzB;EACI;EACA;EACA;;AAEA;EAAqB;;;AAGzB;EACI;EACA;EACA;EACA;;AAEA;EAAM;EAAsB;;;AAGhC;AACA;EACI;EACA;;AAEA;EAAU;;;AAGd;EACI;;;AAGJ;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAEA;EAAqB;EAAgC;;AACrD;EAAqB;EAAmB;;;AAG5C;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AC3MH;AAAA;AAAA;AAAA;AAAA;AAAA;AAMD;AAAA;AAAA;AAGA;EACI;EACA;EACA;EACA;EACA;EACA;AAEA;AAAA;AAAA;EAGA;EACA;AAeA;AAAA;;AAbA;EACI;;AAGJ;EACI;;AAGJ;EACI;EACA;;AAKJ;EACI;;;AAIR;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;;;AAGd;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;IAAkB;;EAElB;IACI;IACA,qBACI;;EAGJ;IAAkB;;EAClB;IAAkB;;EAClB;IAAkB;;;AAI1B;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;;AACA;EACI;EACA;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;;;AAGd;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAiB;;;AAGrB;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AASA;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;AAAA;AAGA;AACA;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;;;AAGd;EACI;EACA;;;AAGJ;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;EACI;EACA;EACA;EACA;EACA;EACA;AAEA;;AACA;EAAgB;;;AAGpB;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;;AAEV;EACI;EACA;EACA;EACA;;;AAIR;AACA;EACI;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;IACI;;EAGJ;IACI;IACA;IACA;;;AAIR;EACI;EACA;EACA;;;AAGJ;AAAA;AAAA;AAIA;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AAAA;AAGA;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;AAEA;;AACA;EAAW;EAAgB;;AAC3B;EAAS;EAAgB;;;AAG7B;EACI;EACA;AAEA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAe;;;AAGnB;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;AAEA;EAAW;EAAgB;;;AAG/B;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;;AAIR;AACA;EACI;;;AAGJ;EACI;IAAY;;;AAGhB;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAMA;AAEA;AAAA;AAAA;AAAA;AAKA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AASA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAOA;AAAA;;AALA;EACI;EACA;;AAKJ;EACI;EACA;EACA;;;AAIR;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;AACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AAAA;AAGA;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EANJ;IAOQ;AAEA;;EACA;IACI;;;;AAKZ;AACA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAGA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AC/vBJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AACA;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;;AC5BH;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQD;AACA;EACI;EACA;EACA;EACA;EACA;;AAEA;EAAI;;;AAGR;AAAA;AAEA;EAAoB;;;AAEpB;AACA;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;AAEA;;AACA;EACI;EACA;EACA;EACA;;AAIR;EACI;EACA;EACA;;AAEA;EAAO;EAAe;;AACtB;EAAS;;;AAIjB;AAAA;AAAA;AAAA;AAAA;AAKA;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AAAA;AAAA;AAAA;AAKA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAgBA;;AAdA;EACI;EACA;EACA;;AAGJ;EAEI;EACA;;AAEA;EAAI;;AAIR;EAAkB;EAAkC;;;AAGxD;AACA;EACI;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAKA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;;AAIR;AACA;EACI;EACA;EACA;;;AAGJ;AACA;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;AAEA;EAAI;;;AAGR;EACI;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AAAA;AAAA;AAAA;AAKA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;AAGJ;EAEI;;AAEA;EAAI;;AAGR;EAAkB;EAAkC;;;ACjQxD;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AACA;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAEA;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;;;AAIR;EACI;EACA;EACA;;AAEA;EACI;;;AAIR;AACA;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;AAEA;EALJ;IAMQ;IACA;;;;AAIR;EACI;EACA;EACA;EACA;;AAEA;EACI;;;AAIR;AAEA;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;;;AAGJ;EACI;;AAEA;EACI;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAGJ;EACI;;;AAIR;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;AAEA;EACI;;;AAIR;EACI;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;;;AAIR;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;AAMA;;AAJA;EACI;;AAIJ;EACI;EACA;;;AAIR;AACA;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;AAEA;EALJ;IAMQ;;;;AAIR;AACA;EACI;EACA;EACA;;AAEA;EAAQ;;;AAGZ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AC9PJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA;AAAA;AAAA;AAAA;AAIA;EACI;EACA;EACA;;;AAGJ;AACA;EACI;;AAEA;EAAI;;;AAGR;AAAA;AAAA;AAAA;AAIA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;EAAoC;;AAE9C;EACI;EACA;EACA;;;AAIR;AACA;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;;;AAGJ;AACA;AAAA;AAAA;AAAA;AAAA;AAMA;AACA;EACI;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;EACA;;;AAIR;AACA;EACI;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;AAQA;;AANA;EACI;EACA;EACA;;AAIJ;EACI;;;AAIR;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;;AAIR;EACI;EACA;EACA;EACA;;;AAGJ;AAEA;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;;AAAA;AAAA;AAAA;AAOA;EACI;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;AAcA;AAIA;AAAA;;AAhBA;EAEI;EACA;EACA;EACA;EACA;;AAGJ;EAAY;EAAS;;AACrB;EAAY;EAAW;;AAGvB;EAAwB;;AACxB;EAAwB;;AAMpB;EAAY;;AAGhB;EAAmB;;AAEnB;EAAyB;;;AAG7B;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACA;EACA;EACA;EACA;AACA;EACA;AAOA;AAAA;;AALA;EACI;EACA;;AAKJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;;;AAIR;EACI;EACA;EACA;EACA;;AAEA;EAEI;;AAGJ;EACI;;;AAIR;EACI;EACA;EACA;;;AAGJ;AACA;EACI;IACI;IACA;IACA;;EAGJ;AAAA;IAEI;;EAGJ;IAAuB;;EACvB;IAAuB;;;AAG3B;AAAA;AAAA;;AAAA;AAAA;AAAA;AAOA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;AAAA;AAAA;;AAGA;EACI;EACA;;AAEA;AAAA;EAEI;;;AAKZ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;;AAIR;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;;AAIR;AAAA;AAAA;AAGA;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAIR;AACA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;;AAIR;AAAA;AAAA;AAGA;EACI;;AAEA;EAHJ;IAIQ;;;;AAIR;AAAA;AAAA;AAAA;AAAA;AAKA;EACI;EACA;EACA;EACA;EACA;;AAEA;EAAI;EAAmB;;;AAG3B;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EAAe;;;AAGnB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;;AACA;EAAe;EAA4B;;AAC3C;EAAe;EAA4B;;;AAG/C;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAGA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AC1nBJ;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAUA;AAEA;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;;AAEA;EAAe;;;AAGnB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;;AAAA;AAAA;AAAA;AAMA;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAKA;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;;AAIR;AACA;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAIJ;AAAA;AAAA;AAAA;AAKA;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;;AAKR;AAAA;AAAA;AAAA;AAKA;AACA;AACG;AAAA;EAEC;EACA;;;AAGJ;EACI;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;AACA;EACI;IACI;;EAGJ;IACI;;;AAIR;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAMA;AAAA;;AAJA;EACI;;AAKJ;EACI;;AAGJ;EACI;;;AAIR;AAAA;AAAA;AAGA;EACI;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;;AAKZ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;AAEA;EACI;EACA;;;AAIR;EACI;IACI;;EAEA;IACI;;EAGJ;IACI;;;AAMZ;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBA;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAIA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACI;;AACA;EACI;EACA;;;AAIR;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;;;AAIR;AAAA;AAAA;AAGA;AACI;AAiFA;;AAhFA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAIR;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;;AAGJ;AAAA;EAEI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EAAyB;;AACzB;EAAyB;;AAEzB;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;;AAIR;AACA;AAyCI;;AAxCA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EAAgB;;AAChB;EAAgB;EAAiB;EAAkB;;AAEnD;EAAkB;EAAiB;EAAe;EAAqB;EAAU;;AACjF;EAAmB;;AACnB;EAAoB;;AACpB;EAAwB;EAAkB;EAAkB;;AAC5D;EAAwB;;AAExB;EAAgB;EAAkB;EAAe;EAAqB;EAAgC;EAAU;;AAChH;EAAiB;EAAiB;EAAkB;;AACpD;EAAsB;EAAkB;EAAmB;EAAkB;EAAkC;;AAG/G;EACI;EACA;EACA;EACA;EACA;;;AAKR;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAYA;AAAA;AAEA;EACI;;;AAGJ;AAAA;AAEA;AACI;AAAA;AAAA;EAGA;EACA;AAEA;AAAA;EAEA;EAEA;;;AAGJ;AAAA;AAEA;EACI;IAAW;;EACX;IAAW;;;AAGf;AAAA;AAEA;EACI;IACI;;;AAIR;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;AAgBA;AAcA;AAAA;AA8BA;AASA;AAwBA;AAOA;AAAA;AAAA;AAWA;AAAA;AAAA;;AA9GA;EACI;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAIJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAKJ;EACI;EACA;EACA;EACA;AAEA;AAAA;AAAA;;AAGA;EACI;;AAIR;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;EACA;EACA;;AAIJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;;AAIJ;EACI;EACA;EACA;;AAMJ;EACI;;AAEA;EACI;;AAOR;EACI;;;AAIR;AAAA;AAEA;EAEQ;IAEI;;EAGJ;IACI;;;AAKZ;AAAA;AAAA;AAGA;EACI;AAAA;IAEI;;;AAIR;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;;AAIR;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;AAoBA;;AAlBA;EAAsB;;AAEtB;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EAAuB;EAAiB;EAAkB;;AAE1D;EAAuB;;AAGvB;EACI;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;;;AAKZ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;;;ACvhCJ;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAWA;AACA;EACI;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAIA;EACI;EACA;;;AAIJ;AAEA;EACI;;;AAIJ;AAEA;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;;;AAIJ;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AACA;EACI;IACI;IACA;;;ACjKR;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAWA;AAEA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;AAAA;AAGA;EACI;EACA;;;AAIJ;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAIJ;AAEA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAMA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;;;AAIJ;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AC/NJ;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAmBA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EAGA;EACA;;AAEA;EAXJ;IAYQ;IACA;IACA;;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAIJ;AAAA;AAAA;AAIA;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAIJ;AAAA;AAAA;AAAA;AAAA;AAMA;AAAA;AAAA;AAGA;EACI;EACA;EACA;;;AAGJ;AAAA;AAAA;AAGA;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;EACI;EACA;EACA;EACA;;AAEA;EANJ;IAOQ;;;;AAIR;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAXJ;IAYQ;;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;;AAEA;EAA0B;;;AAG9B;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;AAAA;AAGA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EAA0B;;;AAG9B;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AAAA;AAAA;AAGA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;AAEA;AAAA;AAAA;;AAGA;EAA2B;;AAC3B;EAAiB;;;AAGrB;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAA0B;;;AAG9B;AACA;EACI;EACA;EACA;EACA;;AAEA;EAA0B;;;AAG9B;AAAA;AAAA;AAGA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAIA;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AACA;EACI;AACA;AAAA;EAEA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAKA;EACI;EACA;EACA;;AAEA;EAA0B;;;AAG9B;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAEA;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;;AAGJ;EACI;;AAGJ;EACI;;;AAIR;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;AAEA;EACI;;;AAIR;EACI;EACA;;;AC5rCJ;AAAA;AAAA;AAAA;AAAA;AAMA;AACA;EACI;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;AAAA;AAGA;EACI;EACA;EACA;EACA;;;AC9BJ;AAAA;AAAA;AAAA;AAAA;AAMA;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EAGA;EACA;EACA;;AAGA;EAXJ;IAYQ;;;;AAIR;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;;;AAGJ;EACI;EAEA;EACA;;AAEA;EANJ;IAOQ;;;;AAIR;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;;AAEA;EACI;EACA;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;ACrNJ;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAeA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;;;AAIJ;AAEA;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;AAAA;AAGA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;;;AC9PJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;AAUA;AAAA;;AARA;EACI;;AAGJ;EACI;;AAKJ;EACI;;AAEA;EACI;EACA;;AAGJ;EACI;;;AAKZ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;AACA;AACI;EACA;;;AAGJ;EACI;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;AAEA;AAAA;EAEA;EAEA;;;ACpIJ;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAUA;AACA;EACI;;;AAGJ;EACI;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;;;AAGJ;AACA;EACI;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;;;AAGJ;AACA;EACI;EACA;;;AAIJ;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAQA;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AAEA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;;AAIR;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAU;;;AC/Gd;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAWA;AAEA;EACI;;;AAGJ;EACI;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAIJ;AAEA;AAAA;AAEA;EACI;EACA;EACA;EACA;;;AAGJ;AAAA;EAEI;EACA;EACA;AACA;EACA;;;AAGJ;EACI;EACA;EACA;;;AAGJ;AACA;EACI;IACI;;;AAIR;AACA;EACI;EACA;;;AAIJ;AAEA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;;AAGJ;EACI;EACA;;AAGJ;EACI;EACA;EACA;;;AAIR;EACI;EACA;;;AAGJ;EACI;AACA;EACA;EACA;EACA;EACA;;;AAGJ;AAAA;AAAA;AAGA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAK;EAAoB;EAAiB;;AAC1C;EAAK;EAAoB;EAAiB;;AAC1C;EAAK;EAAoB;EAAiB;;AAE1C;EAAI;;AAEJ;EAAS;EAAkB;;AAC3B;EAAK;;AAEL;EACI;EACA;EACA;EACA;;AAGJ;EAAM;EAAiB;EAAc;;AAErC;EAAI;EAAsB;;AAE1B;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;;;AAIR;EACI;;;AAIJ;AAEA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;ACpPJ;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAWA;EACI;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;AAEA;EACI;;;AAIR;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;AAEA;EAAS;;AACT;EAAU;;;AAGd;EACI;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AAAA;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;;AAEA;EAAU;;;AAGd;EACI;EACA;EACA;EACA;AACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AACA;EACI;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;AACA;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;;;AAIJ;AAEA;AACA;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AC3KJ;AAAA;AAAA;AAAA;AAIA;EACI;EACA;EACA;EACA;EACA;;AAEA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;AAGJ;EACI;EACA;EACA;EACA;;;A3BlBR;AAAA;AAAA;AAGA;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;AAAA;AAAA;AAGA;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;AAAA;AAAA;AAGA;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAEJ;AACA;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;AAAA;AAAA;AAGA;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;AAAA;AAAA;AAGA;AACA;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AACA;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;AACA;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;AAAA;AAAA;AAGA;EACI;;;AAGJ;EACI;;;AAEJ;AACA;EACI;;;AAEJ;AACA;EACI;;;AAEJ;AACA;EACI;;;AAEJ;AAEA;AAAA;AAAA;AAGA;EACI;;;AAGJ;AACA;EACI;;;AAGJ;AACA;EACI;;;AAGJ;AACA;EACI;;;AAGJ;AACA;EACI;;;AAGJ;EACI;;;AAGJ;EACI;;;AAGJ;AAAA;AAAA;AAGA;AACA;EACI;;;AAGJ;AACA;EACI;;;AAGJ;AACA;EACI;;;AAGJ;AACA;EACI;;;AAGJ;AACA;EACI;;;AAEJ;AAAA;AAAA;AAGA;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAEJ;AAAA;AAAA;AAGA;AACA;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA;;;AAGJ;EACI;EACA%22%7D */