/* Giao diện trình sửa clip.

   NGÔN NGỮ THIẾT KẾ — theo bản dựng Stitch `stitch_d_n_kh_i_nghi_p/`.
   Ba điều làm nên cái nhìn đó, và cả ba đều nằm ở đây chứ không rải rác:

    1. KHỐI NỔI TRÊN NỀN ĐEN. Nền trang là đen tuyệt đối, còn mỗi cột là một
       khối xám bo góc nổi lên, cách nhau 8px. Trước đây các cột dán liền nhau
       và ngăn bằng một sợi chỉ 1px — mắt phải tự đi tìm ranh giới.
    2. NHẤN XANH LÁ, CHỮ ĐEN TRÊN NHẤN. Xanh dương cũ trùng với màu chữ liên
       kết và với chính màu thương hiệu trong nhiều clip, nên khung chọn lẫn vào
       nội dung. Xanh lá không xuất hiện trong clip nào.
    3. XÁM TRUNG TÍNH, KHÔNG ÁM XANH. Bảng màu cũ ám xanh dương ở mọi cấp
       (#0e1420, #263349…). Vỏ phần mềm ám màu thì màu thật của clip bị đọc
       lệch — đúng thứ không được phép xảy ra ở công cụ chỉnh màu.

   Nền tối để khung hình clip nổi lên, giống mọi công cụ dựng phim — mắt bám
   vào khung hình chứ không bám vào vỏ phần mềm. */

:root {
  --trang-nen: #000000;   /* nền sâu nhất, khe giữa các khối */
  --nen:    #121212;      /* khối chính: cột, thanh */
  --nen-2:  #181818;      /* thẻ con, thanh công cụ */
  --nen-3:  #242424;      /* rê chuột, ô nhập */
  --nen-4:  #333333;      /* viền rõ, rãnh thanh trượt */
  --vach:   #262626;

  --chu:      #ffffff;
  --chu-mo:   #b3b3b3;
  --chu-mo-2: #727272;

  --nhan:      #31d975;
  --nhan-sang: #44f38b;
  --nhan-nhe:  rgba(49, 217, 117, .15);
  --tren-nhan: #06140c;   /* chữ nằm TRÊN màu nhấn */

  --cam: #f97316;
  --do:  #ef4444;
  --xanh: #31d975;

  /* THANG CỠ CHỮ — ba bậc, không phải chín cỡ rời.
     Đo trước khi sửa: 57 trên 74 chỗ khai cỡ chữ nằm trong khoảng 10–12px, và
     chỉ ĐÚNG MỘT chỗ đạt 15px. Gần như không có chữ nào thoải mái để đọc, mà
     đây là công cụ ngồi trong đó vài tiếng mỗi ngày — xem
     `docs/KHONG-GIAN-LAM-VIEC.md`.

     Luật dùng: chật thì NỚI Ô CHỨA, đừng hạ cỡ chữ xuống lại. Hạ xuống là quay
     về đúng chỗ vừa đi ra. */
  --chu-nho: 12px;   /* nhãn phụ, đơn vị, dấu hiệu — thứ chỉ liếc qua */
  --chu-vua: 14px;   /* MẶC ĐỊNH: nhãn núm, tên lớp, nút, ô nhập */
  --chu-to:  16px;   /* tiêu đề bảng, tên clip */

  --bo-nho: 4px;
  --bo: 8px;
  --bo-khoi: 10px;
  --bo-tron: 999px;

  /* NHỊP CHUNG. Mọi chuyển động trong vỏ phần mềm dùng đúng bộ này, để cả giao
     diện chạy cùng một nhịp thay vì mỗi chỗ một kiểu.
     150–300ms là khoảng "có phản hồi mà không phải chờ"; dài hơn là chậm chạp.
     Đường cong vào có đuôi vượt nhẹ cho giống lò xo — thứ tạo cảm giác mượt. */
  --nhip-nhanh: 150ms;
  --nhip: 220ms;
  --da-vao: cubic-bezier(.22, 1, .36, 1);
  --da-ra: cubic-bezier(.4, 0, 1, 1);
  /* Phông chữ tải từ Google Fonts, KÈM ĐỦ đường lùi hệ thống: mạng hỏng thì
     giao diện vẫn đúng, chỉ khác nét chữ. Không đưa phông vào clip — clip phải
     đo được cỡ chữ trên mọi máy, xem `measureFit()` của bộ dựng. */
  /* Phao chỉ còn `system-ui`: Roboto/Noto không có file đi kèm, rơi vào đó là
     lệch mặt chữ mà chẳng có gì báo. Rơi về system-ui nghĩa là bộ chữ hỏng,
     nhìn ra ngay. */
  --font: var(--bo-chu, "Be Vietnam Pro", system-ui, sans-serif);
  color-scheme: dark;
}

* { box-sizing: border-box; }

body {
  margin: 0;
  background: var(--trang-nen);
  color: var(--chu);
  /* KHÔNG có phần đậm nhạt ở đây. Bản trước lọt chữ `None` vào đúng chỗ này
     (`font: None var(--chu-vua)/1.5 …`) — script đổi hàng loạt ghi ra giá trị
     rỗng của Python. `font:` rút gọn mà sai một từ là trình duyệt VỨT CẢ DÒNG,
     nên mất luôn cả cỡ chữ lẫn phông, và cả trình sửa rơi về Times New Roman.
     Hỏng nhìn thấy ngay mà không ai báo, vì CSS không kêu bao giờ.
     `tools/kiem-chu.mjs` bắt được ca này. */
  font: var(--chu-vua)/1.5 var(--font);
  height: 100vh;
  overflow: hidden;
  -webkit-font-smoothing: antialiased;
}

/* Khối nổi trên nền đen: 8px đệm ngoài, 8px khe giữa các khối. */
#app {
  display: flex; flex-direction: column; height: 100vh;
  padding: 8px; gap: 8px;
}

/* Thanh cuộn mảnh, chỉ hiện khi rê vào — như mọi công cụ dựng phim. */
.ds-canh, .ds-lop, .bang-tt, .video-ds, .khung-ds, .menu-them {
  scrollbar-width: thin; scrollbar-color: transparent transparent;
}
.ds-canh:hover, .ds-lop:hover, .bang-tt:hover, .video-ds:hover, .khung-ds:hover {
  scrollbar-color: var(--nen-4) transparent;
}
.ds-canh::-webkit-scrollbar, .ds-lop::-webkit-scrollbar,
.bang-tt::-webkit-scrollbar, .menu-them::-webkit-scrollbar { width: 7px; height: 7px; }
.ds-canh::-webkit-scrollbar-thumb, .ds-lop::-webkit-scrollbar-thumb,
.bang-tt::-webkit-scrollbar-thumb, .menu-them::-webkit-scrollbar-thumb {
  background: transparent; border-radius: var(--bo-tron);
}
.ds-canh:hover::-webkit-scrollbar-thumb, .ds-lop:hover::-webkit-scrollbar-thumb,
.bang-tt:hover::-webkit-scrollbar-thumb { background: var(--nen-4); }

/* ---------- thanh trên ---------- */
.thanh-tren {
  display: flex; align-items: center; gap: 12px;
  height: 48px; padding: 0 14px;
  background: var(--nen);
  border-radius: var(--bo-khoi);
  flex: none;
}
/* Ô hiệu: chữ tắt của Mắt Bão, chỗ neo mắt ở góc trái — giống mọi phần mềm
   dựng phim, và cũng là chỗ duy nhất trong vỏ được dùng màu thương hiệu. */
/* Dấu M của logo. Ảnh cao 128px thu xuống 15px nên nét vẫn sắc trên màn hình
   2×; đừng thay bằng bản nhỏ hơn. */
.o-hieu { height: 15px; width: auto; flex: none; display: block; }
.hieu { font-weight: 600; font-size: var(--chu-vua); letter-spacing: .1px; color: var(--chu-mo); }
.hieu b { font-weight: 800; color: var(--chu); }
.day { flex: 1; }
.phu { color: var(--chu-mo); font-size: var(--chu-vua); }
.lien-ket { color: var(--chu-mo); text-decoration: none; font-size: var(--chu-vua); }
.lien-ket:hover { color: var(--nhan); }

.chon {
  background: var(--nen-3); color: var(--chu);
  border: 1px solid var(--vach); border-radius: var(--bo);
  padding: 7px 11px; font: inherit; min-width: 260px;
}
.chon:focus-visible { outline: 2px solid var(--nhan); outline-offset: 1px; }

/* ---------- thân ---------- */
.than { display: flex; flex: 1; min-height: 0; gap: 8px; }

.cot-trai, .cot-phai {
  flex: none;
  background: var(--nen);
  border-radius: var(--bo-khoi);
  display: flex; flex-direction: column; min-height: 0;
  overflow: hidden;
}
/* Bề rộng do người dùng kéo, nhớ trong máy — xem `web/cot.js`. Số ở đây chỉ là
   đường lùi cho lần chạy đầu, trước khi JS kịp đặt biến. */
.cot-trai { width: var(--cot-trai, 272px); }
.cot-phai { width: var(--cot-phai, 316px); }

/* ẨN HẲN MỘT CỘT — xem `web/cot.js`.
   Giấu cả tay nắm kéo đi cùng: để lại một tay nắm cạnh chỗ trống thì kéo nó ra
   cái gì? Và `display:none` chứ không phải bề rộng 0 — cột bề rộng 0 vẫn ăn
   `Tab`, người dùng bàn phím sẽ đi lạc vào một cột vô hình. */
#app[data-an-trai="1"] .cot-trai,
#app[data-an-trai="1"] .keo-cot[data-cot="trai"],
#app[data-an-phai="1"] .cot-phai,
#app[data-an-phai="1"] .keo-cot[data-cot="phai"] { display: none; }

/* Nút đang bật thì sáng màu nhấn — người dùng phải biết vì sao cột biến mất. */
.nut-tron[aria-pressed="true"] { color: var(--nhan); background: var(--nhan-nhe); }

/* Đường thoát khi bản chạy không dựng được video — xem `web/exportpanel.js`. */
.duong-thoat {
  margin-top: 10px; padding: 14px; border-radius: var(--bo);
  background: var(--nen-2); border: 1px solid var(--nen-4);
}
.duong-thoat b { display: block; font-size: var(--chu-vua); }
.duong-thoat p { margin: 6px 0 12px; font-size: var(--chu-nho); color: var(--chu-mo); }
.duong-thoat .thoat-chi { margin: 10px 0 0; color: var(--chu-mo-2); }

/* ---------- tay nắm kéo cột ---------- */
/* Vạch mảnh 4px nhưng vùng bấm rộng 12px: tay nắm đúng 4px thì phải ngắm mới
   trúng. Nới bằng đệm ngang rồi kéo lề âm cho nó không chiếm thêm chỗ. */
.keo-cot {
  flex: none; width: 4px; margin: 0 -4px; padding: 0 4px;
  background-clip: content-box; background-color: transparent;
  cursor: col-resize; border-radius: var(--bo-tron);
  position: relative; z-index: 5;
  transition: background-color var(--nhip-nhanh) var(--da-ra);
}
.keo-cot:hover, .keo-cot.dang-keo { background-color: var(--nhan); }
.keo-cot:focus-visible { outline: 2px solid var(--nhan); outline-offset: 1px; }
/* Đang kéo thì khoá con trỏ ở kiểu co giãn và cấm bôi đen chữ — không thì rê
   qua danh sách thành phần là bôi đen cả loạt tên món. */
body:has(.keo-cot.dang-keo) { cursor: col-resize; user-select: none; }
body:has(.keo-cot.dang-keo) iframe { pointer-events: none; }

.tieu-de-cot {
  padding: 10px 12px; font-size: var(--chu-nho); font-weight: 700;
  text-transform: uppercase; letter-spacing: .06em;
  color: var(--chu-mo); border-bottom: 1px solid var(--vach); flex: none;
  background: var(--nen-2);
}

.ds-canh { list-style: none; margin: 0; padding: 6px; overflow-y: auto; flex: 1; }
.ds-canh li {
  padding: 8px 10px; border-radius: var(--bo); cursor: pointer;
  display: flex; justify-content: space-between; gap: 8px; align-items: baseline;
  border: 1px solid transparent;
}
.ds-canh li { transition: background var(--nhip-nhanh) var(--da-ra); }
.ds-canh li:hover { background: var(--nen-3); border-color: rgba(255,255,255,.08); }
.ds-canh li[aria-current="true"] { background: var(--nhan); color: var(--tren-nhan); font-weight: 600; }
.ds-canh li[aria-current="true"] .giay-canh { color: var(--tren-nhan); opacity: .75; }
.ds-canh .giay-canh { color: var(--chu-mo); font-size: var(--chu-vua); font-variant-numeric: tabular-nums; }

.trong { padding: 16px 14px; color: var(--chu-mo); font-size: var(--chu-vua); }
.ghi-chu { color: var(--chu-mo-2); font-size: var(--chu-vua); margin: 10px 0 0; }

/* ---------- giữa ---------- */
.giua { flex: 1; display: flex; flex-direction: column; min-width: 0; min-height: 0; }

.bang-bao {
  margin: 12px 16px 0; padding: 10px 14px;
  background: #3a2a12; border: 1px solid #6b4a1c; border-left: 3px solid var(--cam);
  border-radius: 0 8px 8px 0; font-size: var(--chu-vua); color: #f0d9bd;
}
.an { display: none !important; }

.san-khau {
  flex: 1; min-height: 0;
  display: flex; align-items: center; justify-content: center;
  padding: 18px; overflow: hidden;
}
/* Chỉ sân khấu của clip mới làm khung chứa đo được — `.boc-khung` cần biết CẢ
   HAI cạnh của nó (xem `cqh` ngay bên dưới). Không đặt cho cả `.san-khau` vì hai
   sân còn lại (khung nhấn, video) cao theo nội dung, mà `container-type: size`
   thì cắt đứt đúng cái đường phụ thuộc đó. */
#san-clip { container-type: size; }

/* KHUNG XEM PHẢI GIỮ ĐÚNG TỈ LỆ CỦA CLIP — cả hai chiều, không chỉ một.
 *
 * Bản cũ viết `height: 100%` KÈM `aspect-ratio`, và hai dòng đó cãi nhau: chiều
 * cao đã định sẵn nên bề ngang tính ra từ tỉ lệ, rồi `max-width` cắt bề ngang
 * lại cho vừa cột — mà chiều cao thì KHÔNG được tính lại. Kết quả là tỉ lệ bị bẻ
 * gãy IM LẶNG.
 *
 * Đo thật trên clip 1280×720 trong cửa sổ cao 977px: khung ra 483×799, tức tỉ lệ
 * 0,605 — dọc hẳn, trong khi `--ti-le` vẫn đang là `1280 / 720`. Bộ dựng bên
 * trong tự co cho vừa nên clip vẫn đúng hình, chỉ là nằm giữa hai dải trắng trên
 * dưới; người dùng mở clip ngang lên thấy một khung dọc và tưởng dự án hỏng.
 *
 * Cách chữa: đừng định sẵn cạnh nào cả, lấy CẠNH NÀO CHẠM TRƯỚC. `cqw`/`cqh` đo
 * đúng lòng trong của sân khấu (đã trừ padding), nên không phải cộng trừ tay. */
.boc-khung {
  position: relative;
  background: #000;
  border-radius: var(--bo);
  /* KHÔNG `overflow: hidden` Ở ĐÂY.
     Nó vốn chỉ để bo tròn bốn góc iframe. Nhưng nó cắt luôn tay nắm co giãn:
     món nào rộng bằng cả khung thì tám tay nắm nằm đúng ngoài mép, bị cắt sạch
     — bấm vào là trúng sân khấu chứ không trúng tay nắm, và người dùng tưởng
     tính năng hỏng. Chuyển việc bo góc xuống chính iframe (`#khung`), chỗ duy
     nhất thật sự cần. Phần tràn vẫn được `#san-clip` cắt, nên phóng to không
     lem ra ngoài sân khấu. */
  box-shadow: 0 14px 46px rgba(0, 0, 0, .6);
  aspect-ratio: var(--ti-le, 16 / 9);
  max-width: 100%; max-height: 100%;
  /* Đường lùi cho trình duyệt chưa có truy vấn khung chứa: chiếm hết bề ngang,
     cao tính theo tỉ lệ. Hẹp hơn mức có thể ở sân khấu lùn, nhưng KHÔNG BAO GIỜ
     méo tỉ lệ — mà méo tỉ lệ mới là lỗi người dùng nhìn thấy. */
  width: 100%;
  width: min(100cqw, calc(100cqh * var(--ti-le, 16 / 9)));
}
#khung {
  width: 100%; height: 100%; border: 0; display: block; background: #000;
  border-radius: var(--bo);   /* trước đây do `.boc-khung` cắt hộ */
}
/* Đang phóng thì `.boc-khung` bỏ bo góc, iframe cũng phải bỏ theo, không thì
   ở mức 400% cái bo góc bị phóng thành một đường cong to tướng. */
.boc-khung.dang-phong #khung { border-radius: 0; }

/* Lớp phủ vẽ khung chọn — LUÔN ở trang cha, không bao giờ chèn vào iframe.
   Chèn vào iframe là làm bẩn đúng cái lát nữa đem đi xuất video. */
.lop-phu { position: absolute; inset: 0; pointer-events: none; }

.dieu-khien {
  display: flex; align-items: center; gap: 14px;
  padding: 12px 18px 16px; flex: none;
}
.thanh-tua { flex: 1; accent-color: var(--nhan); cursor: pointer; }
.dong-ho { color: var(--chu-mo); font-variant-numeric: tabular-nums; font-size: var(--chu-vua); min-width: 130px; text-align: right; }

/* Nút dạng viên thuốc — bo tròn hẳn, không viền, chữ đậm và nhỏ. Đây là thứ
   đổi nhiều nhất so với bản cũ, và cũng là thứ thấy đầu tiên. */
.nut {
  display: inline-flex; align-items: center; justify-content: center; gap: 6px;
  background: var(--nen-3); color: var(--chu);
  border: 0; border-radius: var(--bo-tron);
  padding: 7px 15px; font: 600  var(--chu-vua)/1 var(--font);
  cursor: pointer; white-space: nowrap;
}
.nut { transition: background var(--nhip-nhanh) var(--da-ra),
                   border-color var(--nhip-nhanh) var(--da-ra),
                   transform var(--nhip-nhanh) var(--da-vao); }
.nut:hover:not(:disabled) { background: var(--nen-4); transform: scale(1.02); }
/* Lún xuống một chút khi bấm. Không đổi kích thước ô, chỉ transform — nên không
   làm xô lệch những thứ xung quanh. */
.nut:active:not(:disabled) { transform: scale(.97); }
.nut:disabled { opacity: .45; cursor: default; }
.nut.chinh {
  background: var(--nhan); color: var(--tren-nhan); font-weight: 700;
}
.nut.chinh:hover:not(:disabled) {
  background: var(--nhan-sang); box-shadow: 0 0 16px rgba(49, 217, 117, .38);
}
.nut.vien { background: transparent; border: 1px solid var(--nen-4); }
.nut.vien:hover:not(:disabled) { background: transparent; border-color: var(--chu); }

/* ---------- lời nhắc ---------- */
.bao {
  /* Nằm TRÊN thanh phát, không đè lên: thanh phát cao 62px + 8px khe ngoài. */
  position: fixed; left: 50%; bottom: 82px; transform: translateX(-50%);
  background: var(--nen-3); border: 1px solid var(--vach);
  padding: 11px 18px; border-radius: var(--bo);
  box-shadow: 0 10px 30px rgba(0, 0, 0, .55);
  font-size: var(--chu-vua); z-index: 100; max-width: min(560px, 90vw);
  /* Nền mờ: lời nhắc nổi trên khung hình clip, mà khung hình thì lắm chi tiết.
     Làm nhoè cái phía sau thì chữ đọc ra ngay mà không phải tô nền đục kín. */
  background: color-mix(in srgb, var(--nen-3) 88%, transparent);
  backdrop-filter: blur(14px);
  animation: bao-hien var(--nhip) var(--da-vao);
}
@keyframes bao-hien {
  from { opacity: 0; transform: translate(-50%, 10px); }
  to   { opacity: 1; transform: translate(-50%, 0); }
}
.bao.hong { border-color: var(--do); background: #2c1416; color: #ffd9da; }

.ds-canh .khong-the {
  color: var(--chu-mo-2); font-size: var(--chu-vua); cursor: default; padding: 12px 11px; line-height: 1.5;
}
.ds-canh .khong-the:hover { background: none; }

/* ============ LỚP BẮT SỰ KIỆN & KHUNG CHỌN ============ */

/* iframe nuốt hết chuột, nên lớp này phủ lên trên để trang cha bắt được.
   Nó nằm khít iframe ⇒ toạ độ trùng 1-1, không phải quy đổi. */
.lop-bat { position: absolute; inset: 0; cursor: default; }
.lop-bat.keo-duoc { cursor: move; }

.khung-chon, .khung-re {
  position: absolute; display: none; pointer-events: none;
  border: 1.5px solid var(--nhan); border-radius: 2px;
  box-shadow: 0 0 0 1px rgba(0, 0, 0, .35);
}
.khung-re { border-color: rgba(49, 217, 117, .55); border-style: solid; }

/* Ba kiểu viền cho ba trạng thái — nhìn là biết kéo được hay không. */
.khung-chon[data-kieu="tu"]  { border-style: solid; }
.khung-chon[data-kieu="dat"] { border-style: dashed; }
.khung-chon[data-kieu="con"] { border-style: dotted; border-color: #a3a3a3; }

.khung-nhan {
  position: absolute; left: -1.5px; top: -21px;
  background: var(--nhan); color: var(--tren-nhan);
  font-size: var(--chu-nho); font-weight: 600; line-height: 1;
  padding: 4px 7px; border-radius: 4px 4px 0 0; white-space: nowrap;
}
.khung-chon[data-kieu="con"] .khung-nhan { background: #a3a3a3; }

/* ============ DANH SÁCH THÀNH PHẦN ============ */
.ds-lop { overflow-y: auto; flex: 1; padding: 5px 0 10px; min-height: 90px; }
.lop-hang {
  display: flex; align-items: center; gap: 7px;
  padding: 5px 10px; cursor: pointer; font-size: var(--chu-vua);
}
.lop-hang { transition: background var(--nhip-nhanh) var(--da-ra); }
.lop-hang:hover { background: var(--nen-3); }
.lop-hang.dang { background: var(--nhan); color: var(--tren-nhan); }
.lop-cham { width: 7px; height: 7px; border-radius: 2px; background: var(--chu-mo-2); flex: none; }
.lop-hang.dang .lop-cham { background: var(--tren-nhan); }
.lop-ten { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.lop-dau { margin-left: auto; font-size: var(--chu-nho); color: var(--chu-mo-2); flex: none; }
.lop-hang.dang .lop-dau { color: var(--tren-nhan); opacity: .7; }

/* ---------- KÉO ĐỔI CHỖ TRONG CỘT THÀNH PHẦN ----------
   Thứ tự trong danh sách chính là thứ tự vẽ, nên kéo ở đây đổi cả hình lẫn
   nhịp bay vào. Vạch chỉ dẫn phải nói rõ SẼ RƠI VÀO ĐÂU trước khi người dùng
   nhả tay: một vạch mảnh giữa hai hàng là "chen vào giữa", còn cả hàng sáng
   lên là "vào trong cụm này". Thiếu phân biệt đó thì kéo vào cụm và kéo qua
   cụm trông y hệt nhau. */
.lop-hang { position: relative; }
.lop-hang.dang-keo { opacity: .4; }
.lop-hang.tha-tren::before,
.lop-hang.tha-duoi::after {
  content: ''; position: absolute; left: 6px; right: 6px; height: 2px;
  background: var(--nhan); border-radius: 2px; pointer-events: none;
}
.lop-hang.tha-tren::before { top: -1px; }
.lop-hang.tha-duoi::after { bottom: -1px; }
.lop-hang.tha-vao {
  background: var(--nhan-nhe);
  box-shadow: inset 0 0 0 1px var(--nhan);
  border-radius: var(--bo-nho);
}
/* Thả vào chỗ trống dưới danh sách = đem ra ngoài cùng. Đây là đường DUY NHẤT
   lôi một món ra khỏi cụm, nên nó phải có dấu hiệu riêng. */
.ds-lop.tha-cuoi { box-shadow: inset 0 -2px 0 var(--nhan); }
.cot-trai .ds-canh { flex: 0 0 auto; max-height: 34%; }

/* ============ BẢNG THUỘC TÍNH ============ */
.bang-tt { overflow-y: auto; flex: 1; padding-bottom: 24px; }

.chi-duong {
  display: flex; flex-wrap: wrap; align-items: center; gap: 2px;
  padding: 9px 12px; border-bottom: 1px solid var(--vach);
  font-size: var(--chu-vua); color: var(--chu-mo); position: sticky; top: 0;
  background: var(--nen-2); z-index: 2;
}
.chi-o {
  background: none; border: 0; color: var(--chu-mo); font: inherit;
  padding: 2px 4px; border-radius: 4px; cursor: pointer;
}
.chi-o:hover { background: var(--nen-3); color: var(--chu); }
.chi-o.dang { color: var(--chu); font-weight: 600; }
.chi-mui { color: var(--nen-4); }

.muc { padding: 12px 12px 4px; border-bottom: 1px solid var(--vach); }
.muc-ten {
  margin: 0 0 11px; font-size: var(--chu-nho); font-weight: 700;
  text-transform: uppercase; letter-spacing: .05em; color: var(--chu);
}

.num { margin-bottom: 12px; }
.num-nhan { display: block; font-size: var(--chu-vua); color: var(--chu-mo); margin-bottom: 4px; }
.num-nhan.an-nhan { display: none; }
.num-goi { margin: 4px 0 0; font-size: var(--chu-nho); color: var(--chu-mo-2); line-height: 1.45; }

.o-nhap {
  width: 100%; background: var(--nen-3); color: var(--chu);
  border: 1px solid transparent; border-radius: var(--bo-nho);
  padding: 6px 9px; font: inherit; font-size: var(--chu-vua);
  font-variant-numeric: tabular-nums;
}
.o-nhap:focus { border-color: var(--nhan); }
.o-nhap:focus-visible { outline: 2px solid var(--nhan); outline-offset: -1px; border-color: var(--nhan); }
.o-van { resize: vertical; line-height: 1.5; font-family: inherit; }
.o-so { text-align: right; }

.num-so { display: flex; align-items: center; gap: 8px; }
.num-so .truot { flex: 1; accent-color: var(--nhan); min-width: 0; }
.num-so .o-so { width: 68px; flex: none; }

.cap { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; }
.cap .num { margin-bottom: 8px; }

.doan, .nac { display: flex; gap: 3px; flex-wrap: wrap; }
.doan-o, .nac-o {
  flex: 1; min-width: 0; background: var(--nen); color: var(--chu-mo);
  border: 1px solid var(--vach); border-radius: 6px;
  padding: 5px 4px; font: inherit; font-size: var(--chu-nho); cursor: pointer;
  white-space: nowrap; overflow: hidden; text-overflow: ellipsis;
}
.doan-o[aria-pressed="true"], .nac-o[aria-pressed="true"] {
  background: var(--nhan); border-color: var(--nhan); color: var(--tren-nhan); font-weight: 600;
}
.nac-o { flex: 0 0 calc(25% - 3px); }

.num-mau { display: flex; gap: 7px; align-items: center; }
.o-mau { width: 38px; height: 30px; padding: 0; border: 1px solid var(--vach);
         border-radius: 6px; background: none; cursor: pointer; flex: none; }
.o-ma { flex: 1; font-family: ui-monospace, monospace; font-size: var(--chu-vua); }

.nhieu { display: flex; flex-direction: column; gap: 5px; }
.nhieu-o, .cong-tac { display: flex; align-items: center; gap: 7px; font-size: var(--chu-vua); cursor: pointer; }
.nhieu-o input, .cong-tac input { accent-color: var(--nhan); }

.num-anh .anh-xem {
  margin-top: 7px; background: var(--nen); border: 1px solid var(--vach);
  border-radius: 7px; padding: 7px; min-height: 40px;
  display: flex; align-items: center; justify-content: center;
  font-size: var(--chu-nho); color: var(--chu-mo-2);
}
.num-anh .anh-xem img { max-width: 100%; max-height: 90px; display: block; }

.nhac {
  margin: 0 0 10px; padding: 8px 10px; font-size: var(--chu-vua); line-height: 1.5;
  background: var(--nen); border-left: 2px solid var(--chu-mo-2);
  border-radius: 0 6px 6px 0; color: var(--chu-mo);
}
.nut.nho { padding: 6px 11px; font-size: var(--chu-vua); }

/* ============ THANH TRÊN ============ */
.dau-ban { font-size: var(--chu-vua); color: var(--cam); }

/* ============ NÚT TRÊN ĐẦU CỘT ============ */
.tieu-de-cot { display: flex; align-items: center; justify-content: space-between; gap: 6px; }
.cot-nut { display: flex; gap: 2px; }
.nut-ti {
  background: none; border: 1px solid transparent; color: var(--chu-mo);
  border-radius: 5px; width: 22px; height: 22px; padding: 0;
  font-size: var(--chu-vua); line-height: 1; cursor: pointer;
}
.nut-ti:hover:not(:disabled) { background: var(--nen-3); border-color: var(--vach); color: var(--chu); }
.nut-ti:disabled { opacity: .3; cursor: default; }

.menu-them {
  position: absolute; z-index: 30; background: var(--nen-3);
  border: 1px solid var(--vach); border-radius: 9px; padding: 5px;
  box-shadow: 0 12px 34px rgba(0, 0, 0, .55); max-height: 320px; overflow-y: auto;
  background: color-mix(in srgb, var(--nen-3) 90%, transparent);
  backdrop-filter: blur(16px);
  /* Bung ra từ phía nút vừa bấm, không phải hiện đột ngột giữa trời — cho mắt
     nối được cái menu với cái nút đã gọi nó ra. */
  animation: menu-bung var(--nhip-nhanh) var(--da-vao);
  transform-origin: top left;
}
@keyframes menu-bung {
  from { opacity: 0; transform: scale(.96) translateY(-4px); }
  to   { opacity: 1; transform: none; }
}
.menu-them button {
  display: block; width: 100%; text-align: left; background: none; border: 0;
  color: var(--chu); font: inherit; font-size: var(--chu-vua);
  padding: 6px 12px; border-radius: 6px; cursor: pointer; white-space: nowrap;
}
.menu-them button:hover { background: var(--nhan); color: var(--tren-nhan); }

/* ============ THẺ CỘT PHẢI ============ */
.the-hang { display: flex; gap: 2px; padding: 6px 8px 0; background: var(--nen-2);
  border-bottom: 1px solid var(--vach); flex: none; }
.the {
  flex: 1; background: none; border: 0; border-bottom: 2px solid transparent;
  color: var(--chu-mo); font: 600  var(--chu-nho)/1 var(--font);
  letter-spacing: .02em;
  padding: 11px 6px; cursor: pointer; border-radius: var(--bo-nho) var(--bo-nho) 0 0;
}
.the[aria-selected="true"] { color: var(--nhan); border-bottom-color: var(--nhan); background: var(--nen-3); }
.the { transition: color var(--nhip-nhanh) var(--da-ra),
                   border-color var(--nhip) var(--da-vao); }
.the:hover { color: var(--chu); }

/* ============ XUẤT VIDEO ============ */
.nut.rong { width: 100%; }
/* Nút là thẻ <a> thì phải gỡ gạch chân — `.nut` viết cho <button>, mà <button>
   thì không có gạch chân để mà gỡ. */
a.nut { text-decoration: none; }
a.nut svg { fill: none; stroke: currentColor; stroke-width: 1.6;
            stroke-linecap: round; stroke-linejoin: round; }
.hang-nut { display: flex; gap: 7px; margin-bottom: 10px; }
.hang-nut .nut.chinh { flex: 1; }

.tien-do {
  height: 6px; background: var(--nen); border-radius: 3px;
  overflow: hidden; margin-bottom: 8px;
}
.tien-do-vach { height: 100%; width: 0; background: var(--nhan); transition: width .35s ease; }

.ket-qua { margin-top: 10px; display: flex; flex-direction: column; gap: 9px; }
.xem-truoc { width: 100%; border-radius: 8px; background: #000; display: block; }
.ket-qua a { text-decoration: none; text-align: center; }
.nhat-ky {
  margin: 0; padding: 9px 11px; background: var(--nen); border: 1px solid var(--vach);
  border-radius: 7px; font-size: var(--chu-nho); line-height: 1.55; white-space: pre-wrap;
  max-height: 260px; overflow: auto; font-family: ui-monospace, monospace; color: var(--chu-mo);
}
.ke { border: 0; border-top: 1px solid var(--vach); margin: 14px 0; }

/* Biểu tượng vẽ thẳng bằng SVG chứ không dùng ký tự: phông trong workspace
   thiếu mấy ký tự hình học, ra ô vuông rỗng. SVG thì máy nào cũng vẽ được. */
.nut-ti svg { width: 13px; height: 13px; display: block; margin: auto;
  fill: none; stroke: currentColor; stroke-width: 1.6; stroke-linecap: round; }

/* ============ CHỈNH KHUNG NHẤN ============ */
.khung-san { position: relative; display: none; max-height: 100%; }
.khung-anh { display: block; max-height: calc(100vh - 200px); width: auto;
  max-width: 100%; border-radius: 8px; }
.khung-trong { color: var(--chu-mo); font-size: var(--chu-vua); text-align: center; }

.khung-hop {
  position: absolute; display: none; cursor: move;
  border: 3px solid var(--cam); border-radius: 12px;
  box-shadow: 0 0 0 1px rgba(0, 0, 0, .5), 0 0 0 9999px rgba(0, 0, 0, .5);
}
.khung-hop[data-loai="che"]  { border-color: #7c5cff; }
.khung-hop[data-loai="xoa"]  { border-color: var(--xanh); border-style: dashed; }

.khung-tay {
  position: absolute; width: 13px; height: 13px;
  background: var(--chu); border: 2px solid var(--cam); border-radius: 3px;
}
.khung-tay[data-tay^="t"] { top: -7px; }
.khung-tay[data-tay^="g"] { top: calc(50% - 7px); }
.khung-tay[data-tay^="d"] { bottom: -7px; }
.khung-tay[data-tay$="t"] { left: -7px; }
.khung-tay[data-tay$="g"] { left: calc(50% - 7px); }
.khung-tay[data-tay$="p"] { right: -7px; }
.khung-tay[data-tay="tt"], .khung-tay[data-tay="dp"] { cursor: nwse-resize; }
.khung-tay[data-tay="tp"], .khung-tay[data-tay="dt"] { cursor: nesw-resize; }
.khung-tay[data-tay="tg"], .khung-tay[data-tay="dg"] { cursor: ns-resize; }
.khung-tay[data-tay="gt"], .khung-tay[data-tay="gp"] { cursor: ew-resize; }

.khung-so { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 12px; }
.khung-dau { padding: 12px 12px 8px; margin: 0; border-top: 1px solid var(--vach); }
.khung-ds { padding: 0 6px 20px; }
.khung-hang {
  display: flex; align-items: center; gap: 7px; width: 100%;
  background: none; border: 0; color: var(--chu); font: inherit; font-size: var(--chu-vua);
  padding: 6px 8px; border-radius: 6px; cursor: pointer; text-align: left;
}
.khung-hang:hover:not(:disabled) { background: var(--nen-3); }
.khung-hang.dang { background: var(--nhan); color: var(--tren-nhan); }
.khung-hang:disabled { opacity: .38; cursor: default; }
.khung-cham { width: 8px; height: 8px; border-radius: 2px; flex: none; background: var(--cam); }
.khung-cham[data-loai="che"] { background: #7c5cff; }
.khung-cham[data-loai="xoa"] { background: var(--xanh); }
.khung-ten { flex: 1; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.khung-thoi { color: var(--chu-mo); font-size: var(--chu-nho); flex: none; font-variant-numeric: tabular-nums; }
.khung-hang.dang .khung-thoi { color: var(--tren-nhan); opacity: .75; }
.khung-canh {
  padding: 10px 8px 4px; font-size: var(--chu-nho); font-weight: 600;
  text-transform: uppercase; letter-spacing: .06em; color: var(--chu-mo);
}

/* ============ VIDEO ĐÃ XUẤT ============ */
.video-boc { display: flex; flex-direction: column; gap: 10px;
  max-width: 100%; max-height: 100%; align-items: center; }
.video-xem { max-width: 100%; max-height: calc(100vh - 210px);
  border-radius: var(--bo); background: #000; display: block;
  box-shadow: 0 14px 46px rgba(0, 0, 0, .6); }
.video-nhan { margin: 0; font-size: var(--chu-vua); color: var(--chu-mo); text-align: center; }

.video-ds { padding: 0 6px 20px; }
/* Đầu mỗi bộ dự án — bấm để gập lại. Dính lên trên khi cuộn: danh sách dài hơn
   một màn, không dính thì cuộn tới giữa là không còn biết đang ở bộ nào. */
.video-bo {
  display: flex; align-items: center; gap: 8px; width: 100%;
  position: sticky; top: 0; z-index: 2;
  margin: 14px 0 2px; padding: 8px; border: 0; border-radius: 8px;
  background: var(--nen-2); color: var(--chu); font: inherit;
  cursor: pointer; text-align: left;
}
.video-bo:first-child { margin-top: 4px; }
.video-bo:hover { background: var(--nen-3); }
.video-bo b { font-size: var(--chu-vua); }
.video-bo-cot { flex: 1; display: flex; flex-direction: column; gap: 1px; min-width: 0; }
.video-bo-mo { font-size: var(--chu-nho); color: var(--chu-mo);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.video-mui { flex: none; width: 10px; height: 10px; color: var(--chu-mo); }
.video-mui svg { width: 10px; height: 10px; display: block;
  fill: none; stroke: currentColor; stroke-width: 1.7;
  stroke-linecap: round; stroke-linejoin: round;
  transition: transform .12s; }
.video-bo:not(.gap) .video-mui svg { transform: rotate(90deg); }
/* Cột phải chỉ rộng ~150px: không chặn thì "07/09 21:55 · 85s · 48.1 MB" tụt
   xuống hàng hai và mỗi video cao gấp rưỡi. */
.video-phu { white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.video-hang {
  display: flex; align-items: center; gap: 8px; width: 100%;
  background: none; border: 0; color: var(--chu); font: inherit;
  padding: 7px 8px; border-radius: 7px; cursor: pointer; text-align: left;
}
.video-hang:hover { background: var(--nen-3); }
.video-hang.dang { background: var(--nhan); color: var(--tren-nhan); }
.video-cot { display: flex; flex-direction: column; gap: 2px; flex: 1; min-width: 0; }
.video-ten { font-size: var(--chu-vua); font-variant-numeric: tabular-nums; }
.video-phu { font-size: var(--chu-nho); color: var(--chu-mo); }
.video-hang.dang .video-phu { color: var(--tren-nhan); opacity: .75; }
.video-nhan-hang { display: flex; flex-direction: column; gap: 3px; align-items: flex-end; flex: none; }

.the-nho {
  font-size: var(--chu-nho); padding: 2px 6px; border-radius: 4px;
  background: var(--nen); border: 1px solid var(--vach); color: var(--chu-mo);
  white-space: nowrap;
}
.the-nho.tieng { border-color: #2b6b45; background: #13291d; color: #7fd6a0; }
.the-nho.cam { border-color: #6b4a1c; background: #2a1f12; color: #e0a86a; }
.video-hang.dang .the-nho { background: rgba(0,0,0,.2); border-color: rgba(0,0,0,.32); color: var(--tren-nhan); }
.video-boc .nut { text-decoration: none; text-align: center; }

.ly-do { max-width: 520px; text-align: left; color: var(--chu-mo); font-size: var(--chu-vua); }
.ly-do h4 { margin: 0 0 10px; color: var(--chu); font-size: var(--chu-to); }
.ly-do ul { margin: 0 0 12px; padding-left: 20px; line-height: 1.7; }
.ly-do li { margin-bottom: 5px; }

/* Hộp mỏng: giấu tay nắm giữa, không thì chúng phủ kín chỗ để nắm mà dời. */
.khung-hop.mong-ngang .khung-tay[data-tay="tg"],
.khung-hop.mong-ngang .khung-tay[data-tay="dg"],
.khung-hop.mong-doc  .khung-tay[data-tay="gt"],
.khung-hop.mong-doc  .khung-tay[data-tay="gp"] { display: none; }
/* Bé cả hai chiều thì giấu hết — dời bằng chuột, co giãn thì gõ số. */
.khung-hop.be-ti .khung-tay { display: none; }
.khung-hop.mong-ngang .khung-tay, .khung-hop.mong-doc .khung-tay {
  width: 10px; height: 10px; border-width: 1.5px;
}

/* ---------- soát chất lượng ---------- */
/* Hai mức, phân biệt bằng CẢ màu lẫn chữ và chấm — không bao giờ chỉ bằng màu,
   vì người mù màu sẽ không thấy khác gì giữa "phải sửa" và "nên xem". */
.soat { display: flex; flex-direction: column; gap: 6px; }
.soat-sach { margin: 0; color: var(--xanh); font-size: var(--chu-vua); }

.soat-hang {
  display: grid; grid-template-columns: 9px 1fr; gap: 3px 8px;
  text-align: left; padding: 9px 10px; border-radius: 8px;
  background: var(--nen-3); border: 1px solid var(--vach);
  color: var(--chu); font: inherit; font-size: var(--chu-vua); line-height: 1.45;
  cursor: pointer;
}
.soat-hang:hover { border-color: var(--nhan); }
.soat-hang:focus-visible { outline: 2px solid var(--nhan); outline-offset: 1px; }
.soat-cham { width: 7px; height: 7px; border-radius: 50%; margin-top: 5px; }
.soat-hang.nang { border-left: 3px solid var(--do); }
.soat-hang.nang .soat-cham { background: var(--do); }
.soat-hang.nhe  { border-left: 3px solid #8a6d3b; }
.soat-hang.nhe  .soat-cham { background: #c9973f; }
.soat-goi { grid-column: 2; color: var(--chu-mo); font-size: var(--chu-nho); }

.soat-them {
  background: none; border: 0; padding: 7px 2px; text-align: left;
  color: var(--chu-mo); font: inherit; font-size: var(--chu-vua); cursor: pointer;
  text-decoration: underline; text-underline-offset: 3px;
}
.soat-them:hover { color: var(--chu); }
.soat-them:focus-visible { outline: 2px solid var(--nhan); outline-offset: 1px; border-radius: 4px; }

/* Thẻ có lỗi nặng: chấm đỏ + con số, không chỉ đổi màu chữ. */
.the.co-loi { color: #ff9c9e; }
.the.co-loi[aria-selected="true"] { border-bottom-color: var(--do); }

/* ---------- mục nâng cao ---------- */
.nang-cao { margin-top: 4px; }
.nang-cao > summary {
  list-style: none; cursor: pointer; user-select: none;
  display: flex; align-items: center; gap: 6px;
  padding: 6px 2px; font-size: var(--chu-vua); color: var(--chu-mo);
}
.nang-cao > summary::-webkit-details-marker { display: none; }
.nang-cao > summary::before {
  content: ''; width: 0; height: 0; flex: none;
  border: 4px solid transparent; border-left-color: currentColor;
  transition: transform var(--nhip-nhanh) var(--da-vao);
}
.nang-cao[open] > summary::before { transform: rotate(90deg) translateX(-1px); }
.nang-cao > summary:hover { color: var(--chu); }
.nang-cao > summary:focus-visible { outline: 2px solid var(--nhan); outline-offset: 1px; border-radius: 4px; }
.nang-cao[open] > summary { margin-bottom: 6px; }

/* ---------- tôn trọng cài đặt giảm chuyển động ---------- */
/* Người bật cài đặt này thường vì chuyển động làm họ chóng mặt hoặc buồn nôn.
   Tắt hẳn, không phải làm chậm lại. Giao diện vẫn dùng được y nguyên. */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
  }
}

/* ---------- núm chọn video ---------- */
.num-video { display: flex; flex-direction: column; gap: 7px; }
.video-xem-truoc {
  width: 100%; border-radius: 8px; background: #000; display: block;
  max-height: 130px; object-fit: cover;
}

/* ---------- phóng to khung làm việc ---------- */
.giua { position: relative; }
.chi-phong {
  position: absolute; right: 16px; top: 14px; z-index: 20;
  display: flex; align-items: center; gap: 8px;
  padding: 5px 6px 5px 12px; border-radius: 999px;
  background: color-mix(in srgb, var(--nen-2) 86%, transparent);
  backdrop-filter: blur(14px);
  border: 1px solid var(--vach);
  font-size: var(--chu-vua); font-variant-numeric: tabular-nums;
  animation: bao-hien var(--nhip) var(--da-vao);
}
.chi-phong .nut { border-radius: 999px; }
/* Đang phóng thì bỏ bo góc và bóng đổ: hai thứ đó bị phóng theo, thành ra viền
   dày cộp và bóng loang lổ ở mức 400%. */
.boc-khung.dang-phong { border-radius: 0; box-shadow: none; }

/* Đang kéo một tấm ảnh từ ngoài vào: nói rõ THẢ VÀO ĐÂY THÌ ĂN. Không có dấu
   hiệu nào thì người ta thả vào giữa cửa sổ, trình duyệt mở luôn tấm ảnh thay
   cả trang, và mất hết những gì chưa lưu. */
.boc-khung.dang-tha-anh { outline: 3px dashed var(--nhan); outline-offset: -3px; }
.boc-khung.dang-tha-anh::after {
  content: 'Thả ảnh vào đây';
  position: absolute; inset: auto 0 14px; text-align: center;
  font-size: var(--chu-vua); font-weight: 600; pointer-events: none;
  color: var(--tren-nhan); 
}
.boc-khung.dang-tha-anh::before {
  content: ''; position: absolute; left: 50%; bottom: 10px; translate: -50% 0;
  width: 160px; height: 30px; border-radius: 999px; background: var(--nhan);
  pointer-events: none;
}
#san-clip.dang-doi { cursor: grabbing; }

/* ---------- ảnh nhỏ của thành phần (kiểu bảng lớp Photoshop) ---------- */
.lop-anh {
  width: 34px; height: 34px; flex: none;
  border-radius: 5px; border: 1px solid var(--vach);
  background:
    /* ô cờ vua nhạt để thấy phần trong suốt, như mọi phần mềm đồ hoạ */
    linear-gradient(45deg, #202020 25%, transparent 25%, transparent 75%, #202020 75%) 0 0/10px 10px,
    linear-gradient(45deg, #202020 25%, transparent 25%, transparent 75%, #202020 75%) 5px 5px/10px 10px,
    #161616;
  overflow: hidden; position: relative;
}
.lop-hang.dang .lop-anh { border-color: rgba(0, 0, 0, .45); }
.lop-hang { gap: 9px; padding: 5px 10px; align-items: center; }

.lop-xem-lon {
  position: fixed; z-index: 200;
  width: 168px; height: 168px;
  border-radius: 10px; border: 1px solid var(--vach);
  box-shadow: 0 16px 44px rgba(0, 0, 0, .6);
  overflow: hidden; pointer-events: none;
  animation: bao-hien var(--nhip-nhanh) var(--da-vao);
}

/* ---------- bong bóng hướng dẫn tại chỗ ---------- */
/* Nút hỏi nằm im lìm cho tới khi cần: hiện mờ, rõ hẳn khi rê vào hàng núm. Bày
   chín mươi dấu hỏi sáng rực ra cùng lúc thì chính nó lại thành thứ gây rối. */
.hd-nut {
  width: 15px; height: 15px; margin-left: 6px; padding: 0;
  border: 0; border-radius: 50%;
  background: var(--nen-3); color: var(--chu-mo);
  font: 600  var(--chu-nho)/15px system-ui; text-align: center;
  cursor: help; opacity: .45; vertical-align: middle;
  transition: opacity var(--nhip-nhanh) var(--da-ra),
              background var(--nhip-nhanh) var(--da-ra),
              color var(--nhip-nhanh) var(--da-ra);
}
.num:hover .hd-nut { opacity: .85; }
.hd-nut:hover, .hd-nut[aria-describedby] { opacity: 1; background: var(--nhan); color: var(--tren-nhan); }
.hd-nut:focus-visible { outline: 2px solid var(--nhan); outline-offset: 2px; opacity: 1; }

.hd {
  position: fixed; z-index: 300; width: 300px;
  padding: 12px 14px; border-radius: 12px;
  background: color-mix(in srgb, var(--nen-2) 88%, transparent);
  backdrop-filter: blur(18px);
  border: 1px solid var(--vach);
  box-shadow: 0 18px 50px rgba(0, 0, 0, .62);
  animation: hd-hien var(--nhip) var(--da-vao);
}
@keyframes hd-hien { from { opacity: 0; transform: translateY(6px) scale(.98); } }
.hd-de { margin: 0 0 6px; font-size: var(--chu-vua); font-weight: 600; color: var(--chu); }
.hd-mo { margin: 0; font-size: var(--chu-vua); line-height: 1.55; color: var(--chu-mo); }
.hd-demo { margin-top: 10px; border-radius: 8px; overflow: hidden; background: #000; }

/* ============================================================================
   GIAO DIỆN MỚI — các mảnh chỉ có trong bản dựng Stitch
   ==========================================================================*/

/* Chữ chỉ dành cho trình đọc màn hình. Không dùng `display:none`: thứ đó bị
   trình đọc bỏ qua luôn, mà đây đúng là thứ cần đọc lên. */
.chi-doc {
  position: absolute; width: 1px; height: 1px; overflow: hidden;
  clip-path: inset(50%); white-space: nowrap;
}

/* ---------- thanh trên ---------- */
.chon {
  background: var(--nen-3); color: var(--chu);
  border: 1px solid transparent; border-radius: var(--bo-tron);
  padding: 6px 12px; font: 500  var(--chu-vua)/1.4 var(--font); min-width: 240px;
}
.chon:hover { background: var(--nen-4); }

/* Hai mẩu tin nhỏ cạnh nhau: kích thước khung hình, và "chưa lưu".
   Cùng dáng viên thuốc nhưng khác màu — cái xám là sự thật nguội, cái cam là
   việc phải làm. */
.chip-tin {
  font-size: var(--chu-nho); color: var(--chu-mo);
  background: var(--nen-3); padding: 3px 10px; border-radius: var(--bo-tron);
  font-variant-numeric: tabular-nums; white-space: nowrap;
}
.dau-ban {
  font-size: var(--chu-nho); font-weight: 600; color: var(--cam);
  background: rgba(249, 115, 22, .14); padding: 3px 10px;
  border-radius: var(--bo-tron); white-space: nowrap;
}

.nhom-nut { display: flex; gap: 2px; }
.nut-tron {
  width: 30px; height: 30px; padding: 0; flex: none;
  border: 0; border-radius: 50%; background: transparent; color: var(--chu-mo);
  cursor: pointer; display: inline-flex; align-items: center; justify-content: center;
  transition: color var(--nhip-nhanh) var(--da-ra),
              background var(--nhip-nhanh) var(--da-ra),
              transform var(--nhip-nhanh) var(--da-vao);
}
.nut-tron svg {
  width: 15px; height: 15px; fill: none; stroke: currentColor;
  stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round;
}
.nut-tron:hover:not(:disabled) { color: var(--chu); background: rgba(255, 255, 255, .08); transform: scale(1.06); }
.nut-tron:disabled { opacity: .3; cursor: default; }
.nut-tron:focus-visible { outline: 2px solid var(--nhan); outline-offset: 2px; }

/* ---------- ô lọc thành phần ---------- */
.hop-tim {
  position: relative; display: flex; align-items: center;
  padding: 8px 10px; border-bottom: 1px solid var(--vach); flex: none;
}
.tim-kinh {
  position: absolute; left: 19px; width: 13px; height: 13px; pointer-events: none;
  fill: none; stroke: var(--chu-mo-2); stroke-width: 1.5; stroke-linecap: round;
}
.nhap-tim {
  flex: 1; min-width: 0;
  background: var(--nen-3); color: var(--chu);
  border: 1px solid transparent; border-radius: var(--bo-tron);
  padding: 6px 30px 6px 28px; font: inherit; font-size: var(--chu-vua); outline: none;
}
.nhap-tim::placeholder { color: var(--chu-mo-2); }
.nhap-tim:focus { border-color: var(--chu-mo); background: var(--nen-2); }
.tim-dem {
  position: absolute; right: 20px; font-size: var(--chu-nho); color: var(--chu-mo-2);
  font-variant-numeric: tabular-nums; pointer-events: none;
}

/* ---------- khu giữa ---------- */
.giua {
  background: var(--nen); border-radius: var(--bo-khoi); overflow: hidden;
}
.san-khau { background: #0a0a0a; }
.bang-bao { margin: 10px 12px 0; }

/* ---------- thanh phát dưới cùng ---------- */
.thanh-duoi {
  height: 62px; flex: none;
  background: var(--nen); border-radius: var(--bo-khoi);
  display: grid; grid-template-columns: minmax(140px, 1fr) minmax(0, 2.2fr) minmax(60px, 1fr);
  align-items: center; gap: 14px; padding: 0 16px;
}
.dang-phat { display: flex; align-items: center; gap: 11px; min-width: 0; }
.anh-canh {
  width: 40px; height: 40px; flex: none; border-radius: var(--bo);
  background: var(--nen-3); display: flex; align-items: center; justify-content: center;
}
.dang-phat-chu { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.ten-canh {
  font-size: var(--chu-vua); font-weight: 600; color: var(--chu);
  overflow: hidden; text-overflow: ellipsis; white-space: nowrap;
}
.phu-canh { font-size: var(--chu-nho); color: var(--chu-mo); white-space: nowrap; }

.dieu-khien { display: flex; align-items: center; gap: 12px; padding: 0; min-width: 0; }

/* Nút chạy: tròn, trắng, chữ đen — thứ sáng nhất trên cả thanh, vì nó là việc
   người dùng bấm nhiều nhất. */
.nut-phat {
  width: 34px; height: 34px; flex: none; padding: 0;
  border: 0; border-radius: 50%; background: var(--chu); color: #000;
  display: inline-flex; align-items: center; justify-content: center; cursor: pointer;
  transition: transform var(--nhip-nhanh) var(--da-vao), background var(--nhip-nhanh) var(--da-ra);
}
.nut-phat:hover:not(:disabled) { transform: scale(1.08); }
.nut-phat:disabled { opacity: .35; cursor: default; }
.nut-phat:focus-visible { outline: 2px solid var(--nhan); outline-offset: 3px; }
.nut-phat svg { width: 15px; height: 15px; fill: currentColor; stroke: none; }
.nut-phat .hinh-dung { display: none; }
.nut-phat[data-chay="1"] .hinh-chay { display: none; }
.nut-phat[data-chay="1"] .hinh-dung { display: block; }

/* ---------- thanh trượt: rãnh mảnh, núm tròn nhỏ ---------- */
.thanh-tua, .num-so .truot {
  -webkit-appearance: none; appearance: none;
  height: 4px; border-radius: var(--bo-tron);
  background: var(--nen-4); outline: none; cursor: pointer;
}
.thanh-tua::-webkit-slider-thumb, .num-so .truot::-webkit-slider-thumb {
  -webkit-appearance: none; width: 12px; height: 12px; border-radius: 50%;
  background: var(--chu); cursor: pointer; border: 0;
}
.thanh-tua:hover::-webkit-slider-thumb,
.num-so .truot:hover::-webkit-slider-thumb { background: var(--nhan); }
.thanh-tua::-moz-range-thumb, .num-so .truot::-moz-range-thumb {
  width: 12px; height: 12px; border-radius: 50%; background: var(--chu); border: 0;
}
.dong-ho { font-size: var(--chu-nho); min-width: 118px; }
.tien-ich-phai { display: flex; align-items: center; justify-content: flex-end; gap: 10px; }

/* ---------- khung chọn trên khung hình: tám tay nắm co giãn ---------- */
/* Bản cũ vẽ hai chấm góc bằng ::before/::after — chỉ để NHÌN, bấm không trúng
   vì cả khung chọn đang pointer-events:none. Nay là thẻ thật, bắt được chuột.

   CHÚNG PHẢI ĂN CHUỘT, KHUNG CHỌN THÌ KHÔNG. Cho cả khung ăn chuột là mọi cú
   bấm vào giữa món đều bị khung nuốt, và người dùng hết chọn được món nằm
   dưới. Nên chỉ tám ô vuông này mở, phần còn lại vẫn trong suốt với chuột. */
.khung-nam {
  position: absolute; width: 9px; height: 9px; pointer-events: auto;
  background: var(--nen-2); border: 1.5px solid var(--nhan); border-radius: 2px;
  box-shadow: 0 0 0 1px rgba(0, 0, 0, .55);
}
/* Vùng chạm rộng hơn ô nhìn thấy: 9px là vừa mắt nhưng khó trúng, nhất là ở
   mức phóng nhỏ. Lớp đệm trong suốt này nới ra 20px mà không to thêm chấm. */
.khung-nam::after { content: ''; position: absolute; inset: -6px; }

.khung-nam[data-nam^="t"] { top: -5px; }
.khung-nam[data-nam^="g"] { top: calc(50% - 4.5px); }
.khung-nam[data-nam^="d"] { bottom: -5px; }
.khung-nam[data-nam$="t"] { left: -5px; }
.khung-nam[data-nam$="g"] { left: calc(50% - 4.5px); }
.khung-nam[data-nam$="p"] { right: -5px; }

.khung-nam[data-nam="tt"], .khung-nam[data-nam="dp"] { cursor: nwse-resize; }
.khung-nam[data-nam="tp"], .khung-nam[data-nam="dt"] { cursor: nesw-resize; }
.khung-nam[data-nam="tg"], .khung-nam[data-nam="dg"] { cursor: ns-resize; }
.khung-nam[data-nam="gt"], .khung-nam[data-nam="gp"] { cursor: ew-resize; }

/* Vùng đặt sẵn tự tính bề rộng bằng calc() — ghi một con số cứng vào là món
   thôi co theo khung, và 16:9 với 9:16 lại lệch nhau. Giấu hẳn tay nắm, và
   `keoco.js` nói ra lý do nếu ai đó vẫn kéo trúng. */
.khung-chon[data-kieu="dat"] .khung-nam { display: none; }

/* Hộp mỏng thì tay nắm giữa chen vào chỗ dùng để DỜI món; hộp bé cả hai chiều
   thì giấu hết, kéo cỡ bằng ô "Rộng"/"Cao" ở bảng bên phải. */
.khung-chon.mong-ngang .khung-nam[data-nam^="g"],
.khung-chon.mong-doc .khung-nam[data-nam$="g"] { display: none; }
.khung-chon.be-ti .khung-nam { display: none; }
.anh-canh svg {
  width: 17px; height: 17px; fill: none; stroke: var(--chu-mo-2);
  stroke-width: 1.3; stroke-linejoin: round;
}

/* ---------- thanh trên không được đẩy tràn ngang ---------- */
/* Ô chọn clip có `min-width` cố định, mà tên clip đời cũ thì dài
   ("VH-03 · CEO / Sales Leader — số liệu không phải đợi ai"). Không cho co thì
   cả thanh đội rộng ra, đẩy nút Lưu khỏi mép phải và sinh cuộn ngang. */
.thanh-tren > * { min-width: 0; }
.chon { flex: 0 1 auto; min-width: 140px; max-width: 46vw; }
.hieu { flex: none; }
.o-hieu { flex: none; }

/* ---------- bảng chọn thành phần (kho, chia theo bộ) ---------- */
/* Trước đây đây là một danh sách phẳng 13 dòng. Kho giờ 24 món — đổ hết ra một
   cột thì phải cuộn, mà cuộn một danh sách toàn chữ thì không ai nhớ món nào
   nằm đâu. Nên: chia bộ, mỗi món một dòng tả ngắn, và có ô tìm. */
.menu-them { width: 340px; padding: 0; max-height: min(600px, 80vh); display: flex; flex-direction: column; }
.kho-dau {
  padding: 11px 13px 8px; font-size: var(--chu-nho); font-weight: 700;
  text-transform: uppercase; letter-spacing: .06em; color: var(--chu-mo); flex: none;
}
.kho-tim { margin: 0 12px 8px; padding-left: 12px; flex: none; }
.kho-than { overflow-y: auto; padding: 0 6px 8px; flex: 1; min-height: 0; }
.kho-bo {
  padding: 9px 7px 4px; font-size: var(--chu-nho); font-weight: 700;
  text-transform: uppercase; letter-spacing: .05em; color: var(--chu-mo-2);
  position: sticky; top: 0; background: var(--nen-3); z-index: 1;
}
/* Lưới hai cột: hình vẽ trên, tên dưới. Mắt bắt hình nhanh hơn bắt chữ, mà
   người mở bảng này ra là đang muốn LƯỚT chứ không muốn đọc. */
.kho-luoi { display: grid; grid-template-columns: 1fr 1fr; gap: 4px; padding: 0 3px; }
.menu-them .kho-mon {
  display: flex; flex-direction: column; gap: 5px; align-items: center;
  width: 100%; text-align: center; padding: 8px 6px 7px; border-radius: var(--bo);
  background: none; border: 1px solid transparent; color: var(--chu);
  font: inherit; cursor: pointer;
  transition: background var(--nhip-nhanh) var(--da-ra),
              border-color var(--nhip-nhanh) var(--da-ra);
}
.menu-them .kho-mon:hover { background: var(--nen-2); border-color: var(--nhan); }
.menu-them .kho-mon:focus-visible { outline: 2px solid var(--nhan); outline-offset: 1px; }
.kho-ten { font-size: var(--chu-nho); font-weight: 600; line-height: 1.25; }

/* Hình sơ đồ: viền xám, đúng MỘT mảng nhấn cho phần "ruột" của món. */
.hinh-mon {
  width: 100%; height: 40px; display: block;
  background: var(--nen); border-radius: var(--bo-nho);
}
.hinh-mon .v { fill: none; stroke: var(--chu-mo-2); stroke-width: 1.4;
  stroke-linejoin: round; stroke-linecap: round; }
.hinh-mon .d { fill: var(--nhan); stroke: none; opacity: .85; }
.hinh-mon .d.net { fill: none; stroke: var(--nhan); stroke-width: 2;
  stroke-linecap: round; stroke-linejoin: round; opacity: 1; }
.hinh-mon .dut { stroke-dasharray: 3 2.5; }
.hinh-mon .ch { fill: var(--chu-mo-2); font: 600 13px var(--font); text-anchor: middle; }
.menu-them .kho-mon:hover .hinh-mon { background: var(--nen-3); }
.kho-trong { padding: 14px 10px; font-size: var(--chu-vua); color: var(--chu-mo); }

/* ---------- hai thẻ trong bảng chọn: bộ dựng sẵn · một món ---------- */
.kho-the { display: flex; gap: 2px; padding: 0 12px 8px; flex: none; }
.kho-the-nut {
  flex: 1; padding: 6px 0; border: 0; border-radius: var(--bo-nho);
  background: var(--nen-2); color: var(--chu-mo);
  font: 600  var(--chu-nho)/1 var(--font); cursor: pointer;
}
.kho-the-nut[aria-selected="true"] { background: var(--nen-4); color: var(--nhan); }
.kho-the-nut:hover { color: var(--chu); }

/* ---------------------------------------------------------------- rãnh tiếng
   Sóng âm vẽ bằng SVG giãn theo bề ngang, nên `vector-effect` là bắt buộc: thiếu
   nó thì `preserveAspectRatio="none"` kéo giãn luôn nét vẽ và sóng thành một
   mảng bôi. */
.muc-tieng { display: flex; flex-direction: column; gap: 10px; }
.ranh { border: 1px solid var(--vach); border-radius: 10px; padding: 8px 9px; background: var(--nen-2); }
.ranh-dinh { display: flex; align-items: center; gap: 6px; }
.ranh-ten { flex: 1 1 auto; min-width: 0; font-size: var(--chu-vua); font-weight: 600;
            overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
/* `.o-nhap` dùng chung có `width:100%`, để nguyên thì ô chọn loại nuốt hết chỗ và
   TÊN FILE biến mất — mà tên file mới là thứ người dùng cần đọc đầu tiên. */
.ranh-dinh .o-nhap.ti { flex: 0 0 auto; width: auto; max-width: 108px; }
.ranh-dinh .nut-ti { flex: 0 0 auto; }
.ranh-dai { position: relative; height: 34px; margin: 7px 0 5px;
            background: var(--nen-3); border-radius: 6px; overflow: hidden; }
.ranh-song { position: absolute; top: 1px; bottom: 1px; left: 0; width: 100%; }
.ranh-song .song { width: 100%; height: 100%; }
.ranh-song .song path { stroke: currentColor; stroke-width: 1;
                        vector-effect: non-scaling-stroke; opacity: .85; }
.ranh-tieng .ranh-song { color: var(--nhan); }
.ranh-nhac .ranh-song { color: #6b8fd6; }
.ranh-hieu-ung .ranh-song { color: #d68f6b; }
.ranh-ghi { position: absolute; right: 6px; bottom: 2px; font-size: var(--chu-nho);
            color: var(--chu-mo); background: color-mix(in srgb, var(--nen-3) 80%, transparent);
            padding: 0 4px; border-radius: 4px; }
.ranh-num { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 5px 8px; }
.num-ti { display: flex; flex-direction: column; gap: 2px; }
.num-nhan-ti { font-size: var(--chu-nho); color: var(--chu-mo); }
.o-nhap.ti { padding: 3px 5px; font-size: var(--chu-nho); }
.canh-bao { color: #c4632a; }

/* ------------------------------------------------------------ mốc chuyển động */
.muc-moc .moc-dai { position: relative; height: 16px; margin: 2px 0 8px;
                    background: var(--nen-3); border-radius: 4px; }
.moc-vach { position: absolute; top: 2px; bottom: 2px; width: 3px; margin-left: -1px;
            background: var(--nhan); border-radius: 2px; }
.moc-kim { position: absolute; top: -2px; bottom: -2px; width: 1px;
           background: var(--chu); opacity: .55; }
.moc { border: 1px solid var(--vach); border-radius: 8px; padding: 6px 7px; margin-bottom: 7px; }
.moc-dinh { display: flex; align-items: center; gap: 5px; }
.moc-so { font-size: var(--chu-nho); font-weight: 700; margin-right: auto; }
.moc-nhan-ti { font-size: var(--chu-nho); color: var(--chu-mo); }
.moc-dinh .o-nhap.ti { width: auto; max-width: 74px; flex: 0 0 auto; }
.moc-num { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 4px 7px; margin-top: 6px; }
/* Núm chưa bật thì mờ đi — nhìn một cái là biết mốc này ghim những gì. */
.moc-o { display: flex; align-items: center; gap: 4px; opacity: .45; }
.moc-o.bat { opacity: 1; }
.moc-o .o-nhap.ti { width: auto; min-width: 0; flex: 1 1 auto; }
.moc-o input[type="checkbox"] { flex: 0 0 auto; margin: 0; }

/* ------------------------------------------------------------------ khung AI */
.muc-ai { display: flex; flex-direction: column; gap: 8px; }
.o-loi { min-height: 96px; resize: vertical; font-family: inherit; line-height: 1.45; }
.ai-giong { display: flex; flex-direction: column; gap: 3px;
            max-height: 320px; overflow-y: auto; }
.ai-ngan { font-size: var(--chu-nho); color: var(--chu-mo); margin: 8px 0 2px;
           border-top: 1px solid var(--vach); padding-top: 7px; }
.ai-hang { display: flex; align-items: center; gap: 4px; border-radius: 8px;
           border: 1px solid transparent; }
.ai-hang.chon { border-color: var(--nhan); background: var(--nhan-nhe); }
.ai-ten { flex: 1; display: flex; flex-direction: column; align-items: flex-start;
          gap: 1px; padding: 5px 7px; background: none; border: 0; cursor: pointer;
          text-align: left; color: inherit; font: inherit; min-width: 0; }
.ai-ten-chinh { font-size: var(--chu-vua); font-weight: 600; }
.ai-ten-phu { font-size: var(--chu-nho); color: var(--chu-mo); overflow: hidden;
              text-overflow: ellipsis; white-space: nowrap; max-width: 100%; }
.ai-nghe { flex: 0 0 auto; width: 26px; height: 26px; margin-right: 5px;
           border-radius: 50%; border: 1px solid var(--vach); background: var(--nen-2);
           display: grid; place-items: center; cursor: pointer; padding: 0; }
.ai-nghe svg { width: 11px; height: 11px; fill: currentColor; stroke: none; }
/* Đang phát thì đổi hẳn màu — người dùng bấm 5 giọng liên tiếp phải biết cái nào
   đang kêu, không thì tưởng máy hỏng. */
.ai-nghe.dang-nghe { background: var(--nhan); color: var(--tren-nhan); border-color: var(--nhan); }
.o-brief { min-height: 62px; resize: vertical; font-family: inherit; line-height: 1.45; }

/* ------------------------------------------------------------- nút AI + thanh hỏi */
.nut-ai { display: inline-flex; align-items: center; gap: 6px; height: 32px;
          padding: 0 13px 0 10px; border-radius: 999px; cursor: pointer;
          border: 1px solid var(--vach); background: var(--nen-2); color: var(--chu);
          font: inherit; font-size: var(--chu-vua); font-weight: 600; }
.nut-ai svg { width: 15px; height: 15px; fill: currentColor; stroke: none; flex: none; }
.nut-ai:hover { border-color: var(--nhan); }
.nut-ai.dang-mo { background: var(--nhan); color: var(--tren-nhan); border-color: var(--nhan); }
.nut-ai-chu { letter-spacing: .04em; }

/* Thanh hỏi nổi NGAY TRÊN thanh dưới, không phủ kín màn hình: người dùng phải
   còn thấy khung hình trong lúc hỏi về nó. */
.thanh-ai { position: fixed; left: 50%; transform: translateX(-50%);
            bottom: calc(var(--cao-thanh-duoi, 64px) + 10px);
            width: min(720px, calc(100vw - 32px)); z-index: 40;
            /* Không bao giờ cao quá màn hình: thẻ "Giọng đọc" có danh sách 28
               giọng, để tự do là nó tràn lên che hết khung xem clip. */
            max-height: min(560px, calc(100vh - 140px)); display: flex;
            flex-direction: column;
            background: var(--nen-2); border: 1px solid var(--vach);
            border-radius: 14px; padding: 10px; box-shadow: 0 10px 34px rgba(0,0,0,.42); }
.thanh-ai.an { display: none; }
/* Thẻ "Giọng đọc" cần rộng hơn thẻ "Hỏi AI" — danh sách giọng có hai dòng chữ
   mỗi hàng, để hẹp thì tên giọng bị cắt. */
.thanh-ai.rong { width: min(860px, calc(100vw - 32px)); }

.ai-the-hang { display: flex; align-items: center; gap: 4px; margin-bottom: 9px;
               flex: none; }
.ai-the { border: 0; background: none; color: var(--chu-mo); font: inherit;
          font-size: var(--chu-vua); font-weight: 600; padding: 5px 11px; border-radius: 8px;
          cursor: pointer; }
.ai-the:hover { color: var(--chu); }
.ai-the.chon { background: var(--nen-3); color: var(--chu); }
.ai-the-hang .nut-dong-ai { margin-left: auto; }
.ai-noi { min-height: 0; overflow-y: auto; }
.ai-noi.an { display: none; }
/* Danh sách giọng tự co theo chỗ còn lại của bảng, không tự đặt trần riêng —
   đặt hai trần lồng nhau là sinh ra hai thanh cuộn chồng lên nhau. */
.ai-noi .ai-giong { max-height: none; }
.ai-goi-y { display: flex; flex-wrap: wrap; gap: 5px; margin-bottom: 8px; }
.ai-chip { border: 1px solid var(--vach); background: var(--nen-3); color: var(--chu-mo);
           border-radius: 999px; padding: 4px 11px; font: inherit; font-size: var(--chu-nho);
           cursor: pointer; }
.ai-chip:hover { border-color: var(--nhan); color: var(--chu); }
.ai-chip.nhan { border-color: var(--nhan); color: var(--nhan); }
.ai-hang-hoi { display: flex; align-items: center; gap: 7px; }
.o-hoi { flex: 1; min-width: 0; }
.nut-gui { flex: 0 0 auto; padding: 0 18px; }
.nut-dong-ai { flex: 0 0 auto; }
.ai-tra { margin-top: 9px; padding: 9px 11px; border-radius: 10px;
          background: var(--nen-3); font-size: var(--chu-vua); line-height: 1.55;
          white-space: pre-wrap; max-height: 210px; overflow-y: auto; }
.ai-tra.an { display: none; }
.ai-tra.hong { color: #e0795a; }

/* Hai cột trong thẻ "Giọng đọc": gõ bên trái, chọn giọng bên phải.
   Dưới 720px thì xếp dọc lại — hai cột 300px thì cột nào cũng chật. */
.ai-noi .muc-ai { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
                  gap: 6px 18px; align-items: start; }
.ai-cot { display: flex; flex-direction: column; gap: 7px; min-width: 0; }
.ai-cot-giong { max-height: 400px; }
.ai-cot .muc-ten { margin: 0; }
.ai-cot-giong .ai-giong { max-height: 300px; overflow-y: auto; }
@media (max-width: 760px) {
  .ai-noi .muc-ai { grid-template-columns: minmax(0, 1fr); }
}

/* ------------------------------------------------------------ thẻ "Dựng hình" */
.muc-dung { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1fr);
            gap: 6px 18px; align-items: start; }
@media (max-width: 760px) { .muc-dung { grid-template-columns: minmax(0, 1fr); } }
/* Chưa dựng thì cột phải trống — cho nó một lời nhắc thay vì một khoảng trắng. */
.muc-dung .dung-kq.an { display: block; visibility: hidden; }
.dung-tha { position: relative; border: 1.5px dashed var(--vach); border-radius: 12px;
            padding: 16px 12px; text-align: center; cursor: pointer;
            background: var(--nen-3); transition: border-color .12s, background .12s; }
.dung-tha:hover, .dung-tha:focus-visible, .dung-tha.dang-keo {
  border-color: var(--nhan); background: var(--nhan-nhe); outline: none; }
.dung-tha.co-anh { padding: 10px; }
.dung-tha-chinh { font-size: var(--chu-vua); font-weight: 600; margin: 0 0 4px; }
.dung-tha-phu { font-size: var(--chu-nho); color: var(--chu-mo); margin: 0; }
/* Ảnh xem trước bị GHIM TRẦN chiều cao: người dùng hay dán ảnh chụp cả màn hình
   dọc, để tự do là nó đẩy nút "Dựng thử" ra khỏi bảng. */
.dung-anh { max-width: 100%; max-height: 118px; border-radius: 8px; display: block;
            margin: 0 auto; }
.dung-ten { display: block; margin-top: 6px; font-size: var(--chu-nho); color: var(--chu-mo); }
.dung-bo { position: absolute; top: 7px; right: 7px; }
.o-y { min-height: 44px; resize: vertical; font-family: inherit; }
.dung-kq { border: 1px solid var(--vach); border-radius: 10px; padding: 10px 11px;
           background: var(--nen-3); }
.dung-kq.an { display: none; }
.dung-kq.hong { border-color: #8a4633; }
.dung-tom { margin: 0 0 7px; font-size: var(--chu-vua); font-weight: 600; }
.dung-cay { max-height: 210px; overflow-y: auto; margin-bottom: 9px; }
.dung-mon { display: flex; align-items: center; gap: 7px; padding: 2px 0; font-size: var(--chu-nho); }
.dung-kind { flex: none; font-family: ui-monospace, monospace; font-size: var(--chu-nho);
             color: var(--nhan); background: var(--nen-2); border-radius: 4px; padding: 1px 6px; }
.dung-nhan { color: var(--chu-mo); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.dung-loi { margin: 6px 0 2px; font-size: var(--chu-nho); color: #e0795a; font-weight: 600; }
.dung-loi-dong { margin: 1px 0; font-size: var(--chu-nho); color: #e0795a; }

/* ------------------------------------------------------------- thẻ "Sửa món" */
.sua-chon { margin: 0 0 2px; font-size: var(--chu-vua); font-weight: 600; padding: 7px 10px;
            border-radius: 8px; background: var(--nhan-nhe); color: var(--chu); }
.sua-chon.trong { background: var(--nen-3); color: var(--chu-mo); font-weight: 400;
                  line-height: 1.5; }
.sua-bang { display: flex; flex-direction: column; gap: 3px; margin-bottom: 8px;
            max-height: 200px; overflow-y: auto; }
.sua-dong { display: grid; grid-template-columns: minmax(64px, auto) 1fr auto 1fr;
            align-items: baseline; gap: 6px; font-size: var(--chu-nho); }
.sua-truong { font-family: ui-monospace, monospace; font-size: var(--chu-nho); color: var(--nhan);
              background: var(--nen-2); border-radius: 4px; padding: 1px 6px; }
.sua-cu { color: var(--chu-mo); text-decoration: line-through; overflow: hidden;
          text-overflow: ellipsis; white-space: nowrap; }
.sua-mui { color: var(--chu-mo); }
.sua-moi { color: var(--chu); font-weight: 600; overflow: hidden;
           text-overflow: ellipsis; white-space: nowrap; }

/* --------------------------------------------------------- đăng nhập / thoát */
.nut-ra { flex: none; }
/* Chạy trên mạng mà không có mật khẩu thì phải NHÌN THẤY, không phải đọc tài liệu. */
.chip-canh-bao {
  flex: none; font-size: var(--chu-nho); font-weight: 600; padding: 4px 10px;
  border-radius: 999px; color: #f0b27a; background: #f0b27a1a;
  border: 1px solid #f0b27a40; cursor: help;
}
.o-tai-khoan { display: flex; align-items: center; gap: 8px; }
.chip-ai {
  flex: none; font-size: var(--chu-nho); font-weight: 600; padding: 4px 10px;
  border-radius: 999px; color: var(--chu-mo); background: var(--nen-3);
  border: 1px solid var(--vach); cursor: default;
}

/* ---------------------------------------------------------------- ô xem thử
 * Một ô nhỏ diễn lại một chuyển động, dùng chung cho dải gói chuyển động và
 * popup hiệu ứng. Xem `web/inspector/o-xem-thu.js`.
 *
 * Kích thước do CHỖ GỌI đặt (thẻ trong dải rộng hẹp khác nhau), ở đây chỉ lo
 * phần khung bên trong luôn phủ kín và không bắt chuột.
 */
.o-xem-thu {
  position: relative;
  overflow: hidden;
  border-radius: 8px;
  background: #eef0f4;          /* đúng nền cảnh mẫu — không chớp trắng lúc nạp */
  /* Cảnh mẫu khổ 640×360. Ô lệch tỉ lệ là bộ dựng thu cho vừa rồi chừa hai dải
     màu nền của nó ra hai bên — trông như ô bị hỏng. Ghim tỉ lệ ở đây để chỗ
     gọi chỉ cần đặt bề ngang. */
  aspect-ratio: 16 / 9;
}
.o-xem-thu-khung {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
  display: block;
  /* Ô xem thử là để NHÌN. Cho nó nhận chuột thì cú bấm chọn gói rơi vào trong
     khung xem chứ không tới được thẻ, và người dùng bấm mãi không chọn được. */
  pointer-events: none;
}

/* ------------------------------------------------- clip đời cũ: chỉ chiếu
 * Clip đời cũ không tách được cảnh và không liệt kê được thành phần, nên cả
 * cột trái rỗng trơn. Để nguyên thì màn hình trông như hỏng — hai bảng trống
 * và một ô tìm kiếm vô dụng bao quanh một clip vẫn đang chạy đúng.
 * Giấu đi, trả 272px lại cho khung hình. Cột phải giữ nguyên vì "Xuất video"
 * và "Khung nhấn" vẫn dùng được thật.
 */
body.doi-cu .cot-trai,
body.doi-cu .keo-cot[data-cot="trai"] { display: none; }

/* Dòng chỉ đường dưới ô gõ của bảng "Sửa món" — chỉ hiện khi người dùng đã gõ.
   Nói trước lúc họ chưa định làm gì là một dòng chữ thừa. */
.sua-chi-duong {
  margin: 6px 2px 0; font-size: var(--chu-nho); line-height: 1.5;
  color: var(--chu-mo);
}
.sua-chi-duong.sua-can { color: #ffb4b4; }

/* ---------- tả bằng lời → Stitch vẽ giao diện ---------- */
/* Lượt này mất khoảng một phút rưỡi, nên dòng chặng phải ở NGAY DƯỚI nút: người
   dùng nhìn nó suốt, và nếu nó nằm xa nút thì họ bấm lại lần nữa vì tưởng hỏng. */
.o-dung-ta { min-height: 52px; }
.nut-ta { margin-top: 2px; }
.ta-chang {
  margin: 0; padding: 6px 8px; border-radius: var(--bo-nho, 6px);
  background: var(--nen-3); color: var(--chu-mo);
  font-size: var(--chu-nho); line-height: 1.45;
}
.ta-chang.ta-hong { background: rgba(239, 68, 68, .15); color: #fca5a5; }

/* ---------- Ô ②: ảnh chụp từng phần trang để chọn (web/dunghinh.js) ---------- */
.chup-ds { display: grid; grid-template-columns: repeat(auto-fill, minmax(150px, 1fr)); gap: 8px;
  max-height: 360px; overflow-y: auto; margin-bottom: 8px; padding: 2px; }
.chup-phan { display: flex; flex-direction: column; gap: 5px; padding: 5px; text-align: left;
  background: var(--nen-2); border: 1px solid var(--vach); border-radius: var(--bo);
  color: var(--chu); cursor: pointer; transition: border-color var(--nhip-nhanh); }
.chup-phan:hover { border-color: var(--nen-4); }
.chup-phan[aria-pressed="true"] { border-color: var(--nhan); box-shadow: 0 0 0 1px var(--nhan); }
.chup-phan img { width: 100%; height: 84px; object-fit: cover; object-position: top;
  border-radius: var(--bo-nho); background: var(--nen-3); }
.chup-chu { display: flex; flex-direction: column; gap: 1px; font-size: var(--chu-nho); min-width: 0; }
.chup-chu b { font-size: var(--chu-vua); }
.chup-chu span { color: var(--chu-mo); overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.chup-xem { display: inline-block; margin-bottom: 8px; font-size: var(--chu-nho); color: var(--nhan); }
.hang-phoi { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 4px; }
.hang-phoi .nut { flex: 1 1 calc(50% - 3px); }
