/* ==========================================================
   Tiếng Nhật Đơn Giản — Design Tokens v3 (teal gradient + 2 tông cam)
   2026-07-10 — khôi phục theo đúng ảnh tham chiếu người dùng cung cấp:
   sidebar/banner dùng gradient teal (không phải navy đặc), "Đăng nhập"
   nền teal đặc, "Đăng ký" nền teal nhạt, "Theo dõi Fanpage" cam vàng,
   "Bắt đầu ngay" cam san hô — đúng cặp 2 tông cam đã dùng ở bản teal
   đầu tiên (sampled thật từ tiengnhatdongian.com, #029fb2).

   LOGO: giữ nguyên màu đỏ gốc (#dc3545 trong logo.png thật).

   Lưu ý: chữ trắng trên --color-primary/--accent-amber/--accent-coral
   chỉ đạt ~3.2:1 (dưới ngưỡng AA 4.5:1 cho text thường) — chấp nhận
   đánh đổi này để khớp đúng hình ảnh tham chiếu; nói nếu muốn ưu tiên
   lại WCAG AA nghiêm ngặt như bản trước.
   ========================================================== */
:root{
    --menu-width: 68px;
    --sidebar-w-collapsed: 68px;
    --sidebar-w-expanded: 260px;
    --sidebar-w: var(--sidebar-w-expanded); /* mặc định mở rộng (có nhãn chữ), giống ảnh tham chiếu */

    --color-primary: #029fb2;         /* teal thật, sampled từ tiengnhatdongian.com */
    --color-primary-deep: #026e7a;    /* teal đậm — text/link teal */
    --color-primary-tint: #e1f5f7;    /* teal rất nhạt — nền tag/pill, nút Đăng ký */
    --color-primary-rgb: 2,159,178;

    --sidebar-grad-a: var(--color-primary);
    --sidebar-grad-b: #045062;        /* teal-xanh đậm — điểm cuối gradient sidebar/banner */

    --accent-amber: #ffb700;          /* cam vàng — nút "Theo dõi Fanpage" */
    --accent-amber-hover: #e6a500;
    --accent-coral: #ff7a45;          /* cam san hô — CTA banner "Bắt đầu ngay" */
    --accent-coral-hover: #f2611f;

    --color-logo-accent-rgb: 220,53,69; /* đỏ thật trong logo.png — chỉ dùng cho shadow dưới logo, không đổi màu logo */

    --color-surface: #ffffff;
    --color-surface-alt: #f2f4f7;

    --color-text-primary:#1b1b1a; --color-text-secondary:#495057; --color-text-tertiary:#868e96;
    /* border/bg/shadow phối theo tông teal của D:/tiengnhatdongian/new_UI/japanese-learning-ui
       (--page-bg #f4fafb, --border #dfe9ec, shadow tint rgba(18,60,72,x)) thay vì xám trung tính cũ */
    --color-border:#dfe9ec; --color-border-2:#d2e1e5;

    --page-bg:#f4fafb;
    --card-bg:#ffffff;
    --card-radius:16px;
    --card-shadow:0 4px 18px rgba(18,60,72,.05);
    --card-shadow-hover:0 12px 34px rgba(17,62,74,.10);
    --btn-radius:8px;

    --font-ui: Inter, "Noto Sans JP", sans-serif;
    --font-jp: "M PLUS Rounded 1c", "Noto Sans JP", Inter, sans-serif;
}

*,*::before,*::after{box-sizing:border-box}
html{scroll-behavior:smooth}
body{
    margin:0;
    font-family:var(--font-ui);
    color:var(--color-text-primary);
    background:var(--page-bg);
    -webkit-font-smoothing:antialiased;
    overflow-x:hidden;
}
/* assets/css/custom.css đặt body{padding:0 10px 10px} cho layout cũ — ở layout mới,
   .aside-menu là fixed (không bị ảnh hưởng bởi padding này) trong khi .main-wrap vẫn
   nằm trong luồng nên bị đẩy lệch 10px so với sidebar/mép phải. Reset về 0 cho layout mới. */
body.new-home-ui{padding:0}
a{color:inherit;text-decoration:none}
button{font-family:inherit;cursor:pointer;transition:background .15s ease,color .15s ease,transform .1s ease,box-shadow .15s ease}
button:active{transform:scale(.96)}
button:focus-visible, a:focus-visible, input:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px;border-radius:4px}
svg{width:1em;height:1em;fill:currentColor;display:block}
/* Rule trên chỉ nhằm reset các icon SVG của giao diện mới (sidebar/header/nút...).
   Trang chi tiết Kanji chèn SVG minh họa nét chữ thật (width/height 250px riêng, tự tô màu
   từng nét) qua field ACF kanji_svg — nếu bị ép về 1em (~16px) thì gần như biến mất. */
.kanji-draw-container svg{width:auto;height:auto;fill:initial;display:inline-block}
ul{list-style:none;margin:0;padding:0}
::-webkit-scrollbar{width:9px;height:9px}
::-webkit-scrollbar-thumb{background:rgba(0,0,0,.18);border-radius:50rem}
::-webkit-scrollbar-thumb:hover{background:rgba(0,0,0,.3)}
::-webkit-scrollbar-track{background:transparent}

.kanji-search-result-home:not(:empty){
    margin-top:20px;background:#fff;border-radius:16px;padding:28px;
    box-shadow:0 5px 10px rgba(0,0,0,.15);
    /*overflow-x:hidden;*/ /* lưới an toàn: chặn mọi tràn ngang từ nội dung kanji dùng chung
        (content-single_kanji.php) đè lên layout mobile của trang chủ — xem rule .tuong-tu-box
        bên dưới để biết 1 nguyên nhân cụ thể đã tìm ra (còn nhiều khả năng khác chưa lộ ra
        hết vì template gốc chỉ được thiết kế/test cho layout desktop cũ) */
}
/* Ẩn bảng Từ vựng khi đang ở tab KHÁC Từ vựng — xem đoạn "BẪY đã gặp" ở tabLink click handler
   trong new-home.js: #tuvung_datatable_wrap KHÔNG được `.innerHTML = ''` như 5 khối kết quả AJAX
   kia (DataTable chỉ khởi tạo 1 lần, xoá đi không tự dựng lại khi quay lại tab), chỉ ẩn/hiện bằng
   class này — !important để thắng chắc chắn rule ":not(:empty)" ngay trên (nội dung vẫn còn,
   không phải :empty, nhưng vẫn cần ẩn hẳn). */
.kanji-search-result-home.tv-tab-hidden{
    display:none!important;
}
/* "KANJI TƯƠNG TỰ": .wrap-bo-cau-thanh .kanji-url (display:block) và .kanji-tuong-tu .kanji-url
   (display:inline-block) cùng độ đặc hiệu, áp lên cùng 1 span — rule "block" thắng khiến 20+
   kanji không tự xuống dòng trong cột hẹp ở mobile, tràn ngang cả trang. Ép về inline-block để
   bọc dòng bình thường như chữ trong đoạn văn, không đụng tới file gốc (ảnh hưởng chung site). */
#kanji_search_result_home .kanji-tuong-tu.tuong-tu-box .kanji-url,
.tndg-kanji-info-panel-body .kanji-tuong-tu.tuong-tu-box .kanji-url,
#quickSearchPopupInternal .kanji-tuong-tu.tuong-tu-box .kanji-url{display:inline-block!important}
.kanji-search-loading{
    display:flex;align-items:center;justify-content:center;gap:10px;
    padding:48px 20px 8px;font-size:16px;font-weight:500;color:var(--color-text-secondary);
}
.kanji-search-loading .fa-spinner{font-size:20px;color:var(--color-primary)}
.kanji-search-loading.kanji-not-found{padding:48px 20px;color:#dc3545;font-weight:600}
/* To lên bằng đúng chiều cao khối chữ 2 dòng (16px * ~1.4 line-height * 2 dòng ≈ 45px) — trước
   chỉ 20px, nhỏ hơn hẳn khối chữ 2 dòng (thêm câu gợi ý "Vui lòng nhập một chữ Kanji...") trông
   lệch tỉ lệ. flex-shrink:0 để không bị bóp lại trong hàng flex .kanji-search-loading. */
.kanji-search-loading.kanji-not-found .fa-exclamation-circle{font-size:44px;line-height:1;flex-shrink:0}
/* Khối loading (tndgRenderKanjiLoading trong homeJs.js) giờ dựng lại ĐẦY ĐỦ bố cục overlay
   chuyển trang toàn trang (.tndg-pt-inner trong assets/css/page-transition.css): logo → thẻ dấu
   mộc → dòng "Đang tải..." → thanh tiến trình → 2 nút — copy lại nguyên kích thước/khoảng cách,
   chỉ khác 1 điểm CỐ Ý: thanh tiến trình ở đây được lái bằng JS theo trạng thái tải Kanji thật
   (tndgStartKanjiLoadingProgress) thay vì chạy hẹn giờ cố định như bản gốc (bản gốc chấp nhận
   được vì đó là điều hướng trình duyệt thật, JS không đo được tiến trình; ở đây là AJAX nên đo
   được, không có lý do gì phải giả lập hẹn giờ). */
.kanji-loading-panel{
    display:flex;flex-direction:column;align-items:center;gap:16px;padding:24px 16px 32px;text-align:center;
}
.kanji-loading-quote{display:flex;justify-content:center;width:100%}
/* <p> — cần tiền tố ID để thắng rule "font-size:revert" chặn rò rỉ (#kanji_search_result_home p
   ở dưới file này), cùng lý do đã giải thích ở .kanji-loading-quote-jp/-vi. Liệt kê riêng từng
   nơi khối loading này được dùng lại (không gộp về 1 class chung — hạ specificity xuống dưới
   ".content-wrap section p" của tabs.css, làm rò rỉ lại): tìm Kanji, tìm Giáo trình, và panel
   "Cách nhớ và Giải nghĩa" (tndgOpenKanjiInfoPanel gọi tndgLoadKanjiDetail()/tndgLoadWithLoadingPanel
   — xem homeJs.js) — thiếu nơi nào thì chữ ở đó sẽ về style <p> mặc định của trình duyệt, không
   to/đậm như thiết kế (đúng lỗi khi mới thêm #giaotrinh_search_result_home mà quên thêm vào đây). */
#kanji_search_result_home .kanji-loading-caption,
#giaotrinh_search_result_home .kanji-loading-caption,
#flashcard_search_result_home .kanji-loading-caption,
#dethi_search_result_home .kanji-loading-caption,
#phim_search_result_home .kanji-loading-caption,
.tndg-kanji-info-panel-body .kanji-loading-caption,
#quickSearchPopupInternal .kanji-loading-caption{margin:0;font-size:14px;color:color-mix(in srgb,#1b1b1a 50%,transparent)}
.kanji-loading-bar{position:relative;width:280px;max-width:70vw;height:5px;background:#f3d9dc;border-radius:2.5px}
.kanji-loading-bar-fill{position:absolute;left:0;top:0;height:100%;width:0;border-radius:inherit;background:#c8232f}
.kanji-loading-bar-fill .kanji-loading-quote-flower--cursor{position:absolute;right:-7px;top:50%;transform:translate(50%,-50%)}
.kanji-loading-quote-flower--cursor{width:14px;height:14px}
.kanji-loading-quote-flower--cursor i{width:6px;height:6px;background:#c8232f}
.kanji-loading-quote-flower--cursor i:nth-child(1){top:4px;left:8px}
.kanji-loading-quote-flower--cursor i:nth-child(2){top:8px;left:5px}
.kanji-loading-quote-flower--cursor i:nth-child(3){top:6px;left:0}
.kanji-loading-quote-flower--cursor i:nth-child(4){top:1px;left:0}
.kanji-loading-quote-flower--cursor i:nth-child(5){top:0;left:5px}
.kanji-loading-quote-card{
    position:relative;display:flex;flex-direction:column;align-items:center;gap:16px;
    width:100%;max-width:min(92vw,560px);padding:30px 26px;text-align:center;
    background:#fbf7f1;
    filter:drop-shadow(0 10px 26px rgba(0,0,0,.14));
    -webkit-mask-image:
        radial-gradient(circle 22px at 0 0, transparent 22px, black 22.5px),
        radial-gradient(circle 22px at 100% 0, transparent 22px, black 22.5px),
        radial-gradient(circle 22px at 0 100%, transparent 22px, black 22.5px),
        radial-gradient(circle 22px at 100% 100%, transparent 22px, black 22.5px);
    mask-image:
        radial-gradient(circle 22px at 0 0, transparent 22px, black 22.5px),
        radial-gradient(circle 22px at 100% 0, transparent 22px, black 22.5px),
        radial-gradient(circle 22px at 0 100%, transparent 22px, black 22.5px),
        radial-gradient(circle 22px at 100% 100%, transparent 22px, black 22.5px);
    mask-composite:intersect,intersect,intersect;-webkit-mask-composite:source-in;
}
@media (min-width:420px){
    .kanji-loading-quote-card{padding:36px 60px}
}
.kanji-loading-quote-corner{position:absolute;bottom:22px;width:16px;height:16px}
.kanji-loading-quote-corner--bl{left:22px;border-left:2px solid color-mix(in srgb,#c8232f 45%,transparent);border-bottom:2px solid color-mix(in srgb,#c8232f 45%,transparent)}
.kanji-loading-quote-corner--br{right:22px;border-right:2px solid color-mix(in srgb,#c8232f 45%,transparent);border-bottom:2px solid color-mix(in srgb,#c8232f 45%,transparent)}
.kanji-loading-quote-dot{position:absolute;top:22px;border-radius:50%;background:#f0b8c2}
.kanji-loading-quote-dot--tl{left:22px;width:8px;height:8px}
.kanji-loading-quote-dot--tr{right:22px;width:7px;height:7px}
.kanji-loading-quote-label{
    display:inline-flex;align-items:center;margin-top:10px;margin-bottom:0;transform:rotate(-3deg);
    font-size:13px;font-weight:700;letter-spacing:.04em;color:#a3453f;
    background:rgba(163,32,31,.1);border:1px dashed rgba(163,32,31,.3);
    border-radius:6px;padding:7px 18px;
}
.kanji-loading-quote-label:empty{display:none}
/* .kanji-loading-quote-jp/-vi là thẻ <p> — #kanji_search_result_home p (dưới cùng file này)
   có rule "font-size:revert" để chặn rò rỉ font-size:4em từ tabs.css cho MỌI <p> chèn bằng AJAX
   trong khối kết quả Kanji, độ đặc hiệu (1,0,1) cao hơn 1 class đơn (0,1,0) nên luôn thắng, đè
   mất font-size/color/font-weight cố ý đặt ở đây (đúng lỗi "chữ bị bé" — revert về cỡ chữ kế
   thừa từ ancestor thay vì giữ clamp() đã khai báo). Thêm tiền tố ID để nâng độ đặc hiệu lên
   (1,1,0), thắng được rule chặn rò rỉ mà không cần !important — khối loading này dùng LẠI y hệt
   ở nhiều nơi (tìm Kanji, tìm Giáo trình, panel "Cách nhớ và Giải nghĩa" .tndg-kanji-info-panel-body
   — xem tndgLoadWithLoadingPanel trong homeJs.js) nên phải liệt kê tiền tố riêng cho TỪNG nơi,
   không gộp về 1 class chung (hạ specificity xuống dưới rule chặn rò rỉ, làm rò rỉ lại — xem
   .kanji-loading-caption phía trên). */
#kanji_search_result_home .kanji-loading-quote-jp,
#giaotrinh_search_result_home .kanji-loading-quote-jp,
#flashcard_search_result_home .kanji-loading-quote-jp,
#dethi_search_result_home .kanji-loading-quote-jp,
#phim_search_result_home .kanji-loading-quote-jp,
.tndg-kanji-info-panel-body .kanji-loading-quote-jp,
#quickSearchPopupInternal .kanji-loading-quote-jp{
    margin:0;display:flex;align-items:center;justify-content:center;gap:12px;
    font-family:"Noto Sans JP",var(--font-jp,"M PLUS Rounded 1c"),sans-serif;
    font-size:clamp(24px,6.5vw,38px);font-weight:700;color:#1b1b1a;flex-wrap:wrap;
}
/* Toàn bộ chuỗi ruby/kana của câu (window.tndgPtFuriganaHtml) PHẢI nằm gọn trong 1 khối duy
   nhất — .kanji-loading-quote-jp là flex container nên nếu để từng <ruby>/từng cụm kana rời
   rạc làm con trực tiếp của nó, mỗi mảnh sẽ tách thành flex item riêng và bị đẩy xa nhau bởi
   gap:10px (chữ vỡ hàng, dạt lung tung). white-space:nowrap để cả câu không tự ý xuống dòng
   giữa chừng làm rời khớp furigana khỏi đúng chữ của nó. */
.kanji-loading-quote-jp-text{white-space:nowrap}
.kanji-loading-quote-jp rt{font-size:12px;font-weight:400;opacity:.65}
.kanji-loading-quote-divider{display:flex;align-items:center;gap:8px;opacity:.4}
.kanji-loading-quote-divider .line{width:72px;height:1px;background:color-mix(in srgb,#c8232f 35%,transparent)}
#kanji_search_result_home .kanji-loading-quote-vi,
#giaotrinh_search_result_home .kanji-loading-quote-vi,
#flashcard_search_result_home .kanji-loading-quote-vi,
#dethi_search_result_home .kanji-loading-quote-vi,
#phim_search_result_home .kanji-loading-quote-vi,
.tndg-kanji-info-panel-body .kanji-loading-quote-vi,
#quickSearchPopupInternal .kanji-loading-quote-vi{
    margin:0;font-size:clamp(21px,5.5vw,32px);font-weight:700;line-height:1.3;
}
.kanji-loading-quote-vi .black{color:#1b1b1a}
.kanji-loading-quote-vi .red{color:#c8232f}
/* Hoa văn 5 cánh trang trí — mượn lại nguyên giá trị toạ độ từ .tndg-pt-flower
   (assets/css/page-transition.css) để 2 nơi trông giống hệt nhau. */
.kanji-loading-quote-flower{position:relative;width:16px;height:16px;flex:none;display:inline-block}
.kanji-loading-quote-flower i{position:absolute;width:7px;height:7px;border-radius:50%;background:#f0b8c2}
.kanji-loading-quote-flower i:nth-child(1){top:4.5px;left:9.5px}
.kanji-loading-quote-flower i:nth-child(2){top:9.25px;left:6.05px}
.kanji-loading-quote-flower i:nth-child(3){top:7.44px;left:0.46px}
.kanji-loading-quote-flower i:nth-child(4){top:1.56px;left:0.46px}
.kanji-loading-quote-flower i:nth-child(5){top:-0.25px;left:6.05px}
.kanji-loading-quote-flower b{position:absolute;width:5px;height:5px;border-radius:50%;background:#c8232f;top:5.5px;left:5.5px}
.kanji-loading-quote-flower--red i{background:#c8232f}
.kanji-loading-quote-flower--red b{background:#fff}
/* Nút Dừng để xem — copy lại đúng kiểu dáng .tndg-pt-pause/.is-paused
   (assets/css/page-transition.css) cho đồng nhất, chỉ đổi hành vi (xem
   tndgStartKanjiLoadingTips trong homeJs.js) vì ở đây không có điều hướng trang để dừng lại —
   nút giờ điều khiển việc tự xoay câu. */
.kanji-loading-quote-actions{display:flex;align-items:center;justify-content:center;flex-wrap:wrap;gap:10px}
.kanji-loading-quote-pause{
    margin:0;border-radius:999px;padding:10px 22px;cursor:pointer;
    font-family:var(--font-ui,Inter,sans-serif);font-size:13px;
    background:#c8232f;border:2px solid #c8232f;font-weight:600;color:#fbf7f1;
    box-shadow:0 6px 18px rgba(0,0,0,.12);
}
.kanji-loading-quote-pause.is-paused{background:#fbf7f1;color:#c8232f}

/* Panel "Cách nhớ và Giải nghĩa" trượt phải-sang-trái (tndgCreateKanjiInfoPanel/
   tndgOpenKanjiInfoPanel trong assets/js/new-home.js) — bấm nút trong tooltip hover Kanji mở panel
   này thay vì điều hướng hẳn sang trang khác. MỖI LẦN bấm tạo 1 instance MỚI (id trùng nhau có chủ
   đích, xem comment ở tndgCreateKanjiInfoPanel) xếp chồng lên panel đang mở, không còn dùng chung
   1 overlay singleton như bản đầu — panel sau luôn đứng SAU trong DOM nên tự vẽ đè lên panel trước
   dù CÙNG z-index (không cần tăng z-index thủ công theo độ sâu chồng). z-index phải cao hơn TẤT CẢ z-index khác đang có trên site
   (rà lại toàn bộ CSS theme, cao nhất là #kanji_search_result_home.hp_btn_onfocus/
   .box-search-container.hp_btn_onfocus ở z-index:9999999!important trong chính file này — bật
   lên khi khung tìm kiếm đang focus, đứng cùng stacking context với overlay này vì cả 2 đều là
   con gần-trực-tiếp của <body> không qua ancestor nào tạo stacking context riêng — nếu không cao
   hơn, kết quả tìm kiếm phía sau sẽ đè lên panel ngay khi khung tìm kiếm đang ở trạng thái
   focus). Không dùng !important vì bản thân z-index của overlay này không bị ai khác đè, chỉ
   cần number đủ lớn. */
/* Đóng panel: PHẢI trượt hết ra phải rồi mới mờ nền dần (tuần tự, không mờ+trượt cùng lúc) —
   làm bằng transition-delay: opacity của overlay chỉ bắt đầu chạy SAU khi transform của
   .tndg-kanji-info-panel trượt xong (delay = đúng .34s, khớp thời lượng trượt bên dưới).
   visibility chuyển "hidden" trễ nhất (delay = tổng slide+fade) để phần tử vẫn được vẽ xuyên
   suốt animation, không biến mất đột ngột giữa chừng. Mở panel thì hiện ngay, không cần trễ —
   chỉ chiều đóng mới cần đúng thứ tự này. */
#tndg-kanji-info-panel-overlay{
    position:fixed;inset:0;z-index:2147483000;
    background:rgba(20,20,20,.45);
    opacity:0;visibility:hidden;pointer-events:none;
    transition:opacity .26s ease .34s,visibility 0s linear .6s;
}
#tndg-kanji-info-panel-overlay.is-open{
    opacity:1;visibility:visible;pointer-events:auto;
    transition:opacity .22s ease,visibility 0s linear;
}
/* Rộng bằng #kanji_search_result_home (đo thực tế ~980px ở viewport 1280px, khớp
   .page-container trừ sidebar) để nội dung content-single_kanji.php — vốn chỉ được thiết kế/test
   cho layout rộng — hiển thị đủ chỗ như bên ngoài, không bị co cụm 3 cột lại 1 chỗ như khi panel
   chỉ 480px. */
.tndg-kanji-info-panel{
    position:absolute;top:0;right:0;height:100%;width:min(94vw,1235px);
    display:flex;flex-direction:column;
    background:#fff;box-shadow:-10px 0 30px rgba(0,0,0,.18);
    transform:translateX(100%);
    transition:transform .34s cubic-bezier(.32,.72,0,1);
    will-change:transform;
}
#tndg-kanji-info-panel-overlay.is-open .tndg-kanji-info-panel{transform:translateX(0)}
.tndg-kanji-info-panel-header{
    display:flex;align-items:center;justify-content:space-between;flex-shrink:0;
    padding:16px 20px;border-bottom:1px solid var(--color-border);
}
.tndg-kanji-info-panel-heading{flex:1 1 auto;min-width:0}
/* Đồng bộ với #quickSearchPopupHeadingKanji (style.css/new-home.css, popup "Tra cứu nhanh") —
   .result-list-kanji vốn thiết kế để "tràn" khớp viền khối kết quả có padding riêng
   (#kanji_search_result_home), phải bỏ hết margin/padding/border-bottom khi nằm thẳng trong
   header đã có padding/border-bottom riêng của .tndg-kanji-info-panel-header, tránh cộng dồn. */
.tndg-kanji-info-panel-heading .result-list-kanji{margin:0;padding:0;border-bottom:none}
/* Đồng bộ y hệt .qspop-close (popup "Tra cứu nhanh") — cùng kích thước/bo góc/màu nền, SVG X thay
   cho icon Font Awesome cũ (xem markup mới trong tndgCreateKanjiInfoPanel(), new-home.js). */
.tndg-kanji-info-panel-close{
    flex-shrink:0;width:32px;height:32px;border:none;border-radius:9px;
    background:var(--page-bg);color:var(--color-text-secondary);cursor:pointer;
    display:flex;align-items:center;justify-content:center;transition:background .15s ease;
}
.tndg-kanji-info-panel-close:hover{background:var(--color-border)}
.tndg-kanji-info-panel-close svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.tndg-kanji-info-panel-body{flex:1 1 auto;overflow-y:auto;padding:8px 20px 24px;overflow-x:hidden}
@media (max-width:480px){
    .tndg-kanji-info-panel{width:100%}
}

/* Hàng nút chọn Kanji khi gõ từ 2 Kanji khác nhau trở lên (tndgRenderKanjiPicker() trong
   homeJs.js) — style theo design token của trang chủ (teal) thay vì .btn-secondary xám mặc
   định của Bootstrap, cho đồng bộ với phần nội dung kanji hiển thị ngay bên dưới.
   margin trái/phải -20px "trung hoà" đúng padding-left/right 20px của chính hàng này để hàng
   nằm khít theo padding của khung cha (kanji-search-result-home, 28px) — nhưng padding-top
   14px thì KHÔNG có margin-top âm tương ứng để bù, nên bị cộng dồn với padding-top 28px của
   khung cha thành 42px, cao hơn hẳn lề trái/phải (28px). Bỏ hẳn padding-top (dựa hoàn toàn vào
   padding-top của khung cha) để lề trên bằng đúng lề trái/phải; giữ padding-bottom cho khoảng
   cách trước border-bottom bên dưới. */
.result-list-kanji{
    display:flex;align-items:center;flex-wrap:wrap;gap:16px;
    padding:0 20px 14px;margin:0 -20px 4px;border-bottom:1px solid var(--color-border);
}
.result-list-kanji-info{display:flex;align-items:center;gap:12px;flex-shrink:0}
.result-list-kanji-icon{
    display:flex;align-items:center;justify-content:center;flex-shrink:0;
    width:40px;height:40px;border-radius:50%;
    background:var(--color-primary);color:#fff;
}
.result-list-kanji-icon .fa{font-size:16px}
/* Trường hợp "không tìm thấy Kanji" (runKanjiLookup() trong new-home.js) — đồng bộ đúng màu đỏ
   cảnh báo #dc3545 đã dùng cho .kanji-not-found ở nơi khác (kết quả tìm kiếm trang chủ/panel),
   thay vì giữ nguyên màu teal mặc định vốn chỉ hợp cho trạng thái "tìm thấy". */
.result-list-kanji-icon.is-not-found{background:#dc3545}
.result-list-kanji-text{display:flex;flex-direction:column;gap:1px}
.result-list-kanji-label{font-size:15px;font-weight:700;color:var(--color-text-primary);white-space:nowrap}
.result-list-kanji-sublabel{font-size:12.5px;color:var(--color-text-tertiary);white-space:nowrap}
.result-list-kanji-items{display:flex;flex-wrap:wrap;gap:8px}
.kanji-picker-btn{
    position:relative;display:flex;align-items:center;justify-content:center;
    width:44px;height:44px;border-radius:10px;
    background:var(--page-bg);border:1.5px solid var(--color-border-2);
    font-family:var(--font-jp);font-size:22px;font-weight:500;color:var(--color-text-primary);
    transition:background .15s ease,border-color .15s ease,color .15s ease,transform .1s ease;
}
.kanji-picker-btn:hover{background:var(--color-primary-tint);border-color:var(--color-primary);color:var(--color-primary-deep)}
.kanji-picker-btn:active{transform:scale(.94)}
.kanji-picker-btn.is-active{
    background:var(--color-primary);border-color:var(--color-primary);color:#fff;
    box-shadow:0 3px 10px rgba(var(--color-primary-rgb),.35);
}
.kanji-picker-check{
    position:absolute;top:-6px;right:-6px;width:16px;height:16px;border-radius:50%;
    display:flex;align-items:center;justify-content:center;
    background:#2ecc71;color:#fff;border:2px solid #fff;
}
.kanji-picker-check svg{width:8px;height:8px}

/* Icon loa đọc to Âm On/Kun/Nanori (tndgInitKanjiPronunciation() trong homeJs.js) — chip
   .txt-item vốn đã có sẵn hiệu ứng hover trong content-single_kanji.php nên chỉ cần thêm
   con trỏ pointer + icon, không cần định nghĩa lại toàn bộ style của chip. */
#kanji_search_result_home .txt-item,
.tndg-kanji-info-panel-body .txt-item,
#quickSearchPopupInternal .txt-item{cursor:pointer}
#kanji_search_result_home .txt-item-speak,
.tndg-kanji-info-panel-body .txt-item-speak,
#quickSearchPopupInternal .txt-item-speak{margin-left:6px;font-size:.75em;opacity:.7}
#kanji_search_result_home .txt-item:hover .txt-item-speak,
.tndg-kanji-info-panel-body .txt-item:hover .txt-item-speak,
#quickSearchPopupInternal .txt-item:hover .txt-item-speak{opacity:1}
/* Trạng thái đang chờ Azure Speech trả về mp3 (is-loading, gắn/gỡ trong tndgSpeakKanjiReading()
   của new-home.js) — quay icon loa để báo hiệu đang xử lý, tái dùng đúng @keyframes tv-tts-spin
   đã khai cho nút loa bảng Từ vựng (xem #tuvung_datatable_wrap .tv-tts-btn.is-loading bên dưới). */
#kanji_search_result_home .txt-item-speak.is-loading,
.tndg-kanji-info-panel-body .txt-item-speak.is-loading,
#quickSearchPopupInternal .txt-item-speak.is-loading{opacity:1;animation:tv-tts-spin .8s linear infinite}
/* tabs.css có rule ".content-wrap section p" (chữ nền mờ trang trí cho hệ tab gốc của trang chủ,
   font-size:4em) vô tình đè lên mọi thẻ <p> trong nội dung chèn bằng AJAX ở các khối kết quả tìm
   kiếm trang chủ, làm chữ to bất thường/vỡ layout. Trả lại kế thừa bình thường (giống hệt khi
   render trên trang gốc). Áp cho cả #giaotrinh_search_result_home cùng lý do — xem
   .kanji-loading-quote-jp/-vi phía trên về việc vì sao phải liệt kê riêng ID từng khối. */
#kanji_search_result_home p,
#giaotrinh_search_result_home p,
#flashcard_search_result_home p,
#dethi_search_result_home p,
#phim_search_result_home p,
#quickSearchPopupInternal p{color:revert;font-weight:revert;font-size:revert;line-height:revert;margin:0;padding:0;text-align:left}
/* Rule chặn rò rỉ ở trên áp dụng cho MỌI thẻ <p> nên cũng vô tình đè luôn lên 2 chỗ vốn có
   style riêng cố ý khác biệt (banner "MẸO NHỚ NHANH" và chữ Kanji đặt giữa ảnh nền mờ khi
   không có ảnh minh họa riêng — content-single_kanji.php) — khôi phục lại đúng giá trị gốc
   của 2 chỗ này, độ đặc hiệu cao hơn rule chặn rò rỉ ở trên (thêm .wrap-url-image/#report)
   nên vẫn thắng được nó mà không cần quay lại dùng "revert" (revert bỏ qua toàn bộ CSS do
   theme viết, kể cả các rule hợp lệ này, chứ không riêng gì rule rò rỉ của tabs.css). */
#kanji_search_result_home #report,
#quickSearchPopupInternal #report{padding:7.5px 12.5px}
#kanji_search_result_home .wrap-url-image p,
#quickSearchPopupInternal .wrap-url-image p{padding:5px 20px;margin:0 0 10px;font-size:90px;color:#721c24}

.aside-menu::-webkit-scrollbar{width:6px}
.aside-menu::-webkit-scrollbar-thumb{background:rgba(23,73,84,.18);border-radius:50rem}
.aside-menu::-webkit-scrollbar-thumb:hover{background:rgba(23,73,84,.32)}
.aside-menu::-webkit-scrollbar-track{background:transparent}

/* ---- sidebar backdrop (mobile drawer dimming) ---- */
.sidebar-backdrop{
    position:fixed;inset:0;background:rgba(10,13,18,.45);
    z-index:99;opacity:0;visibility:hidden;transition:opacity .25s ease;
    backdrop-filter:blur(1px);
}
.sidebar-backdrop.show{opacity:1;visibility:visible}
.btn-close-sidebar, .btn-mobile-menu{display:none}

/* ============ SIDEBAR ============ */
.aside-menu{
    position:fixed; inset:0 auto 0 0;
    width:var(--sidebar-w);
    /* gradient teal rất nhạt, học theo .sidebar của japanese-learning-ui (trắng ngà → xanh
       nhạt ở đáy) thay vì nền trắng phẳng cũ — chỉ đổi màu, không đổi bố cục/nội dung */
    background:linear-gradient(180deg,#fefefe 0%,#f9fcfd 66%,#e7f7f8 100%);
    border-right:1px solid #dfecef;
    display:flex; flex-direction:column;
    z-index:100; overflow-y:auto; overflow-x:hidden;
    box-shadow:4px 0 28px rgba(23,73,84,.05);
    scrollbar-width:thin; scrollbar-color:rgba(23,73,84,.18) transparent;
    transition:width .25s cubic-bezier(.32,.72,0,1);
}
body.sidebar-collapsed{ --sidebar-w: var(--sidebar-w-collapsed); }

/* site đang bật Customizer > Site Layout: "Boxed Layout" (style.css .boxed_layout #page{
   margin:0 auto;width:1256px}) — nếu không ghi đè, cột nội dung sẽ co lại giữa trang
   trong khi sidebar fixed vẫn dính mép trái, gây lệch/hụt layout */
.boxed_layout #page{width:auto!important;margin:0!important}

/* ---- vùng trên cùng sidebar (logo + ô tìm kiếm nhanh) — dùng chung 1 nền tranh núi
   Phú Sĩ để 2 khối liền mạch, không đứt đoạn ở đường viền logo ---- */
.sidebar-top{position:relative;padding-bottom:2px}
/* nền tranh đặt riêng ở pseudo-element (không phải trực tiếp trên .sidebar-top) để mask
   fade chỉ làm mờ dần ảnh nền, không kéo mờ theo logo/ô tìm kiếm nằm đè lên trên */
.sidebar-top::before{
    content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
    background:url('../images/sidebar-illustration.png') right top/cover no-repeat;
    -webkit-mask-image:linear-gradient(to bottom, #000 65%, transparent 100%);
            mask-image:linear-gradient(to bottom, #000 65%, transparent 100%);
}
.box-logo{
    display:flex; flex-direction:row; align-items:center; justify-content:space-between; gap:10px;
    padding:16px 16px 14px; flex-shrink:0; position:relative; z-index:1; width:100%;
}
.logo-link{display:block}

/* ---- brand logo: real "ĐG" mark from tiengnhatdongian.com (giữ nguyên đỏ gốc) + wordmark teal ---- */
.logo-lockup{display:flex;align-items:center;gap:12px}
/* logo/slogan to hơn chút cho hợp sidebar rộng 260px (trước 38px/11.5px canh cho sidebar
   hẹp hơn, giờ dư chỗ nên phóng lên) */
.logo-badge{
    width:44px;height:44px;border-radius:50%;flex-shrink:0;object-fit:cover;display:block;
    box-shadow:0 2px 6px rgba(var(--color-logo-accent-rgb),.35);
}
.logo-badge.small{width:32px;height:32px}
.logo-word{
    font-weight:800;color:var(--color-primary-deep);font-size:13px;line-height:1.3;
    letter-spacing:.4px;white-space:nowrap;display:block;
}
.logo-word.single{font-size:15px;color:var(--color-primary-deep);display:inline-block;white-space:nowrap}
.header-logo{display:flex;align-items:center;gap:10px}

.btn-toggle-sidebar{
    width:34px;height:34px;border:1px solid var(--color-border);border-radius:10px;flex-shrink:0;
    background:var(--color-primary-tint);color:var(--color-primary-deep);display:flex;align-items:center;justify-content:center;
    box-shadow:0 1px 3px rgba(0,0,0,.08);
}
.btn-toggle-sidebar svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round;stroke-linejoin:round;transition:transform .25s ease;transform:none}
.btn-toggle-sidebar:hover{background:#fff;border-color:var(--color-primary)}
body.sidebar-collapsed .btn-toggle-sidebar svg{transform:rotate(180deg)}

/* mặc định: mở rộng — logo + toggle nằm cùng hàng, menu hiện nhãn chữ */
/* .sidebar-collapsed: thu gọn về icon-only, logo xếp dọc phía trên toggle — đổi flex-direction
   NGAY LẬP TỨC (không đợi -settled như .menu-item, xem new-home.js) vì .box-logo chỉ có 2 phần
   tử (logo + nút toggle): nếu đợi khung co xong mới đổi, suốt .25s đó logo+nút vẫn ở bố cục
   HÀNG NGANG bị ép chung vào 1 khung đang hẹp dần (do .box-logo{width:100%} tự stretch theo
   .aside-menu) — 2 phần tử chen lấn nhau ngày càng chật, đứng yên/kẹt ở trạng thái ép sát mép
   phải trong khoảnh khắc cuối animation rồi mới "nhảy" sang bố cục dọc khi -settled thêm vào —
   đúng hiệu ứng "khựng lại rồi giật về vị trí" quan sát được trên nút tròn "<". Snap ngay từ đầu
   (cùng lúc bắt đầu co) tránh hẳn được hiện tượng ép/khựng này vì chỉ có 2 phần tử, ít gây chú ý
   hơn nhiều so với 8 dòng menu-item snap cùng lúc (lý do menu-item vẫn cần tách -settled). */
body.sidebar-collapsed .box-logo{flex-direction:column;justify-content:center;padding:16px 0 14px;width:auto}

/* ---- ô tìm kiếm nhanh trên cùng sidebar (dưới logo, trên nav) — bo tròn/đổ bóng
   theo đúng tham chiếu new_UI (D:/tiengnhatdongian/new_UI/japanese-learning-ui) ---- */
.quick-search{
    position:relative;z-index:1;
    display:flex;align-items:center;gap:6px;margin:14px 12px 12px;padding:0 8px 0 12px;
    height:44px;background:rgba(255,255,255,.94);border:1px solid var(--color-border);
    border-radius:14px;color:var(--color-text-tertiary);
    box-shadow:0 4px 15px rgba(18,60,72,.07);
    flex-shrink:0;transition:box-shadow .2s ease,transform .2s ease,border-color .2s ease;
}
.quick-search:hover{transform:translateY(-1px);border-color:var(--color-primary-tint);box-shadow:0 6px 20px rgba(18,60,72,.1)}
.quick-search svg{width:17px;height:17px;flex-shrink:0;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.quick-search input{
    flex:1;min-width:0;border:none;outline:none;background:transparent;
    font-family:inherit;font-size:13.5px;color:var(--color-text-primary);
    /* input[type=search] mặc định có "chrome" riêng của trình duyệt (khung focus do OS/engine
       vẽ, không phải CSS border/outline thường) — appearance:none để bỏ hẳn, chỉ còn giao
       diện tự thiết kế ở trên */
    appearance:none;-webkit-appearance:none;
}
/* style.css gốc của theme có rule input[type="search"]:focus{border:1px solid #AAA}
   (dòng ~430) — specificity (attribute + :focus) cao hơn ".quick-search input" ở trên
   nên viền xám vẫn lọt qua lúc focus; phải khớp lại đúng specificity đó mới thắng được */
.quick-search input:focus{border:none;outline:none}
.quick-search input::placeholder{color:var(--color-text-tertiary)}
/* trình duyệt tự thêm nút "x" xóa nhanh cho input[type=search] — ẩn icon mặc định của
   WebKit để dùng chung giao diện tối giản, không lệch với các ô search khác trên site */
.quick-search input::-webkit-search-cancel-button{-webkit-appearance:none}

/* ---- nút mở dropdown danh mục tra cứu nhanh — pill nền xám nhạt hiện tên danh mục
   đang chọn (Ngữ pháp/Kanji/...) + chevron, giống đúng ảnh tham chiếu người dùng cung
   cấp. positionMenu() trong new-home.js tính toạ độ dropdown theo đúng vị trí nút này. */
.quick-search-cat-toggle{
    display:flex;align-items:center;gap:3px;flex-shrink:0;max-width:92px;
    padding:6px 8px;border:none;border-radius:999px;cursor:pointer;
    background:var(--page-bg);transition:background .15s ease;
}
.quick-search-cat-toggle:hover{background:var(--color-border)}
.quick-search-cat-toggle span{
    overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
    font-size:12.5px;font-weight:600;color:var(--sidebar-grad-b);
}
.quick-search-cat-toggle svg{
    width:12px;height:12px;flex-shrink:0;fill:none;stroke:currentColor;
    stroke-width:2;stroke-linecap:round;stroke-linejoin:round;
    color:var(--color-text-tertiary);transition:transform .18s ease,color .15s ease;
}
.quick-search-cat-toggle.is-open{background:var(--color-primary-tint)}
.quick-search-cat-toggle.is-open svg{transform:rotate(180deg);color:var(--color-primary-deep)}
/* bỏ viền focus-visible mặc định (button:focus-visible ở trên) riêng cho nút này — đã
   có nền đổi màu khi mở (.is-open) làm tín hiệu, không cần thêm viền */
.quick-search-cat-toggle:focus-visible{outline:none}
body.sidebar-collapsed .quick-search-cat-toggle{display:none}

/* ---- dropdown danh mục ("Ngữ pháp / Kanji / Giáo trình / Flashcard / Đề thi / Anime")
   — position:fixed + JS tính toạ độ (positionMenu() trong new-home.js) để không bị
   .aside-menu{overflow-y:auto} cắt mất ---- */
.quick-search-categories{
    /* width do JS đặt khớp đúng bề rộng ô tìm kiếm (positionMenu(), new-home.js) */
    display:none;position:fixed;z-index:10000;
    background:#fff;border-radius:12px;box-shadow:0 16px 40px rgba(17,62,74,.18);
    border:1px solid var(--color-border);padding:6px;box-sizing:border-box;
}
.quick-search-categories.is-open{display:block}
/* mục dropdown giờ là "bộ chọn phạm vi tìm kiếm" (button, không phải link điều hướng) —
   chọn xong vẫn ở lại trang, gõ từ khoá + Enter mới mở popup kết quả theo đúng phạm vi
   (quickSearchOpenPopup() trong new-home.js) */
.quick-search-categories button{
    width:100%;border:none;background:none;cursor:pointer;font:inherit;text-align:left;
    display:flex;align-items:center;gap:10px;padding:9px 10px;border-radius:9px;
    font-size:13.5px;font-weight:500;color:var(--color-text-primary);
}
.quick-search-categories button:hover{background:var(--page-bg);color:var(--color-primary-deep)}
.quick-search-categories button svg{
    width:17px;height:17px;flex-shrink:0;fill:none;stroke:currentColor;
    stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;
}
.quick-search-categories button.is-selected{background:var(--color-primary-tint);color:var(--color-primary-deep)}
.quick-search-categories button.is-selected span::after{content:"✓";margin-left:auto;padding-left:8px;font-weight:700}

/* ---- panel kết quả "Tra cứu nhanh" — mở khi ấn Enter/nút tìm, hiện Google CSE (Ngữ pháp)
   hoặc danh sách kết quả nội bộ (5 danh mục còn lại). Trượt vào từ mép phải, y hệt kiểu dáng/
   chuyển động của panel "Cách nhớ và Giải nghĩa" Kanji (#tndg-kanji-info-panel-overlay/
   .tndg-kanji-info-panel trong homeJs.js/new-home.css) cho đồng nhất — trước đây là modal nổi
   giữa màn hình, giờ đổi sang panel để 2 tính năng "xem nhanh 1 kết quả ngay tại chỗ" của site
   dùng chung 1 ngôn ngữ thiết kế. JS (new-home.js) chỉ toggle class "is-open", không đổi gì
   thêm — html/body giữ nguyên `#quickSearchPopup` (JS trỏ theo id này) chỉ style lại. */
.qspop-backdrop{
    /* z-index cũ (10001) thấp hơn .box-search-container.hp_btn_onfocus/.kanji-search-result-home
       .hp_btn_onfocus (9999999!important — trạng thái "focus" phát sáng của khung tìm kiếm trang
       chủ, xem phía dưới file này) — nếu khung đó đang bật (VD người dùng vừa tương tác khung
       tìm kiếm chính trước khi mở "Tra cứu nhanh" ở sidebar) thì nó đè hẳn lên trên panel này dù
       panel mở SAU, đúng lỗi "panel nằm dưới khung search". Nâng lên cao hơn 9999999 nhưng vẫn
       thấp hơn #tndg-kanji-info-panel-overlay (2147483000 — panel "Cách nhớ và Giải nghĩa" có
       thể mở LỒNG bên trên panel này khi bấm 1 Kanji trong kết quả, nên phải luôn ở trên). */
    /* Đóng panel: PHẢI trượt hết ra phải rồi mới mờ nền dần (tuần tự, không mờ+trượt cùng lúc)
       — giống hệt cơ chế/thời lượng của #tndg-kanji-info-panel-overlay phía trên (transition-
       delay = đúng thời lượng trượt .qspop-panel bên dưới) để 2 panel trượt-từ-phải của site có
       cùng 1 cảm giác đóng. Mở panel thì hiện ngay, không cần trễ. */
    position:fixed;inset:0;z-index:99999999;
    background:rgba(10,13,18,.45);
    opacity:0;visibility:hidden;pointer-events:none;
    transition:opacity .26s ease .34s,visibility 0s linear .6s;
}
.qspop-backdrop.is-open{
    opacity:1;visibility:visible;pointer-events:auto;
    transition:opacity .22s ease,visibility 0s linear;
}
.qspop-panel{
    /* Rộng bằng đúng .tndg-kanji-info-panel (panel "Cách nhớ và Giải nghĩa") để 2 panel trượt-
       từ-phải của site có cùng bề rộng, không lệch nhau khi mở lần lượt. */
    position:absolute;top:0;right:0;height:100%;width:min(94vw,1235px);
    display:flex;flex-direction:column;
    background:#fff;box-shadow:-10px 0 30px rgba(0,0,0,.18);
    transform:translateX(100%);
    transition:transform .34s cubic-bezier(.32,.72,0,1);
    will-change:transform;
}
.qspop-backdrop.is-open .qspop-panel{transform:translateX(0)}
@media (max-width:480px){
    .qspop-panel{width:100%}
}
.qspop-header{
    display:flex;align-items:flex-start;justify-content:space-between;gap:12px;
    padding:18px 20px;border-bottom:1px solid var(--color-border);flex-shrink:0;
}
.qspop-scope{
    display:inline-block;margin-bottom:6px;padding:3px 9px;border-radius:99px;
    background:var(--color-primary-tint);color:var(--color-primary-deep);
    font-size:11.5px;font-weight:700;text-transform:uppercase;letter-spacing:.02em;
}
.qspop-heading{flex:1 1 auto;min-width:0}
.qspop-heading h2{
    margin:0;font-family:var(--font-ui);font-size:16.5px;font-weight:700;
    color:var(--color-text-primary);line-height:1.4;word-break:break-word;
}
/* Phạm vi "Kanji"/"Giáo trình"/"Flashcard"/"Đề thi"/"Anime": #quickSearchPopupHeadingKanji/
   GiaoTrinh/Flashcard/DeThi/Anime thay hẳn header mặc định (runKanjiLookup()/runScopeLookup()
   trong new-home.js) bằng hàng kiểu "Tìm thấy N..." (.result-list-kanji ở trên trong file này) —
   nhưng .result-list-kanji vốn thiết kế để nằm trong khối kết quả có padding riêng (VD
   #kanji_search_result_home), margin âm/padding/border-bottom của nó dùng để "tràn" ra khớp viền
   khối cha đó. Ở đây nó nằm thẳng trong .qspop-heading (đã có padding/border-bottom riêng của
   .qspop-header) nên phải bỏ hết margin/padding/border-bottom, tránh cộng dồn 2 lớp viền/khoảng
   cách chồng lên nhau (đúng lỗi "2 đường line" chụp màn hình thực tế ở phạm vi Đề thi). */
#quickSearchPopupHeadingKanji .result-list-kanji,
#quickSearchPopupHeadingGiaoTrinh .result-list-kanji,
#quickSearchPopupHeadingFlashcard .result-list-kanji,
#quickSearchPopupHeadingDeThi .result-list-kanji,
#quickSearchPopupHeadingAnime .result-list-kanji,
#quickSearchPopupHeadingNguPhap .result-list-kanji{margin:0;padding:0;border-bottom:none}
.qspop-close{
    flex-shrink:0;width:32px;height:32px;border:none;border-radius:9px;
    background:var(--page-bg);color:var(--color-text-secondary);cursor:pointer;
    display:flex;align-items:center;justify-content:center;transition:background .15s ease;
}
.qspop-close:hover{background:var(--color-border)}
.qspop-close svg{width:16px;height:16px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.qspop-body{flex:1;min-height:0;overflow-y:auto;padding:16px 20px 22px}

.qspop-internal{display:flex;flex-direction:column;gap:10px}
.qspop-internal .qsp-state{padding:30px 12px;font-size:13.5px;color:var(--color-text-tertiary);text-align:center}
.qspop-internal .qsp-see-all{
    display:block;margin-top:4px;padding:10px 12px;font-size:13px;font-weight:600;
    color:var(--color-primary-deep);text-align:center;
}
.qspop-internal .qsp-see-all:hover{text-decoration:underline}

.qspop-gcse{display:none}
.qspop-gcse.is-active{display:block}

.box-item{display:flex;flex-direction:column;align-items:stretch;padding:4px 12px;gap:3px;flex:0 0 auto;position:relative;z-index:1;transition:padding .25s cubic-bezier(.32,.72,0,1)}
/* khoảng trống còn lại giữa nav và box-bottom — nơi hiện tranh minh họa núi Phú Sĩ/torii,
   crop theo chiều cao thật còn lại (không đè lên nav) vì background bị clip theo khung của chính div này */
.sidebar-illustration{flex:1;min-height:60px;background:url('../images/sidebar_bg_blue.png') bottom center/100% auto no-repeat}
body.sidebar-collapsed .sidebar-illustration{display:none}
.box-item.box-bottom{
    /* trước có background:#fff riêng, tạo 1 khối trắng lệch tông so với gradient teal nhạt
       của .aside-menu phía trên — bỏ nền để "Tài khoản/Giới thiệu" liền mạch với sidebar */
    flex:0 0 auto;padding:10px 12px 16px;background:transparent;border-top:1px solid var(--color-border);
}

.menu-item{
    width:100%;height:auto;border-radius:10px;
    display:flex;flex-direction:row;justify-content:flex-start;align-items:center;gap:14px;padding:11px 12px;
    color:var(--color-text-secondary); position:relative;
    /* width/height/padding/gap CÓ animate được — cùng thời lượng/easing với transition width của
       .aside-menu (mục 6, style.css) để nội dung bên trong co/giãn ĐỒNG BỘ với khung sidebar thay
       vì snap sang kích thước cuối cùng ngay lập tức rồi khung mới đuổi theo sau (giật). */
    transition:background .15s ease,color .15s ease,transform .15s ease,
               width .25s cubic-bezier(.32,.72,0,1),height .25s cubic-bezier(.32,.72,0,1),
               padding .25s cubic-bezier(.32,.72,0,1),gap .25s cubic-bezier(.32,.72,0,1);
}
/* Trong lúc đang co/giãn (đã có .sidebar-collapsed nhưng CHƯA settle — xem new-home.js), tự cắt
   phần nhãn có thể tràn ra ngoài hàng đang hẹp dần, tránh chữ "ló" đè lên icon/hàng bên cạnh giữa
   chừng animation. Bỏ overflow:hidden ngay khi đã settle vì lúc đó span chuyển sang
   position:absolute để làm tooltip nổi — nếu vẫn còn overflow:hidden trên chính .menu-item (containing
   block của span tuyệt đối) thì tooltip sẽ bị cắt mất, không hiện ra được. */
body.sidebar-collapsed:not(.sidebar-collapsed-settled) .menu-item{overflow:hidden}
.menu-item svg{
    width:24px;height:24px;flex-shrink:0;transition:transform .15s ease;
    fill:none!important;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round;
}
.menu-item span{
    position:static;transform:none;background:none;color:inherit;box-shadow:none;
    opacity:1;padding:0;font-size:16px;font-weight:500;pointer-events:auto;white-space:nowrap;
    /* max-width đủ rộng cho nhãn dài nhất ("Học qua hình ảnh") ở chế độ mở rộng, nhưng vẫn là 1
       con số cụ thể (không phải "none") để CÓ THỂ animate dần về 0 khi thu gọn — xem rule collapsed
       bên dưới. Nhờ đó icon tự trôi dần về giữa hàng theo justify-content:center (đã bật sẵn ngay
       từ .sidebar-collapsed, không đợi -settled) khi nhãn co hết chỗ, thay vì icon dán chết ở mép
       trái suốt animation rồi "giật" sang giữa khi hàng đã đứng yên. */
    max-width:200px;overflow:hidden;
    transition:opacity .18s ease,max-width .25s cubic-bezier(.32,.72,0,1);
}
.menu-item:hover{background:var(--page-bg);color:var(--color-text-primary)}
.menu-item:hover svg{transform:translateY(-1px)}
/* trạng thái active của menu = pill teal nhạt + vạch teal bên trái, giống ảnh tham chiếu */
.menu-item.active{background:var(--color-primary-tint);color:var(--color-primary-deep);box-shadow:none;border-left:3px solid var(--color-primary);padding-left:9px}
.menu-item.active:hover{background:var(--color-primary-tint)}

/* ---- .sidebar-collapsed: icon-only, tooltip khi hover (giao diện thu gọn cũ) ----
   Tách 2 lớp (xem setSidebarCollapsed() trong new-home.js):
   - body.sidebar-collapsed: áp ngay, chỉ đổi các thuộc tính animate được (width/height/padding/
     gap/opacity/max-width) — chạy song song, cùng nhịp với transition width của .aside-menu.
     justify-content:center cũng bật NGAY ở đây (không đợi -settled): vì span co max-width về 0
     CÙNG NHỊP, icon tự trôi dần về giữa theo từng khung hình khi nhãn hết chỗ, không cần đợi
     flex-direction đổi mới canh giữa được — tránh hẳn kiểu "icon lệch trái suốt animation rồi mới
     giật về giữa" (bug đã gặp khi còn để justify-content:center trong -settled).
   - body.sidebar-collapsed-settled: chỉ thêm SAU KHI khung đã co xong (hoặc gỡ NGAY LẬP TỨC
     trước khi khung bắt đầu giãn) — CHỈ còn dùng cho tooltip nổi (`.menu-item span` chuyển
     position:static → absolute, thuộc tính không animate được) vì lúc settle nhãn đã max-width:0
     (vô hình/không chiếm chỗ), đổi position lúc này không gây giật gì thêm. */
body.sidebar-collapsed .box-item{align-items:center;padding:4px 8px}
body.sidebar-collapsed .menu-item{
    width:52px;height:52px;gap:0;padding:0;justify-content:center;
}
body.sidebar-collapsed .menu-item.active{border-radius:12px;border-left:none;padding-left:0}
body.sidebar-collapsed .quick-search{margin:2px 8px 12px;justify-content:center;padding:9px}
body.sidebar-collapsed .quick-search input{display:none}
body.sidebar-collapsed .menu-item span{opacity:0;max-width:0}
body.sidebar-collapsed-settled .menu-item span{
    position:absolute; left:calc(100% + 10px); top:50%; transform:translateY(-50%);
    background:#1b1b1a; color:#fff; font-size:12px; font-weight:500; padding:6px 12px;
    border-radius:8px; white-space:nowrap; pointer-events:none; transition:opacity .15s ease,transform .15s ease;
    box-shadow:0 4px 14px rgba(10,13,18,.25); z-index:5;
}
body.sidebar-collapsed-settled .menu-item:hover span{opacity:1;transform:translate(4px,-50%)}
body.sidebar-collapsed .aside-menu .logo-word{display:none}

/* mobile drawer close button */
.btn-close-sidebar{
    width:32px;height:32px;border:none;border-radius:50%;flex-shrink:0;
    background:rgba(255,255,255,.15);color:#fff;align-items:center;justify-content:center;
}
.btn-close-sidebar svg{width:15px;height:15px;fill:none;stroke:currentColor;stroke-width:2.2;stroke-linecap:round}
.btn-close-sidebar:hover{background:rgba(255,255,255,.28)}

/* ============ MAIN WRAP ============ */
.main-wrap{margin-left:var(--sidebar-w);transition:margin-left .25s cubic-bezier(.32,.72,0,1)}

/* wpDiscuz tự tính left cho #wpd-bubble-wrapper (bong bóng bình luận) bằng JS dựa theo vị trí
   .entry-content, không biết tới .aside-menu (sidebar cố định bên trái, z-index:100) của giao
   diện mới -> bong bóng bị rơi vào vùng sidebar và chìm phía sau (z-index:99), coi như mất hẳn.
   Ghim lại ngay bên phải sidebar (theo đúng --sidebar-w hiện tại, kể cả khi thu gọn) và nâng
   z-index cao hơn sidebar. Chỉ áp dụng ở layout desktop/tablet — dưới 768px sidebar là drawer
   ẩn ngoài màn hình (xem @media max-width:767px phía trên) nên không cần bù trừ. */
@media (min-width:768px){
    #wpd-bubble-wrapper.wpd-left-content,
    #wpd-bubble-wrapper.wpd-left-corner{
        left: calc(var(--sidebar-w) + 20px) !important;
        z-index: 101 !important;
    }
    /* Mặc định wpDiscuz đặt bubble ở bottom:80px trên PC (style.css plugin) — kéo sát xuống
       cuối màn hình còn cách 20px cho đồng bộ với khoảng cách trên mobile. */
    #wpd-bubble-wrapper{
        bottom: 20px !important;
    }
}

/* Bong bóng bình luận wpDiscuz mặc định opacity:0.9 (style.css plugin, load SAU new-home.css
   nên cùng specificity là plugin thắng) — mờ bớt còn 0.3 lúc bình thường để đỡ chiếm mắt nhìn,
   rõ hẳn (1) khi hover vào. Cần !important để thắng rule opacity:0.9 load sau. */
#wpd-bubble-wrapper{
    opacity: .3 !important;
    transition: opacity .2s ease;
}
#wpd-bubble-wrapper:hover{
    opacity: 1 !important;
}

/* Thanh "luyện tập nhanh" (.wrap-learn-bar, single.php — 5 nút Học/Thẻ ghi nhớ/Ghép thẻ/
   Chính tả/Kiểm tra) là fixed bottom, z-index:9999 — cao hơn hẳn #wpd-bubble-wrapper mặc định
   của wpDiscuz (z-index:99, fixed bottom-left). single.php đã chừa sẵn 64px bên trái thanh học
   trên mobile (@media max-width:768px, .wrap-learn-bar.nav{left:64px}) đúng bằng chỗ bong bóng
   (wpd-left-corner: left:10px, rộng 40px) cần — giờ chỉ cần hạ bong bóng xuống ngang hàng
   (cùng bottom:3px) thay vì để wpDiscuz tự đặt bottom:20px mặc định. Chỉ áp dụng khi thanh học
   đang thực sự hiển thị (.nav-visible, JS single.php thêm class khi cuộn quá 300px) — trang
   không có thanh học thì giữ nguyên vị trí gốc của wpDiscuz. */
@media (max-width:1024px){
    body:has(.wrap-learn-bar.nav-visible) #wpd-bubble-wrapper{
        bottom: 3px !important;
    }
}

/* ---- app download strip ---- */
.container-ad{
    display:flex;align-items:center;justify-content:space-between;
    background:#fff;border-bottom:1px solid var(--color-border);
    padding:10px 20px;
}
.ad-left{display:flex;align-items:center;gap:10px}
.ic-mazii-badge{
    width:36px;height:36px;border-radius:50%;object-fit:cover;display:block;flex-shrink:0;
    box-shadow:0 2px 6px rgba(var(--color-logo-accent-rgb),.35);
}
.app-open-title{font-weight:700;font-size:14px}
.app-open-des{font-size:12px;color:var(--color-text-tertiary)}
.btn-open{background:var(--accent-amber);color:#171a1c;border:none;padding:8px 18px;border-radius:var(--btn-radius);font-weight:700;font-size:13px}
.btn-open:hover{background:var(--accent-amber-hover)}

/* ---- header ---- */
.box-header{
    display:flex;align-items:center;justify-content:space-between;gap:16px;
    /* header kính mờ + viền/bóng tông teal nhạt, học theo .topbar của japanese-learning-ui
       thay vì nền trắng đặc + không bóng như trước — chỉ đổi màu, giữ nguyên bố cục */
    background:rgba(255,255,255,.93);backdrop-filter:blur(14px);-webkit-backdrop-filter:blur(14px);
    border-bottom:1px solid var(--color-border);
    box-shadow:0 2px 10px rgba(20,65,75,.025);
    padding:12px 30px;
    position:sticky;top:0;z-index:60;
}
.title-heading{display:flex;align-items:center;gap:14px;min-width:0}
.greeting-block{min-width:0}
.greeting-line1{color:var(--color-text-primary);font-size:15px;font-weight:700;white-space:nowrap;display:flex;align-items:center;gap:6px}
.greeting-line1 .wave{font-size:16px}
.greeting-line2{color:var(--color-text-tertiary);font-size:12.5px;white-space:nowrap;margin-top:1px}
.box-right{display:flex;align-items:center;gap:8px;flex-shrink:0}
.btn{border:none;font-size:14px}

/* ---- social links (Facebook / TikTok / Threads / Instagram) ---- */
.social-links{display:flex;align-items:center;gap:8px;margin-right:2px}
.social-btn{
    position:relative;width:38px;height:38px;border-radius:50%;
    display:flex;align-items:center;justify-content:center;flex-shrink:0;
    background:var(--page-bg);color:var(--color-text-secondary);
    transition:background .2s ease,color .2s ease,transform .35s cubic-bezier(.34,1.56,.64,1),box-shadow .25s ease;
}
/* biến thể phẳng dùng ở header: không nền vòng tròn khi chưa hover, giống ảnh tham chiếu */
.social-links--flat .social-btn{background:transparent}
.social-btn svg{width:19px;height:19px;position:relative;z-index:1}
.social-btn::before{
    content:"";position:absolute;inset:0;border-radius:50%;
    background:var(--social-color,var(--color-primary));
    transform:scale(0);opacity:0;
    transition:transform .3s cubic-bezier(.34,1.56,.64,1),opacity .2s ease;
}
.social-btn:hover{color:#fff;transform:translateY(-3px) rotate(-6deg);box-shadow:0 6px 14px -4px var(--social-shadow,rgba(2,159,178,.5))}
.social-btn:hover::before{transform:scale(1);opacity:1}
.social-btn:active{transform:translateY(-1px) scale(.94)}
.social-fb{--social-color:#1877f2;--social-shadow:rgba(24,119,242,.45)}
.social-tiktok{--social-color:#000;--social-shadow:rgba(0,0,0,.35)}
.social-threads{--social-color:#000;--social-shadow:rgba(0,0,0,.35)}
.social-instagram{--social-shadow:rgba(188,42,141,.45)}
.social-instagram::before{background:radial-gradient(circle at 30% 110%,#ffdb73 0%,#fdad4e 15%,#ff6f52 32%,#e02d5f 50%,#c72e93 68%,#8a3ab9 84%,#5d4bd0 100%)}

/* ---- buttons: Đăng nhập (teal đặc) / Đăng ký (teal nhạt) ---- */
.btn-primary{background:var(--color-primary);color:#fff;padding:9px 18px;border-radius:var(--btn-radius);font-weight:500;box-shadow:0 2px 6px rgba(var(--color-primary-rgb),.25)}
.btn-primary:hover{background:var(--color-primary-deep);box-shadow:0 3px 10px rgba(var(--color-primary-rgb),.35)}
.btn-register{background:var(--color-primary-tint);color:var(--color-primary-deep);padding:9px 18px;border-radius:var(--btn-radius);font-weight:500}
.btn-register:hover{background:#d3edf0}

.box-flag{display:flex;align-items:center;gap:4px;background:none;border:none;padding:8px;border-radius:var(--btn-radius)}
.box-flag:hover{background:var(--page-bg)}
.flag-emoji{font-size:18px}
.chev{width:16px;height:16px;color:var(--color-text-tertiary)}
.notify-wrap{position:relative;display:flex;align-items:center;flex-shrink:0}
.btn-notify{
    position:relative;width:38px;height:38px;border-radius:var(--btn-radius);border:1px solid var(--color-border);
    background:#fff;color:var(--color-text-primary);display:flex;align-items:center;justify-content:center;flex-shrink:0;
}
.btn-notify svg{width:18px;height:18px;color:var(--color-text-secondary)}
.btn-notify:hover{background:var(--page-bg)}
.notify-dot{
    position:absolute;top:7px;right:7px;width:8px;height:8px;border-radius:50%;
    background:#ff4d4f;border:2px solid #fff;
}

/* ---- Bảng thông báo xổ xuống khi bấm chuông (.notify-wrap > .btn-notify + .notify-panel) ----
   Layout phỏng theo mock-up user cung cấp (avatar tròn + tiêu đề + mô tả ngắn + thời gian +
   chấm trạng thái bên phải + tab "Tất cả/Chưa đọc"). Panel luôn nằm sẵn trong DOM (không
   display:none) để opacity/transform animate được mượt — mặc định vô hình + pointer-events:none,
   JS (new-home.js) chỉ thêm/gỡ class .is-open. */
.notify-panel{
    position:absolute;top:calc(100% + 10px);right:0;width:380px;max-width:calc(100vw - 32px);
    background:#fff;border:1px solid var(--color-border);border-radius:16px;
    box-shadow:0 14px 34px rgba(20,30,40,.14);z-index:80;overflow:hidden;
    opacity:0;transform:translateY(-6px);pointer-events:none;
    transition:opacity .18s ease,transform .18s ease;
}
.notify-panel.is-open{opacity:1;transform:translateY(0);pointer-events:auto}
.notify-panel-header{
    display:flex;align-items:center;justify-content:space-between;gap:10px;
    padding:14px 16px;border-bottom:1px solid var(--color-border);
}
.notify-panel-title{font-weight:800;font-size:15px;color:var(--color-text-primary)}
.notify-tabs{display:flex;gap:2px;background:var(--page-bg);border-radius:20px;padding:3px}
.notify-tab{
    border:none;background:transparent;cursor:pointer;font-family:inherit;
    font-size:12px;font-weight:600;padding:5px 12px;border-radius:16px;color:var(--color-text-tertiary);
    transition:background .15s ease,color .15s ease;
}
.notify-tab.is-active{background:#fff;color:var(--color-text-primary);box-shadow:0 1px 4px rgba(20,30,40,.14)}
.notify-panel-list{max-height:420px;overflow-y:auto}
.notify-item{
    display:flex;align-items:flex-start;gap:10px;padding:12px 16px;position:relative;
    text-decoration:none;border-bottom:1px solid var(--color-border);
}
.notify-item:last-child{border-bottom:none}
.notify-item:hover{background:var(--page-bg)}
.notify-item.is-filtered-out{display:none}
.notify-item-avatar{
    flex-shrink:0;width:38px;height:38px;border-radius:50%;overflow:hidden;
    background:var(--color-primary-tint,#eaf6f7);display:flex;align-items:center;justify-content:center;
}
.notify-item-avatar img{width:100%;height:100%;object-fit:cover;display:block}
.notify-item-avatar svg{width:18px;height:18px;color:var(--color-primary)}
.notify-item-body{flex:1 1 auto;min-width:0;display:flex;flex-direction:column;gap:2px}
.notify-item-kicker{font-size:11.5px;font-weight:700;color:var(--color-text-tertiary);text-transform:uppercase;letter-spacing:.02em}
.notify-item-time{font-weight:400;text-transform:none;margin-left:4px;letter-spacing:0}
.notify-item-title{
    display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
    font-size:13.5px;line-height:1.42;color:var(--color-text-primary);font-weight:700;
}
.notify-item-excerpt{
    display:-webkit-box;-webkit-line-clamp:1;-webkit-box-orient:vertical;overflow:hidden;
    font-size:12px;line-height:1.4;color:var(--color-text-tertiary);
}
.notify-item-status{flex-shrink:0;width:8px;height:8px;border-radius:50%;margin-top:6px}
/* Chưa xem: chấm tròn màu primary bên phải + tiêu đề đậm (mặc định). Đã xem: ẩn chấm, tiêu đề
   thường + nhạt màu hơn — trạng thái do JS gán qua tndgNotifySyncReadState(), dựa vào
   localStorage nên hoạt động cho cả khách chưa đăng nhập. */
.notify-item.is-unread .notify-item-status{background:var(--color-primary)}
.notify-item.is-read .notify-item-status{background:transparent}
.notify-item.is-read .notify-item-title{font-weight:500;color:var(--color-text-secondary)}
.notify-empty{padding:26px 16px;text-align:center;font-size:13px;color:var(--color-text-tertiary)}

.avatar.header-avatar{width:38px;height:38px;font-size:15px}

/* ---- Popup "Tính năng đang được phát triển" (nút Đăng nhập/Đăng ký ở header, mục 17
   HUONG_DAN_AI_SUA_TRANG.md) — modal căn giữa màn hình, luôn nằm sẵn trong DOM (không
   display:none) để opacity/transform animate mượt, JS chỉ toggle class .is-open. z-index
   cao hơn #tndg-kanji-info-panel-overlay (2147483000) vì popup này có thể xuất hiện từ
   header ở BẤT KỲ trang nào, kể cả khi 1 panel khác đang mở phía dưới. */
.tndg-comingsoon-overlay{
	position:fixed;inset:0;z-index:2147483600;
	background:rgba(10,13,18,.5);
	display:flex;align-items:center;justify-content:center;padding:20px;
	opacity:0;visibility:hidden;pointer-events:none;
	transition:opacity .2s ease,visibility 0s linear .2s;
}
.tndg-comingsoon-overlay.is-open{
	opacity:1;visibility:visible;pointer-events:auto;
	transition:opacity .2s ease,visibility 0s linear;
}
.tndg-comingsoon-modal{
	position:relative;width:360px;max-width:100%;background:#fff;border-radius:18px;
	box-shadow:0 20px 50px rgba(20,30,40,.24);padding:32px 24px 24px;text-align:center;
	transform:scale(.92) translateY(6px);transition:transform .22s cubic-bezier(.34,1.56,.64,1);
}
.tndg-comingsoon-overlay.is-open .tndg-comingsoon-modal{transform:scale(1) translateY(0)}
.tndg-comingsoon-close{
	position:absolute;top:10px;right:10px;width:30px;height:30px;padding:0;
	display:flex;align-items:center;justify-content:center;border-radius:50%;border:none;
	background:var(--page-bg);color:var(--color-text-tertiary);cursor:pointer;
	line-height:normal;
}
.tndg-comingsoon-close svg{width:16px;height:16px;fill:currentColor}
.tndg-comingsoon-close:hover{background:var(--color-border);color:var(--color-text-primary)}
.tndg-comingsoon-icon{font-size:38px;line-height:1;margin-bottom:12px}
.tndg-comingsoon-title{font-size:17px;font-weight:800;color:var(--color-text-primary);margin:0 0 8px}
.tndg-comingsoon-desc{font-size:13.5px;line-height:1.5;color:var(--color-text-tertiary);margin:0 0 20px}
.tndg-comingsoon-ok{
	height:auto;line-height:normal;width:100%;padding:11px 20px;border:none;border-radius:12px;
	background:var(--color-primary);color:#fff;font-family:inherit;font-size:14px;font-weight:700;
	cursor:pointer;
}
.tndg-comingsoon-ok:hover{filter:brightness(.95)}

/* Khách chưa đăng nhập: 2 nút Đăng nhập/Đăng ký thay cho avatar (.btn-primary/.btn-register đã
   có sẵn style teal đặc/teal nhạt — vốn định nghĩa sẵn cho đúng khu vực này nhưng trước đây chưa
   có markup nào dùng tới, kể cả rule mobile .btn-register{display:none} ở breakpoint 767px). */
.auth-links{display:flex;align-items:center;gap:8px;flex-shrink:0}
.auth-links .btn-primary,
.auth-links .btn-register{font-size:13.5px;white-space:nowrap;text-decoration:none;display:inline-block}

.btn-mobile-menu{
    display:none;width:38px;height:38px;border:none;border-radius:var(--btn-radius);
    background:var(--page-bg);color:var(--color-text-primary);align-items:center;justify-content:center;flex-shrink:0;
}
.btn-mobile-menu svg{width:20px;height:20px}
.btn-mobile-menu:hover{background:var(--color-border)}

/* ============ CONTENT ============ */
.page-container{max-width:1240px;margin:0 auto;padding:16px 20px 40px}

/* Các trang khác trang chủ (bài viết/page/kanji/flashcard/...) vẫn dùng khung
   #content.site-content > .mt-container kế thừa từ layout cũ (không có gutter),
   nên nội dung dính sát sidebar bên trái và mép phải. Áp cùng gutter như
   .page-container ở trang chủ cho đồng nhất. */
body.new-home-ui #content.site-content > .mt-container{padding:16px 20px 40px}

/* ---- search card ---- */
.box-search-container{
    background:var(--card-bg);border-radius:var(--card-radius);box-shadow:var(--card-shadow);
    padding:16px; margin-bottom:16px; border:3px solid transparent;
    transition:box-shadow .28s ease,border-color .28s ease;
    position:relative;overflow:hidden;
}
.search-heading{position:relative;z-index:1;max-width:64%;margin:18px 0 16px}
.search-heading h1{margin:0;font-family:var(--font-ui);font-size:26px;font-weight:800;color:var(--color-text-primary);line-height:1.3}
.search-heading h1 span{color:#078c96}
.search-heading p{margin:6px 0 0;padding:0;text-align:left;font-family:var(--font-ui);font-size:13.5px;color:var(--color-text-tertiary)}
.search-illustration{
    position:absolute;top:-10px;right:-10px;width:420px;height:auto;object-fit:contain;pointer-events:none;z-index:0;
    -webkit-mask-image:linear-gradient(to bottom, #000 65%, transparent 100%);
            mask-image:linear-gradient(to bottom, #000 65%, transparent 100%);
}
@media (max-width:900px){.search-illustration{display:none}.search-heading{max-width:100%}}
.box-search-container:focus-within{box-shadow:0 4px 20px rgba(var(--color-primary-rgb),.16)}

/* ---- chế độ tập trung khi bấm vào ô search (giống bản cũ: mờ toàn bộ phần còn lại,
   viền teal quanh khu vực search) — logic JS ở assets/js/new-home.js. Overlay được JS
   thêm/xoá khỏi DOM (không chỉ ẩn/hiện), nên phải tự bật opacity:0 → .is-visible ở lần
   render kế tiếp (rAF) mới có hiệu ứng fade-in, và khi tắt phải đợi hết transition rồi
   JS mới gỡ phần tử (transitionend/timeout) thì fade-out mới kịp chạy hết. */
.background-blur{
    opacity:0;width:100%;height:100%;background-color:#000000b0;
    display:block;position:fixed;left:0;top:0;bottom:0;z-index:999;
    transition:opacity .28s ease;
}
.background-blur.is-visible{opacity:.5}
.box-search-container.hp_btn_onfocus{
    border-radius:var(--card-radius);background:#fff;border-color:var(--color-primary)!important;
    z-index:9999999!important;position:relative;overflow:hidden;
}
/* Các khối kết quả tìm kiếm chèn bằng AJAX (Kanji, Giáo trình... — dùng chung class
   "kanji-search-result-home", xem page-home.php) cũng phải "nổi" lên trên nền tối giống hệt
   khung tìm kiếm — nếu không, dù nền vẫn mờ đúng ý, kết quả lại bị .background-blur (z-index
   999) đè tối lên vì bản thân nó không có z-index/position để thoát khỏi lớp phủ đó. */
.kanji-search-result-home.hp_btn_onfocus{
    z-index:9999999!important;position:relative;
}
.box-search{display:flex;align-items:center;gap:12px;flex-wrap:wrap}
.content-search{
    flex:1;min-width:280px;display:flex;align-items:center;gap:8px;
    background:var(--page-bg);border-radius:12px;padding:4px 6px 4px 14px;
    border:1.5px solid transparent;transition:border-color .15s ease,background .15s ease;
}
.content-search:focus-within{border-color:var(--color-primary);background:#fff}
.btn-search{background:none;border:none;color:var(--color-text-tertiary);display:flex;flex-shrink:0}
.btn-search svg{width:20px;height:20px}
.input-search{flex:1;min-width:0;border:none;background:transparent;outline:none;font-size:15px;padding:10px 4px;font-family:var(--font-ui);color:var(--color-text-primary)}
.input-search::placeholder{color:var(--color-text-tertiary)}
.btn-right{display:flex;align-items:center;gap:8px;flex-shrink:0}
.vertical-divider{width:1px;height:26px;background:var(--color-border-2)}
.gr-btn{display:flex;gap:2px}
.btn-common{width:34px;height:34px;border:none;background:none;border-radius:8px;color:var(--color-text-secondary);display:flex;align-items:center;justify-content:center}
.btn-common svg{width:18px;height:18px}
.btn-common:hover{background:var(--color-primary-tint);color:var(--color-primary-deep)}
.lang-search{flex-shrink:0}
.dict-show{
    display:flex;align-items:center;gap:6px;background:var(--color-primary-tint);border:none;
    padding:12px 16px;border-radius:12px;color:var(--color-primary-deep);font-weight:600;font-size:14.5px;white-space:nowrap;
}
.dict-show:hover{background:#d3edf0}
.chev-blue{width:16px;height:16px;color:var(--color-primary-deep)}

.line-btn{display:flex;align-items:center;gap:6px;margin-bottom:12px;flex-wrap:wrap}
.btn-tab{
    background:none;border:none;padding:9px 16px;border-radius:8px;font-size:14px;font-weight:500;color:var(--color-text-tertiary);
}
.btn-tab.active{background:var(--color-primary-tint);color:var(--color-primary-deep)}
.btn-tab:hover{color:var(--color-primary-deep)}
.btn-chat-qa{
    display:flex;align-items:center;gap:6px;border:1px dashed var(--color-text-tertiary);color:var(--color-text-tertiary);padding:8px 14px;
}
.ai-ic{width:15px;height:15px;color:var(--accent-amber)}

/* ---- result word card ---- */
.result-panel{max-width:820px;margin:0 auto}
.word-card{background:var(--card-bg);border-radius:var(--card-radius);padding:28px 30px;box-shadow:var(--card-shadow)}
.wc-head{display:flex;align-items:center;gap:14px;flex-wrap:wrap;margin-bottom:6px}
.wc-word{font-family:var(--font-jp);font-size:34px;font-weight:700;color:var(--color-text-primary)}
.wc-kana{font-size:15px;color:var(--color-text-tertiary)}
.wc-play{width:34px;height:34px;border-radius:50%;border:1px solid var(--color-border-2);background:#fff;color:var(--color-primary);display:flex;align-items:center;justify-content:center}
.wc-play:hover{background:var(--color-primary-tint)}
.wc-play svg{width:16px;height:16px}
.wc-tags{display:flex;gap:6px;margin:10px 0 18px}
.wc-tag{font-size:11.5px;font-weight:700;padding:3px 10px;border-radius:50rem;background:var(--color-primary-tint);color:var(--color-primary-deep)}
.wc-meanings{display:flex;flex-direction:column;gap:10px}
.wc-meanings li{display:flex;gap:10px;font-size:15px;line-height:1.6;color:var(--color-text-secondary)}
.wc-meanings b{color:var(--color-primary-deep);flex-shrink:0}
.wc-example{margin-top:20px;padding-top:18px;border-top:1px solid var(--color-border)}
.wc-example h4{margin:0 0 8px;font-size:13px;color:var(--color-text-tertiary);text-transform:uppercase;letter-spacing:.4px;font-weight:600}
.wc-example p{margin:0 0 4px;font-family:var(--font-jp)}
.wc-example small{color:var(--color-text-tertiary)}
.wc-empty{padding:60px 20px;text-align:center;color:var(--color-text-tertiary)}

/* ---- two-column layout ---- */
/* section-block--full: nằm ngoài .row-main nên không được flex gap của .col-main
   lo khoảng cách giúp — tự thêm margin-bottom bằng đúng gap đó (16px) để đều nhau. */
.section-block--full{margin-bottom:16px}
.row-main{display:flex;gap:16px;align-items:flex-start}
.col-main{flex:1;min-width:0;display:flex;flex-direction:column;gap:16px}
.col-side{width:300px;flex-shrink:0;position:sticky;top:84px;align-self:flex-start}
/* .col-side không dùng flex/gap để chia khoảng cách — 2 khối con (.motivation-card/.quick-links)
   tự lo khoảng cách bằng margin-top:16px của riêng .motivation-card (xem rule ở dưới, dùng
   CHUNG với #secondary.tndg-post-sidebar trong inc/template-functions.php — nơi đó lại tự có
   flex+gap:16px riêng nên không đụng tới 2 dòng dưới đây). Từ khi đổi thứ tự "Giữ lửa Nhật Ngữ"
   lên trước "Liên kết nhanh" trên trang chủ, phải tự set lại margin theo đúng vị trí MỚI — nếu
   không, .motivation-card (giờ là con đầu) thừa 16px phía trên, còn .quick-links (giờ là con thứ
   2) mất hẳn khoảng cách với khối phía trên nó. */
.col-side .motivation-card{margin-top:0}
.col-side .quick-links{margin-top:16px}
/* style.css đặt overflow:hidden trên <body>, còn <html> vốn đã overflow-y:scroll (dòng 47) —
   2 scroll container lồng nhau (html + body) làm position:sticky của .col-side bám nhầm mốc
   vào body (ancestor GẦN hơn), nhưng body không tự cuộn được (chiều cao luôn khớp nội dung,
   phần cuộn thật nằm ở html) nên sidebar trôi tuột như position:static thay vì dính lại khi
   cuộn trang. Chỉ trên trang chủ (body.new-home-ui): bỏ hẳn overflow trên body (không còn là
   scroll container), chuyển việc che tràn ngang sang <html> qua :has() — để html là scroll
   container DUY NHẤT, sticky mới tính đúng theo cuộn trang thật. */
html:has(body.new-home-ui){overflow-x:hidden}
body.new-home-ui{overflow:visible}

.two-col{display:grid;grid-template-columns:1fr 1fr;gap:16px}
.word-day-container, .history-home-container, .feedback-card{
    background:var(--card-bg);border-radius:var(--card-radius);box-shadow:var(--card-shadow);padding:16px;
    transition:box-shadow .2s ease,transform .2s ease;
}
.word-day-container:hover, .history-home-container:hover{box-shadow:0 6px 20px rgba(17,62,74,.08);transform:translateY(-2px)}
.line-top{display:flex;align-items:center;gap:10px;margin-bottom:14px}
.vertical-divider-accent{width:3px;height:18px;background:var(--color-primary);border-radius:2px;flex-shrink:0}
.tt-main-df{font-size:17px;font-weight:600;color:var(--color-text-primary);flex:1}
.tt-more{font-size:13.5px;font-weight:600;color:oklch(0.5 0.1 195);text-decoration:none}
.tt-more:hover{color:var(--color-primary-deep)}
.quick-links .line-top svg{width:22px;height:22px;flex-shrink:0;fill:none;stroke:#078c96;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}

.empty-state{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;padding:44px 10px;color:var(--color-text-tertiary)}
.empty-ic{width:44px;height:44px;opacity:.35}
.empty-state .tt-main{font-size:14px;margin:0;color:var(--color-text-tertiary)}

/* ---- promo banner: gradient teal + CTA cam san hô ---- */
.promo-banner{
    position:relative;display:flex;align-items:center;gap:20px;flex-wrap:wrap;
    background:linear-gradient(120deg,var(--sidebar-grad-b),var(--color-primary) 70%);border-radius:var(--card-radius);
    padding:22px 26px;color:#fff;overflow:hidden;box-shadow:0 8px 24px rgba(var(--color-primary-rgb),.3);
}
.promo-banner::after{
    content:"";position:absolute;inset:0;pointer-events:none;
    background:radial-gradient(circle at 85% 0%, rgba(255,255,255,.18), transparent 55%);
}
.promo-close{
    position:absolute;top:12px;right:12px;width:26px;height:26px;border-radius:50%;border:none;
    background:rgba(255,255,255,.2);color:#fff;display:flex;align-items:center;justify-content:center;
}
.promo-close svg{width:12px;height:12px;fill:none;stroke:currentColor;stroke-width:2.4;stroke-linecap:round}
.promo-close:hover{background:rgba(255,255,255,.35)}
.promo-qr{width:64px;height:64px;background:#fff;border-radius:8px;padding:6px;flex-shrink:0}
.promo-text{display:flex;flex-direction:column;gap:4px;flex:1;min-width:200px}
.promo-text strong{font-size:18px;font-family:var(--font-jp)}
.promo-text span{font-size:13.5px;opacity:.9}
.promo-cta{background:var(--accent-coral);color:#fff;border:none;padding:11px 22px;border-radius:50rem;font-weight:700;font-size:13.5px;flex-shrink:0}
.promo-cta:hover{background:var(--accent-coral-hover)}

/* ---- course archive hero (/khoa-hoc/) ---- */
/* .course-hero dùng chung class .tutor-container với .tutor-wrap (khối filter+lưới khóa học
   bên dưới) để tự động khớp đúng max-width/canh giữa của Tutor LMS ở mọi kích thước màn hình
   — .course-hero.tutor-container (2 class) cần thiết để thắng specificity so với chính
   .tutor-container gốc khi override padding.
   Ảnh nền (Phú Sĩ + hoa anh đào + sách, hero-khoa-hoc.png) đã tự nhạt dần/trắng ở giữa-trái
   nên không cần phủ gradient tối lên trên — chữ dùng màu tối như thiết kế tham chiếu. */
.course-hero{
    position:relative;display:flex;align-items:center;
    background:#eef6f8 url('../images/hero-khoa-hoc.png') right center/cover no-repeat;
    border-radius:var(--card-radius);margin:0 auto 20px;overflow:hidden;
    box-shadow:var(--card-shadow);
}
.course-hero.tutor-container{padding:48px 60px;min-height:300px}
.course-hero-text{position:relative;max-width:600px}
.course-hero-eyebrow{
    display:block;font-size:12.5px;font-weight:700;letter-spacing:.04em;
    color:var(--color-primary-deep);margin-bottom:14px;
}
/* h1,p toàn site có color:#3d3d3d cố định (style.css) — ép lại đúng tông màu thiết kế ở đây vì
   color đặt trực tiếp trên chính element luôn thắng color kế thừa từ .course-hero. */
.course-hero-text h1{font-size:34px;line-height:1.32;margin:0 0 16px;font-family:var(--font-jp);font-weight:800;color:var(--color-text-primary)}
.course-hero-text h1 .hl{color:var(--color-primary)}
.course-hero-text p{font-size:15px;line-height:1.7;margin:0 0 22px;max-width:480px;color:var(--color-text-secondary)}
.course-hero-stats{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:13.5px;font-weight:700;color:var(--color-primary-deep)}
.course-hero-stat-sep{color:var(--color-border-2);font-weight:400}

/* Khung filter + lưới khóa học bên dưới hero (.tutor-wrap của Tutor LMS) đang có class Bootstrap
   .rounded (border-radius:.25rem!important) — bo lại bằng bán kính thẻ chung của site cho đồng
   bộ với hero. Cần !important vì .rounded của Bootstrap cũng !important. */
.course-archive-page{border-radius:var(--card-radius)!important}
/* Trang chi tiết khóa học (VD /khoa-hoc/<slug>/) — khung .tutor-wrap ở đây không có class
   .rounded sẵn nên chỉ cần border-radius thường, không cần !important. */
.tutor-wrap.tutor-course-top-info{border-radius:var(--card-radius)}

/* Khung nội dung bài viết đơn (#primary trong single.php) đang có class Bootstrap .rounded
   (border-radius:.25rem!important) — bo lại bằng bán kính thẻ chung của site (--card-radius)
   cho đồng bộ với sidebar phải mới (.feedback-card/.motivation-card/... cũng dùng --card-radius).
   overflow:hidden để ảnh đại diện/nội dung tràn viền không đè lên góc bo. */
.single #primary{border-radius:var(--card-radius)!important;overflow:hidden}
/* Popup "Cách nhớ và Giải nghĩa" kanji (.new-tooltip-content) là absolute, rộng 300px, canh
   giữa ký tự kanji (margin-left:-150px) — với kanji ở gần mép trái khung (cột đầu bảng),
   popup tràn ra ngoài #primary và bị overflow:hidden ở trên cắt mất, đồng thời để lộ
   sidebar trái (.aside-menu, fixed, nằm ngoài #primary) đè lên phần bị cắt đó. Chỉ mở khoá
   overflow đúng lúc đang hover popup (không bỏ hẳn overflow:hidden) để vẫn giữ bo góc/clip
   ảnh như thiết kế gốc những lúc khác. */
.single #primary:has(.new-tooltip:hover){overflow:visible}

/* ---- generic section block ---- */
.section-block{border-radius:var(--card-radius);padding:16px 0}

/* .level-card/.textbook-card vốn không tự set nền (trước đây ăn nền trắng có sẵn của
   .section-block) — giờ section có màu riêng nên phải set nền trắng tường minh cho các thẻ con
   này, nếu không chúng sẽ "trong suốt" và lộ màu section ra, mất hẳn cảm giác thẻ nổi lên nền. */
.level-card,.textbook-card{background:var(--card-bg)}

/* ---- community ---- */
.community-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.qa-card{border:1px solid var(--color-border);border-radius:12px;padding:16px;display:flex;flex-direction:column;gap:8px;transition:box-shadow .2s ease,border-color .2s ease}
.qa-card:hover{box-shadow:0 6px 18px rgba(17,62,74,.08);border-color:transparent}
.qa-tag{align-self:flex-start;font-size:11px;font-weight:700;color:var(--color-primary-deep);background:var(--color-primary-tint);padding:3px 10px;border-radius:50rem}
.qa-card h3{font-size:15px;margin:0;line-height:1.4}
.qa-author{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--color-text-tertiary)}
.qa-author b{color:var(--color-text-primary);font-size:13.5px}
.avatar{width:30px;height:30px;border-radius:50%;background:var(--color-primary-deep);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:700;font-size:13px;flex-shrink:0;text-transform:uppercase}
/* role-badge: gộp vào cùng hệ tag/pill teal duy nhất */
.role-badge{background:var(--color-border);color:var(--color-text-secondary);font-size:10.5px;padding:1px 7px;border-radius:50rem;margin-left:2px}
.role-badge.expert{background:var(--color-primary-tint);color:var(--color-primary-deep)}
.qa-time{font-size:11.5px;color:var(--color-text-tertiary)}
.qa-card p{margin:0;font-size:13px;color:var(--color-text-secondary);line-height:1.5;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.qa-footer{display:flex;gap:14px;font-size:12.5px;color:var(--color-text-tertiary);border-top:1px solid var(--color-border);padding-top:10px}

.pagination{display:flex;justify-content:flex-end;gap:8px;margin-top:14px}
.pagination button{width:30px;height:30px;border-radius:50%;border:1px solid var(--color-border-2);background:#fff;color:var(--color-text-secondary)}
.pagination button:hover{background:var(--color-primary-tint);color:var(--color-primary-deep);border-color:var(--color-primary-tint)}

/* ---- reading ---- */
.reading-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
.reading-card{border-radius:12px;overflow:hidden;border:1px solid var(--color-border);transition:box-shadow .2s ease,border-color .2s ease}
.reading-card:hover{box-shadow:0 6px 18px rgba(17,62,74,.1);border-color:transparent}
.reading-card:hover .reading-thumb{transform:scale(1.04)}
.reading-thumb{
    height:120px;display:flex;align-items:flex-end;padding:10px;position:relative;
    background-size:cover;background-position:center;transition:transform .3s ease;overflow:hidden;
}
/* ảnh nền minh họa bài đọc — gam trung tính, không thuộc bảng màu thương hiệu */
.reading-thumb.t1{background:linear-gradient(135deg,#3e5c8a,#1b2a44)}
.reading-thumb.t2{background:linear-gradient(135deg,#5b7fa6,#22344f)}
.reading-thumb.t3{background:linear-gradient(135deg,#2f3e50,#101820)}
.reading-thumb .furi{color:#fff;font-family:var(--font-jp);font-size:12.5px;line-height:1.5;background:rgba(0,0,0,.35);padding:4px 8px;border-radius:6px}
.reading-meta{display:flex;align-items:center;justify-content:space-between;padding:10px 12px}
.unread{font-size:11.5px;font-weight:600;color:var(--color-primary-deep);background:var(--color-primary-tint);padding:3px 9px;border-radius:50rem}
.date{font-size:11.5px;color:var(--color-text-tertiary)}

/* ---- Trang chủ: cấp độ / flashcard / giáo trình / tips / công cụ / phim ---- */
.level-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:14px}
.level-card{border:1px solid var(--color-border);border-radius:var(--card-radius);padding:18px 16px;display:flex;flex-direction:column;gap:12px;transition:box-shadow .2s ease,border-color .2s ease}
.level-card:hover{box-shadow:var(--card-shadow-hover);border-color:transparent}
.level-top{display:flex;align-items:center;justify-content:space-between}
.level-code{font-size:22px;font-weight:800;color:var(--color-text-primary)}
.level-tag{width:30px;height:30px;border-radius:50%;display:flex;align-items:center;justify-content:center;color:#fff;font-size:12px;font-weight:700;font-family:var(--font-jp);flex-shrink:0}
.level-desc{font-size:12.5px;color:var(--color-text-tertiary)}
.level-divider{height:1px;background:var(--color-border)}
.level-links{display:flex;gap:8px}
.level-links a{flex:1;font-size:11.5px;font-weight:600;text-align:center;padding:7px 0;border-radius:8px;background:var(--page-bg);color:var(--color-text-secondary)}
.level-links a:hover{background:var(--color-primary-tint);color:var(--color-primary-deep)}

.flashcard-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:14px}
/* background riêng (không kế thừa nền section) — section "Flashcard luyện từ vựng" giờ có nền
   pastel riêng (.section-block--flashcard), nếu không set nền thẻ vẫn "trắng" ngầm định do
   trước đây section luôn trắng, sẽ bị trong suốt và lộ màu section ra. */
.flashcard-card{background:var(--card-bg);border:1px solid var(--color-border);border-radius:12px;padding:16px 14px;display:flex;flex-direction:column;gap:8px;transition:box-shadow .2s ease,border-color .2s ease}
.flashcard-card:hover{box-shadow:0 6px 18px rgba(17,62,74,.1);border-color:transparent}
.flashcard-badge{width:34px;height:34px;border-radius:9px;color:#fff;display:flex;align-items:center;justify-content:center;font-weight:800;font-size:12.5px}
.flashcard-name{font-size:13px;font-weight:700}
.flashcard-count{font-size:11.5px;color:var(--color-text-tertiary)}

.textbook-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
.textbook-card{border:1px solid var(--color-border);border-radius:12px;overflow:hidden;transition:box-shadow .2s ease,border-color .2s ease}
.textbook-card:hover{box-shadow:0 6px 18px rgba(17,62,74,.1);border-color:transparent}
.textbook-cover{height:88px;background:linear-gradient(135deg,var(--color-primary),var(--color-primary-deep));display:flex;align-items:center;justify-content:center;color:#fff;font-size:19px;font-weight:800;font-family:var(--font-jp);letter-spacing:.02em;text-align:center;padding:0 12px}
.textbook-body{padding:14px 16px}
.textbook-title{font-size:13.5px;font-weight:700;margin-bottom:4px;line-height:1.4}
.textbook-desc{font-size:12px;color:var(--color-text-tertiary);line-height:1.5}

.tips-list{display:flex;flex-direction:column;background:var(--card-bg);border:1px solid var(--color-border);border-radius:var(--card-radius);padding:4px 20px}
.tips-item{display:flex;align-items:center;gap:14px;padding:14px 4px;border-bottom:1px solid var(--color-border)}
.tips-item:last-child{border-bottom:none}
.tips-num{width:26px;height:26px;border-radius:7px;background:var(--color-primary-tint);color:var(--color-primary-deep);display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:800;flex-shrink:0}
.tips-title{flex:1;font-size:13.5px;font-weight:600;color:var(--color-text-primary);line-height:1.4}
.tips-arrow{color:var(--color-text-tertiary)}
.tips-item:hover .tips-title{color:var(--color-primary-deep)}

.tools-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
.tools-card{border-radius:var(--card-radius);padding:20px;display:flex;flex-direction:column;gap:6px;justify-content:center;min-height:110px;transition:transform .2s ease}
.tools-card:hover{transform:translateY(-3px)}
.tools-eyebrow{font-size:11px;font-weight:600;opacity:.8}
.tools-title{font-size:17px;font-weight:800}
.tools-desc{font-size:12.5px;opacity:.85;line-height:1.4}

.movie-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:14px}
/* background riêng — lý do giống .flashcard-card ở trên: section "Học qua phim & anime song
   ngữ" giờ có nền pastel riêng (.section-block--movie), và .movie-tag bên trong dùng đúng
   --color-primary-tint làm nền nên cần .movie-body có nền trắng để không bị chìm màu. */
.movie-card{background:var(--card-bg);border-radius:12px;overflow:hidden;border:1px solid var(--color-border);transition:box-shadow .2s ease,border-color .2s ease}
.movie-card:hover{box-shadow:0 6px 18px rgba(17,62,74,.1);border-color:transparent}
.movie-poster{height:130px;background-size:cover;background-position:center;background-color:var(--color-border)}
.movie-body{padding:12px 14px}
.movie-tag{display:inline-block;font-size:10.5px;font-weight:700;color:var(--color-primary-deep);background:var(--color-primary-tint);padding:3px 9px;border-radius:50rem}
.movie-title{font-size:13px;font-weight:700;line-height:1.4;margin-top:8px}

@media (max-width:900px){
    .level-grid,.flashcard-grid{grid-template-columns:repeat(3,1fr)}
    .textbook-grid,.tools-grid{grid-template-columns:1fr 1fr}
    .movie-grid{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:480px){
    .level-grid,.flashcard-grid{grid-template-columns:repeat(2,1fr)}
    .textbook-grid,.tools-grid,.movie-grid{grid-template-columns:1fr}
}

/* ---- feedback sidebar card ---- */
.fb-list{display:flex;flex-direction:column;gap:14px}
.fb-list li{font-size:13.5px;line-height:1.5;color:var(--color-text-secondary);padding-bottom:12px;border-bottom:1px solid var(--color-border)}
.fb-list li:last-child{border-bottom:none;padding-bottom:0}
.fb-word{font-family:var(--font-jp);font-weight:700;color:var(--color-text-primary)}
.fb-user{display:flex;align-items:center;gap:6px;margin-top:6px;font-size:12px;color:var(--color-text-tertiary)}
.avatar.sm{width:18px;height:18px;background:var(--color-border-2)}

/* ============ FOOTER ============ */
/* Nền footer đổi sang teal đậm (#007072) — hầu hết chữ/viền/link bên dưới đều tham chiếu qua
   các biến --color-text-primary, --color-text-secondary, --color-text-tertiary, --color-border,
   --color-border-2, --color-primary-deep (định nghĩa dark trên nền trắng ở :root), nên chỉ cần
   định nghĩa lại đúng các biến đó NGAY TRONG PHẠM VI .site-footer là toàn
   bộ chữ/viền con bên trong tự động đổi sang tông sáng phù hợp nền tối, không phải sửa tay từng
   selector. Ngoại lệ: .pm-ic (nền đặc dùng --color-primary-deep để làm khối icon, không phải
   chữ — nếu đổi theo sẽ ra icon nhạt cùng tông với nền, mất hẳn tương phản) và .social-btn
   (vòng tròn nền sáng riêng, icon bên trong phải giữ tối để tương phản với chính vòng tròn của
   nó, không liên quan gì đến nền footer) — 2 chỗ này ghi đè cứng riêng bên dưới, không dùng biến
   đã đổi ở trên. */
.site-footer{
    background:#007072;
    border-top:1px solid rgba(255,255,255,.15);
    margin-top:24px;padding:32px 20px 0;
    --color-text-primary:#ffffff;
    --color-text-secondary:rgba(255,255,255,.85);
    --color-text-tertiary:rgba(255,255,255,.62);
    --color-border:rgba(255,255,255,.18);
    --color-border-2:rgba(255,255,255,.26);
    --color-primary-deep:#8fe9e2;
}
.site-footer .pm-ic{background:rgba(255,255,255,.16)}
.site-footer .social-btn{background:#fff;color:#495057}
.site-footer .footer-app-card{background:rgba(255,255,255,.05)}
.footer-top{max-width:1240px;margin:0 auto;display:flex;gap:32px;flex-wrap:wrap;padding-bottom:28px;border-bottom:1px solid var(--color-border)}
.footer-brand{flex:1;min-width:260px;display:flex;flex-direction:column;gap:8px}
.footer-brand .logo-word{display:block;color:#fff}
.footer-tagline{color:#fff;font-weight:700;font-size:15px;margin:6px 0 4px}
.contact-row{display:flex;align-items:center;gap:8px;font-size:13.5px;color:var(--color-text-secondary)}
.contact-row svg{width:16px;height:16px;color:var(--color-text-tertiary);flex-shrink:0}
.footer-app-card{
    width:300px;flex-shrink:0;border:1px solid var(--color-border);border-radius:12px;padding:16px;
    display:grid;grid-template-columns:auto 1fr;gap:10px 12px;align-items:center;
}
.app-card-text{display:flex;flex-direction:column;font-size:13px;color:var(--color-text-tertiary)}
.app-card-text b{font-size:14px;color:var(--color-text-primary)}
.qr-block{grid-column:1/-1;display:flex;align-items:center;gap:10px;font-size:12px;color:var(--color-text-tertiary);border-top:1px solid var(--color-border);padding-top:10px}
.mini-qr{width:40px;height:40px;border:1px solid var(--color-border)}
.store-badges{grid-column:1/-1;display:flex;gap:8px}
.store-badge{flex:1;text-align:center;background:#171a1c;color:#fff;padding:8px;border-radius:8px;font-size:12px;font-weight:600}

.footer-cols{max-width:1240px;margin:0 auto;display:grid;grid-template-columns:1fr 1.3fr 1fr 1.4fr 1fr;gap:24px;padding:28px 0}
.footer-col{display:flex;flex-direction:column;gap:9px;font-size:13.5px;color:var(--color-text-secondary)}
.footer-col h4{color:var(--color-text-primary);font-size:14px;margin:0 0 4px}
.footer-col h4.mt-h4{margin-top:10px}
.footer-col a:hover{color:var(--color-primary-deep)}
.product-mini{display:flex;align-items:center;gap:10px;font-size:12.5px}
.product-mini b{display:block;font-size:13px;color:var(--color-text-primary)}
.product-mini span{color:var(--color-text-tertiary);font-size:11.5px}
/* pm1-4: 4 icon "Chuyên mục" — gộp về 1 tông teal đậm duy nhất */
.pm-ic{width:30px;height:30px;border-radius:8px;display:flex;align-items:center;justify-content:center;color:#fff;font-family:var(--font-jp);font-weight:700;font-size:13px;flex-shrink:0;background:var(--color-primary-deep)}
.social-row{display:flex;gap:8px}
.social-row .social-btn{width:32px;height:32px}
.social-row .social-btn svg{width:15px;height:15px}
.footer-col .social-btn:hover{color:#fff}

.footer-bottom{
    max-width:1240px;margin:0 auto;display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:12px;
    padding:16px 0;font-size:12px;color:var(--color-text-tertiary);
}
.footer-bottom b{color:var(--color-text-primary);display:block;font-size:13px;margin-bottom:2px}
.notice-badge{border:1px solid var(--color-border-2);border-radius:6px;padding:6px 12px;font-size:11.5px;color:var(--color-text-secondary);white-space:nowrap}

/* mobile-only duplicate toolbar (mirrors mazii.net's own d-md-none pattern) */
.mobile-tools-row{display:none;justify-content:center;gap:28px;margin-top:12px;padding-top:12px;border-top:1px solid var(--color-border)}
.mobile-tools-row button{background:none;border:none;color:var(--color-text-secondary);display:flex;flex-direction:column;align-items:center;gap:4px;font-size:10.5px}
.mobile-tools-row svg{width:22px;height:22px}
.mobile-tools-row button:hover{color:var(--color-primary-deep)}

/* mặc định ẩn — chỉ hiện trong @media max-width:1100px dưới đây khi hàng tab chuyển sang
   cuộn ngang 1 dòng và JS phát hiện còn nội dung bị ẩn bên phải. Phải khai báo TRƯỚC block
   @media để không bị chính rule display:flex bên trong media query đè mất (cùng specificity,
   rule khai báo sau thắng bất kể có nằm trong media query hay không). */
.tabs-scroll-hint{display:none}

/* ============ RESPONSIVE ============ */
@media (max-width:1100px){
    .row-main{flex-direction:column;align-items:stretch}
    .col-side{width:100%;position:static}
    .footer-cols{grid-template-columns:1fr 1fr}
    /* Tablet trở xuống: hàng tab Ngữ pháp/Kanji/Từ vựng/... ở khối tìm kiếm trang chủ chỉ
       hiện 1 dòng, tràn thì cuộn ngang thay vì xuống dòng (đè .tabs nav ul flex-wrap:wrap
       gốc trong tabs.css) */
    .tabs.tabs-style-pill nav ul{
        flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;
        scrollbar-width:none;
    }
    .tabs.tabs-style-pill nav ul::-webkit-scrollbar{display:none}
    .tabs.tabs-style-pill nav ul li{flex-shrink:0}
    .tabs.tabs-style-pill nav ul li a{white-space:nowrap}

    /* Báo hiệu còn tab bị ẩn bên phải khi hàng tab tràn — mũi tên nổi trên nền mờ dần,
       JS (homeJs.js) bật/tắt class .show tuỳ theo còn cuộn được sang phải hay không. Badge
       dùng nền tint nhạt + icon teal (bản teal đặc/viền trắng trước đó nổi bật quá mức cần) */
    .tabs.tabs-style-pill nav{position:relative}
    .tabs-scroll-hint{
        display:flex;align-items:center;justify-content:flex-end;
        position:absolute;top:0;right:0;bottom:12px;width:40px;
        background:linear-gradient(to right,rgba(255,255,255,0),var(--card-bg) 60%);
        pointer-events:none;opacity:0;transition:opacity .2s ease;
        /* tabs.css đặt sẵn ".tabs nav ul li{z-index:1}" cho từng tab — không set z-index ở
           đây thì badge (z-index:auto) bị pill nền của tab đang active/hover đè lên khi tab
           đó nằm ngay dưới vùng này */
        z-index:2;
    }
    .tabs-scroll-hint.show{opacity:1}
    .tabs-scroll-hint i{
        width:20px;height:20px;border-radius:50%;
        background:var(--color-primary-tint);
        display:flex;align-items:center;justify-content:center;
        color:var(--color-primary-deep);font-size:11px;
    }
}
@media (max-width:900px){
    .community-grid{grid-template-columns:1fr}
    .reading-grid{grid-template-columns:1fr}
    .footer-top{flex-direction:column}
    .footer-app-card{width:100%}
}

@media (max-width:767px){
    /* --- drawer sidebar: full menu w/ labels, dims background --- */
    .aside-menu{
        width:min(78vw,300px); transform:translateX(-100%);
        transition:transform .28s cubic-bezier(.32,.72,0,1);
        border-radius:0 20px 20px 0;
    }
    .aside-menu.open{transform:translateX(0)}
    .box-logo{flex-direction:row;justify-content:space-between;padding:18px 20px 16px;border-bottom:none;margin-bottom:0}
    .logo-word{display:block}
    .btn-toggle-sidebar{display:none}
    .btn-close-sidebar{display:flex}
    .box-item{align-items:stretch;padding:6px 12px}
    .menu-item{
        width:100%;height:auto;flex-direction:row;justify-content:flex-start;gap:14px;
        padding:12px 12px;border-radius:12px;
    }
    .menu-item span{
        position:static;transform:none;background:none;color:inherit;box-shadow:none;
        opacity:1;padding:0;font-size:14.5px;font-weight:500;pointer-events:auto;
    }
    .menu-item:hover span{transform:none}
    /* chốt an toàn: trạng thái "thu gọn" lưu từ phiên desktop không được rò rỉ vào drawer mobile */
    body.sidebar-collapsed .box-logo{flex-direction:row;justify-content:space-between;padding:18px 20px 16px;width:auto}
    body.sidebar-collapsed .box-item{align-items:stretch;padding:6px 12px}
    body.sidebar-collapsed .menu-item{width:100%;height:auto;flex-direction:row;justify-content:flex-start;gap:14px;padding:12px 12px;border-radius:12px}
    /* Cùng lỗi rò rỉ collapsed->drawer như .quick-search phía dưới: chỉ reset border-radius
       (khớp .menu-item{border-radius:12px} của drawer) là chưa đủ — border-left:none và
       padding-left:0 của bản icon-only (dòng ~675) vẫn còn hiệu lực (không bị ghi đè vì rule
       dưới đây không khai lại 2 thuộc tính đó), khiến icon/chữ của mục active bị đẩy lệch
       sang trái so với các mục thường (border-left 3px của mục thường choán mất 3px, mục
       active lại padding-left:0 nên hụt luôn 3px đó). Khai đủ cả border-left/padding-left
       để khớp lại đúng dáng "pill teal nhạt + vạch teal trái" như bản gốc (dòng 667). */
    body.sidebar-collapsed .menu-item.active{border-radius:12px;border-left:3px solid var(--color-primary);padding-left:9px}
    /* max-width:0 (dòng ~700, cơ chế thu-nhãn-về-0 để icon tự canh giữa mượt khi thu gọn desktop)
       phải reset lại ở đây — không thì nhãn trong drawer mobile bị vô hình/mất chỗ theo đúng lỗi
       rò rỉ collapsed->drawer đã ghi ở "chốt an toàn" phía trên. */
    body.sidebar-collapsed .menu-item span{position:static;transform:none;background:none;color:inherit;box-shadow:none;opacity:1;padding:0;font-size:14.5px;font-weight:500;pointer-events:auto;max-width:200px}
    body.sidebar-collapsed .aside-menu .logo-word{display:block}
    /* JS tự thêm .sidebar-collapsed cho mọi màn hình <=1100px khi chưa có tuỳ chọn lưu
       (new-home.js dòng ~816) — bao gồm cả các máy tính bảng/điện thoại rơi vào breakpoint
       drawer này, khiến ô "tìm kiếm nhanh" bị co lại kiểu icon-only (chỉ còn kính lúp, mất
       placeholder "Tìm nhanh…" và nút chọn danh mục "Ngữ pháp ▾"). Trả lại đúng layout gốc
       của .quick-search cho drawer, đồng bộ với "chốt an toàn" phía trên. */
    body.sidebar-collapsed .quick-search{margin:14px 12px 12px;justify-content:flex-start;padding:0 8px 0 12px}
    body.sidebar-collapsed .quick-search input{display:block}
    body.sidebar-collapsed .quick-search-cat-toggle{display:flex}

    .main-wrap{margin-left:0}
    .sidebar-toggle-btn{display:none}

    /* --- header --- */
    .box-header{padding:10px 14px;gap:8px}
    .btn-mobile-menu{display:flex}
    .title-heading{gap:8px;flex:1 1 auto;min-width:0}
    /* greeting-block cần co lại + cắt chữ bằng "..." trên mobile, không thì text 2 dòng
       (nowrap) sẽ tràn đè lên .box-right (social icons + avatar) vì box-right có
       flex-shrink:0, không tự nhường chỗ được. */
    .greeting-block{flex:1 1 auto;min-width:0;overflow:hidden}
    .greeting-line1{overflow:hidden;text-overflow:ellipsis;font-size:13.5px}
    .greeting-line2{display:none}
    .logo-word.single{display:none}
    .btn-register{display:none}
    .box-right{gap:6px}
    .btn-primary{padding:6.5px 12.5px;font-size:13.5px}
    .btn-notify{display:none}

    /* --- search card --- */
    .box-search{flex-direction:column;align-items:stretch}
    .content-search .btn-right{display:none}
    .mobile-tools-row{display:flex}
    .lang-search{width:100%}
    .dict-show{width:100%;justify-content:center}
    .gcse-row{flex-direction:column;align-items:stretch;gap:10px}
    #search-box .gsib_a{padding-right:40px!important}
    .line-btn{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;margin:0 -16px 12px;padding:0 16px 4px;scrollbar-width:none}
    .line-btn::-webkit-scrollbar{display:none}
    .btn-tab, .btn-chat-qa{flex-shrink:0}

    .two-col{grid-template-columns:1fr}

    /* --- horizontal snap carousels --- */
    .community-grid{
        display:flex;grid-template-columns:none;overflow-x:auto;scroll-snap-type:x mandatory;
        gap:12px;margin:0 -16px;padding:0 16px 6px;-webkit-overflow-scrolling:touch;scrollbar-width:none;
    }
    .community-grid::-webkit-scrollbar{display:none}
    .community-grid .qa-card{flex:0 0 86%;scroll-snap-align:start}

    .reading-grid{
        display:flex;grid-template-columns:none;overflow-x:auto;scroll-snap-type:x mandatory;
        gap:12px;margin:0 -16px;padding:0 16px 6px;-webkit-overflow-scrolling:touch;scrollbar-width:none;
    }
    .reading-grid::-webkit-scrollbar{display:none}
    .reading-grid .reading-card{flex:0 0 62%;scroll-snap-align:start}

    .promo-banner{padding:18px 16px;text-align:center;justify-content:center}
    .promo-text{text-align:left}

    .footer-cols{grid-template-columns:1fr 1fr;gap:20px 16px}
    .footer-col.products-col{grid-column:1/-1}
    .page-container{padding:12px}
    body.new-home-ui #content.site-content > .mt-container{padding:12px}

    /* Ảnh nền rất ngang (bleed bên phải) không đủ chỗ nhạt dần trên màn hẹp — bỏ ảnh,
       giữ màu nền be nhạt của ảnh để không đè lên chữ. */
    .course-hero{background:#eef6f8}
    .course-hero.tutor-container{padding:24px 20px;min-height:0}
    .course-hero-text{max-width:none}
    .course-hero-text h1{font-size:24px}
    .course-hero-stats{gap:10px;font-size:12.5px}
}

@media (max-width:420px){
    .footer-cols{grid-template-columns:1fr}
    .box-flag span.flag-emoji{font-size:16px}
    .btn-primary{padding:6.5px 11px;font-size:13px}
}

/* ==========================================================
   WordPress integration overrides — re-skin của các form tìm
   kiếm thật (ngữ pháp/kanji/từ vựng/giáo trình/flashcard/đề
   thi/anime) hiện có trên site, giữ nguyên toàn bộ logic JS/PHP
   gốc (cbpFWTabs.js, homeJs.js), chỉ đổi giao diện cho khớp
   design tokens phía trên.
   ========================================================== */
.tabs.tabs-style-pill{background:none;overflow:visible;font-size:1em;font-weight:400}
.tabs.tabs-style-pill nav{border-bottom:1px solid var(--color-border);padding-bottom:12px}
.tabs.tabs-style-pill nav ul{justify-content:flex-start;gap:6px;max-width:none;position:relative}
.tabs.tabs-style-pill nav ul li{flex:none;position:relative}
.tabs.tabs-style-pill nav ul li a{
    background:none;border:none;padding:9px 16px;border-radius:8px;
    font-size:14px;font-weight:500;line-height:normal;color:var(--color-text-tertiary);
}
/* tabs.css gốc có ".tabs nav a span{font-size:.75em}" (dành cho label nhỏ dưới icon
   ở thiết kế tab cũ) làm chữ trong pill bị thu nhỏ còn ~10.5px — ghi đè lại 14px */
.tabs.tabs-style-pill nav ul li a span{font-size:14px}
.tabs.tabs-style-pill nav ul li a i{font-size:13px;margin-right:6px;vertical-align:middle}
.tabs.tabs-style-pill nav ul li a:hover,
.tabs.tabs-style-pill nav ul li a:focus{color:var(--color-primary-deep)}
.tabs.tabs-style-pill nav li.tab-current a{background:var(--color-primary-tint);color:var(--color-primary-deep)}
/* Nền pill trượt mượt giữa các tab khi bấm qua lại (thay vì mỗi tab tự bật/tắt nền riêng, snap
   tức thì) — 1 span riêng (.tabs-pill-indicator, chèn làm con ĐẦU TIÊN của <ul> trong page-home.php)
   nằm ĐÈ DƯỚI toàn bộ <li> nhờ thứ tự DOM (đứng trước) + cùng là phần tử positioned
   (.tabs.tabs-style-pill nav ul li{position:relative} ngay trên — bắt buộc phải có, nếu không
   <li> không tạo stacking context riêng thì span position:absolute lại đè LÊN TRÊN chữ/icon do
   phần tử positioned mặc định vẽ sau phần tử thường trong luồng, bất kể thứ tự DOM). JS
   (assets/js/homeJs.js, IIFE cuối file) đo `getBoundingClientRect()` của <a> đang active mỗi khi
   đổi tab rồi gán transform/width cho span này — CSS chỉ lo phần chuyển động (transition), không
   tự tính vị trí. .tab-current a vẫn giữ nguyên background làm PHƯƠNG ÁN DỰ PHÒNG khi JS chưa kịp
   chạy/bị tắt — JS thêm class "tabs-pill-ready" lên <ul> ngay khi định vị xong lần đầu để tắt hẳn
   nền snap riêng của từng tab, nhường chỗ cho span trượt. */
.tabs-pill-indicator{
    position:absolute;
    top:0;left:0;
    border-radius:8px;
    background:var(--color-primary-tint);
    opacity:0;
    pointer-events:none;
    transition:transform .32s cubic-bezier(.34,1.1,.64,1),
        width .32s cubic-bezier(.34,1.1,.64,1),
        opacity .15s ease;
}
.tabs.tabs-style-pill nav ul.tabs-pill-ready li.tab-current a{background:none}
.tabs.tabs-style-pill .content-wrap{padding-top:14px}
.tabs.tabs-style-pill .content-wrap section{max-width:none}
/* Hiện nội dung tab (ô search + phần liên quan trong <section>) bằng animation fade + trượt nhẹ
   lên, thay vì display:none→block snap tức thì của tabs.css gốc (".content-wrap section.content-
   current{display:block}", không transition được vì "display" không animate được bằng CSS
   transition). Dùng @keyframes thay vì transition vì mỗi lần cbpFWTabs.js gán lại className, phần
   tử CHUYỂN HẲN từ display:none sang display:block (không phải đổi giá trị 1 thuộc tính đã hiện
   diện) — animation tự chạy lại từ đầu MỖI LẦN phần tử được đưa vào cây hiển thị theo đúng cách
   này, không cần JS can thiệp gì thêm. Cubic-bezier êm (không nảy) khác với nền pill trượt phía
   trên (có nảy nhẹ) vì đây là nội dung chữ/ô nhập liệu, nảy sẽ gây rối mắt hơn là dễ chịu. */
@keyframes tndgTabContentReveal{
    from{opacity:0;transform:translateY(10px)}
    to{opacity:1;transform:translateY(0)}
}
.tabs.tabs-style-pill .content-wrap section.content-current{
    animation:tndgTabContentReveal .32s cubic-bezier(.16,1,.3,1) both;
}
/* riêng trong khối tìm kiếm trang chủ: ô search phải dừng trước khi chạm tranh minh họa
   bên phải (.search-illustration), không đè lên tranh như hiện tại */
.box-search-container .tabs.tabs-style-pill .content-wrap section{max-width:64%;margin-left:0;margin-right:0}
@media (max-width:900px){
    .box-search-container .tabs.tabs-style-pill .content-wrap section{max-width:none}
}
/* Riêng tab Ngữ pháp (section chứa #search-box GCSE): khối kết quả tìm kiếm
   (.gsc-results-wrapper-visible) là ANH EM của ô input, không phải con — nên bị dính
   luôn max-width:64% ở trên dù chỉ cần mỗi ô input tránh tranh minh hoạ, khiến cả bảng
   kết quả bị bó hẹp/lệch trái dù tranh đã hết diện tích ngang từ lâu (tranh chỉ cao
   ~320px, không xuống tới khu vực kết quả). Bỏ giới hạn 64% ở section này, chuyển giới
   hạn đó sang đúng ô input (form.gsc-search-box) để kết quả được full-width. */
.box-search-container .tabs.tabs-style-pill .content-wrap section:has(#search-box){max-width:none}
#search-box form.gsc-search-box{max-width:64%!important}
@media (max-width:900px){
    #search-box form.gsc-search-box{max-width:100%!important}
}

/* ô nhập liệu dạng "search-bar-kanji" — dùng chung cho 5 tab (kanji/giáo trình/flashcard/
   đề thi/anime), pill trắng viền xám + shadow giống .search-form ở japanese-learning-ui */
.wrap-sear-bar-kanji{margin:0}
.search-bar-kanji{
    display:flex;align-items:center;gap:8px;background:#fff;border-radius:13px;height:52px;
    padding:0 6px 0 20px;border:1px solid var(--color-border-2);box-shadow:0 8px 18px rgba(18,66,77,.05);
    transition:border-color .15s ease;
}
.search-bar-kanji:focus-within{border-color:var(--color-primary)}
.search-bar-kanji .fa-search{color:var(--color-text-secondary);font-size:19px;flex-shrink:0}
.search-bar-kanji input[type=text]{
    flex:1;min-width:0;border:none;background:transparent;outline:none;text-align:center;
    font-size:22px;font-family:monospace;color:#dc3545;font-weight:bold;padding:10px 4px;
    box-shadow:none!important;
}
.search-bar-kanji input[type=text]::placeholder{
    font-size:16px;font-family:var(--font-ui);font-weight:400;color:var(--color-text-tertiary);
}
.search-bar-kanji .button{
    order:2;
    background:linear-gradient(135deg,#029ba5,#007582);color:#fff;border:none;
    padding:0 21px;height:40px;border-radius:9px;min-width:100px;
    font-weight:700;font-size:14px;flex-shrink:0;white-space:nowrap;transition:filter .18s ease;
}
.search-bar-kanji .button:hover{filter:brightness(1.08)}
/* nút "x" xóa nhanh nội dung — đẩy ra trước nút "Tìm kiếm" bằng flex order (DOM vẫn
   giữ nguyên thứ tự cũ input→button→x, không cần sửa markup ở cả 5 tab) */
.search-bar-kanji [class*=clear-][class*=-button]{
    order:1;position:relative;
    width:26px;height:26px;
    background:none;border:none;color:var(--color-text-tertiary);flex-shrink:0;padding:0;display:none;
}
.search-bar-kanji [class*=clear-][class*=-button]:hover{color:var(--color-text-primary)}
/* FontAwesome "fa-times" chỉ có 1 độ đậm cố định (font-weight:normal duy nhất trong file font),
   tăng font-size của icon này lên sẽ khiến nét chữ X trông càng dày/thô hơn chứ không mảnh đi.
   Nên tự vẽ dấu X bằng 2 thanh ::before/::after xoay 45deg để kiểm soát độc lập độ dài (to hơn)
   và độ dày nét (mảnh hơn) thay vì phụ thuộc vào glyph có sẵn của icon font. */
.search-bar-kanji [class*=clear-][class*=-button] i{font-size:0}
.search-bar-kanji [class*=clear-][class*=-button]::before,
.search-bar-kanji [class*=clear-][class*=-button]::after{
    content:"";position:absolute;top:50%;left:50%;width:16px;height:1.5px;
    background:currentColor;border-radius:1px;
}
.search-bar-kanji [class*=clear-][class*=-button]::before{transform:translate(-50%,-50%) rotate(45deg)}
.search-bar-kanji [class*=clear-][class*=-button]::after{transform:translate(-50%,-50%) rotate(-45deg)}

.search_history{display:flex;align-items:center;flex-wrap:nowrap;gap:8px;list-style:none;margin:11px 0 0;padding:0;min-width:0}
.search_history li.list-first-item{
    height:27px;display:flex;align-items:center;flex-shrink:0;
    background:none;border-color:transparent;color:#6e7988;font-size:12px;cursor:default;padding:0 4px;
}
/* Chỉ phần các từ khóa (pill) cuộn ngang — nhãn "Lịch sử:" ở trên đứng yên, không cuộn theo */
.search_history li.search-history-scroll{
    flex:1 1 auto;min-width:0;display:flex;align-items:center;gap:8px;
    overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none;padding:0 0 4px;
}
.search_history li.search-history-scroll::-webkit-scrollbar{display:none}
.search_history .history-pill{
    height:27px;display:flex;align-items:center;flex-shrink:0;white-space:nowrap;
    background:rgba(255,255,255,.85);color:#6e7785;font-size:11.5px;
    padding:0 13px;border:1px solid var(--color-border-2);border-radius:20px;
    cursor:pointer;transition:.16s ease;
}
.search_history .history-pill:hover{border-color:#98ccd1;color:var(--color-primary-deep);background:#fff}
.wrap-search-history{align-items:center}

/* nút xóa toàn bộ lịch sử tìm kiếm — chỉ hiện khi có lịch sử, xác nhận trước khi xóa
   (xem xử lý click ở assets/js/new-home.js) */
.clear-history-btn{
    display:flex;align-items:center;justify-content:center;flex-shrink:0;
    width:28px;height:28px;margin-left:6px;border:none;background:none;border-radius:8px;
    color:#788492;align-self:center;
}
.clear-history-btn svg{width:17px;height:17px}
.clear-history-btn:hover{background:#f2f6f7}
.search_history.d-none ~ .clear-history-btn{display:none}

/* nút "Tra cứu Từ vựng minna" (bản mới/bản cũ) */
.a-btn{
    display:flex;align-items:center;justify-content:space-between;gap:10px;
    background:var(--page-bg);border-radius:12px;padding:14px 18px;font-weight:500;color:var(--color-text-primary);
}
.a-btn:hover{background:var(--color-primary-tint);color:var(--color-primary-deep)}
.a-btn-slide-text{font-size:12.5px;font-weight:700;color:var(--color-primary-deep);background:#fff;padding:3px 10px;border-radius:50rem}
.a-btn-icon-right{color:var(--color-text-tertiary)}

/* chip danh mục flashcard/anime — cách ô search 1 khoảng cho thoáng, căn giữa theo
   đúng class text-center có sẵn trong markup */
.wrap-search-phim{margin-top:14px}
.wrap-search-phim .btn-group{display:flex;flex-wrap:wrap;gap:8px;justify-content:center}
.wrap-search-phim .btn-group .btn{
    flex:0 0 auto!important;margin:0!important;
    background:var(--page-bg)!important;color:var(--color-text-secondary)!important;border:none!important;
    border-radius:50rem!important;padding:8px 16px!important;font-size:13px!important;font-weight:500;
    transition:background .15s ease,color .15s ease;
}
.wrap-search-phim .btn-group .btn:hover{background:var(--color-primary-tint)!important;color:var(--color-primary-deep)!important}

/* GCSE (ngữ pháp) — khung tìm kiếm nền trắng + viền + đổ bóng + nút "Tìm kiếm" teal
   liền khối bên phải, theo đúng .search-form/.search-submit của japanese-learning-ui.
   Bo góc/viền/bóng đặt trên form.gsc-search-box (đúng bằng hàng input+nút) chứ KHÔNG
   đặt trên #search-box (khối ngoài cùng) — #search-box còn chứa cả khối kết quả tìm
   kiếm (.gsc-results-wrapper-visible, hiện SAU khi ấn Enter) là anh em (sibling) của
   form, không phải con của form. Trước đó lỡ đặt overflow:hidden + height:52px trên
   #search-box để bo góc pill, vô tình CẮT MẤT/ẨN toàn bộ kết quả tìm kiếm phía dưới
   (chúng vẫn render đúng trong DOM, chỉ là bị kẹt trong khung 52px overflow:hidden) —
   đây là lý do "gõ từ khoá ấn Enter không thấy kết quả". */
.gcse-row{display:flex;align-items:center;gap:12px}
#search-box{position:relative;flex:1;min-width:0}
/* style.css gốc có "#search-box form.gsc-search-box{border:3px solid transparent;
   border-radius:20px;background:#fff}" — ghi đè lại đúng kích thước pill mong muốn
   (52px, bo 13px, viền + bóng) NGAY TẠI form này, không lan ra khối kết quả bên ngoài. */
#search-box form.gsc-search-box{
    margin:0!important;padding:0!important;max-width:100%;
    height:52px!important;background:#fff!important;
    border:1px solid var(--color-border-2)!important;border-radius:13px!important;
    overflow:hidden;box-shadow:0 8px 18px rgba(18,66,77,.05);transition:border-color .15s ease;
}
#search-box form.gsc-search-box:focus-within{border-color:var(--color-primary)!important}
/* chữ nhập vào ô tìm kiếm Ngữ pháp giờ style giống hệt .search-bar-kanji (đỏ, monospace,
   in đậm, canh giữa) cho đồng bộ giao diện giữa các tab tìm kiếm — theo yêu cầu người dùng. */
#search-box input.gsc-input,
#search-box .gsc-input-box,
#search-box .gsc-input-box-hover,
#search-box .gsc-input-box-focus{
    font-size:22px!important;
    font-family:monospace!important;
    font-weight:bold!important;
    color:#dc3545!important;
    text-align:center!important;
    line-height:1.4!important;
}
#search-box input.gsc-input::placeholder{
    font-size:16px!important;
    font-family:var(--font-ui)!important;
    font-weight:400!important;
    color:var(--color-text-tertiary)!important;
}
#search-box .gsc-input-box,
#search-box table.gsc-input,
#search-box td.gsc-input,
#search-box .gsib_a{
    background-color:#fff!important;
    border:none!important;
    border-radius:0!important;
}
#search-box table.gsc-search-box{width:100%;height:52px!important;margin:0!important}
#search-box tr{height:52px!important}
#search-box td.gsc-input{padding:0!important;vertical-align:middle;height:52px!important}
/* Google tự set ".gsib_b{height:48px;padding:4px}" (ô chứa nút "x" xoá nhanh, mặc định
   dành chỗ vẽ icon riêng của Google) — content-box nên tổng cao 48+4+4=56px, kéo cả hàng
   (table-cell height chỉ là mức TỐI THIỂU, ô nào cao nhất thì cả hàng cao theo ô đó) lên
   56px dù .gsib_a đã ép 52px, khiến nút "Tìm kiếm" (canh giữa theo hàng 56px cao hơn khung
   ngoài 52px) bị lệch xuống và bị overflow:hidden ở #search-box cắt mất đáy — đây mới là
   nguyên nhân thật, không phải .gsib_a. */
#search-box table.gstl_50.gsc-input{height:52px!important;box-sizing:border-box!important}
#search-box .gsib_a{padding:4px 10px 4px 50px!important;height:52px!important;box-sizing:border-box!important;overflow:hidden}
#search-box .gsib_b{height:52px!important;padding:0 14px!important;box-sizing:border-box!important;vertical-align:middle}
/* trước dùng position:absolute;right:130px — số 130px này chỉ đúng khi phần tử định vị
   theo #search-box, nhưng thực ra .gsst_a lại định vị theo .gsst_b (cha gần nhất có
   position:relative do Google tự đặt, kích thước chỉ vừa đủ ôm icon x) nên right:130px
   thực chất kéo dấu x lệch hẳn ra khỏi mọi mốc hợp lý — đây là lý do dấu x nằm lệch giữa
   khoảng trắng thay vì bám sát cạnh phải ô nhập. Bỏ absolute, để x nằm tự nhiên theo
   luồng bảng (ngay sau ô input, trước nút "Tìm kiếm") — đúng hành vi mặc định của GCSE. */
#search-box .gsst_a{padding:0!important;display:flex;align-items:center;justify-content:center}

/* hàng icon phụ (viết Kanji / bộ thủ / giọng nói / dịch ảnh) — đang ẩn theo yêu cầu,
   giữ lại markup/JS phòng khi cần bật lại sau này */
.gcse-toolbar{display:none}
/* nút "Tìm kiếm" — Google mặc định để td.gsc-search-button{display:none} (chỉ tìm bằng
   Enter/gợi ý), khôi phục lại + style thành nút teal liền khối bên phải + nhãn "Tìm
   kiếm", đúng kiểu .search-submit của japanese-learning-ui. Dùng riêng selector cho
   td (table-cell) và button (flex) vì cả 2 cùng mang class "gsc-search-button" —
   gộp chung 1 rule sẽ làm cái sau ghi đè cái trước, vỡ layout bảng. */
#search-box td.gsc-search-button{display:table-cell!important;vertical-align:middle!important;width:1%;padding:0!important;height:52px!important}
#search-box button.gsc-search-button-v2{
    display:flex!important;align-items:center;justify-content:center;gap:8px;
    width:110px;height:52px;padding:0 20px!important;margin:0!important;
    background:linear-gradient(135deg,#029ba5,#007582)!important;border-radius:0!important;
    color:#fff;font-weight:700;font-size:14px;white-space:nowrap;transition:filter .18s ease;
}
#search-box button.gsc-search-button-v2:hover{filter:brightness(1.08)}
/* Bỏ hẳn icon kính lúp (SVG do chính Google CSE render bên trong nút, không phải markup của
   theme) theo yêu cầu — chỉ còn nhãn "Tìm kiếm" từ ::after bên dưới. */
#search-box button.gsc-search-button-v2 svg{display:none}
#search-box button.gsc-search-button-v2::after{content:"Tìm kiếm"}

/* danh sách gợi ý từ khóa của Google (autocomplete) — làm đẹp lại cho đồng bộ giao diện */
.gstl_50.gssb_c{margin-top:6px!important}
.gsc-completion-container{
    border:1px solid var(--color-border)!important;
    border-radius:12px!important;
    box-shadow:0 12px 32px rgba(10,13,18,.14)!important;
    font-family:var(--font-ui)!important;
    overflow:hidden;
}
.gssb_e{padding:6px!important}
.gssb_a{
    padding:10px 14px!important;
    font-family:var(--font-ui)!important;
    font-size:14.5px!important;
    color:var(--color-text-primary)!important;
    border-radius:8px;
    cursor:pointer;
}
.gssb_a:hover{background-color:var(--page-bg)!important}
.gssb_a b{background:none!important;color:var(--color-primary-deep)!important;font-weight:600!important}
/* style.css gốc có rule "body.home .gstl_50.gssb_c .gsq_a tr td span{background:#ffff88}"
   tô vàng phần từ khóa đã gõ — bỏ đi cho sạch, khớp với phần gợi ý (không có nền) */
body.home .gstl_50.gssb_c .gsq_a tr td span{background:none!important}

/* ---- GCSE trong popup "Tra cứu nhanh" (quickSearchOpenPopup(), new-home.js) — style.css
   gốc chỉ làm đẹp kết quả GCSE cho #search-box (khối search ở trang chủ), còn container
   riêng của popup (#quickSearchPopupGcseTarget) không khớp selector đó nên hiện nguyên
   giao diện mặc định xám xịt của Google. Lặp lại đúng các rule của #search-box (border/
   shadow/nền trắng cho từng kết quả, ẩn branding, v.v.) cho container này để hai nơi
   nhìn giống hệt nhau. ---- */
#quickSearchPopupGcseTarget .gcsc-more-maybe-branding-root,
#quickSearchPopupGcseTarget .gcsc-find-more-on-google-root{display:none!important}
#quickSearchPopupGcseTarget .gsc-orderby-container .gsc-orderby{display:flex;justify-content:flex-end}
#quickSearchPopupGcseTarget .gsc-above-wrapper-area-container{margin-bottom:0}
#quickSearchPopupGcseTarget .gsc-result-info-container .gsc-result-info{padding:4px}
#quickSearchPopupGcseTarget .gsc-tabsArea{background:#fff;border-top:1px solid #dfe1e5;padding:10px 10px 8px}
#quickSearchPopupGcseTarget .gsc-expansionArea .gsc-webResult:first-child{margin-top:15px}
#quickSearchPopupGcseTarget .gsc-webResult.gsc-result,
#quickSearchPopupGcseTarget .gsc-results .gsc-imageResult{
    border:1px solid #d7d0d0;margin:10px 0;padding:10px;border-radius:10px;
    box-shadow:0 .125rem .25rem rgba(0,0,0,.075)!important;background-color:#fff;
}
#quickSearchPopupGcseTarget .gsc-webResult.gsc-result div.gs-title{border-bottom:1px solid #d7d0d0;padding-bottom:5px}
#quickSearchPopupGcseTarget .gsc-results .gsc-cursor-box{margin:20px 0 15px;text-align:center}
#quickSearchPopupGcseTarget .gs-result .gs-title{margin-bottom:8px;font-weight:bold;color:#0073aa}
#quickSearchPopupGcseTarget .gs-webResult div.gs-visibleUrl{font-size:12px}
#quickSearchPopupGcseTarget .gsc-control-cse{padding:0;border:none;border-radius:8px;background:transparent}
#quickSearchPopupGcseTarget .gsc-control-cse .gsc-table-result{font-size:12.5px}
#quickSearchPopupGcseTarget .gs-webResult.gs-result a.gs-title b{background-color:#ffff00!important;padding:0 2px;color:#222}
#quickSearchPopupGcseTarget .gs-webResult .gs-snippet b{color:red;font-weight:bold}
#quickSearchPopupGcseTarget .gsc-above-wrapper-area{background:#f5f5f5;max-width:100%}
#quickSearchPopupGcseTarget .gsc-webResult.gsc-result:hover{transition:.5s all;background-color:#CCE6FF}
#quickSearchPopupGcseTarget .gsc-webResult.gsc-result .gs-title{transition:none}
#quickSearchPopupGcseTarget .gsc-webResult.gsc-result .gs-spelling{font-weight:bold;color:#e74c3c}
#quickSearchPopupGcseTarget .gsc-results .gsc-cursor-box .gsc-cursor-page:hover{
    text-decoration:none;border-color:#029fb2;background:#fff;color:#029fb2;
}
#quickSearchPopupGcseTarget .gsc-wrapper,
#quickSearchPopupGcseTarget .gsc-results{background:#f5f5f5!important;border-bottom-left-radius:5px;border-bottom-right-radius:5px;max-width:100%}
#quickSearchPopupGcseTarget .gsc-results{padding:0 10px}
#quickSearchPopupGcseTarget .gsc-tabHeader.gsc-tabhActive,
#quickSearchPopupGcseTarget .gsc-refinementHeader.gsc-refinementhActive{margin:0;padding:10px}
#quickSearchPopupGcseTarget .gsc-tabHeader.gsc-tabhInactive,
#quickSearchPopupGcseTarget .gsc-refinementHeader.gsc-refinementhInactive{padding:10px}

/* ---- Truy cập nhanh (grid icon N1-N5 / giáo trình / đề thi / kanji) ---- */
.quick-grid{display:grid;grid-template-columns:repeat(6,1fr);gap:12px}
.quick-grid a{display:block;min-width:0;border-radius:12px;overflow:hidden;border:1px solid var(--color-border);transition:box-shadow .2s ease,transform .2s ease}
.quick-grid a:hover{box-shadow:0 6px 18px rgba(17,62,74,.1);transform:translateY(-2px)}
.quick-grid img{display:block;width:100%;max-width:100%;height:auto}
.quick-grid-title{font-size:13px;font-weight:600;color:var(--color-text-primary);margin:0 0 10px}
@media (max-width:900px){.quick-grid{grid-template-columns:repeat(3,1fr)}}
@media (max-width:480px){.quick-grid{grid-template-columns:repeat(2,1fr)}}

/* ---- promo tài trợ (ảnh thật, không phải QR giả) ---- */
.promo-banner img{max-width:100%;border-radius:10px;display:block}

/* ---- modal "không tìm thấy kanji" dùng chung style card ---- */
#no_kanji .modal-content{border-radius:var(--card-radius);border:none;box-shadow:0 12px 40px rgba(10,13,18,.2)}

/* ---- quick-links sidebar card (thay cho khối "Góp ý" không có dữ liệu thật) ---- */
.quicklinks-card{display:flex;flex-direction:column}
.quicklinks-card a{
    min-height:44px;margin-top:8px;padding:7px 10px;display:grid;
    grid-template-columns:28px 1fr 18px;align-items:center;gap:8px;
    border:1px solid var(--color-border-2);border-radius:10px;background:#fff;
    color:var(--color-text-primary);font-size:12.5px;font-weight:520;
    box-shadow:0 3px 10px rgba(15,63,73,.035);transition:.17s ease;
}
.quicklinks-card a:hover{
    transform:translateX(3px);border-color:#b9dce0;
    box-shadow:0 7px 15px rgba(15,63,73,.08);color:#006c78;
}
.quick-icon{
    width:26px;height:26px;display:grid;place-items:center;border-radius:7px;
    background:#e8f7f7;color:#078c96;flex-shrink:0;
}
.quick-icon svg{width:18px;height:18px;fill:none;stroke:currentColor;stroke-width:1.85;stroke-linecap:round;stroke-linejoin:round}
.quicklinks-card .chev{width:16px;height:16px;flex-shrink:0;fill:none;stroke:#687587;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}

/* ---- thẻ kêu gọi ủng hộ "Giữ lửa Nhật Ngữ" + mã QR donate — cả thẻ là 1 link ra
   trang donate ---- */
.motivation-card{
    position:relative;padding:18px 16px;margin-top:16px;overflow:hidden;
    display:flex;align-items:center;gap:14px;
    background:linear-gradient(135deg,#fff8f0 0%,#fdeee0 65%,#fbe4d4 100%);
    border:1px solid #f1ddc8;border-radius:var(--card-radius);
    box-shadow:0 4px 18px rgba(180,110,40,.08);
    transition:box-shadow .2s ease,transform .2s ease,border-color .2s ease;
}
.motivation-card:hover{
    box-shadow:0 10px 26px rgba(180,110,40,.16);transform:translateY(-2px);
    border-color:#e8c9a3;
}
/* vệt sáng trang trí góc trên — gợi "ngọn lửa" ấm áp, không chiếm layout */
.motivation-card::after{
    content:"";position:absolute;top:-30%;right:10%;width:140px;height:140px;
    background:radial-gradient(circle,rgba(255,183,0,.18),transparent 70%);
    pointer-events:none;
}
/* card trong sidebar chỉ rộng ~300px (hẹp hơn nhiều so với bố cục gốc rộng rãi của
   japanese-learning-ui) — giảm cỡ chữ dòng phụ (15px→13px) để "Cùng nhau lan tỏa tri
   thức" vừa đúng 1 dòng, không bị wrap */
.motivation-copy{position:relative;z-index:1;min-width:0;flex:1;color:var(--color-text-primary)}
.motivation-copy h2{
    margin:0;font-size:15.5px;font-weight:800;white-space:nowrap;
    display:flex;align-items:center;gap:5px;letter-spacing:-.1px;
}
.motivation-flame{font-size:15px;line-height:1;filter:drop-shadow(0 1px 1px rgba(180,90,10,.25))}
.motivation-copy p{
    margin:4px 0 10px;padding:0;text-align:left;font-size:12px;font-weight:400;
    color:var(--color-text-secondary);white-space:nowrap;
}
/* nút CTA "Quét mã để ủng hộ" — pill nổi bật thay vì chữ đậm trơn, có mũi tên gợi hành
   động, đổi màu khi hover cả card (không cần :hover riêng vì cha .motivation-card đã bắt) */
.motivation-cta{
    display:inline-flex;align-items:center;gap:5px;white-space:nowrap;
    background:#fff;color:#b5540a;font-size:11px;font-weight:700;letter-spacing:.1px;
    padding:6px 10px;border-radius:50rem;border:1px solid #f1ddc8;
    box-shadow:0 2px 6px rgba(180,110,40,.1);transition:background .2s ease,gap .2s ease;
}
.motivation-cta svg{width:12px;height:12px;flex-shrink:0}
.motivation-card:hover .motivation-cta{background:#fff3e6;gap:7px}
/* mã QR donate là mã thanh toán thật (VietQR/Napas) không phải ảnh trang trí — không
   được crop vuông (object-fit:cover) vì sẽ cắt mất phần mã, không quét được nữa. Ảnh
   gốc 444×534 (khối QR vuông + dải logo Momo/VietQR/Napas bên dưới) nên hiển thị theo
   đúng tỉ lệ gốc, chỉ giới hạn chiều rộng. */
.motivation-qr{
    position:relative;z-index:1;flex-shrink:0;background:#fff;border-radius:12px;
    padding:5px;border:1px solid #f1ddc8;box-shadow:0 3px 10px rgba(180,110,40,.1);
}
.motivation-card img{width:84px;height:auto;display:block;border-radius:6px}

/* ---- reset <button> padding/line-height bị style.css gốc của theme đè lên
   (rule "button, input[type=button], ..." set padding:10px 15px; height:33px;
   line-height:13px làm bóp méo icon trong các nút mới) ---- */
.btn-toggle-sidebar,
.btn-close-sidebar,
.btn-mobile-menu,
.btn-notify,
.promo-close,
.pagination button,
.clear-history-btn,
.qspop-close,
.tndg-kanji-info-panel-close,
.btn-common{
    padding:0;
    line-height:normal;
}

/* ============ TRANG KẾT QUẢ "TRA CỨU NHANH" (search.php, search_type=quick_search) ============
   Trang này vẫn đi qua header.php/get_header() (khung sidebar+topheader mới) nhưng nội dung
   #primary bên trong vốn là layout Bootstrap cũ của theme — bộ class qsp-* dưới đây tự vẽ lại
   phần kết quả cho khớp phong cách card/teal của dashboard mới, độc lập với CSS cũ xung quanh. */
.qsp-wrap{max-width:760px;margin:0 auto;padding:24px 0 40px}
.qsp-heading{
    background:var(--card-bg);border-radius:var(--card-radius);box-shadow:var(--card-shadow);
    padding:22px 24px;margin-bottom:16px;
}
.qsp-heading h1{margin:0;font-family:var(--font-ui);font-size:22px;font-weight:800;color:var(--color-text-primary);line-height:1.3}
.qsp-heading h1 span{color:var(--color-primary-deep)}
.qsp-heading p{margin:6px 0 0;font-family:var(--font-ui);font-size:13.5px;color:var(--color-text-tertiary)}

.qsp-results{display:flex;flex-direction:column;gap:10px}
.qsp-result-card{
    display:block;background:var(--card-bg);border-radius:14px;box-shadow:var(--card-shadow);
    padding:16px 18px;transition:box-shadow .2s ease,transform .2s ease;
}
.qsp-result-card:hover{box-shadow:0 8px 22px rgba(17,62,74,.09);transform:translateY(-2px)}
.qsp-result-type{
    display:inline-block;font-size:11px;font-weight:700;color:var(--color-primary-deep);
    background:var(--color-primary-tint);border-radius:50rem;padding:3px 10px;margin-bottom:8px;
}
.qsp-result-title{margin:0 0 4px;font-family:var(--font-ui);font-size:15.5px;font-weight:700;color:var(--color-text-primary);line-height:1.4}
.qsp-result-card:hover .qsp-result-title{color:var(--color-primary-deep)}
/* bôi vàng từ khoá khớp trong tiêu đề kết quả — dùng chung cho tra Kanji và tìm nội bộ
   Giáo trình/Flashcard/Đề thi/Anime (highlightTerms(), new-home.js). #ffff00 giống đúng
   màu highlight sẵn có ở kết quả Google CSE (xem rule "#quickSearchPopupGcseTarget ...
   a.gs-title b" bên dưới) để đồng bộ trong cùng 1 popup */
.qsp-hl{background-color:#ffff00;color:#222;padding:0 2px;border-radius:2px}
.qsp-result-excerpt{margin:0;font-family:var(--font-ui);font-size:13px;color:var(--color-text-tertiary);line-height:1.55}

.qsp-empty{
    display:flex;flex-direction:column;align-items:center;gap:8px;text-align:left;
    background:var(--card-bg);border-radius:var(--card-radius);box-shadow:var(--card-shadow);
    padding:48px 20px;color:var(--color-text-tertiary);
}
.qsp-empty svg{width:36px;height:36px;opacity:.4;margin-bottom:4px}
.qsp-empty b{font-family:var(--font-ui);font-size:15px;color:var(--color-text-primary)}
.qsp-empty span{font-family:var(--font-ui);font-size:13.5px}

.qsp-pagination{margin-top:18px;display:flex;justify-content:center}
@media (max-width:600px){.qsp-wrap{padding:16px 12px 32px}}

/* ============================================================
   Banner "campaign" (functions.php campaign_callback(), do_action('campaign'))
   — component dùng chung ở ~23 template (trang chủ, bài viết, giáo trình, đề thi,
   series...). Ảnh hiện chỉ có viền Bootstrap mảnh (.border 1px xám) + bo góc nhỏ
   10px set qua inline style, không có shadow/hover, lệch tông với style card
   (bo tròn 16px + đổ bóng + hover nhấc) của giao diện mới. Ghi đè bằng !important
   ở những chỗ đang bị inline style (border-radius) khoá.
   ============================================================ */
/* Gộp 3 ảnh (banner video + 2 banner N3/N2) vào chung 1 hàng: HTML gốc là 2 khối
   .banner-tudien anh em (khối 1 = banner video; khối 2 = .row chứa 2 cột N3/N2 lồng bên
   trong). Trước dùng display:contents để "làm phẳng" khối .row nhưng bị lỗi render ở 1 số
   trình duyệt: border-radius + overflow:hidden trên <a> (cháu của phần tử display:contents)
   không clip đúng, ảnh N3/N2 bị vuông góc dù ảnh video (không qua display:contents) vẫn tròn
   bình thường. Đổi sang flex lồng nhau thật (khối .row = 1 flex item to gấp đôi, tự chia 2
   con bên trong đều nhau) để tránh hẳn bug này. */
.wrap-banner-content{overflow:visible;display:flex;flex-wrap:wrap;align-items:stretch;gap:14px}
.wrap-banner-content > .banner-tudien{margin:0;flex:1 1 260px;min-width:0}
.wrap-banner-content > .banner-tudien.row{flex:2 1 520px;min-width:0;display:flex;gap:14px}
.wrap-banner-content > .banner-tudien.row > [class*="col-"]{flex:1 1 0;min-width:0;max-width:none;padding:0;margin:0!important}
.banner-tudien a.border{
    display:block;height:100%;border:none!important;border-radius:var(--card-radius)!important;overflow:hidden;
    background:var(--card-bg);box-shadow:var(--card-shadow);transition:box-shadow .2s ease,transform .2s ease;padding:0!important;
}
.banner-tudien a.border:hover{box-shadow:var(--card-shadow-hover);transform:translateY(-2px)}
/* object-fit:contain để không cắt mất chữ/nội dung trong ảnh banner (trước dùng cover bị
   crop mất chữ ở mép, VD "MIMIKARA OBOERU N2" bị cắt chữ "N2") — bo góc vẫn giữ nhờ
   border-radius + overflow:hidden ở .banner-tudien a.border (thẻ cha) phía trên. */
.banner-tudien a.border img{
    width:100%!important;height:100%!important;max-height:none!important;display:block;margin:0!important;
    border-radius:0!important;object-fit:contain;
}
@media (max-width:700px){
    /* Bug: flex-direction đổi thành column trên mobile nhưng flex-basis (520px cho khối
       .row, 260px/0 cho ảnh video và 2 cột N3/N2) vẫn giữ nguyên từ context hàng-ngang ở
       desktop — trong flex column, flex-basis lại quyết định CHIỀU CAO, nên các khối bị
       kéo cao hàng trăm px dù ảnh bên trong chỉ cao bằng nội dung thật, để lại khoảng
       trắng rỗng bên dưới ảnh. Phải reset hẳn flex:none (không chỉ flex-basis) cho mọi
       cấp lồng nhau ở mobile. */
    .wrap-banner-content{flex-direction:column;gap:10px}
    .wrap-banner-content > .banner-tudien{flex:none}
    .wrap-banner-content > .banner-tudien.row{flex:none;display:flex;flex-direction:column;gap:10px}
    .wrap-banner-content > .banner-tudien.row > [class*="col-"]{flex:none}
    .banner-tudien a.border{height:auto!important}
    .banner-tudien a.border img{height:auto!important}
}

/* ============================================================
   Hàng nút chọn cấp độ (N5-N1) + ô tìm kiếm giáo trình/đề thi — pattern lặp lại y hệt
   ở ~15 template (page-giao-trinh-n1..5.php, page-de-thi-n1..5.php, page-tong-hop-toan-bo-
   giao-trinh.php, page-tong-hop-toan-bo-de-thi.php...). Bản gốc dùng 5 màu nút Bootstrap
   mặc định (secondary/success/info/warning/danger) rất chỏi + khung xám #ccc. Selector
   dùng đủ 4 class ".d-flex.justify-content-center.h-100.p-3" (không dùng riêng
   ".d-flex.justify-content-center") vì combo 2 class đó còn xuất hiện ở 1 chỗ khác trong
   header.php (thanh search cũ) — chỉ khớp đúng combo 4 class mới là hàng nút cấp độ.
   Hàng nút và ô search vốn là 2 element rời (không có div bọc chung trong HTML gốc) — ghép
   thành 1 khối liền mạch bằng cách cho full-width bằng nhau, dính sát (margin-bottom:0),
   bo góc chỉ ở 2 cạnh ngoài (trên/dưới) + 1 đường kẻ mảnh phân cách ở giữa thay vì 2 viên
   thuốc rời rạc như trước. */
/* Tab dạng underline (bỏ nền pill trước đây): chữ xám khi thường, chữ + gạch chân teal khi
   .active — .active gắn bằng PHP is_page() ở từng file page-giao-trinh-nX.php/page-de-thi-nX.php
   (so khớp đúng slug trang đang xem, không phải hardcode CSS). */
.d-flex.justify-content-center.h-100.p-3{
    display:flex!important;flex-wrap:wrap;justify-content:flex-start!important;
    background:var(--card-bg)!important;box-shadow:var(--card-shadow);
    border-radius:var(--card-radius) var(--card-radius) 0 0!important;
    border-bottom:1px solid var(--color-border);
    padding:0 8px!important;gap:0;width:100%!important;height:auto!important;margin:0!important;
}
.d-flex.justify-content-center.h-100.p-3 .btn{
    position:relative;background:transparent!important;color:var(--color-text-secondary)!important;border:none!important;
    border-radius:0!important;font-weight:700;padding:16px 14px!important;height:auto!important;font-size:15px!important;
}
.d-flex.justify-content-center.h-100.p-3 .btn::after{
    content:"";position:absolute;left:14px;right:14px;bottom:-1px;height:2.5px;
    background:transparent;border-radius:2px 2px 0 0;transition:background-color .15s ease;
}
.d-flex.justify-content-center.h-100.p-3 .btn:hover{color:var(--color-primary-deep)!important}
.d-flex.justify-content-center.h-100.p-3 .btn.active{color:var(--color-primary)!important}
.d-flex.justify-content-center.h-100.p-3 .btn.active::after{background-color:var(--color-primary)}
.d-flex.justify-content-center.h-100.p-3 .btn .sp-600{font-weight:500}

/* Ô search trước quá "chìm" (nền trắng trên nền trang trắng, không icon, chữ nhỏ, dán sát mép
   card) — thêm icon kính lúp (data-URI, không cần sửa HTML), để ô search thụt vào có khoảng
   đệm quanh (dạng "viên thuốc nổi trong khay") thay vì dán liền mép ngoài của card, chữ to
   hơn để dễ đọc/dễ gõ hơn. */
#searchform{margin-top:0!important;background:var(--card-bg);border-radius:0 0 var(--card-radius) var(--card-radius)}
#searchform .input-group{
    background-color:#fff!important;
    background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23868e96' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E")!important;
    background-repeat:no-repeat!important;background-position:18px center!important;background-size:21px 21px!important;
    border:1.5px solid var(--color-border-2)!important;border-radius:50rem!important;
    padding:6px 6px 6px 50px!important;box-shadow:none!important;
    transition:border-color .15s ease;
}
#searchform .input-group:focus-within{
    border-color:var(--color-primary)!important;
    background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23029fb2' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E")!important;
}
#searchform .form-control{border:none!important;border-radius:0!important;height:46px!important;font-size:16px!important;padding-left:0!important;box-shadow:none!important;background:transparent!important}
#searchform .btn{border-radius:50rem!important;font-weight:700;font-size:15px!important;padding:0 28px!important}

@media (max-width:767px){
    .d-flex.justify-content-center.h-100.p-3{justify-content:flex-start!important;overflow-x:auto}
    .d-flex.justify-content-center.h-100.p-3 .btn{padding:14px 10px!important;font-size:13.5px!important;white-space:nowrap}
}

/* ============================================================
   Trang /tong-hop-toan-bo-giao-trinh/ — thiết kế lại theo mockup Other/giao trinh.png.
   Markup viết lại hoàn toàn trong page-tong-hop-toan-bo-giao-trinh.php (không còn dùng
   class Bootstrap .d-flex/.card/.Horizontal-list cũ trên riêng trang này nữa — 11 trang
   giao-trinh-nX/de-thi-nX khác không đụng tới, vẫn dùng CSS ở trên).
   ============================================================ */
.gt-toolbar{
    display:flex;flex-wrap:wrap;align-items:center;gap:8px;
    background:var(--card-bg);border-radius:var(--card-radius);box-shadow:var(--card-shadow);
    padding:10px;margin-bottom:16px;
}
.gt-pill{
    flex-shrink:0;font-size:14px;font-weight:600;color:var(--color-text-secondary);
    background:transparent;border:1.5px solid var(--color-border-2);border-radius:50rem;
    padding:9px 16px;white-space:nowrap;transition:background .15s ease,border-color .15s ease,color .15s ease;
}
.gt-pill:hover{border-color:var(--color-primary);color:var(--color-primary-deep)}
/* .active dùng chung cho cả pill "Tất cả" (trang tổng hợp) lẫn pill N5-N1 (trang riêng từng
   cấp độ) — không giới hạn riêng .is-all để tái dùng được ở page-giao-trinh-n1..5.php. */
.gt-pill.active{background:var(--color-primary);border-color:var(--color-primary);color:#fff}
.gt-search{flex:1 1 260px;min-width:220px;display:flex;align-items:center;gap:8px;margin:0}
.gt-search-input{
    flex:1;position:relative;background:var(--page-bg);border:1.5px solid transparent;border-radius:50rem;
    transition:border-color .15s ease,background .15s ease;
}
.gt-search-input::before{
    content:"";position:absolute;left:16px;top:50%;transform:translateY(-50%);width:19px;height:19px;
    background:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23868e96' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Ccircle cx='11' cy='11' r='8'/%3E%3Cpath d='m21 21-4.35-4.35'/%3E%3C/svg%3E") center/contain no-repeat;
    pointer-events:none;
}
.gt-search-input:focus-within{border-color:var(--color-primary);background:#fff}
.gt-search-input input{
    width:100%;border:none;background:transparent;outline:none;height:44px;font-size:14.5px;
    padding:0 14px 0 44px;font-family:var(--font-ui);color:var(--color-text-primary);
}
.gt-search-input input::placeholder{color:var(--color-text-tertiary)}
/* Chrome tô nền xanh nhạt (input:-internal-autofill-selected, user agent stylesheet) khi chọn
   1 gợi ý autofill — pseudo-class đó là nội bộ Chrome, trang web không gọi trực tiếp được, nhưng
   Chrome có expose bản công khai :-webkit-autofill. Trick: đặt transition-delay cực lớn cho
   background-color để Chrome không kịp sơn màu autofill trước khi input mất focus. */
.gt-search-input input:-webkit-autofill,
.gt-search-input input:-webkit-autofill:hover,
.gt-search-input input:-webkit-autofill:focus,
.gt-search-input input:-webkit-autofill:active{
    -webkit-text-fill-color:var(--color-text-primary);
    transition:background-color 9999s ease-in-out 0s,color 9999s ease-in-out 0s;
}
.gt-search-btn{
    flex-shrink:0;background:var(--color-primary);color:#fff;border:none;border-radius:50rem;
    height:44px;padding:0 22px;font-weight:700;font-size:14.5px;
}
.gt-search-btn:hover{background:var(--color-primary-deep)}

/* Khoảng đệm trên/dưới cho các trang danh sách kiểu gt-* (giáo trình, đề thi, ngữ pháp, từ vựng,
   kanji, tính điểm thi, bài viết hay, học qua hình ảnh) — các trang này không có khung "card"
   trắng bọc ngoài như /khoa-hoc/ (tutor-wrap...p-4.rounded) nên chỉ dựa vào padding chung của
   #content.site-content > .mt-container là không đủ, đặc biệt padding đó bị responsive rút
   xuống còn 12px ở mobile (@media max-width:767px). Thêm class riêng để đảm bảo luôn có
   khoảng cách rõ ràng giữa nội dung và nền trang, không phụ thuộc rule dùng chung đó.
   Selector phải là "#primary.gt-page" (không chỉ ".gt-page") để thắng specificity của rule
   cũ "#primary{padding:.5rem 2rem}" (style.css) — đó mới là rule thực sự đang áp dụng
   padding rất mỏng (8px trên/dưới) cho các trang này, không phải .mt-container. Giữ nguyên
   2rem trái/phải của rule cũ, chỉ tăng trên/dưới — nếu dùng shorthand "padding:20px 0 44px"
   sẽ vô tình xoá luôn padding trái/phải gốc, làm nội dung sát mép hơn ngoài ý muốn. */
#primary.gt-page{padding:20px 2rem 44px}
@media (max-width:767px){#primary.gt-page{padding:16px 2rem 32px}}

/* Nền gradient teal đậm (cùng tông với .course-hero) cho nổi bật hẳn khỏi nền trang trắng,
   toàn bộ chữ/icon bên trong đổi sang trắng để đủ tương phản trên nền đậm. */
.gt-header{
    position:relative;display:flex;align-items:center;gap:16px;overflow:hidden;
    background:linear-gradient(120deg,var(--sidebar-grad-b),var(--color-primary) 75%);
    border-radius:var(--card-radius);box-shadow:0 10px 24px rgba(var(--color-primary-rgb),.22);
    padding:18px 20px;margin-bottom:16px;
}
.gt-header::after{
    content:"";position:absolute;inset:0;pointer-events:none;
    background:radial-gradient(circle at 92% 0%, rgba(255,255,255,.16), transparent 55%);
}
.gt-header-icon{
    position:relative;flex-shrink:0;width:44px;height:44px;border-radius:12px;background:rgba(255,255,255,.18);
    color:#fff;display:flex;align-items:center;justify-content:center;
}
.gt-header-icon i{font-size:20px;line-height:1}
.gt-header-text{position:relative;flex:1;min-width:0}
.gt-header-text h1{margin:0 0 4px;font-size:19px;font-weight:800;color:#fff;font-family:var(--font-jp)}
.gt-header-text p{margin:0;font-size:13.5px;color:rgba(255,255,255,.85)}
.gt-header-stat{position:relative;flex-shrink:0;display:flex;align-items:center;gap:10px;color:#fff}
.gt-header-stat i{font-size:24px;flex-shrink:0;line-height:1}
.gt-header-stat div{display:flex;flex-direction:column;line-height:1.3}
.gt-header-stat-label{font-size:11px;color:rgba(255,255,255,.75);order:-1}
.gt-header-stat strong{font-size:20px;font-weight:800;color:#fff}
.gt-header-stat span{font-size:11.5px;color:rgba(255,255,255,.75)}

/* Đoạn giới thiệu — nội dung gốc của trang (trước là .alert-warning nền vàng/chữ đỏ),
   khôi phục lại nội dung nhưng đổi sang style thẻ trắng đồng bộ giao diện mới. */
.gt-intro{
    background:var(--card-bg);border-radius:var(--card-radius);box-shadow:var(--card-shadow);
    padding:16px 20px;margin-bottom:16px;font-size:14px;line-height:1.7;color:var(--color-text-secondary);
}
.gt-intro b{color:var(--color-primary-deep)}

/* Lưới 4 cột (trước 5 cột) — card rộng hơn nên nới cỡ chữ/khoảng đệm bên trong theo tỉ lệ
   cho cân đối, không để trống trải quá nhiều so với kích thước card mới. */
.gt-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:18px}
.gt-card{
    display:block;background:var(--card-bg);border-radius:var(--card-radius);box-shadow:var(--card-shadow);
    overflow:hidden;transition:box-shadow .2s ease,transform .2s ease;color:inherit;
}
.gt-card:hover{box-shadow:var(--card-shadow-hover);transform:translateY(-2px)}
/* --card-shadow (5% opacity) được thiết kế cho các trang liệt kê giáo trình có nền xám nhạt
   (--page-bg) làm nổi card lên — trong khung kết quả tìm kiếm Giáo trình/Flashcard/Đề thi/
   Phim ở trang chủ (#giaotrinh_search_result_home/#flashcard_search_result_home/
   #dethi_search_result_home/#phim_search_result_home, nền trắng #fff, xem
   .kanji-search-result-home phía dưới file này) shadow đó gần như không thấy được. Đậm hơn
   riêng ở đây để card vẫn "nổi" rõ trên nền trắng, giống mockup thiết kế. */
#giaotrinh_search_result_home .gt-card,
#flashcard_search_result_home .gt-card,
#dethi_search_result_home .gt-card,
#phim_search_result_home .gt-card,
#quickSearchPopupInternal .gt-card{box-shadow:0 6px 20px rgba(18,60,72,.14)}
#giaotrinh_search_result_home .gt-card:hover,
#flashcard_search_result_home .gt-card:hover,
#dethi_search_result_home .gt-card:hover,
#phim_search_result_home .gt-card:hover,
#quickSearchPopupInternal .gt-card:hover{box-shadow:0 14px 34px rgba(18,60,72,.2)}
.gt-card-thumb{position:relative;aspect-ratio:16/10;background:var(--page-bg);overflow:hidden}
.gt-card-thumb img{width:100%;height:100%;object-fit:cover;display:block}
/* Badge cấp độ nằm trong phần thân card (trên tiêu đề), không overlay trên ảnh — đúng theo
   mockup Other/giao trinh.png (khác bản trước đè lên góc ảnh). */
.gt-badge{
    display:inline-block;font-size:12px;font-weight:800;color:#fff;
    padding:4px 12px;border-radius:50rem;letter-spacing:.02em;margin-bottom:10px;
}
.gt-badge.lvl-n5{background:#1e3a5f}
.gt-badge.lvl-n4{background:var(--color-primary)}
.gt-badge.lvl-n3{background:#43a047}
.gt-badge.lvl-n2{background:#fb8c00}
.gt-badge.lvl-n1{background:#7c4dff}
.gt-badge.lvl-multi{background:#1e3a5f}
.gt-sponsor{
    position:absolute;top:8px;right:8px;font-size:10.5px;font-weight:600;color:#fff;
    background:rgba(255,255,255,.22);padding:3px 9px;border-radius:50rem;
}
.gt-card-body{padding:16px 18px 18px}
.gt-card-body h3{
    margin:0 0 12px;font-size:16.5px;line-height:1.4;font-weight:700;color:var(--color-text-primary);
    display:-webkit-box;-webkit-line-clamp:2;line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;min-height:46px;
}
.gt-card:hover .gt-card-body h3{color:var(--color-primary-deep)}
.gt-card-footer{display:flex;align-items:center;justify-content:space-between;gap:8px}
.gt-tag{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--color-text-tertiary)}
.gt-bookmark{flex-shrink:0;color:var(--color-text-tertiary);display:flex}
.gt-bookmark svg{width:18px;height:18px}
.gt-card:hover .gt-bookmark{color:var(--color-primary-deep)}

.gt-card-promo .gt-card-thumb{background:#0c4a6e}

/* Link "Xem tất cả kết quả" dưới lưới .gt-grid — chỉ xuất hiện trong khối kết quả tìm kiếm
   Giáo trình chèn bằng AJAX ở trang chủ (xem tndg_giao_trinh_search_result() trong functions.php),
   trỏ sang trang kết quả tìm kiếm đầy đủ (search.php, nhánh search_type=ngu_phap). */
.gt-result-see-all{
    display:block;margin-top:16px;padding:14px;text-align:center;font-size:14px;font-weight:600;
    color:var(--color-primary-deep);background:var(--card-bg);border:1px solid var(--color-border);
    border-radius:var(--card-radius);text-decoration:none;
}
.gt-result-see-all:hover{background:var(--page-bg)}

@media (max-width:1200px){.gt-grid{grid-template-columns:repeat(3,1fr)}}
@media (max-width:700px){
    .gt-grid{grid-template-columns:repeat(2,1fr);gap:12px}
    .gt-card-body{padding:12px 14px 14px}
    .gt-card-body h3{font-size:14.5px;min-height:40px}
    .gt-toolbar{padding:8px}
    .gt-pill{padding:8px 12px;font-size:13px}
    .gt-header{flex-wrap:wrap}
    .gt-header-stat{width:100%;justify-content:flex-start;padding-top:8px;border-top:1px solid var(--color-border)}
}
@media (max-width:420px){.gt-grid{grid-template-columns:1fr 1fr;gap:10px}}

/* Toggle "Bản Mới"/"Bản Cũ" + "Mimikara Oboeru N3" ở tab Từ vựng (#section-bar-3) — đổi từ
   Bootstrap .btn-group (pill nối liền) sang các "thẻ" (card) rời, bo góc, icon vuông ĐẶC MÀU bên
   trái (nền teal/xám/hồng-đỏ, glyph sách TRẮNG bên trong — khác bản đầu dùng icon outline nhạt màu,
   đã bị user chê "không giống ảnh mẫu") + 2 dòng chữ bên phải (Tên bộ giáo trình / Bản mới-cũ),
   theo đúng thiết kế ảnh user cung cấp (2026-08-18, chỉnh lại lần 2 cho khớp sát ảnh hơn). Đổi bản
   (data-tv-version) → gọi tndgTuVungInitTable() với ajax.url() mới (xem homeJs.js/new-home.js) —
   CSS này chỉ lo giao diện, không đụng logic đó. Nút "Mimikara Oboeru N3" (.tv-version-card--static)
   CHƯA có data-tv-version, chỉ để hiện giao diện theo yêu cầu user, chưa gắn hành vi bấm — xem ghi
   chú trong page-home.php. */
.tv-version-toggle{margin-bottom:14px;display:flex;flex-wrap:wrap;gap:10px}
.tv-version-card{
    display:inline-flex;align-items:center;gap:12px;text-align:left;
    /* height:auto BẮT BUỘC phải khai rõ — style.css (theme gốc News Portal) có rule reset toàn site
       `button{height:33px;line-height:13px;...}` (style.css ~dòng 359-390) áp lên MỌI thẻ <button>.
       Rule đó nạp TRƯỚC new-home.css nên về thứ tự thì thua, nhưng vì .tv-version-card KHÔNG hề khai
       `height` nào cả, trình duyệt vẫn lấy `height:33px` từ rule `button` kia (không có xung đột
       cùng thuộc tính để so độ ưu tiên) — thấp hơn hẳn khung icon 44px, khiến icon TRÀN RA NGOÀI
       card theo chiều dọc (bug đã gặp thực tế, user báo "height của button đang thấp hơn icon bên
       trong"). Phải tự khai `height:auto` để card giãn theo nội dung (icon 44px + padding). */
    height:auto;
    border:1.5px solid var(--color-border);border-radius:16px;background:var(--card-bg);
    padding:10px 20px 10px 10px;cursor:pointer;transition:background .15s ease,border-color .15s ease;
}
.tv-version-card:hover{border-color:var(--color-primary)}
.tv-version-card.active{background:#e9f9fa;border-color:var(--color-primary)}
.tv-version-card:focus{outline:none}
.tv-version-card:focus-visible{outline:2px solid var(--color-primary);outline-offset:2px}
.tv-version-icon{
    display:flex;align-items:center;justify-content:center;flex-shrink:0;position:relative;
    width:44px;height:44px;border-radius:12px;background:#c4ccd0;
    transition:background .15s ease;
}
.tv-version-card.active .tv-version-icon{background:var(--color-primary)}
/* Reset toàn site cho MỌI thẻ <svg> (đầu new-home.css: `svg{width:1em;height:1em;fill:currentColor}`)
   đè lên hẳn thuộc tính width/height viết trực tiếp trong <svg> (CSS luôn thắng thuộc tính HTML) —
   nếu không override riêng ở đây, icon sách bị co nhỏ xuống ~1em (~14px) thay vì to bằng khung 44px
   (bug đã gặp thực tế, user báo "giao diện bị lệch"). Riêng `fill` KHÔNG cần override — glyph sách
   dùng `fill="#fff"` khai TRỰC TIẾP trên từng <rect> con (không phải trên <rect> gốc <svg>), mà
   presentation attribute của chính phần tử luôn thắng giá trị KẾ THỪA từ cha (`fill:currentColor`
   ở rule `svg{...}` chỉ áp cho chính thẻ <svg>, không tự vẽ gì, các <rect> con tự có fill riêng). */
.tv-version-icon svg{width:22px;height:22px;display:block}
.tv-version-text{display:flex;flex-direction:column;line-height:1.3}
.tv-version-title{font-weight:700;font-size:14px;color:var(--color-text-primary)}
.tv-version-sub{font-weight:600;font-size:12.5px;color:var(--color-text-tertiary)}
.tv-version-card.active .tv-version-sub{color:var(--color-primary)}
/* Nút "Mimikara Oboeru N3" — chỉ 1 dòng chữ (không có .tv-version-sub) nên .tv-version-text tự
   canh giữa theo chiều dọc nhờ .tv-version-card{align-items:center}, không cần CSS riêng cho canh
   chỉnh. cursor:default (không phải pointer) vì nút CHƯA có hành vi bấm — tránh gợi ý sai là bấm
   được. Icon riêng: nền gradient hồng-đỏ (khác hẳn teal/xám của 2 nút Minna) + thêm 1 badge nhỏ
   "N3" (.tv-version-icon-badge) ĐÈ LÊN góc trên-trái icon (position:absolute, tràn nhẹ ra ngoài
   khung icon bằng giá trị âm) để phân biệt rõ đây là bộ giáo trình khác — đúng bố cục "icon + tag
   N3 góc" trong ảnh mẫu. */
.tv-version-card--static{cursor:default}
.tv-version-card--static:hover{border-color:var(--color-border)}
.tv-version-icon--n3{background:linear-gradient(135deg,#f27a8a,#e0435f)}
.tv-version-icon-badge{
    position:absolute;top:-6px;left:-6px;z-index:1;
    background:#e63950;color:#fff;font-size:9px;font-weight:800;line-height:1;
    padding:2.5px 4.5px;border-radius:5px;box-shadow:0 1px 3px rgba(0,0,0,.2);
    letter-spacing:.2px;
}

/* Khung tab Từ vựng — nhúng THẲNG jQuery DataTables thật (tndgTuVungInitTable() trong
   new-home.js, plugin nạp lazy qua tndgTuVungLoadLibs()) thay vì tự dựng list bằng JS thuần.
   CSS dưới đây CHỈ override lại màu sắc/bo góc của DataTables + Bootstrap4 mặc định cho đồng bộ
   với giao diện teal/bo tròn của trang chủ — không đổi hành vi/tính năng gì của plugin. */
#tuvung_datatable_wrap{position:relative;min-height:80px}
#tuvung_datatable_wrap.is-loading::before{
    content:"Đang tải Từ điển Minna...";display:flex;align-items:center;justify-content:center;
    gap:10px;padding:40px 20px;font-size:15px;font-weight:500;color:#566787;
}
#tuvung_datatable_wrap.is-error::before{content:"Có lỗi xảy ra khi tải Từ điển, vui lòng thử lại.";color:#dc3545}
#tuvung_datatable_wrap.is-loading #tuvung_datatable,
#tuvung_datatable_wrap.is-error #tuvung_datatable{display:none}

/* Hàng nút lọc Bài — multi-select, tự xuống dòng (KHÔNG cuộn ngang), quá ngưỡng thì thu gọn vào
   khối .tv-lesson-buttons-more (Bootstrap .collapse có sẵn), mở bằng nút "Xem thêm bài" — y hệt
   hành vi bản gốc (xem tndgTuVungBuildLessonButtons trong new-home.js). */
.tv-lesson-buttons{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:16px}
.tv-lesson-buttons-more{display:flex;flex-wrap:wrap;gap:8px;width:100%;margin-top:8px}
.tv-lesson-label{font-size:14px;font-weight:600;color:#566787;margin-right:2px;white-space:nowrap}
.tv-lesson-btn,.tv-lesson-more-btn{
    position:relative;font-size:13px;font-weight:600;color:#566787;
    background:#fff;border:1px solid var(--color-border);border-radius:6px;
    padding:7px 14px;white-space:nowrap;cursor:pointer;transition:background .15s ease,color .15s ease,border-color .15s ease;
}
.tv-lesson-btn:hover{background:var(--page-bg);border-color:var(--color-primary)}
.tv-lesson-btn.active{background:var(--color-primary);border-color:var(--color-primary);color:#fff}
/* Biểu tượng nơ đánh dấu "đang xem Bài này" — độc lập với .active (chỉ đánh dấu nút NGƯỜI DÙNG
   đã bấm chọn lọc); nơ theo dõi đúng Bài đang thực sự render trên trang hiện tại của bảng, kể cả
   khi duyệt tự nhiên qua Trang trước/sau không bấm nút lọc nào (xem tndgTuVungSyncCurrentLessonMarker
   trong new-home.js). margin-top trên .tv-lesson-buttons chừa chỗ để nơ không bị cắt ở hàng đầu. */
.tv-lesson-buttons{margin-top:10px}
.tv-lesson-btn.tv-lesson-current::before{
    content:"";position:absolute;top:-7px;right:6px;width:10px;height:13px;
    background:#e74c3c;
    clip-path:polygon(0 0,100% 0,100% 100%,50% 78%,0 100%);
    box-shadow:0 1px 2px rgba(0,0,0,.2);
    transform-origin:center top;
    animation:tvLessonRibbonZoomIn .35s cubic-bezier(.34,1.56,.64,1) both;
}
/* Nơ chỉ zoom-in khi THỰC SỰ vừa xuất hiện (chuyển từ không-khớp sang khớp giữa 2 lần vẽ) — vì
   tndgTuVungSyncCurrentLessonMarker() removeClass rồi addClass lại TRÊN CÙNG 1 vòng đồng bộ ở
   MỌI lần draw (kể cả khi Bài vẫn đang khớp, không đổi gì), animation CSS chỉ thực sự restart khi
   trạng thái class thực sự đổi giữa 2 frame được browser render (không đổi thì không thấy gì khác
   biệt để restart) — không cần logic JS theo dõi "mới xuất hiện hay không", tự đúng nhờ cách
   browser xử lý animation theo thay đổi computed style giữa các frame. */
@keyframes tvLessonRibbonZoomIn{
    0%{opacity:0;transform:scale(0)}
    60%{opacity:1;transform:scale(1.25)}
    100%{opacity:1;transform:scale(1)}
}
.tv-lesson-ellipsis{font-weight:700;color:#9aa5b1;padding:0 2px;letter-spacing:1px}
.tv-lesson-more-btn{display:inline-flex;align-items:center;color:#566787}
.tv-lesson-more-btn::after{
    content:"";display:inline-block;margin-left:6px;width:0;height:0;
    border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid currentColor;
    transition:transform .15s ease;
}
.tv-lesson-more-btn[aria-expanded="true"]::after{transform:rotate(180deg)}

/* Bảng DataTable thật — override style Bootstrap4 mặc định (viền dày/nền xám sọc) cho nhẹ nhàng
   đồng bộ card trắng bo góc của trang chủ.
   MÀU CHỮ: #212529 (không phải #566787 như bản trước) — #566787 là màu <body> khai trong
   <style> của trang gốc /tudien/ban_moi/, NHƯNG bảng thật trên trang đó có class "table" của
   Bootstrap4, mà Bootstrap tự đặt ".table{color:#212529}" — rule này bám thẳng vào bảng nên
   THẮNG màu kế thừa từ body. Tức là chữ TRONG BẢNG ở trang gốc thực ra là #212529 (đen xám đậm),
   #566787 chỉ áp dụng cho phần chữ khác NGOÀI bảng. Bài học: khi "match màu bản gốc", phải xem
   màu THỰC SỰ RENDER ra ở đúng phần tử đó (ở đây là bảng, đã có class Bootstrap riêng), không
   suy luận từ CSS body chung chung. */
/* Fix cứng chiều cao + tự cuộn BÊN TRONG (option scrollY của DataTables core trong
   tndgTuVungInitTable) — user phản hồi chọn nhiều Bài (multi-select) làm bảng quá dài, kéo theo
   cuộn cả TRANG. scrollY tự bọc bảng trong 2 div .dataTables_scrollHead (header, không cuộn) +
   .dataTables_scrollBody (dữ liệu, cuộn dọc riêng) — viền/bo góc đặt trên .dataTables_scrollHead
   (trên cùng) + .dataTables_scrollBody (dưới, có thanh cuộn) để trông liền khối như 1 khung. */
#tuvung_datatable_wrap .dataTables_scrollHead{border-radius:8px 8px 0 0;overflow:hidden}
#tuvung_datatable_wrap .dataTables_scrollBody{
    border:1px solid var(--color-border);border-top:none;border-radius:0 0 8px 8px;
}
/* Spinner "Đang tải..." mỗi khi bảng vẽ lại (đổi trang/lọc Bài/gõ search/đổi Bản Mới-Cũ) — phần
   tử RIÊNG (`.tv-dt-loading-indicator`, chèn trong `initComplete` của `tndgTuVungInitTable`,
   new-home.js), KHÔNG phải `.dataTables_processing` có sẵn của DataTables (đã thử dùng cái có sẵn
   nhưng bị chính DataTables tự ý ẩn ngay khi draw() xong, phá vỡ độ trễ tối thiểu tự tính — xem
   giải thích đầy đủ tại khai báo `tndgTuVungDeferPass` trong new-home.js). Đặt ngay SAU
   `.dataTables_scrollBody` (đúng vùng hiển thị các dòng dữ liệu — user yêu cầu rõ "Ở DƯỚI chỗ show
   nội dung") và TRƯỚC cụm "tv-dt-bottom" (info + phân trang), nằm trong luồng DOM bình thường
   (không absolute) nên không cần toạ độ gì đặc biệt. Ẩn/hiện bằng class `.is-visible`
   (tndgTuVungShowProcessing()/tndgTuVungHideProcessing()) — không phải `display` toggle qua JS
   trực tiếp. */
.tv-dt-loading-indicator{
    display:none;justify-content:center;align-items:center;gap:7px;
    padding:10px 0 0;font-size:13px;font-weight:600;color:var(--color-primary);
}
.tv-dt-loading-indicator.is-visible{display:flex}
.tv-dt-loading-indicator .fa-spinner{font-size:13px}
#tuvung_datatable_wrap table.dataTable{width:100%!important;border-collapse:separate!important;border-spacing:0}
#tuvung_datatable_wrap table.dataTable thead th{
    background:var(--page-bg);color:#566787;font-weight:700;font-size:15px;
    border-bottom:2px solid var(--color-border)!important;white-space:nowrap;
    padding-top:14px;padding-bottom:14px;
}
#tuvung_datatable_wrap table.dataTable tbody td{
    border-color:var(--color-border)!important;font-size:16px;color:#212529;
    vertical-align:middle;padding-top:14px;padding-bottom:14px;
}
#tuvung_datatable_wrap table.dataTable thead th:first-child,
#tuvung_datatable_wrap table.dataTable tbody td:first-child{text-align:center}
/* Cột "Thao tác" (nút loa đọc từ vựng, columnDefs targets:6 trong new-home.js) — luôn là cột
   CUỐI CÙNG nên dùng :last-child thay vì đếm số thứ tự cứng, an toàn nếu sau này thêm/bớt cột
   giữa chừng. */
#tuvung_datatable_wrap table.dataTable thead th:last-child,
#tuvung_datatable_wrap table.dataTable tbody td:last-child{text-align:center;white-space:nowrap}
.tv-tts-btn{
    width:32px;height:32px;border-radius:50%;border:1px solid var(--color-border);
    background:#fff;color:var(--color-primary);display:inline-flex;align-items:center;
    justify-content:center;cursor:pointer;transition:background .15s ease,color .15s ease;
}
.tv-tts-btn:hover{background:var(--color-primary);color:#fff}
/* Trạng thái đang chờ Azure Speech trả về mp3 (is-loading, gắn/gỡ trong click handler của
   new-home.js) — quay icon loa để báo hiệu đang xử lý, tránh cảm giác "bấm không phản hồi" trong
   lúc chờ (lần đầu đọc 1 từ CHƯA có cache thường mất 0.5-1.5s gọi Azure). */
.tv-tts-btn.is-loading{pointer-events:none;opacity:.6}
.tv-tts-btn.is-loading i{animation:tv-tts-spin .8s linear infinite}
@keyframes tv-tts-spin{from{transform:rotate(0deg)}to{transform:rotate(360deg)}}
/* Cột "Bài" (dữ liệu gốc là <h5><span class="badge">Bài N</span></h5>) — h5 có margin mặc định
   (Bootstrap: margin-bottom:.5rem, không margin-top) khiến khối bị lệch xuống dưới dù td đã
   vertical-align:middle (margin của h5 không collapse với td vì td là 1 block formatting context
   riêng) — reset margin/line-height về 0 để badge nằm đúng giữa dòng theo cả 2 chiều. */
#tuvung_datatable_wrap table.dataTable tbody td h5{margin:0;line-height:1}
#tuvung_datatable_wrap table.dataTable tbody td .badge{vertical-align:middle}
/* Màu riêng theo CỘT — bản gốc không tô màu qua data.php mà qua CSS của theme cũ
   (tudien/css/main.css dòng ~4062: ".wrap-courses table tr td:nth-child(3){color:#993300}",
   dòng ~4066: "...td:nth-child(5){color:#008080}") — cột 3 = Từ Vựng (đỏ nâu), cột 5 = Âm Hán
   (teal). Thứ tự cột bảng ở đây giống hệt bản gốc (STT/Bài/Từ Vựng/Hán Tự/Âm Hán/Nghĩa) nên
   nth-child khớp trực tiếp, không cần đổi gì khác. */
#tuvung_datatable_wrap table.dataTable tbody td:nth-child(3){color:#993300!important}
#tuvung_datatable_wrap table.dataTable tbody td:nth-child(5){color:#008080!important}
#tuvung_datatable_wrap table.dataTable.table-striped tbody tr:nth-of-type(odd){background:var(--page-bg)}
#tuvung_datatable_wrap table.dataTable tbody tr:hover{background:rgba(var(--color-primary-rgb),.06)}
/* Dòng tiêu đề nhóm "《 BÀI N 》..." (RowGroup, option rowGroup.startRender trong new-home.js) —
   dùng THẲNG markup + class Bootstrap4 gốc (.alert.alert-primary/.badge.badge-pill.badge-danger,
   Bootstrap4 CSS đã load sẵn ở page-home.php dòng ~31) y hệt bản gốc /tudien/ban_moi/, KHÔNG tự
   vẽ lại kiểu pill teal riêng (bản đầu làm vậy bị chê không giống). Chỉ chỉnh khoảng cách quanh
   dòng này cho hợp với bảng, không đổi màu/kiểu của khối alert bên trong.*/
#tuvung_datatable_wrap tr.dtrg-group{background:transparent}
#tuvung_datatable_wrap tr.dtrg-group td{
    border:none!important;background:transparent;padding:0!important;
    line-height:0;font-size:0;
}
/* padding-top/bottom khớp đúng 14px như tbody td thường (xem rule phía trên) để hàng tiêu đề
   nhóm cao BẰNG hàng dữ liệu thường — trước để .75rem (12px) mặc định của Bootstrap .alert nên
   hàng này thấp hơn hẳn hàng dữ liệu (14px padding + font 16px). */
#tuvung_datatable_wrap tr.dtrg-group .alert{
    margin:0!important;padding:14px 1.25rem;font-size:14px;line-height:1.5;display:block;
    text-align:left;border-radius:0;border:none;
}
#tuvung_datatable_wrap mark{background:#fff3b0;color:inherit;padding:0 1px;border-radius:2px}

/* Thanh trên + dưới (đều info + phân trang) — dom:'<"tv-dt-top"ip>t<"tv-dt-bottom"ip>' trong
   tndgTuVungInitTable(). Các cụm info/phân trang DataTables tự đồng bộ trạng thái (bấm phân trang
   cụm nào cũng chuyển trang, info 2 cụm cùng cập nhật nội dung). Không có "l" (dropdown "Hiển
   thị") vì độ dài trang giờ tự động khớp theo ranh giới từng Bài (preDrawCallback), không còn cho
   chọn tay được nữa — và không có "f" (DataTables tự sinh ô search) vì đã dùng thẳng
   #search_tuvung_input có sẵn của trang chủ (xem homeJs.js). */
.tv-dt-top{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;margin-bottom:12px;padding-top:12px;border-top:1px solid var(--color-border);font-size:13.5px;color:#566787}
.tv-dt-bottom{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:10px;margin-top:16px;padding-top:16px;border-top:1px solid var(--color-border);font-size:13.5px;color:#566787}
.tv-dt-top .dataTables_paginate .pagination,
.tv-dt-bottom .dataTables_paginate .pagination{margin:0;gap:6px}
.tv-dt-top .dataTables_paginate .page-link,
.tv-dt-bottom .dataTables_paginate .page-link{
    border:1px solid var(--color-border);border-radius:8px!important;color:#566787;
    padding:6px 14px;font-size:13.5px;font-weight:600;
}
.tv-dt-top .dataTables_paginate .page-item.active .page-link,
.tv-dt-bottom .dataTables_paginate .page-item.active .page-link{
    background:var(--color-primary);border-color:var(--color-primary);color:#fff;
}
.tv-dt-top .dataTables_paginate .page-item.disabled .page-link,
.tv-dt-bottom .dataTables_paginate .page-item.disabled .page-link{opacity:.4}
/* "Trang X / Y" tự chèn giữa 2 nút Trang trước/Trang sau (tndgTuVungUpdatePageIndicator trong
   new-home.js) — chữ thường, không viền/nền như nút bấm thật, và KHÔNG áp dụng opacity:.4 dùng
   chung cho .page-item.disabled ở trên (span này tuy có class "disabled" để không bấm được,
   nhưng vẫn cần đọc rõ chữ, không mờ như nút Trang trước/sau lúc bị vô hiệu hoá ở đầu/cuối). */
.tv-dt-top .dataTables_paginate .page-item.tv-page-indicator .page-link,
.tv-dt-bottom .dataTables_paginate .page-item.tv-page-indicator .page-link{
    border:none;background:transparent;opacity:1;padding:6px 4px;cursor:default;
    font-weight:500;color:#566787;
}

@media (max-width:480px){
    .tv-version-card{padding:7px 14px 7px 8px;gap:8px}
    .tv-version-icon{width:34px;height:34px;border-radius:9px}
    .tv-version-icon svg{width:17px;height:17px}
    .tv-version-icon-badge{top:-5px;left:-5px;font-size:8px;padding:2px 3.5px}
    .tv-version-title{font-size:13px}
    .tv-version-sub{font-size:11.5px}
    .tv-dt-top{justify-content:center}
    .tv-dt-bottom{justify-content:center;text-align:center}
}
