/**
 * gcc-creator.css — Giao diện tạo thiệp, viết mới hoàn toàn.
 *
 * THAY THẾ ba file: iphone-chat.css (728 dòng), gcc-chat-mode.css (1326 dòng)
 * và gcc-layout-center.css (573 dòng override). Hai file đầu dựng một chiếc
 * iPhone giả — khung máy, tai thỏ, thanh trạng thái, vạch home — với những
 * chuỗi :not() độ đặc hiệu 0,9,1 kèm !important. Bố cục mới không dùng khung
 * máy, nên mọi thứ ở đó chỉ còn là vật cản: mỗi thay đổi nhỏ phải viết một
 * override đặc hiệu hơn nữa. Bỏ hẳn thì không cần một chữ !important nào.
 *
 * Màu lấy từ token của trang (css/theme.css) nên tự đúng ở cả giao diện sáng
 * lẫn tối — bản cũ viết cứng màu tối vì luôn nằm trên "màn hình" nền trắng.
 */

/* ══════════════════════════════════════════════════════════════════════════
 * 1. BỐ CỤC — một cột, preview ở giữa, hộp soạn dưới
 * ══════════════════════════════════════════════════════════════════════════ */
/* ══════════════════════════════════════════════════════════════════════════
 * BỘ TOKEN CỦA RIÊNG FILE NÀY
 * ══════════════════════════════════════════════════════════════════════════
 * Các tấm nổi (bảng hạn mức, hộp xác nhận, tấm trượt tài khoản) TUYỆT ĐỐI
 * không dùng --ink / --card / --surface-2. Đo trên trang thật: ở phạm vi trong
 * khung chat, --ink ra #333333 và --card ra TRẮNG, dù trên <body> --card là
 * #161616 — token bị định nghĩa lại ở tầng gần hơn. Hậu quả là chữ #333 nằm
 * trên nền #1c1c1e, tương phản 1.28: nhìn như chìm hẳn vào nền đen.
 * Tiền tố gcc-pnl- để không đụng tên với bất kỳ bộ token nào khác.
 * Nền phải ĐỤC: vài luật trong dự án này dùng token nền làm màu CHỮ. */
:root {
    /* Mũi tên gửi: nét bo tròn, cùng ngôn ngữ hình với các biểu tượng khác
       trong trang (stroke 2px, đầu nét bo). Để ở biến để chỉ khai báo một
       lần và sửa một chỗ. */
    --gcc-icon-gui: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M12 20V5'/%3E%3Cpath d='M5 12l7-7 7 7'/%3E%3C/svg%3E");
    --gcc-pnl-bg: #ffffff;
    --gcc-pnl-fg: #1a1a1a;
    --gcc-pnl-line: rgba(0, 0, 0, .14);
}

:root[data-theme="dark"],
:root:not([data-theme="light"]) {
    --gcc-pnl-bg: #1c1c1e;
    --gcc-pnl-fg: #ececec;
    --gcc-pnl-line: rgba(127, 127, 127, .3);
}

/* ══════════════════════════════════════════════════════════════════════════
 * 0. THANH ĐIỀU HƯỚNG DỌC (js/gcc-sidebar.js)
 * ══════════════════════════════════════════════════════════════════════════ */

/* Bề ngang để MỘT chỗ: cả sidebar lẫn phần lùi của khung làm việc đều đọc
   biến này. Đặt hai con số rời nhau thì sớm muộn lệch, và lệch kiểu này biểu
   hiện ra là nội dung chui xuống dưới thanh. */
:root { --gcc-sb-w: 232px; }
body.gcc-sb-collapsed { --gcc-sb-w: 56px; }

.gcc-sidebar {
    position: fixed;
    inset: 0 auto 0 0;
    z-index: 120;
    width: var(--gcc-sb-w);
    display: flex;
    flex-direction: column;
    gap: 4px;
    padding: 10px 8px;
    box-sizing: border-box;
    /* Đục, không trong suốt: khung làm việc cuộn ngay sát bên, nền trong suốt
       thì chữ chạy mờ mờ sau các mục điều hướng. */
    background: #141414;
    border-right: 1px solid rgba(127, 127, 127, .16);
    color: #e8e8e8;
    font-size: 13.5px;
    overflow: hidden;
    transition: width .16s ease;
}

:root[data-theme="light"] .gcc-sidebar {
    background: #f7f7f7;
    color: #1a1a1a;
}

/* Khung làm việc lùi đúng bằng bề ngang thanh. position:fixed nên thanh không
   chiếm chỗ trong luồng — thiếu dòng này thì nó đè lên cột trái. */
body.gcc-has-sidebar .gcc-page-wrap { padding-left: var(--gcc-sb-w); }

.gcc-sb-head {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 6px;
    padding: 4px 6px 10px;
}

.gcc-sb-brand {
    display: flex;
    align-items: center;
    gap: 9px;
    color: inherit;
    text-decoration: none;
    font-weight: 700;
    letter-spacing: .2px;
    white-space: nowrap;
}

.gcc-sb-toggle {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 26px;
    height: 26px;
    flex: 0 0 auto;
    border: 0;
    border-radius: 7px;
    background: none;
    color: inherit;
    cursor: pointer;
}

.gcc-sb-toggle:hover { background: rgba(127, 127, 127, .18); }

.gcc-sb-nav { display: flex; flex-direction: column; gap: 2px; }

/* Đẩy phần tài khoản xuống đáy */
.gcc-sb-foot {
    margin-top: auto;
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding-top: 8px;
    border-top: 1px solid rgba(127, 127, 127, .16);
}

.gcc-sb-item,
.gcc-sb-user {
    display: flex;
    align-items: center;
    gap: 10px;
    /* Ô vuông 34px khi thu: biểu tượng phải đứng yên tại chỗ lúc thu/mở, nếu
       nó nhảy ngang thì mắt mất dấu mục đang chọn. */
    min-height: 34px;
    padding: 7px 8px;
    border: 0;
    border-radius: 8px;
    background: none;
    color: inherit;
    font: inherit;
    text-align: left;
    text-decoration: none;
    white-space: nowrap;
    cursor: pointer;
}

.gcc-sb-item svg,
.gcc-sb-avatar { flex: 0 0 auto; }

.gcc-sb-item:hover { background: rgba(127, 127, 127, .18); }

.gcc-sb-item.is-active {
    background: rgba(127, 127, 127, .26);
    font-weight: 600;
}

.gcc-sb-avatar {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    width: 20px;
    height: 20px;
    border-radius: 50%;
    background: #2f6bff;
    color: #fff;
    font-size: 11px;
    font-weight: 700;
}

.gcc-sb-email {
    overflow: hidden;
    text-overflow: ellipsis;
    opacity: .7;
    font-size: 12px;
}

.gcc-sb-user { cursor: default; }

/* Thu về rail: giấu chữ, giữ biểu tượng. display:none chứ không phải opacity —
   chữ ẩn bằng opacity vẫn chiếm chỗ và vẫn bắt được chuột. */
body.gcc-sb-collapsed .gcc-sb-text { display: none; }
body.gcc-sb-collapsed .gcc-sb-head { justify-content: center; padding-inline: 0; }
body.gcc-sb-collapsed .gcc-sb-brand { display: none; }
body.gcc-sb-collapsed .gcc-sb-item,
body.gcc-sb-collapsed .gcc-sb-user { justify-content: center; padding-inline: 0; }

/* Khổ hẹp: thanh tự về rail. 232px trên màn điện thoại là ăn hơn nửa bề ngang
   khung làm việc. */
@media (max-width: 900px) {
    :root { --gcc-sb-w: 52px; }
    .gcc-sidebar .gcc-sb-text { display: none; }
    .gcc-sidebar .gcc-sb-brand { display: none; }
    .gcc-sb-head { justify-content: center; padding-inline: 0; }
    .gcc-sb-item, .gcc-sb-user { justify-content: center; padding-inline: 0; }
}

/* HAI CỘT: trái là khung làm việc, phải là khung xem trước.
   Trước đây từng xếp một cột với preview ở giữa; khi đó phần làm việc bị đẩy
   xuống dưới màn hình nên vừa gõ vừa xem không tiện. Hai cột giữ cả hai thứ
   trong tầm mắt cùng lúc. */
/* Vỏ trang: kín bề ngang màn hình.
   Bản cũ kẹp 1200px + 24px lề trong một khối <style> nội tuyến ở create.html —
   khối đó đứng SAU thẻ <link> nên cùng độ đặc hiệu vẫn thắng, viết đè ở đây vô
   ích. Đã xoá hẳn luật nội tuyến đó thay vì leo thang độ đặc hiệu.
   Trang tạo thiệp là khung làm việc hai cột, không phải bài đọc: kẹp bề ngang
   thì dải xem trước dừng giữa chừng, thừa hai vệt nền trống hai bên. */
.gcc-page-wrap {
    max-width: none;
    margin: 0;
    padding-inline: 0;
}

.gcc-two-col {
    display: flex;
    flex-direction: row;
    align-items: flex-start;
    /* Không khe giữa hai cột: chia đôi thì ranh giới là MỘT đường, khe hở
       biến nó thành hai vệt và hộp soạn không bao giờ tới sát được. */
    gap: 0;
    /* Kín bề ngang màn hình. Lề ngang bằng 0 để dải nền cột phải chạm mép phải,
       không còn khe hở. Cột trái vẫn có trần 640px và tự căn giữa nên chữ
       không bị kéo dài ra thành dòng khó đọc. */
    max-width: none;
    margin: 0;
    /* Lề bằng 0 cả bốn phía: dải nền bên phải phải chạm đủ bốn mép, không còn
       vệt đen mỏng phía trên/dưới. Khoảng thở chuyển hết xuống cột trái. */
    padding: 0;
}

.gcc-two-col > .gcc-col--form {
    order: 1;
    flex: 1 1 auto;
    min-width: 0;
    /* Cột trái cao bằng màn hình để hộp soạn GHIM ĐÁY. Không có chiều cao thì
       cột chỉ cao bằng nội dung, và khi hội thoại còn ngắn thì hộp soạn trôi
       lên lửng lơ giữa trang. */
    display: flex;
    flex-direction: column;
    height: 100vh;
    min-height: 420px;
    padding-block: 16px 24px;
    /* Chiếm trọn nửa trái — hộp soạn chạy sát tới ranh giới với khung xem
       trước, không còn dải trống ở giữa. Trần 640px cũ khiến hộp co về giữa
       nửa trái và trông như bị bỏ rơi giữa vùng đen.
       Trần chỉ đặt lại khi THU khung xem trước (xem luật bên dưới): lúc đó cột
       này chiếm cả màn, một dòng dài quá 80 ký tự đọc rất mệt. */
    flex: 0 0 50%;
    max-width: 50%;
    margin-inline: 0;
    padding-inline: 24px;
    box-sizing: border-box;
}

/* Thu khung xem trước: không còn cột phải để chia, đặt lại trần bề rộng và căn
   giữa, nếu không hộp soạn kéo ngang cả màn. */
.gcc-two-col.gcc-pv-collapsed > .gcc-col--form {
    flex: 1 1 auto;
    max-width: 820px;
    margin-inline: auto;
}

.gcc-two-col > .gcc-col--preview {
    order: 2;
    /* Chia đôi đúng 50:50. Không đặt trần bề rộng: trần làm cột phải hẹp hơn
       nửa màn trên màn lớn, tỉ lệ lệch ngay. Thẻ thiệp bên trong tự có trần
       riêng nên rộng thêm cũng không phình to. */
    flex: 0 0 50%;
    max-width: 50%;
    /* Dính theo màn hình: cuộn phần hội thoại dài mà thiệp vẫn nằm trong tầm mắt */
    position: sticky;
    top: 16px;
    /* Nền riêng để tách bạch hai vùng: bên trái là chỗ làm việc, bên phải là
       chỗ xem kết quả. Trước đây cùng một nền nên thẻ thiệp trông như trôi nổi
       giữa trang, không rõ đâu là ranh giới.
       Xám trong suốt chứ không phải mã màu cố định — tự đúng ở cả giao diện
       sáng lẫn tối. */
    /* 0.07 quá nhạt: chồng lên nền #0d0d0d chỉ ra #1a1a1a — chênh 7/255, mắt
       không nhận ra là một vùng riêng. 0.22 cho ra khoảng #262626, tách bạch
       rõ mà vẫn không chói. */
    background: rgba(127, 127, 127, .22);
    /* KHÔNG bo góc, KHÔNG viền: nền phải là CẢ CỘT, một dải chạy hết chiều cao
       màn hình — không phải một cái hộp đóng khung trôi giữa cột. Cao bằng cột
       trái để hai vùng cắt nhau thành một đường thẳng dọc suốt trang. */
    border: 0;
    border-radius: 0;
    height: 100vh;
    min-height: 420px;
    /* Lề ngang bằng 0: thanh điều khiển phải chạm mép trên cùng của vùng nền,
       nếu còn padding-top thì nội dung cuộn lộ ra ở khe phía trên nó. Padding
       chuyển xuống từng phần tử con. */
    padding: 0;
    overflow-y: auto;
}

/* Thanh điều khiển GHIM ĐỈNH vùng xem trước — cột cuộn, thanh đứng yên.
   backdrop-filter thay vì một nền đục: nền cột là xám trong suốt nên chồng
   thêm một lớp trong suốt nữa vẫn nhìn xuyên qua, thẻ thiệp cuộn lên sẽ hiện
   mờ sau chữ PREVIEW. */
.gcc-two-col > .gcc-col--preview > .gcc-pv-bar {
    position: sticky;
    top: 0;
    z-index: 3;
    /* border-box BẮT BUỘC: luật .gcc-col--preview > * đặt width:100%, mà mặc
       định là content-box nên bề rộng thành 100% CỘNG padding — thanh tràn ra
       ngoài cột 18px mỗi bên và chữ PREVIEW lại dính đúng vào mép. Đo được:
       cột rộng 451, thanh rộng 487. */
    box-sizing: border-box;
    padding: 14px 18px;
    background: rgba(127, 127, 127, .16);
    backdrop-filter: blur(10px);
    -webkit-backdrop-filter: blur(10px);
}

/* Padding ngang trả lại cho phần còn lại (cột đã bỏ padding để ghim thanh). */
.gcc-two-col > .gcc-col--preview > *:not(.gcc-pv-bar) {
    box-sizing: border-box;
    padding-inline: 18px;
}

/* Thẻ thiệp căn giữa theo CHIỀU DỌC phần còn lại của cột.
   Trước đây nó dính ngay dưới thanh điều khiển rồi bỏ trống 267px phía dưới —
   đo được: cột cao 918, thanh 51, thẻ 600. Cho phần thân chiếm hết chỗ thừa
   rồi tự căn giữa; đồng thời chừa khoảng thở để chip Presets không chạm vào
   dải xám của thanh. */
.gcc-two-col > .gcc-col--preview > .gcc-preview-toggle {
    flex: 1 1 auto;
    min-height: 0;
    display: flex;
    flex-direction: column;
    justify-content: center;
    padding-block: 14px 18px;
}

.gcc-two-col > .gcc-col--preview > *:last-child { padding-bottom: 14px; }

/* Thu khung xem trước: cột phải biến mất, khung làm việc chiếm trọn. */
.gcc-two-col.gcc-pv-collapsed > .gcc-col--preview { display: none; }

/* Toàn màn hình */
.gcc-col--preview.gcc-pv-full {
    position: fixed;
    inset: 0;
    z-index: 200;
    max-width: none;
    flex: none;
    margin: 0;
    padding: 56px 20px 24px;
    background: var(--bg, #0d0d0d);
    border: 0;
    border-radius: 0;
    overflow: auto;
    justify-content: center;
}

/* Ẩn thanh cuộn ở khung xem trước — GIỮ nguyên khả năng cuộn.
   Khi phóng to, một vệt xám chạy dọc mép phải cắt ngang thẻ thiệp, phá luôn
   cảm giác đang xem sản phẩm cuối. Áp cho cả trạng thái thường lẫn toàn màn
   hình, vì cột phải cũng cuộn khi thiệp cao hơn màn. */
.gcc-col--preview,
.gcc-col--preview.gcc-pv-full,
.gcc-preview-toggle__panel {
    scrollbar-width: none;
    -ms-overflow-style: none;
}

.gcc-col--preview::-webkit-scrollbar,
.gcc-col--preview.gcc-pv-full::-webkit-scrollbar,
.gcc-preview-toggle__panel::-webkit-scrollbar { width: 0; height: 0; }

@media (max-width: 900px) {
    .gcc-two-col {
        flex-direction: column;
        align-items: center;
        max-width: 520px;
        padding: 12px 12px 24px;
    }
    .gcc-two-col > .gcc-col--preview {
        order: 1;
        flex: none;
        max-width: 100%;
        position: static;
        /* Xếp dọc thì cột không còn là một dải cạnh khung làm việc — cao bằng
           màn hình sẽ đẩy phần làm việc khuất hẳn xuống dưới. */
        height: auto;
        min-height: 0;
    }
    .gcc-two-col > .gcc-col--form { max-width: 100%; }
    .gcc-two-col > .gcc-col--form { order: 2; width: 100%; }
}

/* Bề rộng preview tách khỏi bề rộng hộp soạn: thẻ thiệp giữ tỉ lệ nên rộng
   thêm là cao thêm, còn hàng tiện ích lại cần chỗ ngang cho 9 phần tử. */
.gcc-col--preview {
    /* flex để chặn margin collapse — lề trên của thẻ thiệp từng thoát ra
       ngoài cột, làm cột ngắn hơn nội dung và đè lên hộp soạn. */
    display: flex;
    flex-direction: column;
    align-items: center;
    margin: 0 auto;
}

/* align-items:center của cột flex làm con co về bề rộng NỘI DUNG. Chuỗi bọc
   khung xem trước không có bề rộng nội tại nên sập về 0 và thẻ thiệp còn 16px.
   Cho cả chuỗi chiếm trọn bề ngang cột. */
.gcc-col--preview > *,
.gcc-preview-toggle,
.gcc-preview-toggle__panel,
.gcc-preview-toggle__panel > .gcc-col--preview {
    width: 100%;
    max-width: 100%;
}

/* Cột lồng bên trong panel: bỏ dịch chuyển relative của bản cũ (offset kiểu
   relative không tính vào chiều cao cha nên phần tử tràn xuống đè hộp soạn). */
.gcc-preview-toggle__panel > .gcc-col--preview { position: static; }

.gcc-chat-shell {
    display: flex;
    flex-direction: column;
    flex: 1 1 auto;
    min-height: 0;
    width: 100%;
    /* KHÔNG var(--ink): xem ghi chú ở bộ token trên. gcc-layout-center.js hiện
       còn đặt màu nội tuyến để vượt qua đúng lỗi này — luật đúng ở đây khiến
       cách chữa bằng JS đó không còn là thứ duy nhất giữ chữ đọc được. */
    color: var(--gcc-pnl-fg);
    font-family: var(--sans, 'Be Vietnam Pro', system-ui, sans-serif);
}

.gcc-screen {
    display: flex;
    flex-direction: column;
    gap: 10px;
    /* flex:1 + min-height:0 — cặp bắt buộc để phần cuộn bên trong hoạt động.
       Thiếu min-height:0 thì flex item không co nhỏ hơn nội dung, dòng hội
       thoại đẩy cả cột dài ra và hộp soạn lại rời khỏi đáy. */
    flex: 1 1 auto;
    min-height: 0;
}

/* Vỏ khung máy: không còn dùng. Giữ trong DOM vì các module khác vẫn truy vấn
   tới, nhưng không vẽ gì. */
.gcc-ios-statusbar,
.gcc-iphone-btn,
.gcc-iphone-btn-power,
.gcc-iphone-btn-volup,
.gcc-iphone-btn-voldown,
.gcc-chat-header { display: none; }

/* Vạch home vẫn là một nút mở menu — giấu khỏi mắt, không khỏi bàn phím. */
.gcc-iphone-home-btn {
    position: absolute;
    width: 1px; height: 1px;
    overflow: hidden;
    opacity: 0;
}

/* ══════════════════════════════════════════════════════════════════════════
 * 2. DÒNG HỘI THOẠI
 * ══════════════════════════════════════════════════════════════════════════ */
.gcc-chat-stream {
    display: flex;
    flex-direction: column;
    gap: 12px;
    /* Giãn lấp hết chỗ trống rồi mới cuộn — đây là thứ đẩy hộp soạn xuống đáy. */
    flex: 1 1 auto;
    min-height: 0;
    overflow-y: auto;
    padding: 2px;
    /* Nội dung dồn xuống dưới: tin mới nhất luôn nằm sát hộp soạn, giống mọi
       khung hội thoại. */
    justify-content: flex-end;
    /* Ẩn thanh cuộn nhưng GIỮ khả năng cuộn. Thanh cuộn kiểu cũ là một vệt
       xám chạy dọc cạnh thẻ thiệp, cắt ngang bố cục. */
    scrollbar-width: none;
    -ms-overflow-style: none;
}

.gcc-chat-stream::-webkit-scrollbar,
.gcc-chat-input-mwac::-webkit-scrollbar,
.gcc-chat-final-summary::-webkit-scrollbar { width: 0; height: 0; }

.gcc-chat-input-mwac,
.gcc-chat-final-summary { scrollbar-width: none; -ms-overflow-style: none; }

.gcc-chat-bubble {
    font-size: 14px;
    line-height: 1.55;
    max-width: 88%;
}

/* KHÔNG dùng var(--surface) ở đây: biến đó bị định nghĩa lại ở một tầng gần
   hơn với giá trị SÁNG (#f7f7f7), nên nền bong bóng ra gần trắng trong khi chữ
   sáng — đo được tương phản 1.19. Xám trong suốt đúng trên mọi nền. */

/* Lời của trợ lý: chữ thường trên nền trang. Bong bóng hai phía là ngôn ngữ
   của tin nhắn điện thoại; ở đây chỉ cần phân biệt ai đang nói. */
.gcc-chat-bubble.bot { align-self: flex-start; }

.gcc-chat-bubble.user {
    align-self: flex-end;
    background: rgba(127, 127, 127, .18);
    border-radius: 14px;
    padding: 8px 12px;
}

.gcc-chat-bubble.error {
    align-self: flex-start;
    color: var(--danger, #d92d20);
}

.gcc-chat-edit-hint {
    display: block;
    font-size: 10px;
    opacity: .5;
    margin-top: 2px;
}

.gcc-chat-typing { opacity: .55; font-size: 13px; }

/* Câu hỏi của bước hiện tại đã nằm trong hộp soạn → ẩn bản sao ở dòng hội
   thoại (js/gcc-chatbox.js gắn class này). */
/* Câu hỏi HIỆN NGUYÊN trong dòng hội thoại. Bản trước giấu bong bóng của
   bước hiện tại đi vì câu hỏi được nhét vào placeholder của ô nhập; cách đó
   làm các bảng chọn (template, ảnh) mất chỗ dựa — người dùng thấy một rổ nút
   không rõ đang trả lời câu gì. */

/* ══════════════════════════════════════════════════════════════════════════
 * 3. HỘP SOẠN
 * ══════════════════════════════════════════════════════════════════════════ */
.gcc-chat-input-area {
    display: flex;
    flex-direction: column;
    flex: 0 0 auto;
    /* Khoảng cách dọc ĐỀU giữa mọi khối con, và lề ĐỀU bốn phía. Bản trước
       dùng padding 10/12/8 — ba con số khác nhau nên hàng nút dưới cùng nhìn
       như dính vào viền, trong khi mép trên lại thừa chỗ. */
    gap: 12px;
    border: 1px solid var(--line, rgba(127, 127, 127, .35));
    border-radius: 18px;
    padding: 14px;
}

.gcc-chat-input-area:focus-within { border-color: var(--line-strong, rgba(127, 127, 127, .6)); }

.gcc-chat-input-row {
    display: flex;
    align-items: center;
    gap: 8px;
}

.gcc-chat-input-row input,
.gcc-chat-input-row textarea,
.gcc-chat-mwac-msg-ta,
.gcc-chat-caption-ta {
    flex: 1 1 auto;
    min-width: 0;
    border: 0;
    background: none;
    color: inherit;
    font: inherit;
    font-size: 14px;
    line-height: 1.5;
    padding: 2px 0;
    resize: none;
}

.gcc-chat-input-row input:focus,
.gcc-chat-input-row textarea:focus,
.gcc-chat-mwac-msg-ta:focus,
.gcc-chat-caption-ta:focus { outline: none; }

.gcc-chat-input-row input::placeholder,
.gcc-chat-input-row textarea::placeholder { color: inherit; opacity: .5; }

/* Câu hỏi của bước bấm chọn (không có ô nhập) */
/* Con trỏ nhấp nháy trong lúc gõ (js/gcc-typewriter.js) — dấu hiệu "đang
   viết", cũng là chỗ neo mắt để chữ mới không nhảy đột ngột. */
.gcc-chat-bubble.bot.gcc-tw-running::after {
    content: '';
    display: inline-block;
    width: 2px;
    height: 1em;
    margin-left: 2px;
    vertical-align: -2px;
    background: currentColor;
    opacity: .65;
    animation: gcc-tw-nhay .8s steps(1) infinite;
}

@keyframes gcc-tw-nhay { 0%, 49% { opacity: .65 } 50%, 100% { opacity: 0 } }
.gcc-chat-counter { font-size: 10px; opacity: .45; align-self: flex-end; }
.gcc-chat-actions-row:empty { display: none; }

.gcc-chat-actions-row {
    display: flex;
    gap: 8px;
    flex-wrap: wrap;
}

/* ── Nút ─────────────────────────────────────────────────────────────── */
/* Nút KHÔNG dùng var(--ink-strong)/var(--bg): cả hai bị định nghĩa lại ở tầng
   gần hơn với giá trị của giao diện SÁNG, nên trên nền tối ra chữ trắng trên
   nền sáng — đo được tương phản 1.27 ở nút AI. Cặp màu viết tường minh theo
   data-theme thì không phụ thuộc token nào. */
/* MỘT khuôn cho mọi nút: cùng chiều cao, cùng bo góc, cùng lề trong. Trước
   đây nút chính 7px/16px còn nút phụ 5px/10px — đứng cạnh nhau là so le, đó
   chính là cảm giác "lộn xộn". Chỉ MÀU phân biệt chính/phụ, không phải kích
   thước. */
.gcc-chat-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    gap: 6px;
    min-height: 34px;
    box-sizing: border-box;
    border: 1px solid transparent;
    border-radius: 999px;
    background: #1d1d1f;
    color: #ffffff;
    font: inherit;
    font-size: 13px;
    font-weight: 600;
    padding: 7px 16px;
    line-height: 1.2;
    white-space: nowrap;
    cursor: pointer;
}

:root[data-theme="dark"] .gcc-chat-btn,
:root:not([data-theme="light"]) .gcc-chat-btn {
    background: #e8e8e8;
    color: #101010;
}

.gcc-chat-btn:hover { opacity: .88; }

/* Nút phụ: kiểu viền, không cần ghép cặp màu nên đúng ở mọi giao diện.
   Đặt SAU khối theo data-theme ở trên để thắng nó. */
.gcc-chat-btn.ghost,
.gcc-chat-btn-icon,
:root[data-theme="dark"] .gcc-chat-btn.ghost,
:root[data-theme="dark"] .gcc-chat-btn-icon,
:root:not([data-theme="light"]) .gcc-chat-btn.ghost,
:root:not([data-theme="light"]) .gcc-chat-btn-icon {
    background: none;
    color: inherit;
    border: 1px solid var(--line, rgba(127, 127, 127, .35));
    /* Cùng lề trong với nút chính — chỉ khác màu, không khác kích thước. */
    padding: 7px 16px;
    font-weight: 500;
}

.gcc-chat-btn.ghost:hover,
.gcc-chat-btn-icon:hover { background: rgba(127, 127, 127, .14); }

/* Nút gửi trong hàng nhập: nút tròn có mũi tên, không phải khối chữ.
   CHỈ áp cho nút CHÍNH. Luật cũ quét mọi .gcc-chat-btn trong hàng nhập, nên
   khi gcc-compose-layout.js chuyển nút Skip vào cùng hàng thì Skip cũng bị
   bóp còn 30px, font-size:0 và mọc thêm mũi tên ↑ — thành HAI nút mũi tên
   giống hệt nhau đứng cạnh nhau. Đã đo được: cả hai đều rộng 30px, cùng
   ::after "↑", một cái chữ thật là "Skip". */
.gcc-chat-input-row .gcc-chat-btn:not(.secondary):not(.gcc-row-nut-phu) {
    /* Ô VUÔNG THẬT SỰ. Bản trước chỉ đặt width:30px mà quên rằng khuôn nút
       chung đang có min-height:34px và padding 7px/16px — ra hình bầu dục
       30×34 với chữ bị bóp bên trong, đúng chỗ "méo" nhìn thấy được.
       Phải huỷ cả ba: bề rộng, chiều cao tối thiểu, và lề trong. */
    flex: 0 0 auto;
    width: 30px;
    height: 30px;
    min-height: 0;
    padding: 0;
    border: 0;
    border-radius: 50%;
    display: inline-flex;
    align-items: center;
    justify-content: center;
    /* Nền TRONG SUỐT: nút gửi nằm ngay trong hộp soạn, đã có ngữ cảnh rõ ràng
       nên không cần một khối đặc hút hết mắt khỏi chữ người dùng đang gõ.
       Nền chỉ hiện lên khi rê chuột. */
    background: none;
    color: inherit;
    /* Ẩn chữ "Send" — nội dung nút do engine đặt là văn bản, còn ở đây ta chỉ
       muốn biểu tượng. Bỏ dòng này thì chữ hiện lại và đẩy biểu tượng ra khỏi
       ô 30px (đã đo: biểu tượng còn bề rộng 0). Chữ vẫn nằm trong DOM nên
       trình đọc màn hình vẫn đọc được "Send". */
    font-size: 0;
    line-height: 0;
    transition: background-color .12s ease;
}

/* Mũi tên vẽ bằng SVG chứ không phải ký tự '↑': ký tự mũi tên mỗi phông chữ
   một dáng, có phông còn không có glyph này và trình duyệt thay bằng ô vuông
   rỗng. SVG thì mọi máy ra đúng một hình.
   Tô bằng `background: currentColor` qua mask nên nó tự đổi theo màu chữ,
   không cần khai báo màu riêng cho giao diện sáng/tối. */
.gcc-chat-input-row .gcc-chat-btn:not(.secondary):not(.gcc-row-nut-phu)::after {
    content: '';
    width: 17px;
    height: 17px;
    background: currentColor;
    -webkit-mask: var(--gcc-icon-gui) center / contain no-repeat;
    mask: var(--gcc-icon-gui) center / contain no-repeat;
}

.gcc-chat-input-row .gcc-chat-btn:not(.secondary):not(.gcc-row-nut-phu):hover {
    background: rgba(127, 127, 127, .18);
}

.gcc-chat-input-row .gcc-chat-btn:not(.secondary):not(.gcc-row-nut-phu):disabled {
    opacity: .35;
    cursor: not-allowed;
}

/* ══════════════════════════════════════════════════════════════════════════
 * 4. LỰA CHỌN
 * ══════════════════════════════════════════════════════════════════════════ */
.gcc-chat-choices {
    display: flex;
    flex-direction: column;
    gap: 8px;
}

.gcc-chat-choice {
    display: flex;
    flex-direction: column;
    gap: 2px;
    text-align: center;
    border: 1px solid var(--line, rgba(127, 127, 127, .3));
    border-radius: 12px;
    background: none;
    color: inherit;
    font: inherit;
    padding: 10px 12px;
    cursor: pointer;
}

.gcc-chat-choice:hover { background: rgba(127, 127, 127, .12); }
.gcc-chat-choice-label { font-size: 13px; font-weight: 600; }
.gcc-chat-choice-desc  { font-size: 11px; opacity: .55; }

/* Lưới hiệu ứng: nhiều ô nhỏ thì xếp ngang cho đỡ dài */
.gcc-chat-choices.gcc-fx-choices {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    gap: 6px;
}

.gcc-chat-choices.gcc-fx-choices .gcc-chat-choice { padding: 8px 4px; }
.gcc-chat-choices.gcc-fx-choices .gcc-chat-choice-desc { display: none; }

/* ══════════════════════════════════════════════════════════════════════════
 * 5. BƯỚC CHỌN SẴN CÓ (media, template)
 * ══════════════════════════════════════════════════════════════════════════ */
/* Khối này gồm nhiều phần rời: tóm tắt lựa chọn, hàng nút, và bảng hỏi lại
   khi xoá. Xếp tất cả vào MỘT dòng ngang (flex-wrap) là chúng tự trộn vào nhau
   theo bề rộng còn thừa — đúng cảnh Cancel / Yes, clear / Change / Send nằm
   lẫn lộn. Mỗi phần một HÀNG riêng. */
.gcc-chat-pick {
    display: flex;
    flex-direction: column;
    align-items: stretch;
    gap: 12px;
}

.gcc-chat-pick-buttons,
.gcc-chat-pick-confirm-buttons {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    align-items: center;
    /* Nút hành động dồn về BÊN PHẢI, giống mọi hộp thoại khác trong trang. */
    justify-content: flex-end;
}

.gcc-chat-pick-summary {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 13px;
    min-height: 34px;
}

.gcc-chat-pick-check   { color: var(--ok, #16a34a); }
.gcc-chat-pick-value   { font-weight: 600; }
.gcc-chat-pick-helper,
.gcc-chat-pick-confirm-msg { font-size: 12px; opacity: .6; }

/* Bảng hỏi lại trước khi xoá: một vùng riêng có nền và viền, để người dùng
   thấy rõ đây là câu hỏi lồng vào chứ không phải thêm hai nút nữa vào hàng. */
.gcc-chat-pick-confirm-clear {
    display: flex;
    flex-direction: column;
    gap: 10px;
    padding: 12px;
    border: 1px solid var(--line, rgba(127, 127, 127, .25));
    border-radius: 12px;
    background: rgba(127, 127, 127, .07);
}

/* ══════════════════════════════════════════════════════════════════════════
 * 6. BƯỚC LỜI CHÚC + CHÚ THÍCH TỪNG ẢNH
 * ══════════════════════════════════════════════════════════════════════════ */
.gcc-chat-input-mwac { max-height: 320px; overflow-y: auto; }

.gcc-chat-mwac-message-wrap,
.gcc-chat-mwac-captions-wrap,
.gcc-chat-percaption-fields {
    display: flex;
    flex-direction: column;
    gap: 6px;
}

.gcc-chat-mwac-label { font-size: 12px; font-weight: 600; opacity: .8; }

.gcc-chat-mwac-caption-toggle { display: flex; flex-direction: column; gap: 2px; }
.gcc-chat-mwac-caption-toggle-row { display: flex; align-items: center; gap: 8px; }
.gcc-chat-mwac-caption-label { font-size: 12px; }
.gcc-chat-mwac-caption-desc  { font-size: 11px; opacity: .5; margin: 0; }

.gcc-chat-caption-row {
    display: flex;
    gap: 8px;
    align-items: flex-start;
    border: 1px solid var(--line, rgba(127, 127, 127, .25));
    border-radius: 10px;
    padding: 8px;
}

.gcc-chat-caption-thumb { width: 40px; height: 40px; object-fit: cover; border-radius: 6px; }
.gcc-chat-caption-icon  { font-size: 20px; }
.gcc-chat-caption-info  { flex: 1; display: flex; flex-direction: column; gap: 4px; min-width: 0; }
.gcc-chat-caption-label { font-size: 11px; opacity: .6; }

.gcc-chat-ai-inline-row { display: flex; }
.gcc-chat-ai-inline-btn { font-size: 12px; padding: 6px 12px; }

/* ══════════════════════════════════════════════════════════════════════════
 * 7. BƯỚC TỰ CHỌN CHỦ ĐỀ + BƯỚC CUỐI
 * ══════════════════════════════════════════════════════════════════════════ */
.gcc-chat-autotheme-row {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    align-items: center;
}

/* Ô chọn chiếm trọn một hàng, nút xuống hàng dưới. Ép chung một dòng thì ô
   chọn bị bóp còn một mẩu và nhãn dài bị cắt. */
.gcc-chat-autotheme-select {
    flex: 1 1 100%;
    min-width: 0;
    min-height: 34px;
    box-sizing: border-box;
    border: 1px solid var(--line, rgba(127, 127, 127, .35));
    border-radius: 10px;
    /* MÀU PHẢI VIẾT TƯỜNG MINH, cả nền lẫn chữ, cả cho <option>.
       `background: none` để trình duyệt tự lo: bảng xổ xuống của Windows dùng
       nền TRẮNG hệ thống, còn chữ vẫn thừa kế màu sáng của giao diện tối —
       chữ trắng trên nền trắng, không đọc được gì.
       color-scheme báo cho trình duyệt vẽ luôn cả mũi tên và thanh cuộn của
       bảng xổ theo tông tối. */
    background: var(--gcc-pnl-bg);
    color: var(--gcc-pnl-fg);
    color-scheme: light dark;
    font: inherit;
    font-size: 13px;
    padding: 7px 12px;
}

.gcc-chat-autotheme-select option {
    background: var(--gcc-pnl-bg);
    color: var(--gcc-pnl-fg);
}

:root[data-theme="dark"] .gcc-chat-autotheme-select,
:root:not([data-theme="light"]) .gcc-chat-autotheme-select { color-scheme: dark; }

.gcc-chat-autotheme-status { font-size: 12px; opacity: .6; }

.gcc-chat-final { display: flex; flex-direction: column; gap: 10px; }

.gcc-chat-final-summary {
    max-height: 130px;
    overflow-y: auto;
    font-size: 12px;
    line-height: 1.6;
    border: 1px solid var(--line, rgba(127, 127, 127, .25));
    border-radius: 10px;
    padding: 10px;
}

/* Nút tạo thiệp KHÔNG mang class .gcc-chat-btn (xem gcc-chat-engine.js, chỗ
   dựng .gcc-chat-final) nên nó không thừa kế gì cả — trình duyệt vẽ nút mặc
   định: góc vuông, nền xám hệ thống. Phải khai báo lại đủ bộ ở đây, đúng khuôn
   của nút chính, chỉ khác là chiếm trọn bề ngang. */
.gcc-chat-final-create {
    display: block;
    width: 100%;
    box-sizing: border-box;
    min-height: 42px;
    border: 1px solid transparent;
    border-radius: 999px;
    background: #1d1d1f;
    color: #ffffff;
    font: inherit;
    font-size: 14px;
    font-weight: 600;
    padding: 11px 16px;
    cursor: pointer;
}

:root[data-theme="dark"] .gcc-chat-final-create,
:root:not([data-theme="light"]) .gcc-chat-final-create {
    background: #e8e8e8;
    color: #101010;
}

.gcc-chat-final-create:hover { opacity: .88; }
.gcc-chat-final-create:disabled { opacity: .5; cursor: not-allowed; }

/* ══════════════════════════════════════════════════════════════════════════
 * 8. HÀNG TIỆN ÍCH (js/gcc-layout-center.js gom vào đây)
 * ══════════════════════════════════════════════════════════════════════════ */
.gcc-ubar {
    position: relative;
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
    flex-wrap: nowrap;
    padding: 10px 4px 0;
    margin-top: 6px;
    /* Không kẻ đường ngang phía trên: hộp soạn ngay trên đã có viền bao, thêm
       một vạch nữa cách đó vài pixel thành hai đường song song. Khoảng trắng
       đủ để tách hai khối. */
    font-size: 12px;
}

.gcc-ubar-left,
.gcc-ubar-right {
    display: flex;
    align-items: center;
    gap: 8px;
    min-width: 0;
}

/* Ba wrapper mang sẵn bố cục thanh trạng thái iPhone (căn đều hai đầu, chiếm
   hết bề ngang). Ở đây chúng chỉ là một cụm chip. */
.gcc-ubar .gcc-ios-time,
.gcc-ubar .gcc-ios-icons,
.gcc-ubar .gcc-ios-island-badge {
    display: flex;
    align-items: center;
    gap: 8px;
    font-size: 12px;
}

.gcc-ios-chip { display: inline-flex; align-items: center; gap: 4px; }

.gcc-ios-plan {
    background: var(--ink-strong, #1d1d1f);
    color: var(--bg, #fff);
    border-radius: 999px;
    padding: 2px 9px;
    font-size: 10px;
    font-weight: 700;
    letter-spacing: .4px;
}

.gcc-ios-avatar {
    width: 22px;
    height: 22px;
    border-radius: 50%;
    background: var(--accent, #2f6fed);
    color: #fff;
    justify-content: center;
    font-size: 11px;
    font-weight: 600;
    cursor: pointer;
}

/* Chấm lưu đứng đầu hàng và đứng riêng — thứ duy nhất tự đổi màu, cần chỗ cố
   định để mắt biết tìm ở đâu. */
.gcc-ubar .gcc-ios-time { position: relative; }
.gcc-ios-dot { width: 7px; height: 7px; border-radius: 50%; order: -1; flex: none; }

.gcc-chat-progress {
    border: 1px solid var(--line, rgba(127, 127, 127, .3));
    border-radius: 999px;
    padding: 3px 10px;
    font-size: 11px;
    white-space: nowrap;
}

/* Hai nút ↺ và ← bỏ viền: trong một hàng đã có chip bo tròn và bộ đếm có
   viền, thêm hai khung nữa thành rối. Chỉ đổi nền khi rê chuột là đủ báo.
   Phải liệt kê CẢ biến thể theo data-theme: khối nút phụ ở mục 3 có nhánh
   `:root[data-theme="dark"] .gcc-chat-btn.ghost` (0,4,0), đặc hiệu hơn
   `.gcc-ubar .gcc-chat-btn.ghost` (0,2,0) nên viền vẫn còn 1px. */
.gcc-ubar .gcc-chat-btn-icon,
.gcc-ubar .gcc-chat-btn.ghost,
:root[data-theme="dark"] .gcc-ubar .gcc-chat-btn-icon,
:root[data-theme="dark"] .gcc-ubar .gcc-chat-btn.ghost,
:root:not([data-theme="light"]) .gcc-ubar .gcc-chat-btn-icon,
:root:not([data-theme="light"]) .gcc-ubar .gcc-chat-btn.ghost {
    border: 0;
    padding: 4px 7px;
    font-size: 13px;
    line-height: 1.4;
    border-radius: 8px;
}

/* ══════════════════════════════════════════════════════════════════════════
 * 9. BẢNG HẠN MỨC + MENU TÀI KHOẢN
 * ══════════════════════════════════════════════════════════════════════════ */
.gcc-plan-pop {
    position: absolute;
    bottom: calc(100% + 8px);
    left: 0;
    z-index: 40;
    width: 232px;
    max-width: calc(100vw - 32px);
    padding: 12px 13px 10px;
    border-radius: 14px;
    background: var(--gcc-pnl-bg);
    color: var(--gcc-pnl-fg);
    border: 1px solid var(--gcc-pnl-line);
    font-size: 11px;
    opacity: 0;
    pointer-events: none;
    transition: opacity .16s ease;
}

.gcc-plan-pop.is-open { opacity: 1; pointer-events: auto; }

.gcc-plan-pop-head { display: flex; justify-content: space-between; margin-bottom: 8px; }
.gcc-plan-pop-plan { font-weight: 700; }
.gcc-plan-pop-tag  { opacity: .5; text-transform: uppercase; font-size: 9px; }
.gcc-plan-pop-row + .gcc-plan-pop-row { margin-top: 8px; }
.gcc-plan-pop-line { display: flex; justify-content: space-between; }
.gcc-plan-pop-label { opacity: .7; }
.gcc-plan-pop-num  { font-weight: 600; }
.gcc-plan-pop-sep  { opacity: .45; margin: 0 1px; font-weight: 400; }
.gcc-plan-pop-track { height: 3px; border-radius: 2px; background: rgba(127, 127, 127, .3); margin-top: 4px; }
.gcc-plan-pop-fill  { display: block; height: 100%; border-radius: 2px; }
.gcc-plan-pop-ok.gcc-plan-pop-fill   { background: #30d158; }
.gcc-plan-pop-warn.gcc-plan-pop-fill { background: #ff9f0a; }
.gcc-plan-pop-full.gcc-plan-pop-fill { background: #ff453a; }
span.gcc-plan-pop-ok   { color: #30d158; }
span.gcc-plan-pop-warn { color: #ff9f0a; }
span.gcc-plan-pop-full { color: #ff453a; }
.gcc-plan-pop-extra { margin-top: 9px; padding-top: 8px; border-top: 1px solid rgba(127, 127, 127, .25); }
.gcc-plan-pop-sub   { font-size: 9.5px; text-transform: uppercase; letter-spacing: .5px; opacity: .5; margin-bottom: 5px; }
.gcc-plan-pop-grid  { display: grid; grid-template-columns: 1fr auto; gap: 3px 10px; }
.gcc-plan-pop-gk    { opacity: .7; }
.gcc-plan-pop-gv    { font-weight: 600; font-variant-numeric: tabular-nums; }
.gcc-plan-pop-notes { margin-top: 8px; padding-top: 7px; border-top: 1px solid rgba(127, 127, 127, .25); font-size: 10px; opacity: .75; }
.gcc-plan-pop-foot  { margin-top: 7px; font-size: 9.5px; opacity: .45; }
.gcc-plan-pop-empty { opacity: .6; }

/* Neo theo HÀNG TIỆN ÍCH (gcc-layout-center.js chuyển nó vào đó lúc mở), không
   phải theo khung chat: khung chat cao cả cột nên `bottom: 100%` đẩy tấm trượt
   lên trên đỉnh cột, ra ngoài màn hình. */
.gcc-iphone-navsheet {
    position: absolute;
    right: 0;
    bottom: calc(100% + 8px);
    z-index: 45;
    width: min(240px, 90%);
    display: flex;
    flex-direction: column;
    gap: 2px;
    padding: 8px;
    border-radius: 12px;
    background: var(--gcc-pnl-bg);
    color: var(--gcc-pnl-fg);
    border: 1px solid var(--gcc-pnl-line);
    opacity: 0;
    transform: translateY(6px);
    pointer-events: none;
    transition: opacity .16s ease, transform .16s ease;
}

.gcc-iphone-navsheet.open { opacity: 1; transform: translateY(0); pointer-events: auto; }
.gcc-iphone-navsheet-grabber { display: none; }
.gcc-iphone-navsheet-title { font-size: 10px; text-transform: uppercase; letter-spacing: .5px; opacity: .5; padding: 4px 8px; }

.gcc-iphone-navsheet-item,
.gcc-iphone-navsheet-signout {
    display: flex;
    align-items: center;
    gap: 10px;
    padding: 8px;
    border: 0;
    border-radius: 8px;
    background: none;
    color: inherit;
    font: inherit;
    font-size: 13px;
    text-decoration: none;
    cursor: pointer;
    text-align: left;
}

.gcc-iphone-navsheet-item:hover,
.gcc-iphone-navsheet-signout:hover { background: rgba(127, 127, 127, .14); }

/* ══════════════════════════════════════════════════════════════════════════
 * 10. HỘP XÁC NHẬN ĐẶT LẠI
 * ══════════════════════════════════════════════════════════════════════════ */
/* Hộp xác nhận PHẢI ẩn khi chưa mở. Thiếu quy tắc này nó nằm ngay đầu trang
   dưới dạng hai nút nhỏ lơ lửng phía trên khung xem trước — đúng thứ trông
   như "hai nút thừa". Engine chỉ gắn/gỡ class gcc-confirm--visible, việc ẩn
   là của CSS. */
.gcc-confirm-backdrop {
    position: fixed;
    inset: 0;
    z-index: 60;
    display: none;
    align-items: center;
    justify-content: center;
    background: rgba(0, 0, 0, .45);
    /* TRANSITION LÀ BẮT BUỘC, không phải trang trí.
       Engine (gcc-chat-engine.js, showResetConfirm) đặt display:flex bằng style
       NỘI TUYẾN khi mở, rồi lúc đóng chỉ gỡ class và chờ 'transitionend' mới
       gỡ display. Không khai báo transition thì sự kiện đó không bao giờ nổ:
       style nội tuyến display:flex nằm lại vĩnh viễn, tấm nền phủ kín trang và
       bấm OK xong hộp vẫn treo ở đó. */
    opacity: 0;
    transition: opacity .18s ease;
}

.gcc-confirm-backdrop.gcc-confirm--visible { display: flex; opacity: 1; }

/* Lưới an toàn: transition 0 giây (máy bật "giảm chuyển động", hoặc một bản
   trình duyệt nào đó) cũng không nổ transitionend. Khi ấy display:flex vẫn kẹt
   lại — nhưng tấm nền hết bắt chuột nên người dùng không bị khoá trang. */
.gcc-confirm-backdrop:not(.gcc-confirm--visible) { pointer-events: none; }

.gcc-confirm-dialog {
    width: min(320px, calc(100vw - 40px));
    padding: 18px;
    border-radius: 14px;
    background: var(--gcc-pnl-bg);
    color: var(--gcc-pnl-fg);
    border: 1px solid var(--gcc-pnl-line);
}

.gcc-confirm-actions { display: flex; gap: 8px; justify-content: flex-end; margin-top: 14px; }
.gcc-confirm-title   { font-size: 15px; font-weight: 600; margin-bottom: 6px; }
.gcc-confirm-message { font-size: 13px; opacity: .75; }

/* ══════════════════════════════════════════════════════════════════════════
 * 11. MÀN HẸP
 * ══════════════════════════════════════════════════════════════════════════ */
@media (max-width: 600px) {
    .gcc-two-col { padding: 8px 12px 20px; }
    .gcc-chat-stream { max-height: 150px; }
    .gcc-ubar { gap: 7px; font-size: 11px; }
    .gcc-ubar-left, .gcc-ubar-right { gap: 6px; }
    .gcc-chat-choices.gcc-fx-choices { grid-template-columns: repeat(3, 1fr); }
}

/* ══════════════════════════════════════════════════════════════════════════
 * 12. TRÌNH CHỌN NHÚNG TRONG HỘP SOẠN
 * Bảng chọn media/template có CSS riêng, viết cho một tấm nền SÁNG. Các ô của
 * nó tự mang nền sáng nên chữ trong ô vẫn đọc được (đo: 16.25), nhưng chữ nằm
 * NGOÀI ô — tiêu đề, breadcrumb — rơi thẳng lên nền trang tối: đo được 1.12.
 * Cho phần đó thừa kế màu chữ của trang.
 * ══════════════════════════════════════════════════════════════════════════ */
.gcc-chat-input-area .gcc-modal-title,
.gcc-chat-input-area .gcc-breadcrumb-item,
.gcc-chat-input-area .gcc-section-divider,
.gcc-chat-input-area .gcc-empty-state {
    color: inherit;
}

.gcc-chat-input-area .gcc-modal-title { font-size: 13px; font-weight: 600; }

/* Nút AI dùng chung class .gac-trigger với gac.css, nơi ép
   `color: var(--gcc-ink-inverse) !important` — biến đó ra màu TRẮNG trong khi
   nền nút lại sáng: đo được tương phản 1.27.
   Đây là chỗ DUY NHẤT trong file này cần !important, vì phải thắng một
   !important có sẵn; selector đặc hiệu hơn (0,2,0 so với 0,1,0) là đủ. */
.gcc-chat-input-area .gac-trigger {
    background: #1d1d1f !important;
    color: #ffffff !important;
}

:root[data-theme="dark"] .gcc-chat-input-area .gac-trigger,
:root:not([data-theme="light"]) .gcc-chat-input-area .gac-trigger {
    background: #e8e8e8 !important;
    color: #101010 !important;
}

/* Trình chọn media nhúng: CSS gốc của nó viết cho một tấm nền SÁNG. Các thẻ
   danh mục và ô media tự mang nền sáng nên vẫn đọc được (đo: 15), nhưng ô tìm
   kiếm và tiêu đề nằm thẳng trên nền tối — đo được 2.81 và 1.54.
   Cho chúng thừa kế màu chữ của trang. */
.gcc-chat-input-area .gcc-mp-title,
.gcc-chat-input-area .gcc-mp-search,
.gcc-chat-input-area .gcc-mp-empty,
.gcc-chat-input-area .gcc-mp-count,
.gcc-chat-input-area .gcc-mp-hint {
    color: inherit;
}

.gcc-chat-input-area .gcc-mp-search::placeholder { color: inherit; opacity: .5; }

/* Trình chọn media dùng cả một THANG token của giao diện sáng
   (gcc-tokens.css) và ép bằng !important. Không đua độ đặc hiệu để đè từng
   quy tắc — chỉ cần đổi GIÁ TRỊ token ngay tại trình chọn, quy tắc gốc vẫn
   chạy nguyên vẹn, chỉ khác kết quả.

   PHẢI LẬT CẢ HỌ, không lật lẻ tẻ. Lần đầu tôi chỉ đổi --gcc-ink sang màu
   sáng mà để nguyên --gcc-ink-inverse = #ffffff; nút Select dùng cặp
   `background: var(--gcc-ink)` + `color: var(--gcc-ink-inverse)` liền thành
   nền sáng trên chữ trắng — đo được 1.23, nút biến mất.
   Đổi một nửa của một cặp màu thì luôn hỏng nửa còn lại. */
:root[data-theme="dark"] .gcc-chat-input-area .gcc-mp-box--inline,
:root:not([data-theme="light"]) .gcc-chat-input-area .gcc-mp-box--inline {
    --gcc-ink-strong:        #f4f4f4;
    --gcc-ink:               #e8e8e8;
    --gcc-ink-secondary:     #d0d0d0;
    --gcc-ink-muted:         #b0b0b0;
    --gcc-ink-faint:         #949494;
    --gcc-ink-ghost:         #6f6f6f;
    --gcc-ink-inverse:       #101010;
    --gcc-ink-inverse-muted: #3a3a3a;

    --gcc-ink-strong-hover:    #ffffff;
    --gcc-ink-hover:           #f4f4f4;
    --gcc-ink-secondary-hover: #e0e0e0;
    --gcc-ink-muted-hover:     #c4c4c4;
    --gcc-ink-inverse-hover:   #000000;

    /* Token bề mặt phải ĐỤC, không dùng màu trong suốt.
       Một số quy tắc dùng chúng làm MÀU CHỮ trên nền ink — nút Select là
       `background: var(--gcc-ink)` + `color: var(--gcc-surface)`. Đặt trong
       suốt thì chữ tàng hình: đo được màu chữ ra rgba(127,127,127,0.06).
       Thang xám đục vừa làm nền đúng trên trang tối, vừa đủ tương phản khi bị
       dùng làm chữ trên nền sáng. */
    --gcc-surface:        #0f0f0f;
    --gcc-surface-1:      #171717;
    --gcc-surface-2:      #1d1d1d;
    --gcc-surface-3:      #232323;
    --gcc-surface-4:      #2a2a2a;
    --gcc-surface-raised: #1d1d1d;
    --gcc-surface-sunken: #141414;

    --gcc-line: rgba(127, 127, 127, .30);
}

/* ══════════════════════════════════════════════════════════════════════════
 * 13. THANH ĐIỀU KHIỂN KHUNG XEM TRƯỚC (js/gcc-workspace.js)
 * ══════════════════════════════════════════════════════════════════════════ */
.gcc-pv-bar {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 10px;
    width: 100%;
    padding: 0 2px 8px;
}

/* Thanh điều khiển thừa kế màu chữ #333 từ khung chat cũ (viết cứng vì bản cũ
   luôn đặt trên "màn hình điện thoại" nền trắng). Nền vùng xem trước vừa sáng
   lên thành #262626 nên #333 chỉ còn tương phản ~1.1 — chữ biến mất. Đặt màu
   dứt khoát ở đây, theo cặp sáng/tối, thay vì mượn token của nơi khác. */
.gcc-pv-bar { color: #1a1a1a; }

:root[data-theme="dark"] .gcc-pv-bar,
:root:not([data-theme="light"]) .gcc-pv-bar { color: #e4e4e4; }

.gcc-pv-label {
    font-size: 12px;
    font-weight: 600;
    letter-spacing: .3px;
    text-transform: uppercase;
    opacity: .65;
}

.gcc-pv-actions { display: flex; gap: 6px; }

.gcc-pv-btn {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 5px 8px;
    border: 1px solid rgba(127, 127, 127, .3);
    border-radius: 8px;
    background: none;
    color: inherit;
    font: inherit;
    font-size: 12px;
    cursor: pointer;
}

.gcc-pv-btn:hover { background: rgba(127, 127, 127, .14); }

/* Thuộc tính `hidden` PHẢI có tác dụng ở đây.
   Luật `display: inline-flex` ngay trên kia có độ đặc hiệu (0,1,0), còn luật
   `[hidden] { display: none }` của trình duyệt chỉ là (0,1,0) trong bảng
   mặc định — bảng của trang bao giờ cũng thắng bảng mặc định. Nên đặt
   `nut.hidden = true` bằng JS thì thuộc tính CÓ trên thẻ mà nút vẫn hiện.
   Đo được đúng thế: hidden=true nhưng offsetParent khác null, nút Card size
   vẫn nằm trên thanh công cụ của thiệp cưới. */
.gcc-pv-btn[hidden] { display: none; }

/* Nút Preview nằm trong HÀNG TIỆN ÍCH, ngoài cùng bên phải — cùng hàng với
   các công cụ khác thay vì trôi nổi phía trên hộp soạn.
   Vẫn phải thuộc cột TRÁI: cột phải lúc thu đang display:none nên nút đặt bên
   đó sẽ biến mất theo, không còn cách mở lại. */
.gcc-ubar .gcc-pv-reopen {
    margin: 0;
    padding: 4px 9px;
    border-radius: 999px;
    font-size: 12px;
}

.gcc-ubar .gcc-pv-reopen span { font-size: 12px; }

/* Toàn màn hình: thẻ thiệp to hết cỡ cho phép nhưng vẫn giữ tỉ lệ. */
.gcc-col--preview.gcc-pv-full .gcc-pv-bar {
    position: sticky;
    top: 0;
    padding: 10px 2px;
    background: var(--bg, #0d0d0d);
    z-index: 2;
}

.gcc-col--preview.gcc-pv-full .gcc-preview-card,
.gcc-col--preview.gcc-pv-full .gcc-preview-wedding-card {
    max-width: min(520px, 92vw);
    margin: 0 auto;
}


/* ══════════════════════════════════════════════════════════════════════════
 * 14. CÁC CLASS TRẠNG THÁI CỦA ENGINE
 * ══════════════════════════════════════════════════════════════════════════
 * gcc-chat-engine.js bật/tắt 10 class dưới đây để đổi trạng thái giao diện,
 * nhưng KHÔNG file CSS nào đang nạp định nghĩa chúng — chúng nằm trong bộ CSS
 * cũ đã xoá. Hậu quả nặng nhất là `gcc-hidden`: engine "giấu" hàng nút cũ rồi
 * mở bảng hỏi lại, nhưng cả hai cùng hiện, chồng lên nhau — đúng cảnh Cancel /
 * Yes, clear / Change / Send nằm lẫn lộn.
 * Đối chiếu bằng cách quét mọi addClass/removeClass/toggleClass trong engine
 * rồi so với CSS đang nạp, nên đây là danh sách đủ, không phải đoán. */

/* Hai lần .gcc-hidden để đạt độ đặc hiệu 0,2,0 — thắng các luật display:flex
   ở trên mà không cần !important. */
.gcc-hidden.gcc-hidden { display: none; }

/* Bộ đếm ký tự: sắp chạm hạn / vượt hạn. */
.gcc-chat-counter.gcc-near { color: #e0a800; opacity: .95; }
.gcc-chat-counter.gcc-over { color: #e05c50; opacity: 1; font-weight: 600; }

/* Bong bóng lỗi lặp lại: rung nhẹ để báo "lỗi vừa xảy ra lần nữa" — không có
   luật này thì bấm Gửi sai lần hai trông như không có phản hồi gì. */
.gcc-shake { animation: gcc-shake .4s ease; }

@keyframes gcc-shake {
    0%, 100% { transform: translateX(0); }
    20%      { transform: translateX(-5px); }
    40%      { transform: translateX(5px); }
    60%      { transform: translateX(-3px); }
    80%      { transform: translateX(3px); }
}

/* Vùng chú thích từng ảnh khi người dùng tắt công tắc chú thích. */
.gcc-mwac-disabled {
    opacity: .45;
    pointer-events: none;
}

/* Lựa chọn đang được chọn (bước choice) và trạng thái của bước pick. */
.gcc-chat-choice.selected {
    border-color: currentColor;
    background: rgba(127, 127, 127, .16);
}

.gcc-chat-pick.is-picking { opacity: .6; pointer-events: none; }
.gcc-chat-pick.is-empty .gcc-chat-pick-check { display: none; }

/* ══════════════════════════════════════════════════════════════════════════
 * 15. KHÔNG THANH CUỘN TRUYỀN THỐNG — TOÀN TRANG
 * ══════════════════════════════════════════════════════════════════════════
 * Trước đây chỉ giấu ở dòng hội thoại và khung xem trước, nên thanh xám vẫn ló
 * ra ở trình chọn ảnh, vùng chú thích, bảng hạn mức... Đặt một lần cho cả
 * trang. GIỮ NGUYÊN khả năng cuộn — chỉ ẩn thanh, không đụng tới overflow. */
html,
body,
.gcc-creator-wrap,
.gcc-creator-wrap * {
    scrollbar-width: none;
    -ms-overflow-style: none;
}

html::-webkit-scrollbar,
body::-webkit-scrollbar,
.gcc-creator-wrap::-webkit-scrollbar,
.gcc-creator-wrap *::-webkit-scrollbar { width: 0; height: 0; }


/* ══════════════════════════════════════════════════════════════════════════
 * 16. NHỊP GIÃN TRONG HỘP SOẠN — VỎ CỦA TỪNG BƯỚC
 * ══════════════════════════════════════════════════════════════════════════
 * Hộp soạn có `gap: 12px`, nhưng gap CHỈ áp cho con TRỰC TIẾP. Engine lại gói
 * nhiều hàng vào một vỏ riêng ($box) rồi mới thả vỏ đó vào hộp — bên trong vỏ
 * không còn khoảng cách nào.
 * Đo được ở bước chọn chủ đề: nút "Apply Theme" kết thúc ở y=795, nút "No
 * thanks" bắt đầu đúng y=795 — dính sát nhau, vì chúng nằm trong hai vỏ con
 * khác nhau của .gcc-chat-autotheme (display:block).
 * Liệt kê tường minh các vỏ engine dựng, không dùng luật quét chung `> *`:
 * quét chung sẽ ép cả những khối cần layout hàng ngang thành cột. */
.gcc-chat-autotheme,
.gcc-chat-final,
.gcc-chat-percaption,
.gcc-chat-ai-suggest {
    display: flex;
    flex-direction: column;
    gap: 12px;
}

/* MỌI hàng nút dồn về bên phải — cùng một quy ước với hộp xác nhận đặt lại.
   Chỗ căn trái chỗ căn phải chính là cảm giác thiếu nhất quán. */
.gcc-chat-actions-row,
.gcc-chat-autotheme-row,
.gcc-chat-pick-buttons,
.gcc-chat-pick-confirm-buttons,
.gcc-chat-ai-inline-row {
    justify-content: flex-end;
}

/* Ô chọn vẫn chiếm trọn hàng của nó, việc căn phải chỉ áp cho nút bên dưới. */
.gcc-chat-autotheme-row > .gcc-chat-autotheme-select { flex: 1 1 100%; }

/* Khoảng cách giữa các nút trong cùng một hàng — nhỏ hơn khoảng cách giữa các
   khối, để mắt đọc ra "đây là một nhóm". */
.gcc-chat-actions-row,
.gcc-chat-ai-inline-row {
    display: flex;
    flex-wrap: wrap;
    gap: 8px;
    align-items: center;
}


/* ══════════════════════════════════════════════════════════════════════════
 * 17. Ô CHỌN TỰ VẼ (js/gcc-select.js)
 * ══════════════════════════════════════════════════════════════════════════
 * Bảng xổ xuống của <select> do hệ điều hành vẽ — không bo góc được, không đổi
 * được nền mục đang rê chuột. Ta giấu thẻ gốc (vẫn giữ nó làm nơi lưu giá trị)
 * và vẽ lại danh sách bằng HTML để đồng bộ với phần còn lại của trang. */
.gcc-sel {
    position: relative;
    flex: 1 1 100%;
    min-width: 0;
}

/* Thẻ gốc phải còn trong DOM cho engine đọc giá trị, chỉ giấu khỏi mắt.
   KHÔNG dùng display:none: một số trình duyệt bỏ qua thẻ ẩn kiểu đó khi gửi
   form và khi đọc kích thước. */
.gcc-sel > select {
    position: absolute;
    width: 1px;
    height: 1px;
    opacity: 0;
    pointer-events: none;
}

.gcc-sel-btn {
    display: flex;
    align-items: center;
    justify-content: space-between;
    gap: 8px;
    width: 100%;
    min-height: 34px;
    box-sizing: border-box;
    padding: 7px 12px;
    border: 1px solid var(--line, rgba(127, 127, 127, .35));
    border-radius: 10px;
    background: var(--gcc-pnl-bg);
    color: var(--gcc-pnl-fg);
    font: inherit;
    font-size: 13px;
    text-align: left;
    cursor: pointer;
}

.gcc-sel-btn:hover { border-color: rgba(127, 127, 127, .55); }
.gcc-sel.is-open .gcc-sel-btn { border-color: rgba(127, 127, 127, .6); }
.gcc-sel.is-placeholder .gcc-sel-label { opacity: .6; }
.gcc-sel-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

.gcc-sel-menu {
    display: none;
    position: absolute;
    left: 0;
    right: 0;
    /* Bung LÊN TRÊN: ô chọn nằm sát đáy màn hình (hộp soạn ghim đáy), bung
       xuống là danh sách chui ra ngoài khung nhìn. */
    bottom: calc(100% + 6px);
    z-index: 50;
    /* Chiều cao là BỘI SỐ của một dòng (34px) cộng lề — để mép dưới không cắt
       ngang một mục, kiểu "nửa dòng thò ra" nhìn như hỏng. Thanh cuộn đang bị
       ẩn nên không có gì báo còn mục bên dưới; scroll-snap khiến mỗi lần cuộn
       dừng đúng đầu một dòng, và vệt mờ ở đáy mới là thứ báo "còn nữa". */
    max-height: calc(34px * 7 + 12px);
    overflow-y: auto;
    scroll-snap-type: y proximity;
    padding: 6px;
    -webkit-mask-image: linear-gradient(to bottom, #000 calc(100% - 22px), transparent);
    mask-image: linear-gradient(to bottom, #000 calc(100% - 22px), transparent);
    border: 1px solid var(--gcc-pnl-line);
    border-radius: 14px;
    background: var(--gcc-pnl-bg);
    color: var(--gcc-pnl-fg);
    box-shadow: 0 10px 30px rgba(0, 0, 0, .35);
    scrollbar-width: none;
}

.gcc-sel-menu::-webkit-scrollbar { width: 0; height: 0; }
.gcc-sel.is-open .gcc-sel-menu { display: block; }

.gcc-sel-item {
    display: flex;
    align-items: center;
    /* Chiều cao CỐ ĐỊNH 34px: khớp với phép tính max-height của bảng ở trên,
       và bằng đúng chiều cao chuẩn của nút trong hộp soạn. */
    min-height: 34px;
    scroll-snap-align: start;
    width: 100%;
    box-sizing: border-box;
    padding: 0 10px;
    border: 0;
    border-radius: 9px;
    background: none;
    color: inherit;
    font: inherit;
    font-size: 13px;
    text-align: left;
    cursor: pointer;
}

.gcc-sel-item:hover { background: rgba(127, 127, 127, .18); }
.gcc-sel-item.is-active { background: rgba(127, 127, 127, .26); font-weight: 600; }


/* ══════════════════════════════════════════════════════════════════════════
 * 18. THỨ BẬC NÚT + GỘP HÀNG (js/gcc-compose-layout.js)
 * ══════════════════════════════════════════════════════════════════════════ */

/* Nút phụ (engine gắn class `secondary`: Skip, No thanks…) chưa từng có kiểu
   riêng nên nó dùng luôn kiểu nút CHÍNH — hai nút nền đặc đứng cạnh nhau,
   nhìn như hai lối làm cùng một việc. Nút phụ phải là kiểu VIỀN: cùng kích
   thước, khác trọng lượng thị giác. */
.gcc-chat-btn.secondary,
:root[data-theme="dark"] .gcc-chat-btn.secondary,
:root:not([data-theme="light"]) .gcc-chat-btn.secondary {
    background: none;
    color: inherit;
    border: 1px solid var(--line, rgba(127, 127, 127, .4));
    font-weight: 500;
}

.gcc-chat-btn.secondary:hover { background: rgba(127, 127, 127, .14); }

/* Hàng đã được gộp lên trên: bỏ đi để không chừa một khoảng trống bằng chiều
   cao hàng. :empty không dùng được — hàng vẫn còn các node văn bản trắng. */
.gcc-chat-actions-row.gcc-row-gop { display: none; }

/* Hàng vừa nhận thêm nút: nút dồn về phải, ô nhập vẫn chiếm phần còn lại. */
.gcc-row-co-nut {
    display: flex;
    align-items: center;
    gap: 8px;
    flex-wrap: wrap;
}

.gcc-row-co-nut > input,
.gcc-row-co-nut > textarea { flex: 1 1 180px; }

/* Ô chọn vẫn giữ nguyên một hàng riêng của nó, các nút xuống hàng dưới và
   đứng cạnh nhau. */
.gcc-row-co-nut > .gcc-sel { flex: 1 1 100%; }


/* Nút phụ được chuyển vào hàng nhập: giữ nguyên chữ và kích thước như ở hàng
   riêng, chỉ đổi chỗ đứng. */
.gcc-chat-input-row .gcc-row-nut-phu {
    flex: 0 0 auto;
    width: auto;
    font-size: 13px;
}


/* ══════════════════════════════════════════════════════════════════════════
 * 19. MEDIA KHOÁ (js/gcc-media-lock.js)
 * ══════════════════════════════════════════════════════════════════════════
 * Chuyển thể từ assets/media-lock.css của module WordPress. Bỏ phần liên quan
 * tới credit; giữ cách làm mờ ảnh và huy hiệu ổ khoá vì đó là tín hiệu đọc
 * được ngay, không cần chữ giải thích. */

.gcc-mp-card[data-locked="1"] img,
.gcc-mp-card[data-locked="1"] .gcc-mp-thumb {
    filter: brightness(.55) saturate(.55);
    transition: filter .18s ease;
}

.gcc-mp-card[data-locked="1"]:hover img,
.gcc-mp-card[data-locked="1"]:hover .gcc-mp-thumb { filter: brightness(.68) saturate(.7); }

/* Huy hiệu ổ khoá. pointer-events:none để cú bấm rơi xuống thẻ bên dưới —
   chính thẻ mới là chỗ module nghe sự kiện. */
.gcc-item-lock {
    position: absolute;
    top: 6px;
    right: 6px;
    display: inline-flex;
    align-items: center;
    gap: 4px;
    padding: 3px 8px;
    border-radius: 999px;
    background: rgba(0, 0, 0, .68);
    color: #fff;
    font-size: 11px;
    font-weight: 600;
    line-height: 1.5;
    white-space: nowrap;
    pointer-events: none;
    backdrop-filter: blur(2px);
}

.gcc-item-lock .gcc-lock-icon { font-size: 11px; }

/* ── Hộp thoại mời nâng cấp ── */
.gcc-ml-backdrop {
    position: fixed;
    inset: 0;
    z-index: 300;
    display: flex;
    align-items: center;
    justify-content: center;
    padding: 20px;
    background: rgba(0, 0, 0, .55);
}

.gcc-ml-dialog {
    width: min(380px, 100%);
    box-sizing: border-box;
    padding: 24px;
    border: 1px solid var(--gcc-pnl-line);
    border-radius: 18px;
    /* Dùng bộ token riêng của file này, KHÔNG mượn --card/--ink: hai biến đó bị
       định nghĩa lại ở tầng gần hơn với giá trị của giao diện sáng (đã đo:
       --card ra TRẮNG ngay trong khung chat). */
    background: var(--gcc-pnl-bg);
    color: var(--gcc-pnl-fg);
    text-align: center;
    box-shadow: 0 18px 50px rgba(0, 0, 0, .45);
}

.gcc-ml-icon  { font-size: 30px; line-height: 1; margin-bottom: 10px; }
.gcc-ml-title { margin: 0 0 8px; font-size: 16px; font-weight: 700; }
.gcc-ml-msg   { margin: 0 0 18px; font-size: 13px; line-height: 1.6; opacity: .75; }

/* Danh sách "tấm thiệp này đang dùng gì thuộc gói trả phí".
   Căn TRÁI trong một hộp thoại căn giữa: đây là thứ để đọc và đối chiếu từng
   dòng, không phải một câu khẩu hiệu. */
.gcc-tn-dialog { width: min(440px, 100%); }
.gcc-tn-ds {
    list-style: none;
    margin: 0 0 18px;
    padding: 0;
    text-align: left;
}
.gcc-tn-ds li {
    padding: 10px 12px;
    margin-bottom: 8px;
    border-radius: 10px;
    border: 1px solid var(--gcc-pnl-line);
    background: rgba(127, 127, 127, .10);
}
.gcc-tn-ds b { display: block; font-size: 13px; margin-bottom: 2px; }
.gcc-tn-ds span { display: block; font-size: 12px; line-height: 1.5; opacity: .75; }

.gcc-ml-actions {
    display: flex;
    gap: 8px;
    justify-content: center;
    flex-wrap: wrap;
}

.gcc-ml-btn {
    display: inline-flex;
    align-items: center;
    justify-content: center;
    min-height: 36px;
    padding: 8px 18px;
    border-radius: 999px;
    border: 1px solid transparent;
    font: inherit;
    font-size: 13px;
    font-weight: 600;
    text-decoration: none;
    cursor: pointer;
}

.gcc-ml-cancel {
    background: none;
    color: inherit;
    border-color: var(--gcc-pnl-line);
}

.gcc-ml-cancel:hover { background: rgba(127, 127, 127, .16); }

.gcc-ml-go {
    background: #1d1d1f;
    color: #fff;
}

:root[data-theme="dark"] .gcc-ml-go,
:root:not([data-theme="light"]) .gcc-ml-go {
    background: #e8e8e8;
    color: #101010;
}

.gcc-ml-go:hover { opacity: .88; }


/* Chip gói của quản trị viên: khác màu hẳn để không nhầm với gói trả phí thật.
   Bypass hạn mức mà nhìn giống tài khoản bình thường là nguồn gốc của những
   lần "trên máy tôi chạy tốt". */
.gcc-ios-chip.gcc-ios-plan-dev {
    background: #6d4aff;
    color: #ffffff;
}


/* ══════════════════════════════════════════════════════════════════════════
 * ✨ PRESETS — chuyển lên thanh công cụ khung xem trước
 * ══════════════════════════════════════════════════════════════════════════
 * Nút cũ nổi ngay phía trên tấm thiệp, bảng chọn bung tại chỗ và che mất đỉnh
 * thiệp — đúng lỗi đã sửa cho bộ trang trí và bộ chọn khổ. Nay nút nằm trên
 * .gcc-pv-bar, bảng thả từ đỉnh cột làm việc (js/gcc-presets-panel.js).
 *
 * Giấu NÚT BẤM chứ không giấu cả khối bọc: gcc-typography.js gọi .show() nên
 * khối bọc mang style nội tuyến display:block — không luật CSS nào với tới nếu
 * không dùng !important. Nút bấm thì không có style nội tuyến, mà nó lại là thứ
 * duy nhất nhìn thấy được trong khối ấy, nên giấu nó là đủ. Khối bọc vẫn còn
 * trong DOM cho bản mobile đọc danh sách preset.
 */
.gcc-col--preview .gcc-typo-preset-trigger { display: none; }

.gcc-col--preview .gcc-typo-preset-wrap {
    margin: 0;
    padding: 0;
    min-height: 0;
}

.gcc-presets-grid {
    display: grid;
    grid-template-columns: repeat(auto-fill, minmax(104px, 1fr));
    gap: 8px;
    overflow-y: auto;
    min-height: 0;
    scrollbar-width: none;
}

.gcc-presets-grid::-webkit-scrollbar { width: 0; height: 0; }

/* Dùng lại đúng dáng của ô chọn khổ để ba bảng trông như một hệ. */
.gcc-presets-grid .gcc-typo-pm-btn {
    padding: 10px 12px;
    border: 1px solid transparent;
    border-radius: 10px;
    background: rgba(127, 127, 127, .12);
    color: inherit;
    font: inherit;
    font-size: 13px;
    font-weight: 600;
    text-align: center;
    cursor: pointer;
}

.gcc-presets-grid .gcc-typo-pm-btn:hover { background: rgba(127, 127, 127, .22); }

.gcc-presets-grid .gcc-typo-pm-btn.active {
    background: rgba(127, 127, 127, .28);
    border-color: currentColor;
}

/* Nút Reset là hành động khác loại với việc chọn một preset — tách ra bằng nét
   đứt thay vì để nó trông như preset thứ năm. */
.gcc-presets-grid .gcc-pm-reset {
    border-style: dashed;
    border-color: var(--gcc-pnl-line, rgba(127, 127, 127, .3));
    background: none;
    font-weight: 500;
}

.gcc-presets-empty { font-size: 12px; opacity: .6; }
