/* ══════════════════════════════════════════════════════════════════════
   Trí Lữ Lesson V25 — lớp da phủ lên Atlas V26
   ══════════════════════════════════════════════════════════════════════
   Gắn SAU hoc-lesson-atlas-v26.css bằng đúng một thẻ <link>. Không đổi
   HTML, không đổi JS, không chạm một byte dữ liệu bài học nào.

   Bốn việc lớp này làm:
     1. Cảnh nền dawn/night — vẽ bằng body::before/::after nên không cần
        thêm thẻ div nào vào 550 trang.
     2. Thang chữ có sàn: không nhãn nào dưới 13px, thân bài 17px.
     3. Bảng màu theo khối + dải màu chữ ký dùng chung.
     4. Chế độ tối: nền lặng, chữ phát quang.
   ══════════════════════════════════════════════════════════════════════ */

:root{
  --v25-label:13px;
  --v25-meta:14px;
  --v25-body:17px;

  --v25-open:#155e91;
  --v25-form:#0e7a6f;
  --v25-example:#b0344f;
  --v25-check:#8a4bc4;
  --v25-warm:#9c4d08;
  --v25-grad:linear-gradient(120deg,#155e91,#8a4bc4 52%,#b0344f);
  /* Opaque text is the shared baseline.  The earlier clipped gradient left
     learner-facing labels transparent in the iOS App-UA compositor. */
  --v25-heading-ink:var(--tl-ink,#172833);

  --v25-scene-dawn:image-set(url("/anh-art/lesson-dawn-900.avif") type("image/avif"),
                             url("/anh-art/lesson-dawn-900.webp") type("image/webp"));
  --v25-scene-night:image-set(url("/anh-art/lesson-night-900.avif") type("image/avif"),
                              url("/anh-art/lesson-night-900.webp") type("image/webp"));
  --v25-base:#dfeaf2;
  --v25-veil:linear-gradient(180deg,rgba(255,255,255,0) 0%,rgba(235,245,251,.06) 42%,rgba(214,228,239,.46) 100%);
  --v25-glass:rgba(250,252,249,.80);
  --v25-glass-soft:rgba(250,252,249,.66);
}

/* V28.1 — tiện ích hoc-nang-cap chèn nút này sau stylesheet và đặt 38px.
   Khóa sàn chạm 44px ở lớp shared, không sửa file tiện ích untracked/WIP. */
#hnc-am {
  width: 44px !important;
  height: 44px !important;
  min-width: 44px !important;
  min-height: 44px !important;
}

html[data-mode="dark"]{
  --v25-open:#7cc8f5;
  --v25-form:#6fe3d0;
  --v25-example:#ffa3b8;
  --v25-check:#c9a6ff;
  --v25-warm:#ffc073;
  --v25-grad:linear-gradient(120deg,#83e8ff,#c7a9ff 52%,#ff9bc8);
  --v25-heading-ink:var(--tl-ink,#f0eee6);
  --v25-base:#020713;
  --v25-veil:linear-gradient(180deg,rgba(1,5,14,.06) 0%,rgba(2,7,19,.26) 52%,rgba(2,7,19,.72) 100%);
  --v25-glass:rgba(9,28,50,.82);
  --v25-glass-soft:rgba(7,24,44,.70);
}

@media(min-width:760px){
  :root{
    --v25-scene-dawn:image-set(url("/anh-art/lesson-dawn-1200.avif") type("image/avif"),
                               url("/anh-art/lesson-dawn-1200.webp") type("image/webp"));
    --v25-scene-night:image-set(url("/anh-art/lesson-night-1200.avif") type("image/avif"),
                                url("/anh-art/lesson-night-1200.webp") type("image/webp"));
  }
}
@media(min-width:1400px){
  :root{
    --v25-scene-dawn:image-set(url("/anh-art/lesson-dawn-1672.avif") type("image/avif"),
                               url("/anh-art/lesson-dawn-1672.webp") type("image/webp"));
    --v25-scene-night:image-set(url("/anh-art/lesson-night-1672.avif") type("image/avif"),
                                url("/anh-art/lesson-night-1672.webp") type("image/webp"));
  }
}

/* ── 1. cảnh nền, không cần thêm thẻ nào ─────────────────────────────── */
body{background:var(--v25-base)!important}
body::before,body::after{content:"";position:fixed;inset:0;pointer-events:none}
body::before{z-index:-2;background-image:var(--v25-scene-dawn);background-size:cover;background-position:center top;background-repeat:no-repeat}
html[data-mode="dark"] body::before{background-image:var(--v25-scene-night)}
body::after{z-index:-1;background:var(--v25-veil)}

/* ── 2. thang chữ có sàn ─────────────────────────────────────────────── */
.sec-kicker{font-size:var(--v25-label)!important;font-weight:700!important;letter-spacing:.12em!important;color:var(--v25-warm)!important}
.pmeta,.pmeta span{font-size:var(--v25-meta)!important}
.hd-tt small,.fl-top small,.hubcard :is(p,span:where(.hubcard-description)),.stat .l{font-size:var(--v25-meta)!important}
.fl-hintswipe{font-size:var(--v25-label)!important;letter-spacing:.1em!important}
/* Đo trên trang thật còn 10 chỗ tụt xuống 9,1-11,2px. Nâng hết lên sàn. */
.hd-kicker{font-size:var(--v25-label)!important;letter-spacing:.1em!important}
.lm-switch button{font-size:var(--v25-meta)!important}
.fl-step,.w-num{font-size:var(--v25-label)!important}
.g-lbl{font-size:var(--v25-label)!important;font-weight:700!important}
.exspk{font-size:var(--v25-meta)!important}
.bnav button{font-size:var(--v25-label)!important}
#tl-furi.noi{font-size:var(--v25-meta)!important}
/* Vét nốt: nhãn từ loại và nhãn giải chữ Hán trên trang từ vựng/Hán tự. */
.w-pos,.wchip,.kb-lbl,.k-lbl{font-size:var(--v25-label)!important}
.g-ex .vn,.w-ex .vn{font-size:max(var(--v25-body),16px)!important;line-height:1.75!important}
.tl-micro-body,.kb-info,.kb-note,.g-explain{font-size:max(var(--v25-body),16px)!important;line-height:1.75!important}
.w-mean[hidden],.g-ex .vn[hidden],.w-ex .vn[hidden]{display:none!important}
.tl-meaning-toggle,.tl-example-meaning-toggle{display:inline-flex;align-items:center;justify-content:center;min-height:44px;padding:9px 13px;border:1px solid color-mix(in srgb,var(--v25-example) 36%,var(--line));border-radius:12px;background:var(--v25-glass-soft);color:var(--v25-example);font-family:"Bricolage Grotesque","Be Vietnam Pro",sans-serif;font-size:var(--v25-meta);font-weight:700;cursor:pointer}
.w-hero>.tl-meaning-toggle{margin:9px auto 3px}
.g-ex>.tl-example-meaning-toggle,.w-ex>.tl-example-meaning-toggle{margin-top:10px}
.spk,.exspk,.hd-mode,.hd-back,.fl-prev,.fl-next,.knowbtn,.opt,.mt,.ghost,.nextbtn{min-height:44px!important}

/* ── 3. mặt kính + màu theo khối ─────────────────────────────────────── */
.hd{background:var(--v25-glass)!important;-webkit-backdrop-filter:blur(26px) saturate(180%)!important;backdrop-filter:blur(26px) saturate(180%)!important;box-shadow:0 12px 34px rgba(8,26,44,.14),inset 0 1px 0 rgba(255,255,255,.5)!important}
html[data-mode="dark"] .hd{box-shadow:0 12px 34px rgba(0,6,16,.4),inset 0 1px 0 rgba(186,224,255,.18)!important}

#flowBox,.fc-stage,.hub,.exwrap,.stat-grid>.stat,.chips{background:var(--v25-glass-soft)!important;-webkit-backdrop-filter:blur(16px) saturate(160%)!important;backdrop-filter:blur(16px) saturate(160%)!important}
#flowBox,.exwrap{box-shadow:0 22px 70px rgba(27,47,66,.16),inset 0 1px 0 rgba(255,255,255,.55),inset 0 -1px 0 rgba(12,34,54,.10)!important}
html[data-mode="dark"] #flowBox,html[data-mode="dark"] .exwrap{box-shadow:0 22px 80px rgba(0,5,15,.44),inset 0 1px 0 rgba(186,224,255,.20),inset 0 -1px 0 rgba(0,0,0,.30)!important}

/* ví dụ: gờ hồng, tách khỏi phần giảng */
.g-ex,.w-ex{border-left:3px solid color-mix(in srgb,var(--v25-example) 62%,transparent)!important;
  background:linear-gradient(100deg,color-mix(in srgb,var(--v25-example) 6%,transparent),transparent 62%),var(--v25-glass-soft)!important}

/* công thức: gờ xanh lam */
.tl-formula-group,.g-struct,#fcS{border-left:3px solid color-mix(in srgb,var(--v25-form) 62%,transparent)!important;
  background:linear-gradient(100deg,color-mix(in srgb,var(--v25-form) 6%,transparent),transparent 62%),var(--v25-glass-soft)!important}

/* ── 4. dải màu chữ ký — thứ anh Trí thích ở nút "Tiếp tục" ──────────── */
.fl-next,.nextbtn{background:var(--v25-grad)!important;color:#fff!important;border:0!important}
html[data-mode="dark"] .fl-next,html[data-mode="dark"] .nextbtn{color:#06111f!important;box-shadow:0 10px 30px rgba(131,232,255,.22)!important}
.pbar>i,#pFill{background:var(--v25-grad)!important}
/* .ic là emoji — cắt nền theo chữ sẽ biến nó thành khối màu đặc.
   Dùng gạch chân dải màu dưới mục đang mở thay vì tô vào biểu tượng. */
.bnav button.on{position:relative}
.bnav button.on::after{content:"";position:absolute;left:22%;right:22%;bottom:6px;height:3px;border-radius:3px;background:var(--v25-grad)}
.lm-switch button.on{background:var(--v25-grad)!important;color:#fff!important}
html[data-mode="dark"] .lm-switch button.on{color:#06111f!important}

/* Nhãn khối giữ mực đặc theo token hệ thống. Không phụ thuộc background-clip:
   App-UA có thể nhận CSS gradient nhưng không vẽ lớp chữ đã clip. */
.fl-top b,.hubcard :is(h3,span:where(.hubcard-heading)){background:none!important;-webkit-background-clip:border-box!important;background-clip:border-box!important;color:var(--v25-heading-ink)!important;-webkit-text-fill-color:var(--v25-heading-ink)!important}

/* ── 5. chế độ tối: chữ phát quang ───────────────────────────────────── */
html[data-mode="dark"] .fl-top b,html[data-mode="dark"] .hubcard :is(h3,span:where(.hubcard-heading)){filter:drop-shadow(0 0 16px rgba(140,200,255,.30))}
html[data-mode="dark"] .q-stem{text-shadow:0 0 26px rgba(124,200,245,.26)}
html[data-mode="dark"] .sec-kicker{text-shadow:0 0 13px color-mix(in srgb,var(--v25-warm) 55%,transparent)}
html[data-mode="dark"] .g-ex .jp b,html[data-mode="dark"] .w-ex .jp b{text-shadow:0 0 16px color-mix(in srgb,var(--v25-example) 65%,transparent)}

/* ── 6. dự phòng ─────────────────────────────────────────────────────── */
@media(prefers-reduced-transparency:reduce){
  body::before,body::after{display:none}
  .hd,#flowBox,.fc-stage,.hub,.exwrap,.chips{-webkit-backdrop-filter:none!important;backdrop-filter:none!important}
}
@media(forced-colors:active){
  body::before,body::after{display:none!important}
  .fl-next,.nextbtn,.lm-switch button.on{background:Highlight!important;color:HighlightText!important}
  .fl-top b,.hubcard :is(h3,span:where(.hubcard-heading)),.bnav button.on .ic{background:none!important;color:CanvasText!important;-webkit-text-fill-color:CanvasText!important}
}
@media print{body::before,body::after{display:none!important}}

/* ══════════════════════════════════════════════════════════════════════
   V25.1 — BỐ CỤC: cho tấm kính nổi lên trên cảnh
   ══════════════════════════════════════════════════════════════════════
   Đo ngày 16/08: .app rộng đúng bằng màn hình, #flowBox bo góc 0px và
   không lề, .hd tràn viền. Nghĩa là nội dung phủ kín 100% khung nhìn nên
   nền cảnh không có chỗ nào lộ ra — đổi màu bao nhiêu cũng vẫn ra tờ giấy.

   Lớp này tạo khe: bo góc, thêm lề, giới hạn bề rộng. Không đổi HTML,
   không đổi thứ tự đọc, không đụng dữ liệu.
   ══════════════════════════════════════════════════════════════════════ */

.app{max-width:min(100%,780px)!important;margin:0 auto!important;padding:10px 12px 96px!important}

/* thanh đầu trang: viên kính nổi, không còn dán mép */
.hd{border-radius:20px!important;margin:0 0 12px!important;padding:12px 14px!important;
    border:1px solid rgba(255,255,255,.5)!important}
html[data-mode="dark"] .hd{border-color:rgba(186,224,255,.16)!important}

/* khối nội dung chính: bo góc, có lề, để lộ cảnh hai bên và giữa các khối */
#flowBox,.exwrap,.fc-stage,.hub,.chips,#pointList{
  border-radius:22px!important;margin:0 0 14px!important;
  border:1px solid rgba(255,255,255,.46)!important}
html[data-mode="dark"] #flowBox,html[data-mode="dark"] .exwrap,
html[data-mode="dark"] .fc-stage,html[data-mode="dark"] .hub,
html[data-mode="dark"] .chips,html[data-mode="dark"] #pointList{border-color:rgba(186,224,255,.14)!important}

/* thanh chuyển chế độ học cũng thành viên kính rời */
.lm-switch{border-radius:16px!important;margin:0 0 12px!important;overflow:hidden}

/* Thanh điều hướng dưới: nổi lên khỏi mép, bo tròn.
   CHỈ áp ở <=820px. V26 dùng đúng breakpoint này để chuyển .bnav thành thanh
   ngang cố định; rộng hơn thì nó là CỘT DỌC bên cạnh. Áp luật thanh ngang cho
   mọi kích thước sẽ kéo cột dọc vào giữa màn hình — đúng lỗi bài 16 ngày 16/08. */
@media(max-width:820px){
  .bnav{left:50%!important;transform:translateX(-50%)!important;width:min(calc(100% - 24px),756px)!important;
    bottom:10px!important;border-radius:20px!important;
    border:1px solid rgba(255,255,255,.5)!important;
    -webkit-backdrop-filter:blur(24px) saturate(170%)!important;backdrop-filter:blur(24px) saturate(170%)!important}
  html[data-mode="dark"] .bnav{border-color:rgba(186,224,255,.16)!important}
}

/* kính đậm hơn để ra chất thuỷ tinh, không phải giấy */
:root{--v25-glass:rgba(252,253,251,.72);--v25-glass-soft:rgba(252,253,251,.58)}
html[data-mode="dark"]{--v25-glass:rgba(8,26,47,.76);--v25-glass-soft:rgba(7,23,42,.62)}
.bnav{background:var(--v25-glass)!important}

/* thẻ bên trong khối thì trong hơn nữa, để thấy tầng lớp */
.wcard,.g-sec,.kb{background:color-mix(in srgb,var(--v25-glass-soft) 86%,transparent)!important}

/* màn rộng: cảnh lộ nhiều hơn ở hai bên */
@media(min-width:900px){ .app{padding:18px 20px 104px!important} }

/* ══════════════════════════════════════════════════════════════════════
   V25.2 — CHỮ: đưa font hiển thị vào, đuổi font code ra khỏi nhãn
   ══════════════════════════════════════════════════════════════════════
   Đo 16/08: tiêu đề bài đang là Be Vietnam Pro 16px weight 400 — tức là
   font thân bài, cỡ thân bài, đậm thân bài. Không có font hiển thị nào.
   Nhãn thì dùng JetBrains Mono, là font lập trình, nên "CHẶNG 1/10" đọc
   ra như dòng log chứ không như nhãn của một bài học.

   Cặp chữ mới:
     · Bricolage Grotesque — tiêu đề, nhãn. Có chân chữ hơi lệch, đọc ra
       chất thủ công, hợp với hệ Cinema đang dùng ở trang chủ.
     · Be Vietnam Pro — thân bài. Giữ nguyên vì dựng riêng cho dấu tiếng Việt.
     · Noto Serif JP — chữ Nhật. Giữ nguyên, vốn đã đúng.
   ══════════════════════════════════════════════════════════════════════ */

.hd-tt,.hd-tt b,.hd-tt strong{font-family:"Bricolage Grotesque","Be Vietnam Pro",sans-serif!important;
  font-size:17px!important;font-weight:600!important;letter-spacing:-.01em!important;line-height:1.25!important}
.hd-kicker{font-family:"Bricolage Grotesque","Be Vietnam Pro",sans-serif!important;font-weight:700!important}

/* nhãn: bỏ font code, dùng khoảng chữ rộng cho ra chất nhãn */
.sec-kicker,.fl-step,.w-num,.g-lbl,.q-label,.fl-hintswipe,.bnav button,.lm-switch button{
  font-family:"Bricolage Grotesque","Be Vietnam Pro",sans-serif!important}
.fl-step,.w-num{letter-spacing:.12em!important;font-weight:600!important}

/* tiêu đề trong bài và câu hỏi */
.q-stem,.g-title,.hubcard :is(h3,span:where(.hubcard-heading)),.stat .v{font-family:"Bricolage Grotesque","Be Vietnam Pro",sans-serif!important;
  letter-spacing:-.015em!important}

/* nghĩa tiếng Việt của từ: cho nó ra dáng tiêu đề phụ, không phải chú thích */
.w-m{font-family:"Bricolage Grotesque","Be Vietnam Pro",sans-serif!important;font-weight:600!important;
  font-size:clamp(19px,2.4vw,23px)!important;letter-spacing:-.01em!important}

/* ══════════════════════════════════════════════════════════════════════
   V25.3 — ICON: thay 14 emoji bằng một bộ vector
   ══════════════════════════════════════════════════════════════════════
   Emoji mỗi hệ điều hành vẽ một kiểu, không nhận màu theo chủ đề, và
   không bao giờ khớp nét với nhau. Dùng mask-image + SVG data-URI nên
   icon ăn theo currentColor, nhận được cả dải màu chữ ký, và KHÔNG phải
   sửa một dòng HTML nào của 550 trang.
   ══════════════════════════════════════════════════════════════════════ */

/* Nút nav là flex container nên phải khoá flex, không thì icon bị co về 0px. */
.bnav .ic{font-size:0!important;line-height:0!important;display:block!important;
  width:24px!important;height:24px!important;min-width:24px!important;flex:0 0 24px!important;
  margin:0 auto 2px!important;background:currentColor!important;
  -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;
  -webkit-mask-position:center;mask-position:center;-webkit-mask-size:contain;mask-size:contain}

/* Học — quyển sách mở */
.bnav button:nth-child(1) .ic{-webkit-mask-image:var(--ic-book);mask-image:var(--ic-book)}
/* Thẻ nhớ — hai thẻ xếp lớp */
.bnav button:nth-child(2) .ic{-webkit-mask-image:var(--ic-cards);mask-image:var(--ic-cards)}
/* Bài tập — bút viết */
.bnav button:nth-child(3) .ic{-webkit-mask-image:var(--ic-pen);mask-image:var(--ic-pen)}
/* Tiến độ — biểu đồ cột */
.bnav button:nth-child(4) .ic{-webkit-mask-image:var(--ic-chart);mask-image:var(--ic-chart)}

/* mục đang mở: icon ăn dải màu chữ ký */
.bnav button.on .ic{background:var(--v25-grad)!important}

:root{
  --ic-book:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M12 6.5C10.5 5 8.5 4.4 4 4.4v13.2c4.5 0 6.5.6 8 2.1 1.5-1.5 3.5-2.1 8-2.1V4.4c-4.5 0-6.5.6-8 2.1z"/><path d="M12 6.5V19.7"/></svg>');
  --ic-cards:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><rect x="3" y="6.5" width="12" height="14" rx="2.2"/><path d="M8 4.2h9.3A2.5 2.5 0 0 1 19.8 6.7v10.6"/></svg>');
  --ic-pen:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M16.5 3.6l3.9 3.9L8.6 19.3l-5 1.1 1.1-5z"/><path d="M14.2 5.9l3.9 3.9"/></svg>');
  --ic-chart:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M4 20.2h16"/><rect x="5.6" y="12" width="3.6" height="6"/><rect x="10.2" y="7.4" width="3.6" height="10.6"/><rect x="14.8" y="4" width="3.6" height="14"/></svg>');
  --ic-speaker:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M11 5.2L6.6 8.9H3.4v6.2h3.2L11 18.8z"/><path d="M15.4 9.2a4 4 0 0 1 0 5.6"/><path d="M18.2 6.6a7.7 7.7 0 0 1 0 10.8"/></svg>');
}

/* nút loa trên thẻ và cạnh câu ví dụ */
.spk,.exspk,#fcSpk,.ls-play{position:relative}
.spk,#fcSpk{font-size:0!important;color:transparent!important}
.spk::after,#fcSpk::after{content:"";position:absolute;inset:0;margin:auto;width:20px;height:20px;
  background:currentColor;color:var(--v25-form);
  -webkit-mask:var(--ic-speaker) center/contain no-repeat;mask:var(--ic-speaker) center/contain no-repeat}
html[data-mode="dark"] .spk::after,html[data-mode="dark"] #fcSpk::after{color:var(--v25-form)}

/* dự phòng: máy không hỗ trợ mask thì trả emoji về, còn hơn mất icon */
@supports not ((-webkit-mask-image:url('')) or (mask-image:url(''))){
  .bnav .ic{font-size:20px!important;line-height:1!important;background:none!important;width:auto;height:auto}
  .spk,#fcSpk{font-size:inherit!important;color:inherit!important}
  .spk::after,#fcSpk::after{display:none}
}
@media(forced-colors:active){
  .bnav .ic{background:CanvasText!important}
  .bnav button.on .ic{background:Highlight!important}
}

/* ── V25.3b — vét nốt 8 emoji còn lại ────────────────────────────────── */
:root{
  --ic-doc:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M13.6 3.2H7.2A2.2 2.2 0 0 0 5 5.4v13.2a2.2 2.2 0 0 0 2.2 2.2h9.6a2.2 2.2 0 0 0 2.2-2.2V8.6z"/><path d="M13.6 3.2v5.4H19"/><path d="M8.6 13h6.8M8.6 16.6h4.6"/></svg>');
  --ic-moon:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M20.2 14.4A8.4 8.4 0 0 1 9.6 3.8a8.4 8.4 0 1 0 10.6 10.6z"/></svg>');
  --ic-sun:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="12" cy="12" r="4.2"/><path d="M12 2.6v2.2M12 19.2v2.2M2.6 12h2.2M19.2 12h2.2M5.4 5.4l1.6 1.6M17 17l1.6 1.6M18.6 5.4L17 7M7 17l-1.6 1.6"/></svg>');
  --ic-flow:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><circle cx="5.4" cy="12" r="2.4"/><circle cx="12" cy="12" r="2.4"/><circle cx="18.6" cy="12" r="2.4"/></svg>');
  --ic-list:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M9 6.4h11M9 12h11M9 17.6h11"/><path d="M4.4 6.4h.02M4.4 12h.02M4.4 17.6h.02"/></svg>');
  --ic-flame:url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="black" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round"><path d="M12 2.8s5.4 4.4 5.4 9.4a5.4 5.4 0 0 1-10.8 0c0-2 1-3.6 1.8-4.6.4 1 1.2 1.8 2 2 0-2.6.8-5 1.6-6.8z"/></svg>');
}

/* helper: biến một nút chữ thành nút icon */
.hd-mode,.lm-switch button{position:relative}
.hd-mode{font-size:0!important;color:transparent!important}
.hd-mode::after{content:"";position:absolute;inset:0;margin:auto;width:21px;height:21px;
  background:var(--v25-ink,currentColor);color:inherit;
  -webkit-mask-repeat:no-repeat;mask-repeat:no-repeat;-webkit-mask-position:center;mask-position:center;
  -webkit-mask-size:contain;mask-size:contain}
.hd-row a.hd-mode::after{-webkit-mask-image:var(--ic-doc);mask-image:var(--ic-doc)}
#modeBtn::after{-webkit-mask-image:var(--ic-moon);mask-image:var(--ic-moon)}
html[data-mode="dark"] #modeBtn::after{-webkit-mask-image:var(--ic-sun);mask-image:var(--ic-sun)}
/* Nút được đặt color:transparent để giấu emoji, nên currentColor cũng trong
   suốt theo — icon biến mất. Phải cho màu tường minh, không dùng currentColor. */
.hd-mode::after{background:#1d3a52!important}
html[data-mode="dark"] .hd-mode::after{background:#dbeaf7!important}

/* ĐÃ BỎ 16/08: ba nút dưới đây có emoji nằm CHUNG text node với chữ
   ("🔉 nghe câu", "🔥 1 ngày", "🧩 Học theo chặng"). CSS không giấu riêng
   được một ký tự trong text node, nên chèn ::before sẽ ra hai icon chồng
   nhau. Muốn thay thì phải bỏ emoji trong HTML — để lượt rollout riêng,
   có kiểm soát, chứ không hack bằng text-indent. */

@supports not ((-webkit-mask-image:url('')) or (mask-image:url(''))){
  .hd-mode{font-size:inherit!important;color:inherit!important}
  .hd-mode::after,.lm-switch button::before,.exspk::before,#xpTxt::before{display:none}
  .lm-switch button{padding-left:inherit!important}
  .exspk{padding-left:inherit!important}
  #xpTxt{padding-left:0}
}

/* ══════════════════════════════════════════════════════════════════════
   V25.4 — SÁNG HƠN · NHIỀU MÀU HƠN · MẶT KÍNH SOI
   ══════════════════════════════════════════════════════════════════════
   Ba việc anh Trí yêu cầu:
   (a) Mặt kính soi — làm trong canary rồi nhưng quên bê sang lớp da này.
   (b) Sáng hơn — lớp phủ đang đè 72% ở đáy nên cảnh bị dập, kính lại đục
       76% nên cả trang ra một mảng navy phẳng.
   (c) Nhiều màu hơn — panel đang trung tính hoàn toàn, màu chỉ nằm ở
       vài nhãn nhỏ. Giờ chính tấm kính cũng mang màu.
   ══════════════════════════════════════════════════════════════════════ */

/* ── (b) nhả cảnh ra, bớt đè ──────────────────────────────────────────── */
:root{
  --v25-veil:linear-gradient(180deg,rgba(255,255,255,0) 0%,rgba(240,247,252,.02) 46%,rgba(206,224,238,.28) 100%);
  --v25-glass:rgba(253,254,252,.60);
  --v25-glass-soft:rgba(253,254,252,.44);
}
html[data-mode="dark"]{
  --v25-veil:linear-gradient(180deg,rgba(1,5,14,0) 0%,rgba(3,12,26,.10) 50%,rgba(3,11,24,.44) 100%);
  --v25-glass:rgba(12,34,60,.58);
  --v25-glass-soft:rgba(11,31,55,.44);
}
/* cảnh rực hơn thay vì bị dập */
body::before{filter:saturate(1.22) contrast(1.06) brightness(1.04)}
html[data-mode="dark"] body::before{filter:saturate(1.24) contrast(1.05) brightness(1.12)}

/* ── (c) tấm kính mang màu, không còn trung tính ──────────────────────── */
#flowBox,.exwrap{
  background:
    radial-gradient(120% 80% at 6% 0%,color-mix(in srgb,var(--v25-open) 16%,transparent),transparent 58%),
    radial-gradient(110% 70% at 96% 100%,color-mix(in srgb,var(--v25-example) 13%,transparent),transparent 56%),
    var(--v25-glass-soft)!important}
.hd{background:
    linear-gradient(112deg,color-mix(in srgb,var(--v25-open) 15%,transparent),color-mix(in srgb,var(--v25-check) 11%,transparent) 62%,transparent),
    var(--v25-glass)!important}
.bnav{background:
    linear-gradient(112deg,color-mix(in srgb,var(--v25-check) 13%,transparent),color-mix(in srgb,var(--v25-example) 10%,transparent) 70%,transparent),
    var(--v25-glass)!important}
.fc-stage,.hub,.chips,#pointList{background:
    radial-gradient(120% 80% at 8% 0%,color-mix(in srgb,var(--v25-form) 14%,transparent),transparent 56%),
    var(--v25-glass-soft)!important}

/* viền cũng ăn màu, không còn viền trắng vô hồn */
#flowBox,.exwrap{border:1px solid color-mix(in srgb,var(--v25-open) 30%,transparent)!important}
.hd{border:1px solid color-mix(in srgb,var(--v25-check) 26%,transparent)!important}
.bnav{border:1px solid color-mix(in srgb,var(--v25-example) 24%,transparent)!important}

/* ── (a) mặt kính soi: vệt loé chéo + mép dày ─────────────────────────── */
/* .hd dùng position:sticky và .bnav dùng position:fixed — KHÔNG được đặt
   position:relative cho chúng, nếu không thanh đầu trang mất tính năng dính
   và thanh dưới rơi khỏi đáy màn hình. Chỉ cho overflow. */
#flowBox,.exwrap,.fc-stage,.hub,.lm-switch,.wcard,.g-sec{position:relative;overflow:hidden}
.hd,.bnav{overflow:hidden}
.hd::before,#flowBox::before,.exwrap::before,.fc-stage::before,.hub::before,.bnav::before,.wcard::before{
  content:"";position:absolute;left:0;right:0;top:0;height:54%;pointer-events:none;z-index:0;
  background:linear-gradient(168deg,rgba(255,255,255,.50),rgba(255,255,255,.12) 44%,transparent);
  mix-blend-mode:soft-light}
html[data-mode="dark"] .hd::before,html[data-mode="dark"] #flowBox::before,
html[data-mode="dark"] .exwrap::before,html[data-mode="dark"] .fc-stage::before,
html[data-mode="dark"] .hub::before,html[data-mode="dark"] .bnav::before,
html[data-mode="dark"] .wcard::before{
  background:linear-gradient(168deg,rgba(200,236,255,.30),rgba(180,220,255,.08) 46%,transparent)}

/* mép trên sáng, mép dưới tối — cho ra cảm giác kính có độ dày */
.hd,#flowBox,.exwrap,.fc-stage,.hub,.bnav{
  box-shadow:0 20px 60px rgba(20,44,68,.16),
             inset 0 1px 0 rgba(255,255,255,.72),
             inset 0 -1px 0 rgba(12,34,54,.10)!important}
html[data-mode="dark"] .hd,html[data-mode="dark"] #flowBox,html[data-mode="dark"] .exwrap,
html[data-mode="dark"] .fc-stage,html[data-mode="dark"] .hub,html[data-mode="dark"] .bnav{
  box-shadow:0 22px 70px rgba(0,5,15,.44),
             inset 0 1px 0 rgba(198,232,255,.34),
             inset 0 -1px 0 rgba(0,0,0,.34)!important}

/* kính dày hơn: blur mạnh, saturate cao → màu sau kính rực lên */
.hd,.bnav{-webkit-backdrop-filter:blur(30px) saturate(200%)!important;backdrop-filter:blur(30px) saturate(200%)!important}
#flowBox,.exwrap,.fc-stage,.hub{-webkit-backdrop-filter:blur(22px) saturate(185%)!important;backdrop-filter:blur(22px) saturate(185%)!important}

/* chữ và nội dung phải nằm TRÊN vệt loé */
.hd>*,#flowBox>*,.exwrap>*,.fc-stage>*,.hub>*,.bnav>*,.wcard>*{position:relative;z-index:1}

@media(prefers-reduced-transparency:reduce){
  .hd::before,#flowBox::before,.exwrap::before,.fc-stage::before,
  .hub::before,.bnav::before,.wcard::before{display:none}
}
@media(forced-colors:active){
  .hd::before,#flowBox::before,.exwrap::before,.fc-stage::before,
  .hub::before,.bnav::before,.wcard::before{display:none!important}
}

/* ══════════════════════════════════════════════════════════════════════
   V25.5 — THẺ TỪ VỰNG: dựng lại phân cấp
   ══════════════════════════════════════════════════════════════════════
   Anh Trí: "thẻ từ vựng quá đơn điệu, tạo cảm giác không có tâm."

   Đúng. Đo ra thì thẻ chỉ là một chồng phần tử canh giữa, không phân cấp:
   ảnh minh hoạ 220x165 chiếm chỗ lớn nhất, chữ Hán 64px thì trôi giữa,
   nhãn từ loại 11,8px một màu xanh chết, nghĩa tiếng Việt 21,6px lọt thỏm,
   ví dụ là hộp viền trơn. Không có gì dẫn mắt.

   Xếp lại thứ bậc: chữ Hán là nhân vật chính → nghĩa là câu trả lời →
   từ loại là chỉ dẫn phụ nhưng có màu riêng → ví dụ là khối tách bạch.
   ══════════════════════════════════════════════════════════════════════ */

/* số thứ tự: từ nhãn xám cô đơn thành viên đếm mang dải màu */
.w-num{display:inline-flex!important;align-items:center;padding:4px 11px!important;
  border-radius:999px!important;background:var(--v25-grad)!important;color:#fff!important;
  font-weight:700!important;letter-spacing:.08em!important;box-shadow:0 4px 14px rgba(20,60,110,.22)}
html[data-mode="dark"] .w-num{color:#06111f!important}

/* ảnh minh hoạ: có khung, có vầng sáng, ra dáng được đặt vào chứ không dán vào */
.w-photo{border-radius:18px!important;
  box-shadow:0 14px 34px rgba(18,44,66,.20),0 0 0 1px rgba(255,255,255,.55) inset!important}
html[data-mode="dark"] .w-photo{box-shadow:0 16px 40px rgba(0,6,16,.5),0 0 0 1px rgba(186,224,255,.18) inset!important}

/* chữ Hán là nhân vật chính */
.w-kanji{font-size:clamp(66px,17vw,92px)!important;line-height:1.12!important}
html[data-mode="dark"] .w-kanji{text-shadow:0 0 34px rgba(124,200,245,.26),0 0 70px rgba(201,166,255,.14)}
.w-kanji rt{font-size:.30em!important;letter-spacing:.16em!important;color:var(--v25-warm)!important;font-weight:600!important}

/* nghĩa tiếng Việt: câu trả lời, phải to và chắc */
.w-mean{font-size:clamp(24px,5.4vw,30px)!important;font-weight:700!important;
  letter-spacing:-.015em!important;line-height:1.25!important;
  background:none!important;-webkit-background-clip:border-box!important;background-clip:border-box!important;
  color:var(--v25-heading-ink)!important;-webkit-text-fill-color:var(--v25-heading-ink)!important}
html[data-mode="dark"] .w-mean{filter:drop-shadow(0 0 18px rgba(140,200,255,.28))}

/* ── từ loại: mỗi nhóm một màu, nhìn là biết ─────────────────────────── */
/* V26 tô màu .tag qua selector có html[data-mode] nên độ ưu tiên cao hơn
   .tag.pos — phải viết đủ cả html[...] mới thắng được. */
html .tag.pos,html[data-mode="dark"] .tag.pos{
  font-size:13px!important;font-weight:700!important;letter-spacing:.04em!important;
  padding:5px 13px!important;border-radius:999px!important;
  border:1px solid color-mix(in srgb,var(--pos,var(--v25-warm)) 45%,transparent)!important;
  background:color-mix(in srgb,var(--pos,var(--v25-warm)) 15%,transparent)!important;
  color:var(--pos,var(--v25-warm))!important}
html .tag.pos[data-nhom="danh-tu"],html[data-mode="dark"] .tag.pos[data-nhom="danh-tu"]  {--pos:var(--v25-open)}
html .tag.pos[data-nhom="dong-tu"],html[data-mode="dark"] .tag.pos[data-nhom="dong-tu"]  {--pos:var(--v25-form)}
html .tag.pos[data-nhom="tinh-tu"],html[data-mode="dark"] .tag.pos[data-nhom="tinh-tu"]  {--pos:var(--v25-example)}
html .tag.pos[data-nhom="pho-tu"],html[data-mode="dark"] .tag.pos[data-nhom="pho-tu"]   {--pos:var(--v25-check)}
html .tag.pos[data-nhom="dai-tu"],html[data-mode="dark"] .tag.pos[data-nhom="dai-tu"]   {--pos:var(--v25-open)}
html .tag.pos[data-nhom="giao-tiep"],html[data-mode="dark"] .tag.pos[data-nhom="giao-tiep"]{--pos:var(--v25-warm)}
html .tag.pos[data-nhom="phu-to"],html[data-mode="dark"] .tag.pos[data-nhom="phu-to"]   {--pos:var(--v25-warm)}

/* ── ví dụ: thành khối riêng có nhãn, không còn là hộp viền trơn ─────── */
.w-ex{position:relative;padding:26px 16px 16px!important;border-radius:16px!important;
  border:1px solid color-mix(in srgb,var(--v25-example) 26%,transparent)!important;
  border-left:3px solid var(--v25-example)!important;
  background:linear-gradient(102deg,color-mix(in srgb,var(--v25-example) 9%,transparent),transparent 64%),
             var(--v25-glass-soft)!important}
.w-ex::before{content:"VÍ DỤ";position:absolute;left:16px;top:8px;
  font-family:"Bricolage Grotesque","Be Vietnam Pro",sans-serif;
  font-size:11px;font-weight:700;letter-spacing:.14em;color:var(--v25-example);opacity:.85}
.w-ex .jp{font-size:clamp(20px,4.6vw,24px)!important;line-height:2!important}

/* nút "đã thuộc": hành động chính của thẻ, cho nó có mặt */
.knowbtn{border:1px solid color-mix(in srgb,var(--v25-form) 40%,transparent)!important;
  background:color-mix(in srgb,var(--v25-form) 12%,transparent)!important;
  color:var(--v25-form)!important;font-weight:700!important}
.knowbtn:hover{background:color-mix(in srgb,var(--v25-form) 20%,transparent)!important}

@media(forced-colors:active){
  .w-num,.w-mean{background:none!important;color:CanvasText!important;-webkit-text-fill-color:CanvasText!important}
  .tag.pos{border-color:CanvasText!important;color:CanvasText!important;background:Canvas!important}
  .w-ex::before{color:CanvasText}
}

/* ══════════════════════════════════════════════════════════════════════
   V25.6 — TỪ ĐANG HỌC ĐƯỢC TÔ TRONG CÂU · NỀN TRONG HẲN
   ══════════════════════════════════════════════════════════════════════ */

/* Từ vừa học, tô ngay trong câu ví dụ để thấy mối liên hệ */
mark.tl-v25-target{background:linear-gradient(180deg,transparent 58%,color-mix(in srgb,var(--v25-example) 32%,transparent) 58%)!important;
  color:var(--v25-example)!important;font-weight:700;padding:0 2px;border-radius:3px}
html[data-mode="dark"] mark.tl-v25-target{color:var(--v25-example)!important;
  text-shadow:0 0 16px color-mix(in srgb,var(--v25-example) 60%,transparent)}
mark.tl-v25-target rt{color:var(--v25-warm)!important}

/* Mẫu ngữ pháp được nhấn trong ví dụ cũng dùng đúng ngôn ngữ đó */
.g-ex .jp b,.w-ex .jp b,.tl-micro-jp b{color:var(--v25-example)!important;font-weight:700!important;
  background:linear-gradient(180deg,transparent 58%,color-mix(in srgb,var(--v25-example) 30%,transparent) 58%)}

/* ── nền trong hẳn: đã có ảnh nền thì phải thấy ảnh nền ───────────────── */
:root{--v25-glass:rgba(253,254,252,.42);--v25-glass-soft:rgba(253,254,252,.26)}
html[data-mode="dark"]{--v25-glass:rgba(12,34,60,.40);--v25-glass-soft:rgba(11,31,55,.26)}

/* trong hơn thì phải bù bằng blur mạnh, nếu không chữ sẽ bơi trên ảnh */
#flowBox,.exwrap,.fc-stage,.hub{-webkit-backdrop-filter:blur(34px) saturate(190%)!important;backdrop-filter:blur(34px) saturate(190%)!important}
.hd,.bnav{-webkit-backdrop-filter:blur(38px) saturate(210%)!important;backdrop-filter:blur(38px) saturate(210%)!important}

/* thẻ từ trong lồng: trong nhất, để nhìn xuyên tới ảnh nền */
.wcard,.g-sec,.kb{background:transparent!important;border:1px solid color-mix(in srgb,var(--v25-open) 18%,transparent)!important}

/* chữ phải dày dạn hơn để đứng vững trên nền trong */
html[data-mode="dark"] .w-kanji,html[data-mode="dark"] .q-stem,html[data-mode="dark"] .g-title{
  text-shadow:0 2px 18px rgba(0,8,20,.7),0 0 34px rgba(124,200,245,.24)}
html:not([data-mode="dark"]) .w-kanji,html:not([data-mode="dark"]) .q-stem{
  text-shadow:0 1px 0 rgba(255,255,255,.8)}

/* ══════════════════════════════════════════════════════════════════════
   V25.7 — ba chỗ anh Trí chỉ ra
   ══════════════════════════════════════════════════════════════════════ */

/* 1 ── Thanh đầu trang thôi bám theo.
   Nó vốn sticky từ V26, nhưng khi em bo góc và tách khỏi mép thì nó thành
   một cái hộp trôi theo mắt, gây khó chịu. Cho nó cuộn đi cùng nội dung. */
.hd{position:static!important;top:auto!important}

/* 2 ── Chữ phiên âm わたし bị dính nền của thẻ đánh dấu.
   <mark> bọc cả cụm <ruby> nên nền phủ lên cả phần <rt> phía trên, thành
   ra わたし có một mảng màu dưới đáy. Bỏ nền, dùng gạch chân — gạch chân
   bám theo đường cơ sở của chữ gốc nên không chạm tới phiên âm. */
mark.tl-v25-target{background:none!important;
  text-decoration:underline!important;text-decoration-thickness:3px!important;
  text-underline-offset:5px!important;text-decoration-color:color-mix(in srgb,var(--v25-example) 70%,transparent)!important}
mark.tl-v25-target rt{background:none!important;text-decoration:none!important}
.g-ex .jp b,.w-ex .jp b,.tl-micro-jp b{background:none!important;
  text-decoration:underline;text-decoration-thickness:3px;text-underline-offset:5px;
  text-decoration-color:color-mix(in srgb,var(--v25-example) 70%,transparent)}

/* 3 ── Nghĩa tiếng Việt ở nền sáng: chữ màu thường, bỏ dải màu.
   Giữ dải màu ở nền tối vì ở đó nó phát sáng đẹp; nền sáng thì chữ gradient
   đọc mệt hơn chữ đặc. */
html:not([data-mode="dark"]) .w-mean{
  background:none!important;-webkit-background-clip:border-box!important;background-clip:border-box!important;
  -webkit-text-fill-color:currentColor!important;color:#1d3a52!important;filter:none!important}

/* ══════════════════════════════════════════════════════════════════════
   V25.8 — CÂN LẠI TỶ LỆ THẺ TỪ VỰNG
   ══════════════════════════════════════════════════════════════════════
   Anh Trí: "sao cái chữ nó to mà chữ lại nhỏ dữ vậy."

   Đo được: chữ Nhật 85px cố định cho MỌI từ, nghĩa tiếng Việt 27px
   → tỷ lệ 3,15:1. Thang chữ mà chênh hơn 3 lần thì mắt chỉ thấy cái to,
   mọi thứ còn lại thành chú thích. Từ 4 chữ như 〜ちゃん còn rộng 371px
   trong thẻ 403px, gần chạm mép.

   Sửa hai chiều:
     · chữ Nhật co theo số ký tự — 1 chữ mới được to hết cỡ;
     · kéo nghĩa, chip và ví dụ lên cho tỷ lệ về khoảng 1,4–2,4:1.
   ══════════════════════════════════════════════════════════════════════ */

/* mặc định cho từ chưa kịp gắn data-do-dai (JS chạy sau) — lấy mức trung bình */
.w-kanji{font-size:clamp(42px,11vw,60px)!important;line-height:1.2!important}

.w-kanji[data-do-dai="1"]{font-size:clamp(60px,16vw,80px)!important}
.w-kanji[data-do-dai="2"]{font-size:clamp(52px,14vw,68px)!important}
.w-kanji[data-do-dai="3"]{font-size:clamp(44px,11.5vw,58px)!important}
.w-kanji[data-do-dai="4"]{font-size:clamp(37px,9.5vw,48px)!important}
.w-kanji[data-do-dai="5"]{font-size:clamp(30px,7.6vw,40px)!important}

/* phiên âm theo tỷ lệ chữ gốc, không để nó bé như hạt bụi trên từ dài */
.w-kanji rt{font-size:.34em!important}

/* nghĩa tiếng Việt: kéo lên để chênh lệch còn ~1,4-2,4 lần */
.w-mean{font-size:clamp(26px,6.4vw,34px)!important}

/* chip từ loại và ví dụ nhích lên cho cùng nhịp */
html .tag.pos,html[data-mode="dark"] .tag.pos{font-size:14px!important}
.w-ex .jp{font-size:clamp(21px,5vw,25px)!important}
.w-ex .vn{font-size:max(17px,1.05rem)!important}

/* ══════════════════════════════════════════════════════════════════════
   V25.9 — CHỮ RÕ Ở NỀN TỐI · NÚT CHÍNH BỎ CẦU VỒNG
   ══════════════════════════════════════════════════════════════════════
   (a) Chữ nền tối chưa rõ. Đo ra tương phản 9-15:1 — nhưng đó là đo với
       MÀU của tấm kính, mà kính chỉ đục 26% nên chữ thật ra nằm trên ảnh
       sao. Gặp mảng sáng của ảnh là mất rõ ngay. Đây là mâu thuẫn thật
       giữa "nền trong như gương" và "chữ phải rõ".
       Cách xử: nâng kính lên 46% (vẫn thấy xuyên) + cho chữ một quầng tối
       rất mảnh để nó bám được trên bất kỳ mảng nào của ảnh.

   (b) Nút chính đang là dải cầu vồng xanh→tím→hồng. Ở chip nhỏ thì vui,
       kéo dài cả chiều ngang màn hình thì thành sến. Đổi sang kính thật:
       nền tối trong, mép trên sáng, viền màu mảnh, chữ trắng.
   ══════════════════════════════════════════════════════════════════════ */

/* (a) ── kính đặc hơn một nấc + quầng chữ ────────────────────────────── */
html[data-mode="dark"]{--v25-glass:rgba(10,28,50,.58);--v25-glass-soft:rgba(9,26,46,.46)}
:root{--v25-glass:rgba(253,254,252,.60);--v25-glass-soft:rgba(253,254,252,.44)}

html[data-mode="dark"] .wcard,html[data-mode="dark"] .g-sec,html[data-mode="dark"] .kb{
  background:color-mix(in srgb,var(--v25-glass-soft) 70%,transparent)!important}

/* quầng tối mảnh: không thấy được, nhưng giữ chữ đứng vững trên ảnh nền */
html[data-mode="dark"] .w-mean,html[data-mode="dark"] .w-ex .jp,
html[data-mode="dark"] .w-ex .vn,html[data-mode="dark"] .g-ex .jp,
html[data-mode="dark"] .g-ex .vn,html[data-mode="dark"] .tl-micro-body,
html[data-mode="dark"] .q-stem,html[data-mode="dark"] .fl-step,
html[data-mode="dark"] .sec-kicker,html[data-mode="dark"] .hd-tt{
  text-shadow:0 1px 3px rgba(0,6,16,.86),0 0 14px rgba(0,6,16,.5)}

/* Nền tối: MỖI LOẠI NỘI DUNG MỘT SẮC RIÊNG, nhưng nhạt.
   Đồng loạt trắng thì phẳng và khó phân biệt vai trò; sắc đậm thì chói và
   mệt mắt khi đọc lâu. Tất cả đều ở độ sáng cao nên vẫn rõ trên nền navy. */
html[data-mode="dark"]{
  --ink-nghia:#fdf1e3;    /* nghĩa tiếng Việt — ngà ấm, là câu trả lời */
  --ink-nhat:#e6f2ff;     /* câu Nhật — trắng xanh lạnh */
  --ink-dich:#bfd2e4;     /* dịch của ví dụ — xanh xám trầm hơn một bậc */
  --ink-cautao:#d3f2e8;   /* cấu tạo, công thức — bạc hà nhạt */
  --ink-giai:#e2daf5;     /* giải thích — oải hương nhạt */
  --ink-nhan:#ffe2bd;     /* nhãn, kicker — hổ phách nhạt */
}
html[data-mode="dark"] .w-mean{
  background:none!important;-webkit-background-clip:border-box!important;background-clip:border-box!important;
  -webkit-text-fill-color:var(--ink-nghia)!important;color:var(--ink-nghia)!important;filter:none!important;
  text-shadow:0 1px 3px rgba(0,6,16,.9),0 0 20px rgba(255,214,160,.20)}

html[data-mode="dark"] .w-ex .jp,html[data-mode="dark"] .g-ex .jp,
html[data-mode="dark"] .tl-micro-jp,html[data-mode="dark"] .fc-ex{color:var(--ink-nhat)!important}
html[data-mode="dark"] .w-ex .vn,html[data-mode="dark"] .g-ex .vn,
html[data-mode="dark"] .tl-micro-vn{color:var(--ink-dich)!important}
html[data-mode="dark"] .g-struct,html[data-mode="dark"] #fcS,
html[data-mode="dark"] .tl-formula-group,html[data-mode="dark"] .kb-combine{color:var(--ink-cautao)!important}
html[data-mode="dark"] .g-explain,html[data-mode="dark"] .kb-info,
html[data-mode="dark"] .kb-note,html[data-mode="dark"] .q-exp{color:var(--ink-giai)!important}
html[data-mode="dark"] .sec-kicker,html[data-mode="dark"] .fl-step,
html[data-mode="dark"] .g-lbl,html[data-mode="dark"] .q-label,
html[data-mode="dark"] .hd-kicker{color:var(--ink-nhan)!important}

/* (b) ── nút chính: kính, không phải cầu vồng ───────────────────────── */
.fl-next,.nextbtn,.step-button--next{
  background:linear-gradient(180deg,rgba(255,255,255,.16),rgba(255,255,255,.03) 46%,transparent),
             rgba(18,44,74,.88)!important;
  color:#f2f8ff!important;
  border:1px solid rgba(150,200,255,.42)!important;
  box-shadow:inset 0 1px 0 rgba(255,255,255,.30),0 10px 26px rgba(6,20,40,.34)!important;
  -webkit-backdrop-filter:blur(18px) saturate(160%);backdrop-filter:blur(18px) saturate(160%)}
.fl-next:hover,.nextbtn:hover{border-color:rgba(180,220,255,.66)!important;
  background:linear-gradient(180deg,rgba(255,255,255,.22),rgba(255,255,255,.05) 46%,transparent),
             rgba(24,56,92,.92)!important}
html[data-mode="dark"] .fl-next,html[data-mode="dark"] .nextbtn{
  background:linear-gradient(180deg,rgba(190,228,255,.16),rgba(190,228,255,.03) 46%,transparent),
             rgba(12,34,60,.86)!important;
  color:#eaf4ff!important;border-color:rgba(150,205,255,.40)!important}

/* thanh chuyển chế độ học cũng bỏ cầu vồng cho đồng bộ */
.lm-switch button.on{
  background:linear-gradient(180deg,rgba(255,255,255,.14),transparent 52%),rgba(18,44,74,.86)!important;
  color:#f2f8ff!important}
html[data-mode="dark"] .lm-switch button.on{
  background:linear-gradient(180deg,rgba(190,228,255,.14),transparent 52%),rgba(12,34,60,.84)!important;
  color:#eaf4ff!important}

/* giữ dải màu ở CHỖ NHỎ — nơi nó vốn đẹp: số chặng, thanh tiến độ, gạch nav */

/* ══════════════════════════════════════════════════════════════════════
   V25.10 — TÁCH RÕ MÀU CHỮ NỀN TỐI · KÍNH TRONG THẬT
   ══════════════════════════════════════════════════════════════════════
   (a) Anh Trí: "chế độ ban đêm chỉ có 1 màu chữ vậy." Đúng — bảng màu cũ
       (#fdf1e3 / #e6f2ff / #bfd2e4) đều ở độ sáng 92-95%, chênh nhau chưa
       tới 3%, nên mắt đọc ra là "đều trắng". Giữ nguyên tinh thần "nhạt"
       nhưng đẩy SẮC ĐỘ ra xa nhau và hạ độ sáng của vai phụ.

   (b) "Bạn thấy nó có trong suốt chưa?" — chưa. Em phải nâng kính lên 46%
       để cứu chữ, tức là đã đánh đổi mất độ trong. Cách thoát khỏi đánh đổi
       đó: KÍNH TRONG (26%) + một "bệ chữ" mờ chỉ nằm sau khối có chữ.
       Nền vẫn nhìn xuyên ở mọi chỗ trống, còn chữ thì luôn có nền tựa.
   ══════════════════════════════════════════════════════════════════════ */

/* (a) ── sắc tách xa nhau, vẫn nhạt ─────────────────────────────────── */
html[data-mode="dark"]{
  --ink-nghia:#ffe9c9;    /* nghĩa — vàng ngà rõ rệt */
  --ink-nhat:#ddefff;     /* câu Nhật — xanh băng */
  --ink-dich:#9fbcd6;     /* dịch — xanh xám, tối hơn hẳn một bậc */
  --ink-cautao:#8fe6cd;   /* cấu tạo — bạc hà */
  --ink-giai:#c9b8f0;     /* giải thích — oải hương */
  --ink-nhan:#ffc98a;     /* nhãn — hổ phách */
}

/* (b) ── kính trong lại, bệ chữ lo phần đọc ─────────────────────────── */
html[data-mode="dark"]{--v25-glass:rgba(10,28,50,.30);--v25-glass-soft:rgba(9,26,46,.18)}
:root{--v25-glass:rgba(253,254,252,.34);--v25-glass-soft:rgba(253,254,252,.20)}

/* blur mạnh hơn để bù độ đục đã bỏ */
#flowBox,.exwrap,.fc-stage,.hub{-webkit-backdrop-filter:blur(40px) saturate(180%)!important;backdrop-filter:blur(40px) saturate(180%)!important}
.hd,.bnav{-webkit-backdrop-filter:blur(44px) saturate(200%)!important;backdrop-filter:blur(44px) saturate(200%)!important}

/* bệ chữ: chỉ nằm sau các khối THỰC SỰ có chữ, không phủ toàn trang */
.w-ex,.g-ex,.g-sec,.kb,.q-exp,.tl-micro-panel{
  background:color-mix(in srgb,var(--v25-glass) 92%,transparent)!important;
  -webkit-backdrop-filter:blur(14px) saturate(150%);backdrop-filter:blur(14px) saturate(150%)}
html[data-mode="dark"] .w-ex,html[data-mode="dark"] .g-ex,html[data-mode="dark"] .g-sec,
html[data-mode="dark"] .kb,html[data-mode="dark"] .q-exp,html[data-mode="dark"] .tl-micro-panel{
  background:rgba(6,20,38,.62)!important}

/* chữ hero đứng một mình trên nền — dựa vào quầng, không cần bệ */
html[data-mode="dark"] .w-kanji{text-shadow:0 2px 10px rgba(0,6,16,.92),0 0 40px rgba(124,200,245,.22)}
html[data-mode="dark"] .w-mean{text-shadow:0 1px 4px rgba(0,6,16,.95),0 0 22px rgba(255,214,160,.22)}
html:not([data-mode="dark"]) .w-kanji,html:not([data-mode="dark"]) .w-mean{
  text-shadow:0 1px 0 rgba(255,255,255,.9),0 2px 12px rgba(255,255,255,.7)}

/* ══════════════════════════════════════════════════════════════════════
   V25.11 — KÍNH MÀU RIÊNG THEO TỪNG LOẠI NỘI DUNG
   ══════════════════════════════════════════════════════════════════════
   Anh Trí: "trong suốt là phải thấy được cái nền phía sau như gương. Và
   tạo nền riêng cho từng loại để dù trong suốt vẫn nhìn thấy chữ."

   Trước đây em xử theo kiểu được cái này mất cái kia: muốn chữ rõ thì làm
   kính đục, muốn thấy nền thì chữ mờ. Sai cách.

   Cách đúng: mỗi khối một tấm KÍNH MÀU riêng, ăn theo đúng sắc chữ của
   khối đó. Kính chỉ đục 16-26% nên vẫn nhìn xuyên thấy cảnh, nhưng vì
   nó CÙNG TÔNG với chữ nên tự tạo ra khoảng cách sáng-tối cần thiết.
   Blur 40px làm cảnh phía sau nhoè thành mảng màu mềm — thấy được chiều
   sâu, mà không có chi tiết vụn phá chữ.

   Kính trong hơn hẳn bản trước (18-30% → 16-26%) mà chữ lại rõ hơn.
   ══════════════════════════════════════════════════════════════════════ */

/* nền tổng thể: trong nhất có thể, chỉ còn một màng rất mỏng */
html[data-mode="dark"]{--v25-glass:rgba(10,28,50,.16);--v25-glass-soft:rgba(9,26,46,.10)}
:root{--v25-glass:rgba(253,254,252,.20);--v25-glass-soft:rgba(253,254,252,.12)}

#flowBox,.exwrap,.fc-stage,.hub{
  -webkit-backdrop-filter:blur(44px) saturate(190%)!important;backdrop-filter:blur(44px) saturate(190%)!important}

/* ── KÍNH MÀU THEO LOẠI ──────────────────────────────────────────────
   Công thức chung: sắc của khối × 16-22% + blur mạnh.
   Nền tối lấy sắc tối cùng tông; nền sáng lấy sắc nhạt cùng tông.        */

/* ví dụ — hồng đô */
html[data-mode="dark"] .w-ex,html[data-mode="dark"] .g-ex{
  background:linear-gradient(140deg,rgba(120,30,55,.30),rgba(60,16,34,.20))!important;
  -webkit-backdrop-filter:blur(26px) saturate(170%)!important;backdrop-filter:blur(26px) saturate(170%)!important;
  border:1px solid rgba(255,163,184,.30)!important;border-left:3px solid rgba(255,163,184,.75)!important}
html:not([data-mode="dark"]) .w-ex,html:not([data-mode="dark"]) .g-ex{
  background:linear-gradient(140deg,rgba(255,214,224,.44),rgba(255,238,242,.26))!important;
  -webkit-backdrop-filter:blur(26px) saturate(170%)!important;backdrop-filter:blur(26px) saturate(170%)!important;
  border:1px solid rgba(176,52,79,.24)!important;border-left:3px solid rgba(176,52,79,.62)!important}

/* cấu tạo, công thức — bạc hà */
html[data-mode="dark"] .g-struct,html[data-mode="dark"] #fcS,
html[data-mode="dark"] .tl-formula-group,html[data-mode="dark"] .kb-combine{
  background:linear-gradient(140deg,rgba(12,80,70,.32),rgba(6,44,40,.20))!important;
  -webkit-backdrop-filter:blur(26px) saturate(170%)!important;backdrop-filter:blur(26px) saturate(170%)!important;
  border:1px solid rgba(143,230,205,.28)!important;border-left:3px solid rgba(143,230,205,.72)!important}
html:not([data-mode="dark"]) .g-struct,html:not([data-mode="dark"]) #fcS,
html:not([data-mode="dark"]) .tl-formula-group,html:not([data-mode="dark"]) .kb-combine{
  background:linear-gradient(140deg,rgba(198,242,232,.46),rgba(232,250,246,.26))!important;
  -webkit-backdrop-filter:blur(26px) saturate(170%)!important;backdrop-filter:blur(26px) saturate(170%)!important;
  border:1px solid rgba(14,122,111,.24)!important;border-left:3px solid rgba(14,122,111,.60)!important}

/* giải thích — oải hương */
html[data-mode="dark"] .g-explain,html[data-mode="dark"] .kb-info,
html[data-mode="dark"] .kb-note,html[data-mode="dark"] .q-exp{
  background:linear-gradient(140deg,rgba(62,42,110,.34),rgba(34,22,62,.20))!important;
  -webkit-backdrop-filter:blur(26px) saturate(170%)!important;backdrop-filter:blur(26px) saturate(170%)!important;
  border:1px solid rgba(201,184,240,.26)!important;border-left:3px solid rgba(201,184,240,.70)!important}
html:not([data-mode="dark"]) .g-explain,html:not([data-mode="dark"]) .kb-info,
html:not([data-mode="dark"]) .kb-note,html:not([data-mode="dark"]) .q-exp{
  background:linear-gradient(140deg,rgba(226,216,250,.46),rgba(242,238,253,.26))!important;
  -webkit-backdrop-filter:blur(26px) saturate(170%)!important;backdrop-filter:blur(26px) saturate(170%)!important;
  border:1px solid rgba(138,75,196,.22)!important;border-left:3px solid rgba(138,75,196,.58)!important}

/* thẻ từ — xanh dương, tông của phần "học" */
html[data-mode="dark"] .wcard,html[data-mode="dark"] .g-sec,html[data-mode="dark"] .kb{
  background:linear-gradient(150deg,rgba(14,50,88,.26),rgba(8,26,50,.14))!important;
  -webkit-backdrop-filter:blur(30px) saturate(175%)!important;backdrop-filter:blur(30px) saturate(175%)!important;
  border:1px solid rgba(124,200,245,.22)!important}
html:not([data-mode="dark"]) .wcard,html:not([data-mode="dark"]) .g-sec,html:not([data-mode="dark"]) .kb{
  background:linear-gradient(150deg,rgba(214,234,250,.40),rgba(244,250,255,.22))!important;
  -webkit-backdrop-filter:blur(30px) saturate(175%)!important;backdrop-filter:blur(30px) saturate(175%)!important;
  border:1px solid rgba(21,94,145,.18)!important}

/* bỏ bệ chữ đặc của bản trước — giờ chính kính màu lo phần đọc */
html[data-mode="dark"] .tl-micro-panel{background:rgba(10,32,58,.26)!important}

/* ── V25.11b — làm SÂU sắc kính thay vì làm ĐỤC ────────────────────────
   Đo bản trên với kính phủ mảng trời sáng nhất: dịch ví dụ 3,69 · từ được
   tô 3,87 · chip từ loại 2,66 — dưới ngưỡng 4,5.
   Không nâng độ đục (sẽ mất độ trong anh Trí muốn) mà hạ sắc xuống sâu
   hơn. Sắc sâu ở 44% chặn ánh sáng tốt hơn sắc nhạt ở 60%, nên vừa trong
   hơn vừa đọc rõ hơn. Đây là chỗ vật lý cho phép có cả hai.            */

html[data-mode="dark"] .w-ex,html[data-mode="dark"] .g-ex{
  background:linear-gradient(140deg,rgba(60,14,30,.46),rgba(30,8,18,.34))!important}
html[data-mode="dark"] .g-struct,html[data-mode="dark"] #fcS,
html[data-mode="dark"] .tl-formula-group,html[data-mode="dark"] .kb-combine{
  background:linear-gradient(140deg,rgba(6,42,37,.46),rgba(3,24,21,.34))!important}
html[data-mode="dark"] .g-explain,html[data-mode="dark"] .kb-info,
html[data-mode="dark"] .kb-note,html[data-mode="dark"] .q-exp{
  background:linear-gradient(140deg,rgba(30,20,58,.48),rgba(16,10,32,.34))!important}
html[data-mode="dark"] .wcard,html[data-mode="dark"] .g-sec,html[data-mode="dark"] .kb{
  background:linear-gradient(150deg,rgba(6,26,48,.44),rgba(3,14,28,.30))!important}

/* chip từ loại: nền riêng đậm hơn để chữ 14px đứng vững */
html[data-mode="dark"] .tag.pos{
  background:color-mix(in srgb,var(--pos,var(--v25-warm)) 22%,rgba(4,16,32,.62))!important}
html:not([data-mode="dark"]) .tag.pos{
  background:color-mix(in srgb,var(--pos,var(--v25-warm)) 18%,rgba(255,255,255,.72))!important}

/* nền sáng: sắc đậm hơn một bậc cho cùng lý do */
html:not([data-mode="dark"]) .w-ex,html:not([data-mode="dark"]) .g-ex{
  background:linear-gradient(140deg,rgba(255,196,212,.56),rgba(255,228,236,.38))!important}
html:not([data-mode="dark"]) .g-struct,html:not([data-mode="dark"]) #fcS,
html:not([data-mode="dark"]) .tl-formula-group,html:not([data-mode="dark"]) .kb-combine{
  background:linear-gradient(140deg,rgba(180,238,226,.58),rgba(222,248,243,.38))!important}
html:not([data-mode="dark"]) .g-explain,html:not([data-mode="dark"]) .kb-info,
html:not([data-mode="dark"]) .kb-note,html:not([data-mode="dark"]) .q-exp{
  background:linear-gradient(140deg,rgba(216,204,248,.58),rgba(236,230,252,.38))!important}
html:not([data-mode="dark"]) .wcard,html:not([data-mode="dark"]) .g-sec,html:not([data-mode="dark"]) .kb{
  background:linear-gradient(150deg,rgba(202,228,248,.52),rgba(238,247,255,.34))!important}

/* Chip từ loại còn 3,11 vì nền chip pha 22% CHÍNH màu của chữ — tự triệt
   tiêu tương phản. Hạ xuống 14% và cho nền tối sâu hơn; viền giữ nguyên
   sắc để vẫn nhận ra nhóm từ. */
html[data-mode="dark"] .tag.pos{
  background:color-mix(in srgb,var(--pos,var(--v25-warm)) 14%,rgba(3,12,26,.78))!important}

/* ══════════════════════════════════════════════════════════════════════
   V25.12 — THANH CHẶNG CÓ TÊN + NHỊP THỞ CỦA BẢN MẪU
   ══════════════════════════════════════════════════════════════════════
   Đo cạnh bản mẫu: khung nội dung bản mẫu đệm 22px/18px, trang thật chỉ
   10px/12px. Cộng với thanh chặng vô danh, đó là toàn bộ khoảng cách —
   không phải màu sắc. Lần này sửa đúng chỗ.
   ══════════════════════════════════════════════════════════════════════ */

.v25-rail{display:flex;gap:8px;overflow-x:auto;scroll-snap-type:x proximity;
  margin:0 0 14px;padding:10px;border-radius:18px;
  border:1px solid rgba(124,200,245,.20);
  background:linear-gradient(140deg,rgba(10,32,58,.34),rgba(6,20,38,.20));
  -webkit-backdrop-filter:blur(26px) saturate(170%);backdrop-filter:blur(26px) saturate(170%);
  scrollbar-width:none}
.v25-rail::-webkit-scrollbar{display:none}
html:not([data-mode="dark"]) .v25-rail{
  border-color:rgba(21,94,145,.18);
  background:linear-gradient(140deg,rgba(214,234,250,.44),rgba(244,250,255,.24))}

.v25-rail__b{display:grid;grid-template-columns:26px 1fr;align-items:center;gap:9px;
  flex:0 0 auto;min-width:154px;max-width:220px;min-height:52px;padding:7px 12px 7px 7px;
  border:0;border-radius:13px;background:transparent;cursor:pointer;text-align:left;
  scroll-snap-align:start}
.v25-rail__n{display:grid;place-items:center;width:26px;height:26px;border-radius:50%;
  border:1px solid var(--v25-open);color:var(--v25-open);
  font-family:"Bricolage Grotesque","Be Vietnam Pro",sans-serif;font-size:13px;font-weight:700}
.v25-rail__t{font-family:"Bricolage Grotesque","Be Vietnam Pro",sans-serif;
  font-size:14px;font-weight:600;line-height:1.25;color:var(--v25-ink,inherit);
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
html[data-mode="dark"] .v25-rail__t{color:#dbe9f8}

.v25-rail__b[aria-current="step"]{
  background:linear-gradient(110deg,color-mix(in srgb,var(--v25-open) 22%,transparent),
                                    color-mix(in srgb,var(--v25-check) 15%,transparent));
  box-shadow:inset 0 0 0 1px color-mix(in srgb,var(--v25-open) 36%,transparent)}
.v25-rail__b[aria-current="step"] .v25-rail__n{
  background:var(--v25-grad);border-color:transparent;color:#06131f}
html[data-mode="dark"] .v25-rail__b[aria-current="step"] .v25-rail__n{color:#06131f}
.v25-rail__b.is-done .v25-rail__n{border-color:var(--v25-form);color:var(--v25-form);opacity:.7}

/* nhịp thở: mở đệm khung ra đúng mức bản mẫu */
.app{padding:16px 18px 100px!important}
@media(max-width:420px){ .app{padding:12px 14px 96px!important} }
#flowBox,.exwrap{padding:20px 18px!important}
.w-ex,.g-ex{margin-top:16px!important}
.wcard{padding:20px 16px!important}

@media(forced-colors:active){
  .v25-rail__b[aria-current="step"]{outline:2px solid Highlight}
  .v25-rail__n{background:Canvas!important;color:CanvasText!important;border-color:CanvasText!important}
}

/* Thanh chặng là thông tin định vị, không phải điều khiển — bỏ con trỏ bấm
   để không hứa thứ nó chưa làm được. */
.v25-rail__b{cursor:default}


/* ══════════════════════════════════════════════════════════════════════
   V25.13 — BỘ NỀN v32: ẢNH DỌC CHO ĐIỆN THOẠI, ẢNH NGANG CHO MÀN RỘNG
   ══════════════════════════════════════════════════════════════════════
   Anh Trí sinh riêng 4 ảnh: web ngang 1672x941, app dọc 1170x2532.
   Trước đây một ảnh ngang phải gánh cả màn dọc — cắt xong mất hết phần
   đẹp hai bên. Giờ mỗi hướng màn hình dùng đúng ảnh của nó.

   Đo trước khi lắp (độ lệch chuẩn vùng đặt chữ, càng nhỏ càng lặng):
     · app tối  11,5  · web tối 16,5  → lặng hơn v31 (15,9), rất tốt
     · app sáng 27,9  · web sáng 43,2 → ĐỘNG HƠN v31 (33,0)
   Nên ảnh sáng phải dựa vào kính màu để giữ chữ; đã đo lại sau khi lắp.
   ══════════════════════════════════════════════════════════════════════ */

/* điện thoại: ảnh DỌC */
body::before{
  background-image:image-set(url("/anh-art/nen-app-sang-660.avif") type("image/avif"),
                             url("/anh-art/nen-app-sang-660.webp") type("image/webp"))}
html[data-mode="dark"] body::before{
  background-image:image-set(url("/anh-art/nen-app-toi-660.avif") type("image/avif"),
                             url("/anh-art/nen-app-toi-660.webp") type("image/webp"))}
@media(min-width:480px){
  body::before{background-image:image-set(url("/anh-art/nen-app-sang-880.avif") type("image/avif"),
                                          url("/anh-art/nen-app-sang-880.webp") type("image/webp"))}
  html[data-mode="dark"] body::before{background-image:image-set(url("/anh-art/nen-app-toi-880.avif") type("image/avif"),
                                                                 url("/anh-art/nen-app-toi-880.webp") type("image/webp"))}
}
@media(min-width:600px) and (max-width:759px){
  body::before{background-image:image-set(url("/anh-art/nen-app-sang-1170.avif") type("image/avif"),
                                          url("/anh-art/nen-app-sang-1170.webp") type("image/webp"))}
  html[data-mode="dark"] body::before{background-image:image-set(url("/anh-art/nen-app-toi-1170.avif") type("image/avif"),
                                                                 url("/anh-art/nen-app-toi-1170.webp") type("image/webp"))}
}

/* màn rộng: ảnh NGANG */
@media(min-width:760px){
  body::before{background-image:image-set(url("/anh-art/nen-web-sang-1200.avif") type("image/avif"),
                                          url("/anh-art/nen-web-sang-1200.webp") type("image/webp"))}
  html[data-mode="dark"] body::before{background-image:image-set(url("/anh-art/nen-web-toi-1200.avif") type("image/avif"),
                                                                 url("/anh-art/nen-web-toi-1200.webp") type("image/webp"))}
}
@media(min-width:1400px){
  body::before{background-image:image-set(url("/anh-art/nen-web-sang-1672.avif") type("image/avif"),
                                          url("/anh-art/nen-web-sang-1672.webp") type("image/webp"))}
  html[data-mode="dark"] body::before{background-image:image-set(url("/anh-art/nen-web-toi-1672.avif") type("image/avif"),
                                                                 url("/anh-art/nen-web-toi-1672.webp") type("image/webp"))}
}

/* ══════════════════════════════════════════════════════════════════════
   V25.14 — KHUNG CHỨA BIẾN MẤT, CHỈ NỘI DUNG CÒN KÍNH
   ══════════════════════════════════════════════════════════════════════
   Anh Trí: "những cái nào không phải thông tin bài học thì nó sẽ gần như
   trong suốt như gương xuyên thấu nền phía sau luôn."

   Trước đây em tô kính đều tay cho mọi tấm, kể cả những tấm chỉ làm nhiệm
   vụ chứa — #flowBox, .wcard, .exwrap. Cộng ba bốn lớp kính chồng lên nhau
   thì dù mỗi lớp mỏng, tổng lại vẫn thành một mảng đục che hết nền.

   Quy tắc mới, dứt khoát:
     · KHUNG CHỨA (không có chữ của riêng nó) → gần như vô hình, 0-5%,
       chỉ còn một sợi viền tóc để thấy ranh giới.
     · KHỐI NỘI DUNG (có chữ bài học) → giữ kính màu như cũ.
   ══════════════════════════════════════════════════════════════════════ */

/* ── khung chứa: xoá hẳn ────────────────────────────────────────────── */
#flowBox,.exwrap,.fc-stage,.hub,.chips,#pointList,.wcard,.app{
  background:none!important;background-color:transparent!important;
  -webkit-backdrop-filter:none!important;backdrop-filter:none!important;
  box-shadow:none!important}
#flowBox,.exwrap,.fc-stage,.hub{
  border:1px solid rgba(255,255,255,.14)!important}
html[data-mode="dark"] #flowBox,html[data-mode="dark"] .exwrap,
html[data-mode="dark"] .fc-stage,html[data-mode="dark"] .hub{
  border-color:rgba(186,224,255,.12)!important}
.wcard{border:0!important}

/* thanh chuyển chế độ + thanh chặng: cũng chỉ là khung điều hướng */
.lm-switch{background:none!important;border:1px solid rgba(255,255,255,.16)!important;
  -webkit-backdrop-filter:blur(10px)!important;backdrop-filter:blur(10px)!important}
html[data-mode="dark"] .lm-switch{border-color:rgba(186,224,255,.14)!important}
.v25-rail{background:none!important;
  -webkit-backdrop-filter:blur(10px) saturate(130%)!important;backdrop-filter:blur(10px) saturate(130%)!important}

/* thanh đầu trang và thanh dưới: mỏng hết mức mà chữ vẫn bám */
.hd{background:linear-gradient(180deg,rgba(255,255,255,.10),transparent 70%)!important;
  -webkit-backdrop-filter:blur(20px) saturate(150%)!important;backdrop-filter:blur(20px) saturate(150%)!important}
html[data-mode="dark"] .hd{background:linear-gradient(180deg,rgba(120,180,240,.10),transparent 70%)!important}
.bnav{background:linear-gradient(180deg,rgba(255,255,255,.12),rgba(255,255,255,.05))!important;
  -webkit-backdrop-filter:blur(22px) saturate(160%)!important;backdrop-filter:blur(22px) saturate(160%)!important}
html[data-mode="dark"] .bnav{background:linear-gradient(180deg,rgba(120,180,240,.13),rgba(60,110,170,.06))!important}

/* ── chữ đứng một mình trên nền: dựa vào quầng, không dựa vào tấm ───── */
html[data-mode="dark"] .w-kanji,html[data-mode="dark"] .w-mean,
html[data-mode="dark"] .fl-step,html[data-mode="dark"] .hd-tt,
html[data-mode="dark"] .hd-kicker,html[data-mode="dark"] .pmeta,
html[data-mode="dark"] .bnav button,html[data-mode="dark"] .lm-switch button,
html[data-mode="dark"] .v25-rail__t,html[data-mode="dark"] .fl-hintswipe{
  text-shadow:0 1px 3px rgba(0,6,16,.94),0 0 16px rgba(0,6,16,.72)}
html:not([data-mode="dark"]) .w-kanji,html:not([data-mode="dark"]) .w-mean,
html:not([data-mode="dark"]) .fl-step,html:not([data-mode="dark"]) .hd-tt,
html:not([data-mode="dark"]) .hd-kicker,html:not([data-mode="dark"]) .pmeta,
html:not([data-mode="dark"]) .bnav button,html:not([data-mode="dark"]) .lm-switch button,
html:not([data-mode="dark"]) .v25-rail__t,html:not([data-mode="dark"]) .fl-hintswipe{
  text-shadow:0 1px 0 rgba(255,255,255,.92),0 2px 10px rgba(255,255,255,.8)}

/* ── KHỐI NỘI DUNG: giữ nguyên kính màu, đây là chỗ có chữ bài học ──── */
/* (.w-ex .g-ex .g-struct .g-explain .kb .tag.pos ... đã khai báo ở V25.11) */

/* Quy tắc cũ viết html[data-mode="dark"] .wcard nên thắng .wcard trần.
   Phải viết đủ specificity mới xoá được nền của khung chứa. */
html .wcard,html[data-mode="dark"] .wcard,
html .g-sec,html[data-mode="dark"] .g-sec,
html .kb,html[data-mode="dark"] .kb{
  background:none!important;background-color:transparent!important;
  -webkit-backdrop-filter:none!important;backdrop-filter:none!important;
  border:0!important;box-shadow:none!important}

/* .kb và .g-sec là khối CÓ chữ bài học → trả lại kính màu, nhưng chỉ chúng */
html[data-mode="dark"] .kb{
  background:linear-gradient(150deg,rgba(6,26,48,.44),rgba(3,14,28,.30))!important;
  -webkit-backdrop-filter:blur(26px) saturate(170%)!important;backdrop-filter:blur(26px) saturate(170%)!important;
  border:1px solid rgba(124,200,245,.20)!important}
html:not([data-mode="dark"]) .kb{
  background:linear-gradient(150deg,rgba(202,228,248,.52),rgba(238,247,255,.34))!important;
  -webkit-backdrop-filter:blur(26px) saturate(170%)!important;backdrop-filter:blur(26px) saturate(170%)!important;
  border:1px solid rgba(21,94,145,.18)!important}

/* ══════════════════════════════════════════════════════════════════════
   V25.14c — thắng cho được luật :is() của V26
   V26 viết: html[data-mode="dark"] :is(.wcard,…,.xtra .wf-item,…)
   :is() lấy độ ưu tiên của THÀNH PHẦN CAO NHẤT bên trong, mà trong danh
   sách có ".xtra .wf-item" (hai lớp) → cả khối thành (0,3,1). Luật của em
   (0,2,1) nên thua dù có !important và nằm sau. Thêm một bậc là xong.
   ══════════════════════════════════════════════════════════════════════ */
html[data-mode="dark"] .app .view .wcard,
html:not([data-mode="dark"]) .app .view .wcard,
html[data-mode="dark"] .app .view .exwrap,
html:not([data-mode="dark"]) .app .view .exwrap,
html[data-mode="dark"] .app .view .hubcard,
html:not([data-mode="dark"]) .app .view .hubcard,
html[data-mode="dark"] .app .view .stat,
html:not([data-mode="dark"]) .app .view .stat{
  background:none!important;background-color:transparent!important;
  -webkit-backdrop-filter:none!important;backdrop-filter:none!important;
  border:0!important;box-shadow:none!important}

/* khối NỘI DUNG bên trong vẫn giữ kính màu — viết đủ bậc cho chắc */
html[data-mode="dark"] .app .view .g-ex,
html[data-mode="dark"] .app .view .g-explain,
html[data-mode="dark"] .app .view .g-cmp{
  background:linear-gradient(140deg,rgba(60,14,30,.46),rgba(30,8,18,.34))!important;
  -webkit-backdrop-filter:blur(26px) saturate(170%)!important;backdrop-filter:blur(26px) saturate(170%)!important;
  border:1px solid rgba(255,163,184,.30)!important;border-left:3px solid rgba(255,163,184,.75)!important}
html:not([data-mode="dark"]) .app .view .g-ex,
html:not([data-mode="dark"]) .app .view .g-explain,
html:not([data-mode="dark"]) .app .view .g-cmp{
  background:linear-gradient(140deg,rgba(255,196,212,.56),rgba(255,228,236,.38))!important;
  -webkit-backdrop-filter:blur(26px) saturate(170%)!important;backdrop-filter:blur(26px) saturate(170%)!important;
  border:1px solid rgba(176,52,79,.24)!important;border-left:3px solid rgba(176,52,79,.62)!important}

/* thanh tab chế độ: cũng là khung, cho trong hẳn */
html .lm-switch,html[data-mode="dark"] .lm-switch{
  background:none!important;background-color:transparent!important}

/* Nút "đã thuộc" ở nền sáng còn 4,09 vì khung chứa đã trong nên nó nằm
   thẳng trên ảnh. Cho nó nền riêng — đây là nút hành động, không phải khung. */
html:not([data-mode="dark"]) .knowbtn{
  background:rgba(255,255,255,.72)!important;color:#0b4a42!important;
  border:1px solid rgba(14,122,111,.42)!important;
  -webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}
html[data-mode="dark"] .knowbtn{
  background:rgba(6,32,30,.60)!important;color:#8fe6cd!important;
  border:1px solid rgba(143,230,205,.34)!important;
  -webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)}

/* ══════════════════════════════════════════════════════════════════════
   V25.15 — GHI LẠI MỘT KẾT LUẬN, KHÔNG VÁ THÊM
   ══════════════════════════════════════════════════════════════════════
   Anh Trí vẫn không thấy trong suốt, dù đo tại chỗ thì khung ĐÃ về độ đục 0.

   Đã thử hai cách vá và gỡ cả hai vì đều không giải quyết gốc:
     · phóng ảnh dọc lên 168% rồi kéo xuống — không được, phần đẹp nằm ở
       ĐỈNH ảnh mà background-position không đẩy ảnh xuống quá mép trên;
     · dùng ảnh ngang cho điện thoại — cũng không, vì ảnh ngang nhận CÙNG
       ràng buộc đó.

   Gốc rễ nằm ở đề bài em viết cho cả bốn ảnh:
     "the ENTIRE LOWER TWO THIRDS ... almost empty, very smooth"
   Bốn ảnh làm đúng. Nhưng nội dung bài học nằm ở đúng vùng đó, nên kính
   trong suốt chỉ để lộ ra khoảng trống. Hai yêu cầu triệt tiêu nhau ngay
   từ lúc em viết đề.

   Ảnh TỐI không bị: trời sao vốn trải đều cả khung nên cắt đâu cũng có gì
   để nhìn. Chỉ hai ảnh SÁNG cần làm lại — đề bài mới ở
   design-lab/DE-BAI-2-ANH-SANG-LAM-LAI.md
   ══════════════════════════════════════════════════════════════════════ */

/* ══════════════════════════════════════════════════════════════════════
   V28 — TRỞ VỀ CHUẨN LESSON CANARY 14/08
   ══════════════════════════════════════════════════════════════════════
   Khóa lại cảnh dawn/night và một tấm kính đọc chính. Các khối chứa cuối
   V25.14 từng bị làm trong hoàn toàn, khiến chữ nằm thẳng trên ảnh và lệch
   khỏi mẫu được chọn. V28 chỉ đảo phần thị giác đó; không đổi nội dung,
   dữ liệu, audio, tiến độ hay logic bài tập.
   ══════════════════════════════════════════════════════════════════════ */
body::before{background-image:var(--v25-scene-dawn)!important;background-position:center top!important}
html[data-mode="dark"] body::before{background-image:var(--v25-scene-night)!important}

html:not([data-mode="dark"]) .app .view #flowBox,
html:not([data-mode="dark"]) .app .view .exwrap,
html:not([data-mode="dark"]) .app .view .fc-stage,
html:not([data-mode="dark"]) .app .view .hub,
html:not([data-mode="dark"]) .app .view .chips,
html:not([data-mode="dark"]) .app .view #pointList{
  background:linear-gradient(135deg,rgba(255,255,255,.16),transparent 45%),rgba(250,252,249,.64)!important;
  -webkit-backdrop-filter:blur(18px) saturate(155%)!important;backdrop-filter:blur(18px) saturate(155%)!important;
  border:1px solid rgba(255,255,255,.62)!important;
  box-shadow:0 22px 70px rgba(27,47,66,.17),inset 0 1px rgba(255,255,255,.55)!important}
html[data-mode="dark"] .app .view #flowBox,
html[data-mode="dark"] .app .view .exwrap,
html[data-mode="dark"] .app .view .fc-stage,
html[data-mode="dark"] .app .view .hub,
html[data-mode="dark"] .app .view .chips,
html[data-mode="dark"] .app .view #pointList{
  background:linear-gradient(135deg,rgba(130,205,255,.08),transparent 46%),rgba(5,22,42,.58)!important;
  -webkit-backdrop-filter:blur(18px) saturate(155%)!important;backdrop-filter:blur(18px) saturate(155%)!important;
  border:1px solid rgba(186,224,255,.28)!important;
  box-shadow:0 22px 80px rgba(0,5,15,.44),inset 0 1px rgba(186,224,255,.18)!important}

html:not([data-mode="dark"]) .app .view .hubcard,
html:not([data-mode="dark"]) .app .view .stat{
  background:rgba(250,252,249,.68)!important;border:1px solid rgba(255,255,255,.62)!important;
  -webkit-backdrop-filter:blur(14px) saturate(145%)!important;backdrop-filter:blur(14px) saturate(145%)!important}
html[data-mode="dark"] .app .view .hubcard,
html[data-mode="dark"] .app .view .stat{
  background:rgba(7,25,46,.62)!important;border:1px solid rgba(186,224,255,.24)!important;
  -webkit-backdrop-filter:blur(14px) saturate(145%)!important;backdrop-filter:blur(14px) saturate(145%)!important}

.v25-rail{background:var(--v25-glass-soft)!important;
  -webkit-backdrop-filter:blur(20px) saturate(155%)!important;backdrop-filter:blur(20px) saturate(155%)!important}
.hd,.bnav{background:var(--v25-glass)!important}
