/* CSS riêng cho trang Gia Sư (gia-su.html) + Hồ Sơ Gia Sư (gia-su-ho-so.html).
   Lưới và kích thước card sao chép đúng theo Preply (đo trực tiếp trên preply.com/en/online/math-tutors
   ở viewport 1280px): card 4 cột 160px / 1fr / 244px / 48px, 3 hàng 32px / 104px / 104px,
   gap 8px 16px, padding 24px, avatar 160×160. Màu sắc vẫn theo DESIGN_SYSTEM.md (navy/gold)
   chứ không lấy hồng/đen của Preply; bo góc + viền + bóng theo ÁO MỚI 25/08/2026 (token --ao-*
   khai ở cuối theme.css — file này nạp SAU theme.css nên phải tự dùng token, không được viết sắc). */

/* ===== Hàng kết quả: card bên trái + khung video bên phải ===== */
.tutor-row {
    display: grid;
    grid-template-columns: minmax(0, 1fr) minmax(320px, 400px);
    gap: 16px;
    /* start giống Preply: khung video giữ tỉ lệ 16:9 nên cao hơn card một chút, không bị bóp dẹt */
    align-items: start;
}
@media (max-width: 1023px) {
    .tutor-row { grid-template-columns: minmax(0, 1fr); }
    .tutor-row .tutor-video-panel { display: none; }
}

/* ===== Card gia sư ===== */
.tutor-card {
    display: grid;
    /* Cột giữa có sàn 200px để không bị bóp thành 3-4 chữ mỗi dòng trên màn 1200-1280px */
    grid-template-columns: 160px minmax(200px, 1fr) 244px 48px;
    grid-template-rows: 32px auto auto;
    grid-template-areas:
        "avatar heading  indicators favorite"
        "avatar maininfo indicators favorite"
        "avatar maininfo actions    actions";
    gap: 8px 16px;
    padding: 24px;
    background: var(--trang);
    /* Border luôn 2px để lúc hover chỉ đổi màu, không đẩy lệch layout (Preply cũng làm vậy).
       Viền ấm + bo 16px + bóng mềm theo áo mới 25/08. */
    border: 2px solid var(--ao-vien);
    border-radius: var(--ao-r-the);
    box-shadow: var(--ao-bong);
    transition: border-color 0.15s ease, box-shadow 0.15s ease;
}
.tutor-row:hover .tutor-card,
.tutor-row:focus-within .tutor-card {
    border-color: var(--navy-900);
}

.tutor-card__avatar     { grid-area: avatar; }
.tutor-card__heading    { grid-area: heading; }
.tutor-card__maininfo   { grid-area: maininfo; min-width: 0; }
.tutor-card__indicators { grid-area: indicators; }
.tutor-card__favorite   { grid-area: favorite; }
.tutor-card__actions    { grid-area: actions; }

.tutor-card__photo {
    width: 160px;
    height: 160px;
    object-fit: cover;
    /* Áo mới 25/08: ảnh đại diện bo 14px cùng họ với thẻ (áp cả cho <div> chữ cái đầu) */
    border-radius: var(--ao-r-nho);
}
/* Nền chỉ đặt cho thẻ <img> (màu chờ trong lúc ảnh chưa tải xong). Khi gia sư chưa có ảnh thật,
   chỗ này là một <div> chữ cái đầu dùng nền bg-navy-100 của Tailwind — file CSS trang nạp sau
   tailwind.css nên nếu để nền ở cả .tutor-card__photo thì nó đè mất lớp bg-navy-100 kia. */
img.tutor-card__photo {
    background: var(--navy-50);
}

/* ===== Ô CHỮ CÁI ĐẦU 28/08/2026 (đợt 1, hạng mục T3 của sandbox/ban-chi-dan-hinh-anh.md) =====
   VÌ SAO SỬA: bản cũ là nền bg-navy-100 chữ text-navy-800 (hai class Tailwind còn nằm trong
   gia-su.html dòng 341). Cặp màu đó nhạt tới mức người xem đọc ra là "ô đang chờ tải ảnh" chứ
   không phải một quyết định thiết kế. Mà VPath chưa có gia sư thật, nên ô này là phương án CHÍNH
   dùng lâu dài chứ không phải phương án dự phòng vài ngày. Nó phải trông có chủ ý.

   NGÔN NGỮ MỚI (giống class dùng chung .o-chu-dau đang được khai ở theme.css): nền navy-900 đặc,
   chữ cái gold-400 đậm 700 cỡ bằng 42 phần trăm cạnh ô, một vành gold-500 mờ 0,35 chạy cách mép
   trong 3px, và hoa văn giấy kẻ ô phủ mờ 0,10 để mặt navy không chết phẳng.
   Trang gia sư dùng bản VUÔNG BO GÓC 14px chứ không phải bản tròn, vì ảnh đại diện thật ở đây
   (img.tutor-card__photo phía trên) cũng bo 14px theo áo mới 25/08. Ô chữ và ô ảnh phải cùng dáng,
   nếu không thì một danh sách có gia sư đã có ảnh lẫn gia sư chưa có ảnh sẽ so le hai kiểu bo góc.

   VÌ SAO NHẮM `div.tutor-card__photo` CHỨ KHÔNG NHẮM `.o-chu-dau`: markup ở gia-su.html dòng 341
   hiện chưa mang class đó, và gia-su.html không thuộc phạm vi sửa của đợt này. Chọn `div` là chọn
   đúng nhánh v-else (ô chữ): nhánh có ảnh thật là thẻ <img>, còn khung chờ ở dòng 293 là thẻ
   <span>, nên cả hai đều không dính luật này. Khi nào markup được gắn thêm .o-chu-dau thì phần
   nền, chữ và vành ở đây trùng với class chung và gỡ bớt được, chỉ còn giữ lại ba biến thể theo cỡ
   cùng dáng vuông bên dưới.

   Đè được lên bg-navy-100 và text-4xl của Tailwind là nhờ độ đặc hiệu: `div.tutor-card__photo` là
   (0,1,1) còn class trần của Tailwind là (0,1,0). Không cần !important. */
div.tutor-card__photo {
    position: relative;
    background-color: var(--navy-900);
    color: var(--gold-400);
    font-weight: 700;
    /* 42 phần trăm của cạnh 160px. Ghi số tuyệt đối chứ không dùng em/%, vì cỡ chữ gốc của thẻ
       không cố định và ba biến thể dưới đây phải bám đúng ba cạnh 160 / 128 / 96. */
    font-size: 67px;
    line-height: 1;
    /* Hoa văn giấy kẻ ô 24px, một đường ngang một đường dọc mỗi ô, nét mờ 0,10 đúng như hạng mục
       T1. Viết thẳng thành data URI thay vì trỏ tới assets/anh/hoa-van/ke-o.svg vì file đó chưa
       tồn tại (T1 chưa làm), và data URI thì không cần thêm một lượt tải mạng cho một ô 160px.
       Màu nét ghi thô #FAF6EE (giấy kem, đúng token paper trong tailwind.config.js) chứ không
       var(--...): SVG trong background-image là một tài liệu riêng, nó KHÔNG đọc được biến CSS của
       trang, và currentColor trong đó cũng không kế thừa. Cùng lý do với rgba() ở .tutor-video__note.
       Nhịp "cứ 5 ô một đường đậm hơn" của T1 bị bỏ ở đây vì nhịp đó cần một ô lặp 120px, mà cạnh
       lớn nhất của ô này mới có 160px, tức chưa đủ hai nhịp để mắt nhận ra nhịp. */
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='24' height='24'%3E%3Cpath d='M24 0H0v24' fill='none' stroke='%23FAF6EE' stroke-width='1' stroke-opacity='0.1'/%3E%3C/svg%3E");
    background-size: 24px 24px;
    background-repeat: repeat;
}
/* Vành trong: đặt bằng phần tử giả thay vì box-shadow inset, vì spec đòi vành LÙI VÀO 3px so với
   mép chứ không nằm sát mép. Bán kính 11px = 14px của ô trừ 3px lùi vào, để hai đường bo đồng tâm.
   gold-500 ở độ mờ 0,35 phải ghi thô vì var() không nhét vào trong rgba() được. */
div.tutor-card__photo::before {
    content: "";
    position: absolute;
    inset: 3px;
    border: 1.5px solid rgba(192, 138, 46, 0.35);
    border-radius: 11px;
    pointer-events: none;
}

/* Cắt phần mô tả còn tối đa 3 dòng như Preply, phần còn lại mở bằng "Xem thêm" */
.tutor-card__bio {
    display: -webkit-box;
    -webkit-line-clamp: 3;
    -webkit-box-orient: vertical;
    overflow: hidden;
}
.tutor-card__bio--open { -webkit-line-clamp: unset; overflow: visible; }

/* Trên màn hẹp, xếp dọc lại thay vì giữ 4 cột cố định */
@media (min-width: 1024px) and (max-width: 1279px) {
    .tutor-card {
        grid-template-columns: 128px minmax(180px, 1fr) 200px 40px;
    }
    .tutor-card__photo { width: 128px; height: 128px; }
    /* Biến thể 128px: vẫn GIỮ ĐỦ vành và hoa văn, chỉ hạ cỡ chữ cho đúng 42 phần trăm cạnh
       (0,42 x 128 = 54px). Ô 24px của hoa văn lặp được 5,3 lần trên cạnh này nên vẫn đọc ra là
       giấy kẻ ô, chưa thành vệt bẩn. */
    div.tutor-card__photo { font-size: 54px; }
}

@media (max-width: 767px) {
    .tutor-card {
        grid-template-columns: 96px minmax(0, 1fr);
        grid-template-rows: auto;
        grid-template-areas:
            "avatar heading"
            "avatar indicators"
            "maininfo maininfo"
            "actions actions";
        padding: 16px;
    }
    .tutor-card__favorite { display: none; }
    .tutor-card__photo { width: 96px; height: 96px; }
    /* Biến thể 96px: BỎ HOA VĂN, giữ vành và chữ. Lý do bỏ chứ không thu nhỏ hoa văn: cạnh 96px
       chỉ chứa được 4 ô 24px, và trên màn điện thoại mật độ điểm ảnh cao thì bốn đường mảnh mờ 0,10
       không còn đọc ra là giấy kẻ ô nữa, nó thành vệt xước trên mặt navy. Thà sạch còn hơn bẩn.
       Cỡ chữ 40px = 42 phần trăm của 96. */
    div.tutor-card__photo {
        font-size: 40px;
        background-image: none;
    }
}

/* ===== Khung video bên phải — phát khi rê chuột vào card ===== */
/* Khung video chỉ hiện khi rê chuột vào đúng hàng của gia sư đó — mặc định cả trang
   không bày sẵn video của toàn bộ gia sư. Vẫn giữ nguyên ô chiếm chỗ (chỉ ẩn hình,
   không dùng display:none) để lúc hiện ra không đẩy card xê dịch. */
.tutor-video-panel {
    background: var(--trang);
    border: 2px solid var(--navy-900);
    border-radius: var(--ao-r-the); /* áo mới 25/08: khung tròn 16px như thẻ */
    padding: 24px;
    display: flex;
    flex-direction: column;
    opacity: 0;
    visibility: hidden;
    transform: translateX(-8px);
    transition: opacity 0.18s ease, visibility 0.18s ease, transform 0.18s ease;
}
/* Đợt 1 mục 1.4: luật này CỐ Ý KHÔNG bọc trong @media (hover: hover) and (pointer: fine), khác
   với hai luật scale ở dưới. Lý do: hover ở đây MANG THÔNG TIN chứ không trang trí, nó là cách
   duy nhất mở khung video giới thiệu. Bọc lại là xóa hẳn tính năng trên máy cảm ứng.
   Nhánh :focus-within đi kèm cũng vì lý do đó: nội dung chỉ mở được bằng chuột là rào cản bàn
   phím, người đi tab vào card phải mở được khung video y như người rê chuột. */
.tutor-row:hover .tutor-video-panel,
.tutor-row:focus-within .tutor-video-panel {
    opacity: 1;
    visibility: visible;
    transform: none;
}

.tutor-video {
    position: relative;
    aspect-ratio: 16 / 9;
    /* overflow hidden có sẵn nên bo 14px (áo mới 25/08) cắt gọn cả video lẫn ảnh bìa phóng to */
    border-radius: var(--ao-r-nho);
    overflow: hidden;
    background: var(--navy-900);
}
.tutor-video video,
.tutor-video img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    display: block;
}
/* Ảnh bìa phóng nhẹ khi hover để khung video có phản hồi ngay cả khi gia sư chưa có video */
.tutor-video img { transition: transform 0.6s ease; }
/* Đợt 1 mục 1.3: luật hover CÓ TRANSFORM phải bọc trong @media (hover: hover) and (pointer: fine).
   Một cú chạm trên điện thoại sinh ra :hover giả rồi treo ở đó, nên ảnh bìa phóng to 1.06 lần và
   nằm luôn như vậy. Đây thuần túy là trang trí (khác hẳn luật mở khung video ở trên) nên chặn
   được, máy cảm ứng không mất thông tin nào. */
@media (hover: hover) and (pointer: fine) {
    .tutor-row:hover .tutor-video img { transform: scale(1.06); }
}

/* Ảnh bìa nằm đè lên video, mờ dần đi khi video bắt đầu chạy */
.tutor-video__poster {
    position: absolute;
    inset: 0;
    opacity: 1;
    transition: opacity 0.3s ease;
}
.tutor-video--playing .tutor-video__poster { opacity: 0; pointer-events: none; }

.tutor-video__play {
    position: absolute;
    right: 12px;
    bottom: 12px;
    width: 48px;
    height: 48px;
    display: flex;
    align-items: center;
    justify-content: center;
    background: var(--gold-500);
    color: var(--navy-900);
    border: none;
    border-radius: var(--ao-r-vien-thuoc); /* áo mới 25/08: nút phát thành hình tròn */
    cursor: pointer;
    transition: transform 0.2s ease, opacity 0.2s ease;
}
/* Đợt 1 mục 1.3: cùng lý do với ảnh bìa ở trên, nút phát phình to 1.1 lần rồi treo sau mỗi cú
   chạm trên điện thoại. Chỉ bọc phần transform; nút vẫn bấm được y như cũ ở mọi thiết bị. */
@media (hover: hover) and (pointer: fine) {
    .tutor-row:hover .tutor-video__play { transform: scale(1.1); }
}
.tutor-video--playing .tutor-video__play { opacity: 0; pointer-events: none; }

.tutor-video__note {
    position: absolute;
    left: 12px;
    bottom: 12px;
    /* navy-900 ở độ mờ 85% — var() không nhét vào trong rgba() được nên giữ số thô */
    background: rgba(13, 31, 51, 0.85);
    /* Áo mới 25/08: hết chữ kem paper-dim, về trắng; huy hiệu thành viên thuốc */
    color: var(--trang);
    border-radius: var(--ao-r-vien-thuoc);
    font-size: 10px;
    font-weight: 600;
    letter-spacing: 0.1em;
    text-transform: uppercase;
    padding: 4px 8px;
}

/* ===== Thanh điểm theo tiêu chí (dùng ở cả 2 trang) ===== */
.criteria-bar {
    height: 4px;
    background: var(--stone-200);
    border-radius: var(--ao-r-vien-thuoc); /* áo mới 25/08: thanh điểm bo tròn hai đầu */
    overflow: hidden;
}
.criteria-bar__fill {
    height: 100%;
    background: var(--navy-900);
    transition: width 0.6s ease;
}

/* ===== Ô lọc + dropdown tự dựng =====
   Dùng thay cho <select> native: hộp thả của macOS/Windows không nhận được font, màu và
   góc sắc của design system nên trông như của một site khác dán vào. */
.filter-box { position: relative; }

.filter-trigger {
    display: block;
    width: 100%;
    text-align: left;
    background: var(--trang);
    border: 1px solid var(--ao-vien);
    border-radius: 11px; /* áo mới 25/08: ô lọc bo như ô nhập */
    padding: 8px 40px 8px 16px;
    cursor: pointer;
    transition: border-color 0.15s ease;
}
.filter-trigger:hover { border-color: var(--navy-300); }
.filter-trigger--open { border-color: var(--navy-900); }

.filter-trigger__value {
    display: block;
    font-size: 14px;
    font-weight: 700;
    color: var(--navy-900);
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
}
.filter-trigger__chevron {
    position: absolute;
    right: 16px;
    bottom: 14px;
    font-size: 10px;
    color: var(--stone-400);
    pointer-events: none;
    transition: transform 0.15s ease;
}
.filter-trigger--open .filter-trigger__chevron { transform: rotate(180deg); }

.filter-panel {
    position: absolute;
    top: calc(100% + 4px);
    left: 0;
    min-width: 100%;
    z-index: 30;
    background: var(--trang);
    border: 1px solid var(--ao-vien);
    /* Áo mới 25/08: panel bo 14px; overflow hidden để nền hover của dòng option
       không lòi ra ngoài góc tròn */
    border-radius: var(--ao-r-nho);
    overflow: hidden;
    /* Bóng đổ = navy-900 ở độ mờ 12% */
    box-shadow: 0 8px 24px rgba(13, 31, 51, 0.12);
    padding: 8px 0;
}
/* Ô cuối hàng: neo panel về bên phải để không tràn khỏi mép phải trang */
.filter-panel--right { left: auto; right: 0; }

.filter-option {
    display: flex;
    align-items: center;
    gap: 8px;
    width: 100%;
    padding: 10px 16px;
    text-align: left;
    font-size: 14px;
    color: var(--stone-700);
    white-space: nowrap;
    transition: background-color 0.12s ease;
}
/* Áo mới 25/08: hover hết nền kem paper-dim, dùng dải ấm của trang chủ */
.filter-option:hover { background: var(--ao-nen-am); }
.filter-option--active { font-weight: 700; color: var(--navy-900); }

/* Dấu tick chiếm chỗ sẵn kể cả khi ẩn, để chữ các dòng thẳng hàng nhau */
.filter-option__check { font-size: 10px; width: 12px; visibility: hidden; }
.filter-option--active .filter-option__check { visibility: visible; }

/* ===== Panel học phí: biểu đồ cột + thanh trượt 2 đầu ===== */
.filter-panel--price { padding: 24px; width: 360px; }

.price-histogram {
    display: flex;
    align-items: flex-end;
    gap: 2px;
    height: 64px;
    margin-bottom: 8px;
}
.price-histogram__bar {
    flex: 1;
    min-height: 2px;
    background: var(--gold-500);
    transition: background-color 0.15s ease, height 0.2s ease;
}
.price-histogram__bar--dim { background: var(--stone-200); }

/* Hai <input type="range"> chồng lên nhau trên cùng một đường ray: cả thanh không nhận
   chuột (pointer-events: none), chỉ riêng 2 nút tròn nhận — nhờ vậy kéo được đầu nào
   cũng đúng, không bị thanh phía trên nuốt mất sự kiện của thanh phía dưới. */
.price-slider { position: relative; height: 24px; }

.price-slider__track,
.price-slider__fill {
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
    height: 3px;
}
.price-slider__track { left: 0; right: 0; background: var(--stone-200); }
.price-slider__fill { background: var(--navy-900); }

.price-slider__input {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 24px;
    margin: 0;
    background: none;
    appearance: none;
    -webkit-appearance: none;
    pointer-events: none;
}
.price-slider__input:focus { outline: none; }

.price-slider__input::-webkit-slider-thumb {
    appearance: none;
    -webkit-appearance: none;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    background: var(--trang);
    border: 2px solid var(--navy-900);
    cursor: grab;
    pointer-events: auto;
}
.price-slider__input::-webkit-slider-thumb:active { cursor: grabbing; }
.price-slider__input::-moz-range-thumb {
    width: 20px;
    height: 20px;
    border-radius: 50%;
    background: var(--trang);
    border: 2px solid var(--navy-900);
    cursor: grab;
    pointer-events: auto;
}
/* Vòng focus = gold-500 ở độ mờ 40% */
.price-slider__input:focus-visible::-webkit-slider-thumb { box-shadow: 0 0 0 3px rgba(192, 138, 46, 0.4); }

.price-input {
    display: flex;
    align-items: center;
    gap: 4px;
    background: var(--trang);
    border: 1px solid var(--ao-vien);
    border-radius: 11px; /* áo mới 25/08: ô nhập bo 11px */
    padding: 8px 12px;
    transition: border-color 0.15s ease;
}
.price-input:focus-within { border-color: var(--navy-900); }
.price-input__field {
    width: 100%;
    min-width: 0;
    background: transparent;
    font-size: 14px;
    font-weight: 700;
    color: var(--navy-900);
}
.price-input__field:focus { outline: none; }
.price-input__unit { font-size: 12px; font-weight: 600; color: var(--stone-400); }

/* ===== Áo mới 25/08/2026 — phần bù cho markup không mang class bo góc =====
   Ô tìm kiếm ở gia-su.html là <label> bọc <input type="search"> (viền nằm ở label, input
   trong suốt) nên lớp đè theo class rounded-sm của theme.css không với tới: bo 11px tại đây
   cho đúng chuẩn ô nhập. :has đã dùng sẵn trong theme.css (body:has) nên không lo hỗ trợ. */
label:has(> input[type="search"]) { border-radius: 11px; }

/* ===== ÁO MỚI 25/08/2026 — chữa nút chọn ngày bị viên thuốc bóp méo =====
   Áo mới đặt luật "button.rounded-sm = viên thuốc 999px". Luật đó đúng cho nút thường (thấp,
   rộng), nhưng dải chọn ngày ở khối đặt lịch là nút VUÔNG ĐỨNG 56x64px — bán kính 999px kẹp
   xuống còn nửa cạnh ngắn (28px) nên nút thành viên nhộng dựng đứng, hai đầu phình tròn nuốt
   mất thứ/ngày bên trong.
   Chỉ nhắm đúng nút ngày (.w-14.h-16). Nút thời lượng và giờ bắt đầu cùng khối vẫn để viên
   thuốc — chúng thấp-rộng nên đúng dáng chip của trang chủ. */
#dat-lich button.w-14.h-16{border-radius:var(--ao-r-nho,14px)}

/* Đợt 4 mục 4.1: hàng khung chờ mượn class .tutor-row và .tutor-card để trùng khít bố cục thật,
   nhưng nó không phải hàng bấm được. Chặn con trỏ để .tutor-row:hover .tutor-card không sáng viền
   navy và .tutor-row:hover không cố mở khung video của một gia sư chưa tồn tại. Vùng này đã mang
   aria-hidden="true" nên trơ với con trỏ là đúng ngữ nghĩa, không phải mẹo. */
.tutor-row--cho {
    pointer-events: none;
}

/* ---- Khung chữ của trang Gia Sư 1:1 (Giai đoạn 8, 03/09/2026) ----
 * <main> nay tràn ngang để ba dải nền chạm hai mép màn hình, nên bề ngang đọc được phải do lớp
 * này giữ. Con số trùng đúng với max-w-7xl + px-4/sm:px-6/lg:px-8 mà <main> mang trước đây, để
 * đội ngũ gia sư không xê dịch một pixel nào so với bản cũ.
 */
.gs-trong {
    max-width: 80rem;
    margin-inline: auto;
    padding-inline: 1rem;
    width: 100%;
}
@media (min-width: 640px) { .gs-trong { padding-inline: 1.5rem; } }
@media (min-width: 1024px) { .gs-trong { padding-inline: 2rem; } }

/* ==========================================================================
   BA KHỐI CMS CỦA TRANG GIA SƯ (Giai đoạn 8 lượt hai, 03/09/2026)
   Vinh danh học sinh, dải ảnh lớp học, đội ngũ. Bộ lọc và danh sách chọn gia
   sư đã gỡ hẳn khỏi trang, xem chú thích ở đầu assets/js/pages/gia-su.page.3f672289.js.
   ========================================================================== */

/* ---- Ảnh người: dùng chung cho học sinh vinh danh và nhóm sáng lập ----
   Ô chữ cái đầu là bản dự phòng khi chưa có ảnh, KHÔNG phải ảnh sinh tự động từ
   dịch vụ ngoài: toàn site đã bỏ api.dicebear.com vì nó nhận nguyên văn tên
   người dùng qua URL ảnh. */
.gs-anh-nguoi {
    width: 72px;
    height: 72px;
    border-radius: var(--ao-r-nho, 14px);
    object-fit: cover;
    background: var(--ao-nen-am, #F2EBDC);
    border: 1px solid var(--ao-vien, #E8E6E1);
}

.gs-anh-nguoi--chu {
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 26px;
    font-weight: 800;
    line-height: 1;
    color: var(--gold-400, #D1A544);
    background: var(--navy-900, #0D1F33);
    border-color: var(--navy-900, #0D1F33);
}

/* Thẻ sáng lập rộng hơn nên ảnh cũng lớn hơn, giữ đúng tỉ lệ ô vuông */
.gs-anh-nguoi--to { width: 104px; height: 104px; font-size: 36px; }

/* ---- Lời chia sẻ của học sinh ----
   Gạch dọc vàng cộng chữ nghiêng để mắt đọc ra ngay đây là lời của em nói, không
   phải câu quảng cáo do VPath viết. Dấu ngoặc kép vẽ bằng ::before nên KHÔNG nằm
   trong chuỗi văn bản: nội dung do admin gõ, thêm ký tự vào chuỗi là sửa lời
   người khác. */
.gs-chia-se {
    border-left: 3px solid var(--gold-400, #D1A544);
    padding-left: 14px;
    font-style: italic;
    font-size: 14px;
    line-height: 1.65;
    color: var(--ao-chu, #3F4A56);
}

/* Dải ảnh lớp học chạy ngang (.gs-dai) KHÔNG nằm ở file này mà ở assets/css/theme.css: khối
   'gia-su' của trang chủ dùng đúng bộ class đó, mà trang chủ không nạp gia-su.css. Hai bản sao của
   cùng một dải là hai bản sẽ lệch nhau ở lần sửa thứ nhất. */

/* ==========================================================================
   THẺ GIA SƯ TIÊU BIỂU
   Khuôn theo mẫu chủ dự án gửi: ảnh trên nền navy, tên trên một dải đặc, rồi
   môn và thông tin. Đây là thẻ TĨNH do CMS cấp, không phải thẻ chọn gia sư:
   không có giá, không có nút đặt lịch, không link tới hồ sơ nào.
   ========================================================================== */
.gs-the {
    display: flex;
    flex-direction: column;
    background: #fff;
    border: 1px solid var(--ao-vien, #E8E6E1);
    border-radius: var(--ao-r-the, 16px);
    overflow: hidden;
    box-shadow: var(--ao-bong);
}

.gs-the__anh {
    position: relative;
    aspect-ratio: 4 / 5;
    background: var(--navy-900, #0D1F33);
    display: flex;
    align-items: center;
    justify-content: center;
}

.gs-the__anh img {
    width: 100%;
    height: 100%;
    object-fit: cover;
    /* object-position: top — mặt người thường nằm ở phần trên khung ảnh, cắt từ
       giữa là mất trán và cắt mất một phần đầu. */
    object-position: top center;
}

.gs-the__chu {
    font-size: 56px;
    font-weight: 800;
    line-height: 1;
    color: var(--gold-400, #D1A544);
}

.gs-the__ten {
    background: var(--navy-900, #0D1F33);
    color: #fff;
    font-weight: 800;
    font-size: 15px;
    line-height: 1.3;
    text-align: center;
    padding: 12px 14px;
}

.gs-the__than {
    padding: 14px;
    text-align: center;
    /* Đẩy thẻ cao bằng nhau trong lưới: phần thân giãn ra chứ không phải ảnh, vì
       ảnh giãn là méo mặt người. */
    flex: 1 1 auto;
}

.gs-the__mon {
    font-size: 13px;
    font-weight: 700;
    color: var(--gold-600, #C08A2E);
    line-height: 1.45;
}

.gs-the__tt {
    margin-top: 8px;
    font-size: 12.5px;
    line-height: 1.6;
    color: var(--ao-chu, #3F4A56);
    white-space: pre-line;
}
