Make WordPress Themes

Changeset 356992


Ignore:
Timestamp:
11/03/2026 02:00:05 PM (6 hours ago)
Author:
themedropbox
Message:

New version of Simple TN - 1.3.18

Location:
simple-tn/1.3.18
Files:
16 added
21 edited
1 copied

Legend:

Unmodified
Added
Removed
  • simple-tn/1.3.18/assets/css/blocks/navigation.css

    r356199 r356992  
    120120}
    121121
     122/*
     123 * Submenu trong footer mở ngược lên trên.
     124 * Footer luôn nằm ở cuối trang nên panel mở xuống dưới sẽ bị mép dưới cửa sổ cắt mất.
     125 * Căn phải theo mục cha để panel không tràn ra ngoài khi menu footer nằm sát lề phải.
     126 */
     127.tn-footer .wp-block-navigation :is(.wp-block-navigation__container, .wp-block-page-list) > .has-child > .wp-block-navigation__submenu-container {
     128        bottom: 100%;
     129        left: auto;
     130        right: -1px;
     131        top: auto;
     132}
     133
     134/* Submenu cấp 2 trở xuống: mở sang trái, canh đỉnh theo mục cha (panel cấp 1 đã căn phải). */
     135.tn-footer .wp-block-navigation .has-child .wp-block-navigation__submenu-container .wp-block-navigation__submenu-container {
     136        bottom: auto;
     137        left: auto;
     138        right: 100%;
     139        top: 0;
     140}
     141
    122142/* Mô tả mục menu (nếu có) chỉ dành cho trình đọc màn hình, không chiếm chỗ trên header. */
    123143.wp-block-navigation .wp-block-navigation-item__description {
    … …  
    129149        width: 1px;
    130150}
     151
     152/* Overlay and wrapping footer menus may contain labels without spaces. */
     153.wp-block-navigation .wp-block-navigation__responsive-container.is-menu-open .wp-block-navigation-item,
     154.tn-footer .wp-block-navigation .wp-block-navigation-item {
     155        max-width: 100%;
     156        min-width: 0;
     157        overflow-wrap: anywhere;
     158}
     159
     160@media (max-width: 781px) {
     161        .wp-block-navigation .wp-block-navigation-item__content,
     162        .wp-block-navigation .wp-block-navigation-submenu__toggle {
     163                box-sizing: border-box;
     164                min-height: 44px;
     165                min-width: 44px;
     166        }
     167}
  • simple-tn/1.3.18/assets/css/blocks/search.css

    r356199 r356992  
    55
    66.wp-block-search .wp-block-search__input {
     7        min-width: 0;
    78        background: var(--wp--preset--color--base);
    89        border: 1px solid color-mix(in srgb, var(--wp--preset--color--muted) 78%, var(--wp--preset--color--base));
    … …  
    2728
    2829.wp-block-search .wp-block-search__button {
     30        flex-shrink: 0;
    2931        background: var(--wp--preset--color--accent);
    3032        border: 0;
  • simple-tn/1.3.18/assets/css/blocks/table.css

    r356199 r356992  
    77.wp-block-table {
    88        overflow-x: auto;
     9        -webkit-overflow-scrolling: touch;
    910}
    1011
    … …  
    1213        border-collapse: collapse;
    1314        width: 100%;
     15}
     16
     17/* Auto layout: retain intrinsic word widths instead of inheriting anywhere from post content. */
     18.wp-block-table table:not(.has-fixed-layout) {
     19        table-layout: auto;
     20}
     21
     22.wp-block-table table:not(.has-fixed-layout) :is(th, td) {
     23        word-break: normal;
     24        overflow-wrap: break-word;
    1425}
    1526
  • simple-tn/1.3.18/assets/css/theme.css

    r356199 r356992  
    1010 * - Nút, nhãn dạng chip: bo tròn hoàn toàn.
    1111 * - Ô nhập liệu: 10px.
    12  * Chỉ có CSS, không có JavaScript; mọi chuyển động đều tắt theo prefers-reduced-motion trong theme.json.
     12 * JavaScript bổ trợ: chuyển nền tối và thu gọn menu header khi không đủ chỗ.
     13 * Mọi chuyển động đều tắt theo prefers-reduced-motion trong theme.json.
    1314 */
    1415
    … …  
    2122}
    2223
     24/*
     25 * Nền tối: bật bằng nút trên header (html[data-theme="dark"]).
     26 * Bảng màu tối do người dùng chỉnh trong Giao diện > Simple TN và được in
     27 * thành biến --wp--preset--color--* trong head (inc/dark-mode.php).
     28 */
     29html[data-theme="dark"] {
     30        color-scheme: dark;
     31}
     32
     33/* Nút core dùng màu hover cố định trong theme.json; đổi theo accent của nền tối. */
     34html[data-theme="dark"] :is(.wp-element-button, .wp-block-button__link):hover {
     35        background-color: color-mix(in srgb, var(--wp--preset--color--accent) 82%, #000);
     36        color: var(--wp--preset--color--accent-contrast);
     37}
     38
    2339/* --------------------------------------------------------------------------
    2440 * Nền chung
    … …  
    2642
    2743html {
     44        background-color: var(--wp--preset--color--base);
     45        color-scheme: light;
    2846        scroll-padding-top: 5.5rem;
    2947}
    … …  
    3250        -webkit-font-smoothing: antialiased;
    3351        -moz-osx-font-smoothing: grayscale;
     52}
     53
     54/* Long titles, URLs and taxonomy labels must fit their own column. */
     55:where(.wp-block-post-title, .wp-block-query-title, .wp-block-site-title, .wp-block-site-tagline, .wp-block-post-terms, .wp-block-post-content, .wp-block-comment-content, .wp-block-comment-author-name, .post-navigation-link__title, .tn-related h3, .tn-footer__bottom) {
     56        overflow-wrap: anywhere;
     57}
     58
     59.tn-related__card > *,
     60.tn-hero__inner > *,
     61.tn-footer__top > * {
     62        min-width: 0;
    3463}
    3564
    … …  
    186215.tn-header__actions {
    187216        align-items: center;
     217        flex: 1 1 0;
     218        justify-content: flex-end;
     219        min-width: 0;
     220}
     221
     222.tn-header > .wp-block-group > .wp-block-group:first-child {
     223        flex: 0 1 auto;
     224        max-width: 45%;
     225        min-width: 0;
     226}
     227
     228.tn-header .wp-block-site-logo,
     229.tn-header__actions > .tn-search,
     230.tn-theme-toggle {
     231        flex-shrink: 0;
     232}
     233
     234.tn-header .wp-block-site-title {
     235        min-width: 0;
     236        overflow-wrap: anywhere;
     237}
     238
     239.tn-header__actions > .wp-block-navigation {
     240        flex: 1 1 0;
     241        min-width: 44px;
     242}
     243
     244/* Measure the full desktop menu; never squeeze labels or its theme toggle. */
     245.tn-nav--header {
     246        max-width: 100%;
     247}
     248
     249.tn-nav--measured .wp-block-navigation__responsive-container:not(.is-menu-open) .wp-block-navigation__responsive-container-content,
     250.tn-nav--measured .wp-block-navigation__responsive-container:not(.is-menu-open) :is(.wp-block-navigation__container, .wp-block-page-list) {
     251        flex-wrap: nowrap;
     252}
     253
     254.tn-nav--measured .wp-block-navigation__responsive-container:not(.is-menu-open) :is(.wp-block-navigation__container, .wp-block-page-list) {
     255        flex-shrink: 0;
     256        white-space: nowrap;
     257}
     258
     259.wp-block-navigation.tn-nav--collapsed .wp-block-navigation__responsive-container-open:not(.always-shown) {
     260        display: flex;
     261}
     262
     263.wp-block-navigation.tn-nav--collapsed .wp-block-navigation__responsive-container:not(.is-menu-open) {
     264        display: none;
     265}
     266
     267/*
     268 * Nút chuyển nền tối: mặc định là icon 44px nằm cạnh menu trên desktop.
     269 * Nút chỉ hiện khi JavaScript chạy (html.tn-js); nhãn chữ hiện trong menu mobile.
     270 */
     271.tn-theme-toggle {
     272        align-items: center;
     273        background: transparent;
     274        border: 1px solid var(--wp--preset--color--border);
     275        border-radius: 999px;
     276        color: var(--wp--preset--color--muted);
     277        cursor: pointer;
     278        display: none;
     279        font: inherit;
     280        gap: 0.35rem;
     281        height: 44px;
     282        justify-content: center;
     283        margin-inline-start: 0.35rem;
     284        min-width: 44px;
     285        padding: 0;
     286        transition: background-color 0.18s var(--tn-ease), border-color 0.18s var(--tn-ease), color 0.18s var(--tn-ease);
     287}
     288
     289html.tn-js .tn-theme-toggle {
     290        display: inline-flex;
     291}
     292
     293.tn-theme-toggle:hover {
     294        background: var(--wp--preset--color--surface);
     295        color: var(--wp--preset--color--contrast);
     296}
     297
     298.tn-theme-toggle:focus-visible {
     299        outline: 2px solid var(--wp--preset--color--accent);
     300        outline-offset: 2px;
     301}
     302
     303.tn-theme-toggle__icon {
     304        align-items: center;
     305        display: inline-flex;
     306        justify-content: center;
     307}
     308
     309/* Ánh sáng: hiện mặt trăng (chuyển sang tối); nền tối: hiện mặt trời. */
     310.tn-theme-toggle__icon--sun,
     311html[data-theme="dark"] .tn-theme-toggle__icon--moon {
     312        display: none;
     313}
     314
     315html[data-theme="dark"] .tn-theme-toggle__icon--sun {
     316        display: inline-flex;
     317}
     318
     319/* Nhãn chỉ dành cho trình đọc màn hình trên desktop. */
     320.tn-theme-toggle__label {
     321        clip-path: inset(50%);
     322        height: 1px;
     323        overflow: hidden;
     324        position: absolute;
     325        white-space: nowrap;
     326        width: 1px;
     327}
     328
     329/* Trong menu mobile: thành một dòng chữ lớn giống các mục menu. */
     330.wp-block-navigation .wp-block-navigation__responsive-container.is-menu-open .tn-theme-toggle {
     331        background: transparent;
     332        border: 0;
     333        border-radius: 0;
     334        color: var(--wp--preset--color--contrast);
     335        font-size: 1.5rem;
     336        font-weight: 600;
     337        gap: 0.6rem;
     338        justify-content: flex-start;
     339        margin-inline-start: 0;
     340        min-height: 56px;
     341        padding: 0;
     342        width: 100%;
     343}
     344
     345.wp-block-navigation .wp-block-navigation__responsive-container.is-menu-open .tn-theme-toggle:hover {
     346        color: var(--wp--preset--color--accent);
     347}
     348
     349.wp-block-navigation .wp-block-navigation__responsive-container.is-menu-open .tn-theme-toggle__label {
     350        clip-path: none;
     351        height: auto;
     352        overflow: visible;
     353        position: static;
     354        white-space: normal;
     355        width: auto;
     356}
     357
     358.wp-block-navigation .wp-block-navigation__responsive-container.is-menu-open .tn-theme-toggle svg {
     359        height: 24px;
     360        width: 24px;
    188361}
    189362
    … …  
    263436
    264437.tn-search__panel {
     438        box-sizing: border-box;
    265439        animation: tn-search-in 0.18s var(--tn-ease);
    266440        background: var(--wp--preset--color--base);
    … …  
    272446        position: absolute;
    273447        right: 0;
    274         top: calc(100% + 1.6rem);
    275         width: min(22rem, calc(100vw - 48px));
     448        top: calc(100% + 0.75rem);
     449        width: min(25rem, calc(100vw - 48px));
    276450        z-index: 5;
    277451}
    278452
    279453.tn-search__panel .wp-block-search__inside-wrapper {
     454        align-items: center;
     455        background: var(--wp--preset--color--surface);
     456        border: var(--tn-hairline);
     457        border-radius: 12px;
     458        gap: 0.25rem;
    280459        max-width: none;
     460        padding: 0.25rem;
     461}
     462
     463.tn-search__panel .wp-block-search__inside-wrapper:focus-within {
     464        border-color: var(--wp--preset--color--accent);
     465        outline: 2px solid var(--wp--preset--color--accent);
     466        outline-offset: 2px;
     467}
     468
     469.tn-search__panel .wp-block-search__input {
     470        background: transparent;
     471        border: 0;
     472        border-radius: 8px;
     473        box-shadow: none;
     474        flex: 1;
     475        width: 100%;
     476}
     477
     478.tn-search__panel .wp-block-search__input:focus-visible {
     479        outline: none;
     480}
     481
     482.tn-search__panel .wp-block-search__input::placeholder {
     483        color: var(--wp--preset--color--muted);
     484        opacity: 1;
     485}
     486
     487.tn-search__panel .wp-block-search__button {
     488        border-radius: 8px;
     489        cursor: pointer;
     490}
     491
     492.tn-search__panel .wp-block-search__button:focus-visible {
     493        outline: 2px solid var(--wp--preset--color--contrast);
     494        outline-offset: 2px;
    281495}
    282496
    … …  
    313527
    314528.tn-list-wide {
     529        --tn-list-text-width: 820px;
    315530        margin-inline: auto;
    316531        width: min(820px, 100%);
    … …  
    341556        line-height: 1.08;
    342557        margin-block: 0.15rem;
     558}
     559
     560/* Nới khoảng cách meta → tiêu đề; 2 class để thắng blockGap của layout. */
     561.tn-hero__body .tn-hero__title {
     562        margin-block-start: var(--wp--preset--spacing--30);
    343563}
    344564
    … …  
    497717
    498718/*
    499  * Home: mở rộng cả danh sách, cột meta rộng 320px, tiêu đề không bị thu hẹp.
     719 * Danh sách rộng: cột meta 12rem, phần còn lại dành cho tiêu đề.
    500720 * Dưới 1024px giữ cột meta 6.5rem để tiêu đề còn đủ chỗ.
    501721 */
    502722@media (min-width: 1024px) {
     723        .tn-list-wide {
     724                --tn-list-column-gap: clamp(2rem, 3vw, 2.75rem);
     725        }
     726
    503727        .tn-list-wide .tn-post-list .wp-block-post-template > li > .wp-block-group {
    504                 column-gap: clamp(2rem, 3vw, 2.75rem);
     728                --tn-list-meta-width: 12rem;
     729                column-gap: var(--tn-list-column-gap);
    505730                grid-template-columns: 12rem minmax(0, 1fr);
    506731        }
    … …  
    509734                min-width: 0;
    510735                width: 100%;
     736        }
     737}
     738
     739.tn-list-wide,
     740.tn-post-list {
     741        --tn-list-thumbnail-width: clamp(9rem, 20vw, 13rem);
     742}
     743
     744/* Mobile: ảnh phía trên; desktop: ảnh ở cột phải khi có thumbnail. */
     745
     746.tn-post-list .wp-block-post-template > li > .wp-block-group > .tn-list__thumbnail {
     747        grid-column: 1;
     748        grid-row: 1;
     749        width: 100%;
     750        min-width: 0;
     751        margin: 0 0 0.75rem;
     752        aspect-ratio: 16 / 9;
     753}
     754
     755.tn-list__thumbnail a {
     756        display: block;
     757        aspect-ratio: 16 / 9;
     758}
     759
     760.tn-list__thumbnail img {
     761        display: block;
     762        width: 100%;
     763        height: 100%;
     764        aspect-ratio: 16 / 9;
     765        object-fit: cover;
     766}
     767
     768@media (min-width: 782px) {
     769        /* Thêm chỗ cho ảnh, giữ nguyên ngân sách chiều rộng của phần chữ. */
     770        .tn-list-wide:has(.tn-list__thumbnail),
     771        .is-layout-constrained > .tn-post-list:has(.tn-list__thumbnail) {
     772                width: min(calc(var(--tn-list-text-width, var(--wp--style--global--content-size, 680px)) + var(--tn-list-thumbnail-width) + var(--tn-list-column-gap, clamp(1.5rem, 3vw, 2.5rem))), 100%);
     773                max-width: var(--wp--style--global--wide-size, 1080px);
     774        }
     775
     776        .tn-post-list:has(.tn-list__thumbnail) .wp-block-post-template > li > .wp-block-group:not(:has(> .tn-list__thumbnail)) {
     777                max-width: min(var(--tn-list-text-width, var(--wp--style--global--content-size, 680px)), 100%);
     778        }
     779
     780        .tn-post-list .wp-block-post-template > li > .wp-block-group:has(> .tn-list__thumbnail) {
     781                grid-template-columns: var(--tn-list-meta-width, 6.5rem) minmax(0, 1fr) var(--tn-list-thumbnail-width);
     782        }
     783
     784        .tn-post-list .wp-block-post-template > li > .wp-block-group > .tn-list__thumbnail {
     785                grid-column: 3;
     786                grid-row: 1 / span 2;
     787                margin-bottom: 0;
    511788        }
    512789}
    … …  
    559836        letter-spacing: -0.03em;
    560837        line-height: 1.07;
    561         margin-block: 0.35rem 0.25rem;
     838        margin-block: var(--wp--preset--spacing--30) 0.25rem;
    562839}
    563840
    … …  
    626903
    627904/* Nội dung bài */
     905/* Use the same containing width as the featured image; keep nested blocks inside their parent. */
     906.tn-single .wp-block-post-content > .tn-cover-width,
     907.editor-styles-wrapper .tn-cover-width {
     908        box-sizing: border-box;
     909        width: 100% !important;
     910        max-width: var(--wp--style--global--wide-size, 1080px) !important;
     911        margin-inline: auto !important;
     912        float: none;
     913}
     914
     915:is(.tn-single .wp-block-post-content, .editor-styles-wrapper) .wp-block-image.tn-cover-width img {
     916        width: 100% !important;
     917        height: auto;
     918}
     919
    628920.tn-single .wp-block-post-content > p {
    629921        line-height: 1.72;
    … …  
    631923
    632924.tn-single .wp-block-post-content :where(h2) {
    633         font-size: clamp(1.6rem, 1.35rem + 0.7vw, 1.85rem);
     925        font-size: clamp(1.875rem, 1.65rem + 0.8vw, 2.25rem);
    634926        letter-spacing: -0.022em;
    635927        line-height: 1.25;
    … …  
    638930
    639931.tn-single .wp-block-post-content :where(h3) {
    640         font-size: 1.3rem;
     932        font-size: clamp(1.5rem, 1.35rem + 0.5vw, 1.75rem);
    641933        letter-spacing: -0.015em;
    642934        margin-block-start: clamp(1.75rem, 3vw, 2.25rem);
     935}
     936
     937.tn-single .wp-block-post-content :where(h4) {
     938        font-size: clamp(1.25rem, 1.15rem + 0.35vw, 1.5rem);
     939        line-height: 1.35;
    643940}
    644941
    … …  
    9121209
    9131210/* --------------------------------------------------------------------------
     1211 * Tùy chọn hiển thị (Appearance → Simple TN)
     1212 * -------------------------------------------------------------------------- */
     1213
     1214.tn-hide-post-date .wp-block-post-date,
     1215.tn-hide-post-author .tn-byline,
     1216.tn-hide-post-author .wp-block-post-author,
     1217.tn-hide-post-author .wp-block-post-author-name {
     1218        display: none;
     1219}
     1220
     1221/* Ẩn ngày thì bỏ luôn dấu "·" phân cách trước chuyên mục trong cụm meta. */
     1222.tn-hide-post-date .tn-meta .wp-block-post-terms::before {
     1223        content: none;
     1224}
     1225
     1226/* --------------------------------------------------------------------------
    9141227 * Màn hình hẹp
    9151228 * -------------------------------------------------------------------------- */
    9161229
    9171230@media (max-width: 781px) {
     1231        .tn-post-footer .wp-block-post-terms a,
     1232        .tn-footer__bottom a {
     1233                align-items: center;
     1234                box-sizing: border-box;
     1235                display: inline-flex;
     1236                justify-content: center;
     1237                min-height: 44px;
     1238                min-width: 44px;
     1239        }
     1240
     1241        .tn-meta .wp-block-post-terms a {
     1242                min-width: 24px;
     1243        }
     1244
     1245        .tn-post-footer .wp-block-post-terms a {
     1246                max-width: 100%;
     1247        }
     1248
     1249        .tn-post-nav .wp-block-post-navigation-link a {
     1250                min-height: 44px;
     1251        }
     1252
    9181253        .tn-hero__media {
    9191254                border-radius: 12px;
  • simple-tn/1.3.18/functions.php

    r356199 r356992  
    1818require_once get_template_directory() . '/inc/content.php';
    1919require_once get_template_directory() . '/inc/search.php';
     20require_once get_template_directory() . '/inc/settings.php';
     21require_once get_template_directory() . '/inc/dark-mode.php';
     22require_once get_template_directory() . '/inc/toc.php';
  • simple-tn/1.3.18/inc/query.php

    r356199 r356992  
    6767
    6868/**
     69 * Đưa link phân trang cũ về URL main query, không để tham số cũ lan sang link mới.
     70 */
     71function simple_tn_redirect_legacy_pagination() {
     72        if ( ! isset( $_GET['query-0-page'] ) || is_admin() || is_feed() || is_preview() || ! ( is_home() || is_archive() || is_search() ) ) {
     73                return;
     74        }
     75
     76        $page = max( 1, (int) get_query_var( 'paged' ) );
     77
     78        // Trang trong đường dẫn ưu tiên hơn tham số cũ; URL gốc lấy số trang cũ.
     79        if ( 1 === $page && is_string( $_GET['query-0-page'] ) && ctype_digit( $_GET['query-0-page'] ) ) {
     80                $page = max( 1, (int) $_GET['query-0-page'] );
     81        }
     82
     83        $url = remove_query_arg( 'query-0-page', get_pagenum_link( $page, false ) );
     84        wp_safe_redirect( $url, 301 );
     85        exit;
     86}
     87add_action( 'template_redirect', 'simple_tn_redirect_legacy_pagination', 5 );
     88
     89
     90/**
    6991 * Truyền dấu nhận diện hero qua query context tới Post Template block.
    7092 *
    … …  
    125147
    126148/**
    127  * Ảnh đại diện trên Home (hero) và đầu trang đọc bài.
     149 * Ảnh đại diện hero, danh sách, bài liên quan và đầu trang đọc bài.
    128150 *
    129151 * - sizes khai báo đúng kích thước hiển thị để trình duyệt chọn file vừa đủ.
    130  * - Đây là ảnh LCP của trang: fetchpriority high, không lazy-load.
    131  * - Hero: link ảnh trùng đích với link tiêu đề ngay cạnh, nên ẩn khỏi screen reader
     152 * - Hero và ảnh đầu bài là ảnh LCP: fetchpriority high, không lazy-load.
     153 * - Hero/danh sách/bài liên quan: link ảnh trùng đích với tiêu đề, ẩn khỏi screen reader
    132154 *   và thứ tự Tab để tên bài không bị đọc hai lần. Chuột và chạm vẫn bấm được.
    133155 *
    … …  
    139161        $is_hero   = simple_tn_block_has_class( $block, 'tn-hero__media' );
    140162        $is_single = simple_tn_block_has_class( $block, 'tn-single__media' );
    141 
    142         if ( ! $is_hero && ! $is_single ) {
     163        $is_card   = simple_tn_block_has_class( $block, 'tn-list__thumbnail' ) || simple_tn_block_has_class( $block, 'tn-related__media' );
     164
     165        if ( ! $is_hero && ! $is_single && ! $is_card ) {
    143166                return $block_content;
    144167        }
    … …  
    146169        $processor = new WP_HTML_Tag_Processor( $block_content );
    147170
    148         if ( $is_hero && $processor->next_tag( 'a' ) ) {
     171        if ( ( $is_hero || $is_card ) && $processor->next_tag( 'a' ) ) {
    149172                $processor->set_attribute( 'aria-hidden', 'true' );
    150173                $processor->set_attribute( 'tabindex', '-1' );
     174        }
     175
     176        if ( $is_card ) {
     177                return $processor->get_updated_html();
    151178        }
    152179
  • simple-tn/1.3.18/inc/search.php

    r356199 r356992  
    99
    1010/**
    11  * Chỉ trả về bài viết trong kết quả tìm kiếm.
     11 * Trả về bài viết và trang trong kết quả tìm kiếm.
    1212 *
    13  * Theme là blog, nên trang tĩnh và các post type khác không nằm trong kết quả.
    1413 * Giữ nguyên hành vi trong admin và các query phụ.
    1514 *
    … …  
    2423         * Loại nội dung xuất hiện trong kết quả tìm kiếm.
    2524         *
    26          * @param string[] $post_types Mặc định chỉ bài viết.
     25         * @param string[] $post_types Mặc định gồm bài viết và trang.
    2726         */
    28         $post_types = (array) apply_filters( 'simple_tn_search_post_types', array( 'post' ) );
     27        $post_types = (array) apply_filters( 'simple_tn_search_post_types', array( 'post', 'page' ) );
    2928
    3029        $query->set( 'post_type', $post_types );
    … …  
    5049
    5150        if ( $processor->next_tag( array( 'tag_name' => 'form' ) ) ) {
    52                 $processor->set_attribute( 'aria-label', __( 'Tìm bài viết', 'simple-tn' ) );
     51                $processor->set_attribute( 'aria-label', __( 'Tìm kiếm', 'simple-tn' ) );
    5352        }
    5453
  • simple-tn/1.3.18/inc/setup.php

    r356199 r356992  
    1616        add_theme_support( 'post-thumbnails' );
    1717        add_theme_support( 'responsive-embeds' );
     18        add_theme_support( 'align-wide' );
    1819
    1920        // CSS bố cục cấp trang: hiển thị trong editor để bản xem trước khớp frontend.
    … …  
    2425}
    2526add_action( 'after_setup_theme', 'simple_tn_setup' );
     27
     28/** Add an explicit cover-width switch to the block inspector. */
     29function simple_tn_enqueue_block_width_editor() {
     30        wp_enqueue_script(
     31                'simple-tn-block-width',
     32                get_template_directory_uri() . '/assets/js/block-width.js',
     33                array( 'wp-hooks', 'wp-element', 'wp-block-editor', 'wp-components', 'wp-i18n' ),
     34                SIMPLE_TN_VERSION,
     35                true
     36        );
     37}
     38add_action( 'enqueue_block_editor_assets', 'simple_tn_enqueue_block_width_editor' );
    2639
    2740/**
    … …  
    95108}
    96109add_action( 'wp_enqueue_scripts', 'simple_tn_enqueue_theme_styles', 20 );
     110
     111/** Keep header navigation on one row, using the core overlay when space runs out. */
     112function simple_tn_enqueue_header_script() {
     113        wp_enqueue_script( 'simple-tn-header', get_template_directory_uri() . '/assets/js/header.js', array(), SIMPLE_TN_VERSION, true );
     114}
     115add_action( 'wp_enqueue_scripts', 'simple_tn_enqueue_header_script' );
  • simple-tn/1.3.18/languages/simple-tn.pot

    r356199 r356992  
    33msgid ""
    44msgstr ""
    5 "Project-Id-Version: Simple TN 1.2.9\n"
     5"Project-Id-Version: Simple TN 1.3.2\n"
    66"Report-Msgid-Bugs-To: https://wordpress.org/support/theme/simple-tn\n"
    77"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
    … …  
    1010"Content-Type: text/plain; charset=UTF-8\n"
    1111"Content-Transfer-Encoding: 8bit\n"
    12 "POT-Creation-Date: 2026-10-29T15:54:25+00:00\n"
     12"POT-Creation-Date: 2026-10-30T00:10:58+00:00\n"
    1313"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
    1414"X-Generator: WP-CLI 2.12.0\n"
    … …  
    1717#. Theme Name of the theme
    1818#: style.css
     19#: inc/settings.php:176
    1920#: inc/setup.php:34
    2021msgid "Simple TN"
    … …  
    2324#. Description of the theme
    2425#: style.css
    25 msgid "Block theme tối giản cho blog cá nhân. Mobile-first, tập trung vào trải nghiệm đọc, không sidebar, không JavaScript từ theme. Màu, font, menu và footer chỉnh được trong Site Editor."
     26msgid "Block theme tối giản cho blog cá nhân. Mobile-first, tập trung vào trải nghiệm đọc, không sidebar, JavaScript tối thiểu cho nút chuyển nền tối. Màu, font, menu và footer chỉnh được trong Site Editor; bật/tắt ngày, tác giả, nền tối và chọn menu nhanh trong Giao diện > Simple TN."
    2627msgstr ""
    2728
    … …  
    3637msgstr ""
    3738
    38 #: inc/search.php:52
     39#: inc/dark-mode.php:61
     40msgid "Chuyển sang nền tối"
     41msgstr ""
     42
     43#: inc/dark-mode.php:62
     44msgid "Chuyển sang nền sáng"
     45msgstr ""
     46
     47#: inc/dark-mode.php:63
     48#: inc/settings.php:234
     49msgid "Nền tối"
     50msgstr ""
     51
     52#: inc/dark-mode.php:64
     53msgid "Nền sáng"
     54msgstr ""
     55
     56#: inc/search.php:51
     57#: inc/search.php:73
    3958#: patterns/404-content.php:24
    4059#: patterns/header-default.php:34
    4160#: patterns/search-header.php:17
    42 msgid "Tìm bài viết"
    43 msgstr ""
    44 
    45 #: inc/search.php:74
    4661msgid "Tìm kiếm"
     62msgstr ""
     63
     64#: inc/settings.php:21
     65msgid "Tối mặc định"
     66msgstr ""
     67
     68#: inc/settings.php:33
     69msgid "Tối ấm"
     70msgstr ""
     71
     72#: inc/settings.php:175
     73msgid "Cài đặt Simple TN"
     74msgstr ""
     75
     76#: inc/settings.php:201
     77msgid "Hiển thị bài viết"
     78msgstr ""
     79
     80#: inc/settings.php:208
     81msgid "Ngày đăng"
     82msgstr ""
     83
     84#: inc/settings.php:214
     85msgid "Hiện ngày đăng của bài viết"
     86msgstr ""
     87
     88#: inc/settings.php:215
     89msgid "Áp dụng cho danh sách bài, bài đơn và bài viết liên quan."
     90msgstr ""
     91
     92#: inc/settings.php:221
     93msgid "Tác giả"
     94msgstr ""
     95
     96#: inc/settings.php:227
     97msgid "Hiện tên tác giả"
     98msgstr ""
     99
     100#: inc/settings.php:228
     101msgid "Ẩn dòng “Bởi …” ở đầu bài viết."
     102msgstr ""
     103
     104#: inc/settings.php:241
     105msgid "Nút chuyển nền tối"
     106msgstr ""
     107
     108#: inc/settings.php:247
     109msgid "Hiện nút chuyển nền sáng/tối"
     110msgstr ""
     111
     112#: inc/settings.php:248
     113msgid "Tắt để ẩn nút và luôn dùng bảng màu sáng đang chọn."
     114msgstr ""
     115
     116#: inc/settings.php:254
     117msgid "Bảng màu tối"
     118msgstr ""
     119
     120#: inc/settings.php:262
     121msgid "Menu header và footer"
     122msgstr ""
     123
     124#: inc/settings.php:269
     125msgid "Menu header"
     126msgstr ""
     127
     128#: inc/settings.php:280
     129msgid "Menu footer"
     130msgstr ""
     131
     132#: inc/settings.php:295
     133msgid "Bật/tắt nhanh các thành phần hiển thị trên toàn site."
     134msgstr ""
     135
     136#: inc/settings.php:302
     137msgid "Nút chuyển nền sáng/tối nằm trong menu header. Trên mobile, nút nằm trong menu mở."
     138msgstr ""
     139
     140#: inc/settings.php:303
     141msgid "Mặc định theo cài đặt hệ thống của khách; lựa chọn được lưu trong trình duyệt, không gửi đi đâu."
     142msgstr ""
     143
     144#: inc/settings.php:304
     145msgid "Bảng màu sáng chỉnh trong Site Editor → Styles. Bảng màu tối chỉnh riêng bên dưới để không ảnh hưởng giao diện sáng."
     146msgstr ""
     147
     148#: inc/settings.php:325
     149msgid "Nền"
     150msgstr ""
     151
     152#: inc/settings.php:326
     153msgid "Nền phụ"
     154msgstr ""
     155
     156#: inc/settings.php:327
     157msgid "Chữ chính"
     158msgstr ""
     159
     160#: inc/settings.php:328
     161msgid "Chữ phụ"
     162msgstr ""
     163
     164#: inc/settings.php:329
     165msgid "Đường kẻ"
     166msgstr ""
     167
     168#: inc/settings.php:330
     169msgid "Màu nhấn"
     170msgstr ""
     171
     172#: inc/settings.php:331
     173msgid "Chữ trên nền nhấn"
     174msgstr ""
     175
     176#: inc/settings.php:336
     177msgid "Bộ màu có sẵn"
     178msgstr ""
     179
     180#: inc/settings.php:338
     181msgid "Tùy chỉnh"
     182msgstr ""
     183
     184#: inc/settings.php:346
     185msgid "Chọn bộ màu để điền nhanh 7 ô bên dưới, sau đó bấm Lưu thay đổi. Có thể chỉnh từng ô."
     186msgstr ""
     187
     188#: inc/settings.php:362
     189msgid "Màu tối chỉ áp dụng khi khách bật nền tối; bảng màu sáng vẫn chỉnh trong Site Editor → Styles."
     190msgstr ""
     191
     192#: inc/settings.php:415
     193msgid "Chọn menu đã tạo trong Site Editor → Navigation."
     194msgstr ""
     195
     196#: inc/settings.php:416
     197msgid "“Theo Site Editor” giữ nguyên thiết lập của Navigation block; chọn một menu cụ thể thì menu đó được dùng thay cho thiết lập của block."
     198msgstr ""
     199
     200#: inc/settings.php:417
     201msgid "Tùy chọn chỉ áp dụng cho Navigation block của theme và có hiệu lực khi khách xem site. Nếu bạn đã thay bằng block khác, hãy chọn menu trực tiếp trong Site Editor."
     202msgstr ""
     203
     204#: inc/settings.php:486
     205msgid "Theo Site Editor (mặc định)"
     206msgstr ""
     207
     208#. translators: %d: menu ID.
     209#: inc/settings.php:494
     210#, php-format
     211msgid "Menu #%d"
     212msgstr ""
     213
     214#: inc/settings.php:503
     215msgid "Đang dùng menu này thay cho thiết lập của Navigation block trong Site Editor."
     216msgstr ""
     217
     218#: inc/settings.php:507
     219msgid "Chưa có menu nào. Tạo menu trong Site Editor → Navigation."
     220msgstr ""
     221
     222#: inc/settings.php:508
     223msgid "Mở Site Editor"
    47224msgstr ""
    48225
    … …  
    298475
    299476#: patterns/search-results.php:34
    300 msgid "Không tìm thấy bài viết phù hợp. Thử một từ khóa ngắn hơn hoặc khác đi."
    301 msgstr ""
    302 
    303 #: theme.json
     477msgid "Không tìm thấy nội dung phù hợp. Thử một từ khóa ngắn hơn hoặc khác đi."
     478msgstr ""
     479
     480#: .json
    304481msgctxt "Border radius size name"
    305482msgid "Small"
    306483msgstr ""
    307484
    308 #: theme.json
     485#: .json
    309486msgctxt "Border radius size name"
    310487msgid "Medium"
    311488msgstr ""
    312489
    313 #: theme.json
     490#: .json
    314491msgctxt "Border radius size name"
    315492msgid "Large"
    316493msgstr ""
    317494
    318 #: theme.json
     495#: .json
    319496#: styles/warm.json
    320497msgctxt "Color name"
    … …  
    322499msgstr ""
    323500
    324 #: theme.json
     501#: .json
    325502#: styles/warm.json
    326503msgctxt "Color name"
    … …  
    328505msgstr ""
    329506
    330 #: theme.json
     507#: .json
    331508#: styles/warm.json
    332509msgctxt "Color name"
    … …  
    334511msgstr ""
    335512
    336 #: theme.json
     513#: .json
    337514#: styles/warm.json
    338515msgctxt "Color name"
    … …  
    340517msgstr ""
    341518
    342 #: theme.json
     519#: .json
    343520#: styles/warm.json
    344521msgctxt "Color name"
    … …  
    346523msgstr ""
    347524
    348 #: theme.json
     525#: .json
    349526#: styles/warm.json
    350527msgctxt "Color name"
    … …  
    352529msgstr ""
    353530
    354 #: theme.json
     531#: .json
    355532#: styles/warm.json
    356533msgctxt "Color name"
    … …  
    358535msgstr ""
    359536
    360 #: theme.json
     537#: .json
    361538msgctxt "Space size name"
    362539msgid "2X-Small"
    363540msgstr ""
    364541
    365 #: theme.json
     542#: .json
    366543msgctxt "Space size name"
    367544msgid "X-Small"
    368545msgstr ""
    369546
    370 #: theme.json
     547#: .json
    371548msgctxt "Space size name"
    372549msgid "Small"
    373550msgstr ""
    374551
    375 #: theme.json
     552#: .json
    376553msgctxt "Space size name"
    377554msgid "Medium"
    378555msgstr ""
    379556
    380 #: theme.json
     557#: .json
    381558msgctxt "Space size name"
    382559msgid "Large"
    383560msgstr ""
    384561
    385 #: theme.json
     562#: .json
    386563msgctxt "Space size name"
    387564msgid "X-Large"
    388565msgstr ""
    389566
    390 #: theme.json
     567#: .json
    391568msgctxt "Space size name"
    392569msgid "2X-Large"
    393570msgstr ""
    394571
    395 #: theme.json
     572#: .json
    396573msgctxt "Font family name"
    397574msgid "Literata"
    398575msgstr ""
    399576
    400 #: theme.json
     577#: .json
    401578msgctxt "Font family name"
    402579msgid "Be Vietnam Pro"
    403580msgstr ""
    404581
    405 #: theme.json
     582#: .json
    406583msgctxt "Font family name"
    407584msgid "Monospace"
    408585msgstr ""
    409586
    410 #: theme.json
     587#: .json
    411588msgctxt "Font size name"
    412589msgid "X-Small"
    413590msgstr ""
    414591
    415 #: theme.json
     592#: .json
    416593msgctxt "Font size name"
    417594msgid "Small"
    418595msgstr ""
    419596
    420 #: theme.json
     597#: .json
    421598msgctxt "Font size name"
    422599msgid "Medium"
    423600msgstr ""
    424601
    425 #: theme.json
     602#: .json
    426603msgctxt "Font size name"
    427604msgid "Large"
    428605msgstr ""
    429606
    430 #: theme.json
     607#: .json
    431608msgctxt "Font size name"
    432609msgid "X-Large"
    433610msgstr ""
    434611
    435 #: theme.json
     612#: .json
    436613msgctxt "Font size name"
    437614msgid "2X-Large"
    438615msgstr ""
    439616
    440 #: theme.json
     617#: .json
    441618msgctxt "Font size name"
    442619msgid "Huge"
    443620msgstr ""
    444621
    445 #: theme.json
     622#: .json
    446623msgctxt "Custom template name"
    447624msgid "Bài viết không ảnh đầu"
    448625msgstr ""
    449626
    450 #: theme.json
     627#: .json
    451628msgctxt "Template part name"
    452629msgid "Header"
    453630msgstr ""
    454631
    455 #: theme.json
     632#: .json
    456633msgctxt "Template part name"
    457634msgid "Footer"
    458635msgstr ""
    459636
    460 #: theme.json
     637#: .json
    461638msgctxt "Template part name"
    462639msgid "Post meta"
  • simple-tn/1.3.18/patterns/404-content.php

    r356199 r356992  
    2222        <!-- /wp:paragraph -->
    2323
    24         <!-- wp:search {"label":"<?php echo esc_attr__( 'Tìm bài viết', 'simple-tn' ); ?>","showLabel":false,"placeholder":"<?php echo esc_attr__( 'Nhập từ khóa', 'simple-tn' ); ?>","buttonText":"<?php echo esc_attr__( 'Tìm', 'simple-tn' ); ?>","buttonUseIcon":true} /-->
     24        <!-- wp:search {"label":"<?php echo esc_attr__( 'Tìm kiếm', 'simple-tn' ); ?>","showLabel":false,"placeholder":"<?php echo esc_attr__( 'Nhập từ khóa', 'simple-tn' ); ?>","buttonText":"<?php echo esc_attr__( 'Tìm', 'simple-tn' ); ?>","buttonUseIcon":true} /-->
    2525
    2626        <!-- wp:paragraph -->
  • simple-tn/1.3.18/patterns/footer-default.php

    r356199 r356992  
    3131                <!-- /wp:group -->
    3232
    33                 <!-- wp:navigation {"ariaLabel":"<?php echo esc_attr__( 'Menu chân trang', 'simple-tn' ); ?>","overlayMenu":"never","style":{"spacing":{"blockGap":"var:preset|spacing|30"}},"layout":{"type":"flex","flexWrap":"wrap"}} /-->
     33                <!-- wp:navigation {"className":"tn-nav--footer","ariaLabel":"<?php echo esc_attr__( 'Menu chân trang', 'simple-tn' ); ?>","overlayMenu":"never","style":{"spacing":{"blockGap":"var:preset|spacing|30"}},"layout":{"type":"flex","flexWrap":"wrap"}} /-->
    3434        </div>
    3535        <!-- /wp:group -->
  • simple-tn/1.3.18/patterns/header-centered.php

    r356199 r356992  
    1717        <!-- wp:site-logo {"width":40,"shouldSyncIcon":false,"align":"center"} /-->
    1818        <!-- wp:site-title {"level":0,"textAlign":"center","style":{"typography":{"fontSize":"var:preset|font-size|large"}}} /-->
    19         <!-- wp:navigation {"ariaLabel":"<?php echo esc_attr__( 'Menu chính', 'simple-tn' ); ?>","overlayMenu":"mobile","overlayBackgroundColor":"base","overlayTextColor":"contrast","style":{"spacing":{"blockGap":"var:preset|spacing|30"}},"layout":{"type":"flex","justifyContent":"center"}} /-->
     19        <!-- wp:navigation {"className":"tn-nav--header","ariaLabel":"<?php echo esc_attr__( 'Menu chính', 'simple-tn' ); ?>","overlayMenu":"mobile","overlayBackgroundColor":"base","overlayTextColor":"contrast","style":{"spacing":{"blockGap":"var:preset|spacing|30"}},"layout":{"type":"flex","justifyContent":"center"}} /-->
    2020</header>
    2121<!-- /wp:group -->
  • simple-tn/1.3.18/patterns/header-default.php

    r356199 r356992  
    2626                <!-- wp:group {"className":"tn-header__actions","style":{"spacing":{"blockGap":"var:preset|spacing|20"}},"layout":{"type":"flex","flexWrap":"nowrap","verticalAlignment":"center"}} -->
    2727                <div class="wp-block-group tn-header__actions">
    28                         <!-- wp:navigation {"ariaLabel":"<?php echo esc_attr__( 'Menu chính', 'simple-tn' ); ?>","overlayMenu":"mobile","overlayBackgroundColor":"base","overlayTextColor":"contrast","style":{"spacing":{"blockGap":"var:preset|spacing|30"}},"layout":{"type":"flex","justifyContent":"right"}} /-->
     28                        <!-- wp:navigation {"className":"tn-nav--header","ariaLabel":"<?php echo esc_attr__( 'Menu chính', 'simple-tn' ); ?>","overlayMenu":"mobile","overlayBackgroundColor":"base","overlayTextColor":"contrast","style":{"spacing":{"blockGap":"var:preset|spacing|30"}},"layout":{"type":"flex","justifyContent":"right"}} /-->
    2929
    3030                        <!-- wp:details {"summary":"<?php echo esc_attr__( 'Tìm', 'simple-tn' ); ?>","className":"tn-search"} -->
    … …  
    3232                                <!-- wp:group {"className":"tn-search__panel","layout":{"type":"default"}} -->
    3333                                <div class="wp-block-group tn-search__panel">
    34                                         <!-- wp:search {"label":"<?php echo esc_attr__( 'Tìm bài viết', 'simple-tn' ); ?>","showLabel":false,"placeholder":"<?php echo esc_attr__( 'Nhập từ khóa', 'simple-tn' ); ?>","buttonText":"<?php echo esc_attr__( 'Tìm', 'simple-tn' ); ?>","buttonUseIcon":true,"className":"tn-search__form"} /-->
     34                                        <!-- wp:search {"label":"<?php echo esc_attr__( 'Tìm kiếm', 'simple-tn' ); ?>","showLabel":false,"placeholder":"<?php echo esc_attr__( 'Nhập từ khóa', 'simple-tn' ); ?>","buttonText":"<?php echo esc_attr__( 'Tìm', 'simple-tn' ); ?>","buttonUseIcon":true,"className":"tn-search__form"} /-->
    3535                                </div>
    3636                                <!-- /wp:group -->
  • simple-tn/1.3.18/patterns/hero-latest-post.php

    r356199 r356992  
    1717                <!-- wp:group {"className":"tn-hero__inner","layout":{"type":"default"}} -->
    1818                <div class="wp-block-group tn-hero__inner">
    19                         <!-- wp:post-featured-image {"isLink":true,"aspectRatio":"3/2","sizeSlug":"large","className":"tn-hero__media"} /-->
     19                        <!-- wp:post-featured-image {"isLink":true,"aspectRatio":"16/9","sizeSlug":"large","className":"tn-hero__media"} /-->
    2020
    2121                        <!-- wp:group {"className":"tn-hero__body","style":{"spacing":{"blockGap":"var:preset|spacing|20"}},"layout":{"type":"default"}} -->
  • simple-tn/1.3.18/patterns/post-list.php

    r356199 r356992  
    44 * Slug: simple-tn/post-list
    55 * Categories: simple-tn, query
    6  * Description: Danh sách bài theo main query (Home, archive, search), chỉ có chữ, kèm pagination.
     6 * Description: Danh sách bài theo main query (Home, archive, search), thumbnail tùy chọn, kèm pagination.
    77 * Viewport Width: 1280
    88 *
    … …  
    2020                        <!-- wp:post-title {"isLink":true,"level":2,"fontSize":"x-large"} /-->
    2121                        <!-- wp:post-excerpt {"excerptLength":24,"className":"tn-excerpt","textColor":"muted","fontSize":"small","style":{"typography":{"lineHeight":"1.6"}}} /-->
     22                        <!-- wp:post-featured-image {"isLink":true,"aspectRatio":"16/9","sizeSlug":"medium_large","className":"tn-list__thumbnail"} /-->
     23
    2224                </div>
    2325                <!-- /wp:group -->
  • simple-tn/1.3.18/patterns/search-header.php

    r356199 r356992  
    1515<div class="wp-block-group" style="margin-bottom:var(--wp--preset--spacing--40)">
    1616        <!-- wp:query-title {"type":"search","level":1} /-->
    17         <!-- wp:search {"label":"<?php echo esc_attr__( 'Tìm bài viết', 'simple-tn' ); ?>","showLabel":false,"placeholder":"<?php echo esc_attr__( 'Nhập từ khóa', 'simple-tn' ); ?>","buttonText":"<?php echo esc_attr__( 'Tìm', 'simple-tn' ); ?>","buttonUseIcon":true} /-->
     17        <!-- wp:search {"label":"<?php echo esc_attr__( 'Tìm kiếm', 'simple-tn' ); ?>","showLabel":false,"placeholder":"<?php echo esc_attr__( 'Nhập từ khóa', 'simple-tn' ); ?>","buttonText":"<?php echo esc_attr__( 'Tìm', 'simple-tn' ); ?>","buttonUseIcon":true} /-->
    1818</div>
    1919<!-- /wp:group -->
  • simple-tn/1.3.18/patterns/search-results.php

    r356199 r356992  
    2020                        <!-- wp:post-title {"isLink":true,"level":2,"fontSize":"x-large"} /-->
    2121                        <!-- wp:post-excerpt {"excerptLength":24,"className":"tn-excerpt","textColor":"muted","fontSize":"small","style":{"typography":{"lineHeight":"1.6"}}} /-->
     22                        <!-- wp:post-featured-image {"isLink":true,"aspectRatio":"16/9","sizeSlug":"medium_large","className":"tn-list__thumbnail"} /-->
     23
    2224                </div>
    2325                <!-- /wp:group -->
    … …  
    3234        <!-- wp:query-no-results -->
    3335                <!-- wp:paragraph -->
    34                 <p><?php esc_html_e( 'Không tìm thấy bài viết phù hợp. Thử một từ khóa ngắn hơn hoặc khác đi.', 'simple-tn' ); ?></p>
     36                <p><?php esc_html_e( 'Không tìm thấy nội dung phù hợp. Thử một từ khóa ngắn hơn hoặc khác đi.', 'simple-tn' ); ?></p>
    3537                <!-- /wp:paragraph -->
    3638        <!-- /wp:query-no-results -->
  • simple-tn/1.3.18/readme.txt

    r356199 r356992  
    77License URI: https://www.gnu.org/licenses/gpl-2.0.html
    88
    9 Block theme tối giản cho blog cá nhân: một cột, không sidebar, không JavaScript riêng, tối ưu cho việc đọc.
     9Block theme tối giản cho blog cá nhân: một cột, không sidebar, JavaScript tối thiểu cho chuyển nền tối, menu thích ứng và mục lục, tối ưu cho việc đọc.
    1010
    1111== Description ==
    1212
    13 Simple TN là block theme cho blog cá nhân. Giao diện một cột, không sidebar, tập trung vào trải nghiệm đọc; không có JavaScript riêng từ theme.
     13Simple TN là block theme cho blog cá nhân. Giao diện một cột, không sidebar, tập trung vào trải nghiệm đọc; JavaScript nhỏ cho nút chuyển nền tối, thu gọn menu khi không đủ chỗ và mục lục bài viết.
    1414
    1515Tính năng:
    1616
    17 * Home: hero bài mới nhất, danh sách bài và pagination dùng chung khung 820px với archive và search.
    18 * Header dính trên cùng, menu mobile dùng Navigation block của WordPress core; panel tìm kiếm mở bằng thẻ details, không cần JavaScript.
     17* Home: hero bài mới nhất với ảnh tỷ lệ 16:9, danh sách bài và pagination dùng chung khung 820px với archive và search; desktop tự mở rộng thêm chỗ cho thumbnail khi có ảnh.
     18* Link phân trang cũ `query-0-page` tự chuyển 301 về URL main query sạch; giữ trang hiện tại trong đường dẫn và các tham số tìm kiếm/chuyên mục.
     19* Header dính trên cùng, menu mobile dùng Navigation block của WordPress core; panel tìm kiếm dùng thẻ details, tự focus ô nhập khi mở và hỗ trợ phím Esc.
     20* Heading nội dung bài: H2 30–36px, H3 24–28px, H4 20–24px (theo màn hình, với cỡ chữ gốc 16px).
    1921* Trang đọc: H1 rộng, dòng tác giả, ảnh đầu bài, điều hướng bài trước/sau và 6 bài liên quan cùng chuyên mục.
     22* Mục lục bài viết tự động từ H3, mặc định hiển thị khi có ít nhất 4 H3; H4 có thể bật để hiển thị lồng bên dưới H3. Giữ ID tác giả, hỗ trợ slug tiếng Việt và heading trùng tên; mobile mặc định thu gọn.
    2023* Bình luận không avatar, form bình luận và phân trang bình luận.
    21 * 2 style variation: mặc định và "Ấm"; màu, font, cỡ chữ, khoảng cách chỉnh trong Site Editor.
     24* 8 bộ màu sáng/tối: Mặc định, Ấm, Đại dương, Rừng, Oải hương, Đất nung, Hoa hồng và Đá phiến. Chọn trong Site Editor → Styles; màu, font, cỡ chữ, khoảng cách vẫn chỉnh được.
     25* Nền tối: nút chuyển nền sáng/tối trong menu header; trên mobile nằm trong menu mở. Theo cài đặt hệ thống của khách và lưu lựa chọn trong trình duyệt.
     26* Màu tối mặc định tự theo style variation đã lưu; tắt “Màu tối theo style” trong Giao diện > Simple TN để dùng màu tối riêng. Bảng màu tối tùy chỉnh từ bản cũ được giữ nguyên.
     27* 2 bộ màu tối thủ công có sẵn: "Tối mặc định" (trung tính) và "Tối ấm" (nền nâu ấm, nhấn hồng), chọn nhanh trong Giao diện > Simple TN; vẫn chỉnh được từng màu.
    2228* 15 pattern, 8 template và 3 template part; không custom post type, shortcode hay custom block.
    23 * Không JavaScript riêng, không thư viện ngoài; font Literata và Be Vietnam Pro tự host.
     29* Trang cài đặt có 2 tab Cài đặt và README. Tab Cài đặt giữ 4 nhóm Header & menu, Bài viết, Table of Contents, Màu sắc & nền tối; responsive và bảng màu tùy chỉnh thu gọn. Tab README hiển thị tài liệu đầy đủ từ file đi kèm theme.
     30* Trang cài đặt Giao diện > Simple TN: cấu hình mục lục, bật/tắt logo header (giữ tên website), thumbnail danh sách bài, ngày đăng, tên tác giả, nút chuyển nền tối, chỉnh 7 màu nền tối và chọn menu header/footer nhanh.
     31* Thumbnail danh sách nằm bên phải trên desktop, phía trên phần chữ trên mobile (dưới 782px), tỷ lệ 16:9, dùng ảnh đại diện bài viết; áp dụng cho Home, chuyên mục, tag, tác giả, lưu trữ và tìm kiếm. Mặc định tắt; bài không có ảnh vẫn chỉ hiện chữ.
     32* Table block dùng auto layout theo nội dung khi tắt “Cố định chiều dài ô”; bảng thiếu chỗ sẽ cuộn ngang thay vì bẻ từ thành từng ký tự. Giữ nguyên fixed layout của WordPress khi bật tùy chọn này.
     33* Block có hỗ trợ chiều rộng có thể mở rộng bằng ảnh cover trong sidebar Block → Chiều rộng; hỗ trợ cả Table, Image và Gallery.
     34* Tìm kiếm cả bài viết và trang; panel trên header tự focus ô nhập khi mở, Esc đóng panel và trả focus về nút tìm kiếm.
     35* Không thư viện ngoài; font Literata và Be Vietnam Pro tự host.
    2436
    2537Yêu cầu:
    … …  
    3042Bố cục:
    3143
    32 * Home, category, tag, author, date và search dùng chung khung danh sách 820px.
     44* Home, category, tag, author, date và search dùng chung khung chữ 820px; khi có thumbnail desktop, danh sách rộng thêm phần ảnh và khoảng cách, tối đa theo màn hình. Cột meta và tiêu đề giữ độ rộng cũ khi đủ chỗ.
    3345* Trang đọc dùng cột nội dung 680px; ảnh đầu bài rộng tối đa 1080px.
    34 * Mobile một cột, không tràn ngang ở 320px.
     46* Mobile một cột; nội dung rộng như bảng và code cuộn trong khung riêng thay vì làm tràn ngang toàn trang ở 320px.
    3547
    3648== Installation ==
    … …  
    41534. Vào Cài đặt > Đọc để đặt số bài mỗi trang cho Home.
    42545. Tạo menu trong Giao diện > Trình chỉnh sửa > Navigation.
     556. Vào Giao diện > Simple TN > Cài đặt để chỉnh 4 nhóm Header & menu, Bài viết, Table of Contents, Màu sắc & nền tối; bấm Lưu thay đổi.
     567. Mở tab README trên cùng trang để đọc hướng dẫn và changelog đúng với bản đang cài. Tab này chỉ đọc, không có nút lưu cài đặt.
     578. Chọn và lưu một bộ màu trong Giao diện > Trình chỉnh sửa > Styles > Browse styles. Màu tối tự theo style khi bật “Màu tối theo style”.
    4358
    4459== Frequently Asked Questions ==
    4560
    46 = Làm sao đổi giữa giao diện mặc định và "Ấm"? =
    47 Giao diện > Trình chỉnh sửa > Styles > Browse styles, chọn "Ấm".
     61= Đọc tài liệu của bản theme đang cài ở đâu? =
     62Vào Giao diện > Simple TN > README. Tab đọc trực tiếp readme.txt đi kèm theme, gồm toàn bộ hướng dẫn, FAQ, changelog, lưu ý nâng cấp và tài nguyên/giấy phép. Không cần Internet hoặc plugin đọc Markdown; văn bản tự xuống dòng trên mobile.
     63Chỉ tài khoản có quyền chỉnh giao diện (edit_theme_options) mới xem được trang này. Chuyển về tab Cài đặt để chỉnh và lưu tùy chọn; tab README không chứa form lưu hoặc color picker. Nếu file tài liệu thiếu/không đọc được, trang hiển thị thông báo thay vì lỗi PHP.
     64
     65= Làm sao chọn một trong 8 bộ màu? =
     66Giao diện > Trình chỉnh sửa > Styles > Browse styles, chọn Mặc định, Ấm, Đại dương, Rừng, Oải hương, Đất nung, Hoa hồng hoặc Đá phiến, rồi lưu. Các variation đổi màu, giữ font và bố cục của theme. Nếu đã chỉnh bảng màu thủ công trong Site Editor, kiểm tra lại các màu tùy chỉnh sau khi đổi style.
    4867
    4968= Làm sao đổi màu, font, cỡ chữ, khoảng cách? =
    … …  
    5170
    5271= Làm sao đổi menu? =
    53 Giao diện > Trình chỉnh sửa > Navigation. Nếu đang dùng menu cổ điển, chọn Import trong block Navigation.
     72Cách nhanh: Giao diện > Simple TN, chọn menu cho header và footer.
     73Chi tiết: Giao diện > Trình chỉnh sửa > Navigation. Nếu đang dùng menu cổ điển, chọn Import trong block Navigation.
     74
     75= Làm sao ẩn logo và chỉ giữ tên website? =
     76Giao diện > Simple TN > Header & menu, bỏ chọn “Hiện logo trên header” rồi lưu. Logo trong template part header bị ẩn; tên website vẫn hiển thị nếu còn block Site Title.
     77
     78= Làm sao bật ảnh trong danh sách bài? =
     79Giao diện > Simple TN > Bài viết, bật “Hiện ảnh đại diện bên phải mỗi bài viết” rồi lưu. Ảnh lấy từ Featured Image của từng bài, tỷ lệ 16:9; mặc định tùy chọn này tắt.
     80Trên desktop (từ 782px), ảnh nằm bên phải; danh sách rộng thêm phần ảnh và khoảng cách, giữ độ rộng meta/tiêu đề khi màn hình đủ chỗ. Dưới 782px, ảnh nằm phía trên phần chữ và rộng toàn hàng, giống hero. Bài không có ảnh chỉ hiện chữ.
     81Áp dụng cho Home, chuyên mục, tag, tác giả, lưu trữ và tìm kiếm. Tùy chọn này không tắt ảnh hero hoặc ảnh đầu bài viết.
     82
     83= Làm sao bật hoặc tắt mục lục bài viết? =
     84Giao diện > Simple TN > Table of Contents. Có bốn tùy chọn:
     85* Hiển thị mục lục bài viết: mặc định bật. Tắt sẽ ngừng xử lý mục lục, không thêm anchor và không tải CSS/JavaScript riêng của TOC.
     86* Số heading tối thiểu: mặc định 4, nhận giá trị từ 2 đến 10; chỉ đếm H3.
     87* Hiển thị heading cấp H4: mặc định tắt. Khi bật, H4 nằm bên dưới H3 cha; không dùng H5/H6.
     88* Thu gọn mục lục trên mobile: mặc định bật dưới 782px; desktop mở sẵn. Có thể mở/đóng bằng chuột, chạm hoặc bàn phím.
     89Mục lục chỉ xuất hiện trong nội dung bài đơn chính, trước H2/H3 đầu tiên và sau phần mở đầu nếu có. Không đưa H1/H2 vào danh sách, không xuất hiện trên page, archive, tìm kiếm, excerpt, feed hoặc bài đang khóa mật khẩu. Không thay đổi nội dung trong database hay permalink.
     90Anchor có sẵn được giữ nguyên. Các ID thủ công bị trùng hoặc không hợp lệ được bỏ khỏi danh sách; nếu còn ít H3 hợp lệ hơn ngưỡng đã đặt thì không hiển thị mục lục. Heading chưa có ID được tạo slug tiếng Việt và thêm hậu tố khi cần.
     91Link mục lục dùng anchor HTML thật, hỗ trợ URL hash/back/forward, cuộn mượt và reduced motion. Khi tắt JavaScript, mục lục mở sẵn và vẫn có thể đóng/mở bằng details gốc của trình duyệt.
     92
     93= Làm sao ẩn ngày đăng hoặc tên tác giả? =
     94Giao diện > Simple TN, bỏ chọn "Hiện ngày đăng của bài viết" hoặc "Hiện tên tác giả". Tùy chọn áp dụng cho danh sách bài, bài đơn và bài viết liên quan.
     95
     96= Làm sao đổi màu nền tối? =
     97Mặc định, Giao diện > Simple TN > Màu sắc & nền tối bật “Màu tối theo style”: mỗi bộ màu sáng có bảng màu tối tương ứng. Hãy lưu style đang chọn trong Site Editor.
     98Để dùng màu riêng, bỏ chọn “Màu tối theo style”, mở “Chỉnh bảng màu tối riêng”, chọn preset “Tối mặc định” hoặc “Tối ấm”, hoặc chỉnh 7 ô màu bằng color picker của WordPress, rồi lưu. Phần màu thủ công vẫn được lưu khi đang thu gọn hoặc dùng chế độ tự động.
     99Bảng màu tối tùy chỉnh từ các phiên bản cũ được giữ ở chế độ thủ công; cài đặt màu tối mặc định chuyển sang tự theo style. Bỏ chọn “Hiện nút chuyển nền sáng/tối” để ẩn nút và luôn dùng bảng màu sáng.
    54100
    55101= Làm sao đổi header hoặc footer? =
    … …  
    651113. Bài có excerpt viết tay chỉ gồm khoảng trắng sẽ hiển thị trống; xoá trắng ô Excerpt.
    66112
    67 = Làm sao cập nhật từ 1.0.1? =
    68 1. Sao lưu và thử trên staging.
    69 2. Cài theme mới; xoá cache của plugin cache/CDN.
    70 3. Nếu Header, Archive, Search hoặc Single đã tùy chỉnh trong Site Editor, reset template/template part để nhận search ở header, khung 820px và related 6 bài.
    71 4. Kiểm tra menu, trang chủ, một category, một trang search và một bài viết.
     113= Table block phân bổ chiều rộng cột như thế nào? =
     114Khi tắt “Cố định chiều dài ô” trong cài đặt Table block, bảng dùng auto layout, rộng 100% khung chứa khi đủ chỗ. Browser phân bổ cột theo nội dung; theme không chia đều cột, không đo nội dung bằng JavaScript và không giả định cột đầu là tiêu đề. Không cần đặt width cho từng cột.
     115Khi bật tùy chọn, class .has-fixed-layout trên table giữ nguyên fixed layout của WordPress; các cột có thể chia đều nếu chưa đặt chiều rộng. Theme không tự chuyển bảng đã bật fixed sang auto.
     116
     117= Vì sao bảng cuộn ngang trên điện thoại? =
     118Khi không đủ chỗ, bảng auto giữ chiều rộng tối thiểu theo từ/nội dung và cuộn ngang trong wrapper. Cell dùng word-break: normal và overflow-wrap: break-word để không kế thừa overflow-wrap: anywhere từ nội dung bài. Chuỗi hoặc URL liền rất dài có thể làm bảng rộng đáng kể; đây là đánh đổi để không ép cột xuống từng ký tự. Không áp min-width cố định cho mọi bảng hoặc nowrap cho cột theo vị trí.
     119Caption ở trong wrapper; các style viền, nền và stripes hiện có được giữ. CSS Table block áp dụng cả frontend và editor theo cơ chế nạp block stylesheet sẵn có. CSS riêng từ plugin, Site Editor hoặc width/white-space do tác giả đặt có thể ảnh hưởng kết quả.
     120
     121= Làm sao mở rộng bảng hoặc ảnh bằng ảnh cover? =
     122Chọn block trong trình sửa bài → sidebar Block → Chiều rộng → bật “Mở rộng bằng ảnh cover”. Hỗ trợ Image, Table, Gallery, Video, Embed, Cover, Columns, Group, Media & Text, Code và Pullquote. Với block lồng trong Group/Columns, bật trên nhóm/cột ngoài cùng.
     123Tắt công tắc để về chiều rộng nội dung; công tắc dùng class/align của block, giữ các class/style khác. Các lựa chọn căn rộng/căn toàn chiều rộng sẵn có của WordPress vẫn được hỗ trợ. Bảng rộng hơn khung sẽ cuộn ngang.
     124
     125= Làm sao cập nhật theme? =
     1261. Sao lưu website và ghi lại các template/template part đã tùy chỉnh; nên thử trên staging.
     1272. Cài gói ZIP mới bằng chức năng tải giao diện lên của WordPress và chọn thay thế bản đã cài.
     1283. Xóa cache của plugin cache, LiteSpeed và CDN nếu có.
     1294. Mở Giao diện > Simple TN để kiểm tra các tùy chọn, đặc biệt thumbnail, mục lục và chế độ màu tối.
     1305. Nếu template hoặc template part đã lưu trong Site Editor không nhận thay đổi từ theme, sao lưu nội dung tùy chỉnh rồi chỉ đặt lại mục cần cập nhật. Đặt lại sẽ bỏ phần tùy chỉnh của mục đó.
     1316. Kiểm tra Home, trang 2, một chuyên mục, tìm kiếm (cả bài viết và trang), bài viết và menu trên desktop/mobile.
     1327. Với bản 1.3.17 trở lên, kiểm tra một bảng auto và một bảng đã bật fixed; trên mobile, bảng nhiều cột phải cuộn trong khung, không làm tràn trang. Không cần sửa/lưu lại các bảng cũ; nếu còn giao diện cũ, kiểm tra cache và CSS tùy chỉnh.
     133
     134= Vì sao phân trang còn có query-0-page trong URL? =
     135Đây là tham số phân trang cũ, có thể còn trong liên kết hoặc HTML đã cache. Từ 1.3.11, theme chuyển 301 URL cũ sang URL phân trang của main query trên Home, chuyên mục/lưu trữ và tìm kiếm.
     136Ví dụ với permalink đẹp: /?query-0-page=2 chuyển tới /page/2/; /page/2/?query-0-page=2 chuyển tới /page/2/. Nếu đường dẫn đã có số trang, số đó được ưu tiên; các tham số tìm kiếm, chuyên mục và tham số khác vẫn được giữ. Với permalink mặc định, URL dùng ?paged=2.
     137Sau khi nâng cấp, xóa cache LiteSpeed/CDN để loại HTML và liên kết cũ. Nếu trang chủ sạch vẫn sinh link query-0-page mới, kiểm tra Query block đã lưu trong Site Editor có đang kế thừa main query hay không.
    72138
    73139= Theme có dùng JavaScript không? =
    74 Không có JavaScript riêng từ theme. Theme chỉ dùng JavaScript có sẵn của WordPress cho menu mobile và trả lời bình luận.
     140Có. Theme dùng JavaScript nhỏ cho chuyển nền sáng/tối, thu menu header khi không đủ chỗ, focus/đóng panel tìm kiếm, thu gọn mục lục trên mobile và đo khoảng bù sticky header. Trong editor có script thêm công tắc mở rộng block bằng ảnh cover; script này không tải ở frontend. Table responsive dùng CSS, không thêm JavaScript đo width hoặc phân loại cột. Từ 1.3.18, script TOC được in inline trong head để tránh một request chặn tải; stylesheet TOC tham gia ngân sách inline CSS của core. Link mục lục và lịch sử URL dùng hành vi gốc của trình duyệt; không thêm thư viện TOC. Menu mobile và trả lời bình luận dùng JavaScript của WordPress core. Trang Giao diện > Simple TN dùng color picker của WordPress và script nhỏ để chọn preset, mở/thu phần màu tùy chỉnh; CSS cài đặt chỉ tải trên trang này.
    75141
    76142== Changelog ==
    77143
    78144Các mục dưới là lịch sử thay đổi.
     145
     146= 1.3.18 =
     147* Inline JavaScript khởi tạo mục lục nhỏ qua API WordPress trong head, bỏ request script đồng bộ nhưng giữ thu gọn mobile trước lần vẽ đầu tiên.
     148* Cho stylesheet mục lục tham gia cơ chế inline CSS theo ngân sách sẵn có của WordPress/theme. Nếu vượt ngân sách, core vẫn dùng file CSS bên ngoài.
     149* Giữ file CSS/JS nguồn riêng, điều kiện bật/tắt TOC và loại trừ trang không áp dụng; không thêm dependency hoặc thay đổi nội dung database.
     150* Thêm tab README tại Giao diện > Simple TN: đọc đầy đủ readme.txt đi kèm theme, gồm hướng dẫn, FAQ, changelog và lưu ý nâng cấp. Hiển thị văn bản an toàn, hỗ trợ mobile và bàn phím; không tải color picker hoặc form lưu cài đặt trên tab này.
     151* Giữ tab Cài đặt với đủ 4 nhóm và Settings API hiện có; không thay đổi option đã lưu. Tăng version lên 1.3.18 để làm mới cache asset.
     152
     153= 1.3.17 =
     154* Sửa Table block auto bị ép cột quá hẹp do kế thừa overflow-wrap: anywhere từ nội dung bài. Cell auto dùng word-break: normal và overflow-wrap: break-word; table giữ width: 100% và table-layout: auto.
     155* Giữ phân bổ cột tự nhiên theo nội dung và cuộn ngang trong wrapper khi không đủ chỗ; bổ sung -webkit-overflow-scrolling: touch. Không áp width/min-width chung cho từng cột, không suy đoán semantic và không thêm JavaScript.
     156* Loại trừ .has-fixed-layout khỏi các rule auto mới, giữ fixed layout và cách wrap của WordPress core cho các bảng cũ.
     157* Cập nhật hướng dẫn Table auto/fixed, giới hạn với URL/chuỗi dài, chiều rộng theo cover, tìm kiếm, cache và nâng cấp. Không thay đổi dữ liệu bài viết hoặc cài đặt đã lưu.
     158
     159= 1.3.16 =
     160* Tìm kiếm cả bài viết và trang, cập nhật nhãn tìm kiếm.
     161* Search header tự focus ô nhập khi mở; Esc đóng và trả focus về icon.
     162* Làm mới thanh search với ô nhập và nút tìm liền mạch, viền focus rõ và hỗ trợ sáng/tối, mobile.
     163
     164= 1.3.15 =
     165* Thêm công tắc riêng Block → Chiều rộng → Mở rộng bằng ảnh cover khi tạo/sửa bài: hỗ trợ Image, Table, Gallery, Video, Embed, Cover, Columns, Group, Media & Text, Code và Pullquote. Lưu theo block, giữ các class/style khác; tắt để về chiều rộng nội dung.
     166* Block ngoài cùng mở rộng bằng cover; với block lồng nhau, bật trên Group/Columns ngoài cùng. Ảnh tự lấp đầy khung; mobile không tràn màn hình.
     167
     168= 1.3.14 =
     169* Bật hỗ trợ align-wide để editor hiển thị tùy chọn căn rộng cho ảnh, bảng, gallery và các block có hỗ trợ. Chiều rộng wide dùng chung 1080px với ảnh đầu bài.
     170
     171= 1.3.13 =
     172* Thêm mục lục tự động từ H3 cho bài đơn: mặc định tối thiểu 4 H3, H4 tùy chọn; giữ nguyên hierarchy heading và ID có sẵn, xử lý slug tiếng Việt và heading trùng tên.
     173* Thêm nhóm Table of Contents trong Giao diện > Simple TN: bật/tắt, ngưỡng H3 (2–10), hiển thị H4 và thu gọn trên mobile; dùng chung Settings API và option hiện tại.
     174* Mục lục dùng nav, danh sách có thứ tự và details/summary; hỗ trợ bàn phím, focus rõ ràng, cuộn mượt, bù sticky header và reduced motion. Không thêm dependency hoặc thay đổi post_content trong database.
     175* Tắt TOC sẽ ngừng parse và không tải asset riêng. Không xử lý page, archive, search, excerpt, feed, REST hoặc bài đang khóa mật khẩu.
     176* Sửa khoảng cách hai dòng category trên mobile: bỏ min-height 44px, giữ vùng bấm tối thiểu 24px; desktop giữ nguyên.
     177* Kiểm tra TOC trên WordPress 7.1.4 với PHP 8.0/8.3, Chromium ở 6 độ rộng và axe cho mục lục; các test hồi quy PHP, Settings, mobile, header, thumbnail và accessibility ảnh đều pass.
     178
     179= 1.3.12 =
     180* Sửa điểm Tab trùng ở ảnh thumbnail danh sách và bài liên quan: link ảnh được xử lý giống hero, không tạo thêm mục đọc cho screen reader; tiêu đề vẫn là link truy cập được.
     181* Tránh focus bàn phím rơi vào ảnh bài liên quan có viền focus bị khung ảnh cắt; Tab qua link tiêu đề có focus hiển thị rõ. Chuột/chạm vẫn bấm ảnh như cũ.
     182* Giữ nguyên bố cục, đích link ảnh, lazy loading của ảnh danh sách/bài liên quan và ưu tiên LCP của hero/ảnh đầu bài.
     183* Qua 24 trường hợp regression bàn phím/bấm ảnh, kiểm tra PHP cho link ảnh và hồi quy Home/hero, archive; chạy lại 192 trường hợp axe-core không báo vi phạm tự động.
     184* Thêm accessibility.txt theo chuẩn WordPress, ghi rõ phạm vi kiểm tra, giới hạn và nơi báo lỗi; chưa tuyên bố đạt đánh giá chính thức.
     185
     186= 1.3.11 =
     187* Sửa tham số query-0-page cũ bị giữ trong các link phân trang tiếp theo.
     188* Chuyển 301 về URL main query sạch trên Home, archive và search; số trang hiện có trong đường dẫn được ưu tiên.
     189* Giữ các tham số khác, hỗ trợ permalink đẹp và dạng ?paged=; không can thiệp tham số của query phụ.
     190* Kiểm tra trên WordPress thử nghiệm: 12 trường hợp URL, đầu vào không hợp lệ, link pagination core và hồi quy Home/hero, archive.
     191* Cập nhật README: hướng dẫn tính năng, cài đặt, nâng cấp và lịch sử 1.3.5–1.3.11.
     192
     193= 1.3.10 =
     194* Danh sách desktop tự rộng thêm phần thumbnail và khoảng cách khi có ảnh, giới hạn theo màn hình.
     195* Giữ độ rộng meta và tiêu đề so với lúc tắt ảnh khi đủ chỗ; bài không có ảnh vẫn giữ độ rộng phần chữ cũ.
     196* Kiểm tra 8 kích thước, cả khung wide/constrained và trạng thái bật/tắt thumbnail.
     197
     198= 1.3.9 =
     199* Dưới 782px, thumbnail danh sách nằm phía trên meta và phần chữ, rộng toàn hàng, tỷ lệ 16:9 như hero.
     200* Desktop giữ thumbnail ở cột phải; kiểm tra thêm hai phía breakpoint 781/782px.
     201
     202= 1.3.8 =
     203* Sắp xếp trang Simple TN thành Header & menu, Bài viết, Màu sắc & nền tối.
     204* Hai cột trên màn hình rộng, một cột khi hẹp; thêm liên kết nhảy tới từng nhóm.
     205* Bảng màu tối riêng có thể thu gọn, các ô màu xếp theo lưới; vẫn gửi đủ dữ liệu khi thu gọn.
     206* Giữ Settings API và kiểm tra quyền; CSS chỉ tải trên trang cài đặt. Kiểm tra responsive ở 375, 768, 1024 và 1440px với color picker WordPress.
     207
     208= 1.3.7 =
     209* Thêm 6 style variation: Đại dương, Rừng, Oải hương, Đất nung, Hoa hồng và Đá phiến.
     210* Cả 8 bộ màu (gồm Mặc định và Ấm) có bảng màu sáng/tối đi cùng; hỗ trợ màu tối tự theo style và chỉnh tay.
     211* Giữ bảng màu tối tùy chỉnh cũ; màu thiếu hoặc không hợp lệ dùng giá trị dự phòng.
     212* Các cặp chữ/nền được kiểm tra trên cả 8 bộ sáng/tối đạt tương phản tối thiểu 4,5:1.
     213
     214= 1.3.6 =
     215* Ảnh hero Home đổi sang tỷ lệ 16:9.
     216* Tăng cỡ mặc định H2/H3/H4 trong nội dung bài, lần lượt 30–36px, 24–28px và 20–24px khi cỡ chữ gốc là 16px.
     217
     218= 1.3.5 =
     219* Thêm tùy chọn ẩn/hiện logo header, giữ tên website; mặc định hiện logo.
     220* Thêm tùy chọn thumbnail danh sách bài cho Home, archive và search; mặc định tắt, dùng ảnh đại diện tỷ lệ 16:9.
     221
     222= 1.3.4 =
     223* Sửa menu header căn phải tràn về bên trái và chèn lên logo ở màn hình iPad.
     224* Đo biên thực tế của danh sách menu và nút chuyển nền để thu menu ngay khi vượt vùng được cấp.
     225* Bổ sung kiểm tra hồi quy menu căn phải và các chiều rộng iPad dọc/ngang trên Chromium, WebKit.
     226
     227= 1.3.3 =
     228* Header tự thu menu khi thiếu chiều ngang, giữ kích thước logo và các nút thao tác.
     229* Tối ưu mobile: panel tìm kiếm nằm trong viewport, ô nhập không đè nút; tăng vùng chạm chuyên mục, tag, RSS và submenu lên tối thiểu 44px.
     230* Tiêu đề, URL và nhãn menu dài tự ngắt trong cột để tránh tràn ngang.
     231
     232= 1.3.2 =
     233* Thêm 2 bộ màu tối có sẵn: "Tối mặc định" (trung tính) và "Tối ấm" (nền nâu ấm, nhấn hồng), tương ứng 2 bảng màu sáng.
     234* Chọn bộ màu trong Giao diện > Simple TN sẽ điền nhanh 7 ô; vẫn chỉnh từng màu và lưu như cũ.
     235* Cả hai bộ màu tối đều đạt contrast WCAG AA cho chữ/nền.
     236* Không đổi bố cục giao diện.
     237
     238= 1.3.1 =
     239* Bảng màu tối chỉnh được trong Giao diện > Simple TN: 7 màu (nền, nền phụ, chữ chính, chữ phụ, đường kẻ, màu nhấn, chữ trên nền nhấn) bằng color picker của WordPress.
     240* Nền tối mặc định #0f0f11; bảng màu tối tách khỏi bảng màu sáng trong Site Editor để đổi nền tối không ảnh hưởng giao diện sáng.
     241* Màu tối in thành biến --wp--preset--color--* trong head, áp dụng cho mọi block và style variation.
     242* Không đổi bố cục giao diện.
     243
     244= 1.3.0 =
     245* Thêm nền tối: nút chuyển nền sáng/tối trong menu header; trên mobile nút nằm trong menu mở.
     246* Nút theo cài đặt hệ thống của khách, lưu lựa chọn trong localStorage; không cookie, không gửi dữ liệu đi.
     247* Bảng màu tối ghi đè biến palette của theme.json nên áp dụng cho mọi block và style variation.
     248* Thêm tùy chọn bật/tắt nút trong Giao diện > Simple TN.
     249* JavaScript của theme chỉ gồm đoạn nhỏ trong inc/dark-mode.php; không thư viện ngoài.
     250* Không đổi bố cục giao diện.
     251
     252= 1.2.12 =
     253* Nới khoảng cách giữa meta (ngày, chuyên mục) và tiêu đề ở hero trang chủ và đầu trang đọc; dùng spacing token 30 (1–1.25rem) thay cho margin 0.15–0.35rem.
     254* Không đổi bố cục khác.
     255
     256= 1.2.11 =
     257* Sửa: chọn menu header/footer trong Giao diện > Simple TN áp dụng cả khi template part header/footer đã tùy biến trong Site Editor, không còn phụ thuộc class tn-nav--header/tn-nav--footer.
     258* Trang cài đặt ghi chú khi menu đang ghi đè thiết lập của Navigation block trong Site Editor.
     259* Không đổi bố cục giao diện.
     260
     261= 1.2.10 =
     262* Thêm trang cài đặt Giao diện > Simple TN: bật/tắt ngày đăng, tên tác giả; chọn menu header/footer.
     263* Submenu ở footer mở ngược lên trên và căn phải, không còn bị cắt ở cuối trang; submenu cấp 2 mở sang trái.
     264* Tùy chọn lưu trong một option simple_tn_options bằng Settings API, sanitize và escape đầy đủ; không thêm JavaScript.
     265* Thêm class tn-nav--header và tn-nav--footer cho Navigation block trong pattern header/footer.
     266* POT cập nhật 111 chuỗi.
     267* Không đổi bố cục mặc định.
    79268
    80269= 1.2.9 =
    … …  
    232421== Upgrade Notice ==
    233422
     423= 1.3.18 =
     424Thêm tab README trong Giao diện > Simple TN và bỏ request chặn tải của JavaScript TOC; CSS TOC có thể inline theo ngân sách core. Giữ nguyên nội dung bài, mục lục và tùy chọn đã lưu. Xóa cache plugin/CDN/trình duyệt sau khi cập nhật; kiểm tra mục lục và trang cài đặt trên staging trước khi thay bản đang dùng.
     425
     426= 1.3.17 =
     427Cải thiện khả năng đọc của Table block auto và cuộn ngang trên mobile; giữ nguyên bảng đã bật fixed layout. Không cần đặt width từng cột hay lưu lại bài viết. Xóa cache plugin/CDN/trình duyệt sau khi cập nhật; kiểm tra bảng auto/fixed ở frontend và editor nếu site có CSS tùy chỉnh.
     428
     429= 1.3.13 =
     430Thêm mục lục bài viết, mặc định bật với ít nhất 4 H3. Cấu hình hoặc tắt tại Giao diện > Simple TN > Table of Contents. Giữ các tùy chọn cũ và nội dung database; xóa cache sau khi cập nhật. Category trên mobile xuống hai dòng gọn hơn.
     431
     432= 1.3.12 =
     433Sửa thứ tự Tab và focus của ảnh danh sách/bài liên quan; thêm accessibility.txt. Không đổi bố cục hay tùy chọn đã lưu. Xóa cache sau khi cập nhật để nhận HTML mới.
     434
     435= 1.3.11 =
     436Sửa URL phân trang cũ và cập nhật tài liệu. Cài bản mới rồi xóa cache LiteSpeed/CDN. Nếu template đã tùy chỉnh không nhận tính năng mới, sao lưu trước khi đặt lại từng mục trong Site Editor.
     437
     438= 1.3.10 =
     439Danh sách có thumbnail tự mở rộng trên desktop, giữ độ rộng phần chữ khi đủ chỗ.
     440
     441= 1.3.9 =
     442Thumbnail danh sách chuyển lên trên phần chữ ở mobile, giữ tỷ lệ 16:9.
     443
     444= 1.3.8 =
     445Sắp xếp lại trang cài đặt thành 3 nhóm; giữ tùy chọn đã lưu.
     446
     447= 1.3.7 =
     448Thêm 6 bộ màu và màu tối tự theo style. Bảng màu tối tùy chỉnh cũ được giữ ở chế độ thủ công.
     449
     450= 1.3.6 =
     451Ảnh hero 16:9 và heading H2/H3/H4 trong bài lớn hơn.
     452
     453= 1.3.5 =
     454Thêm bật/tắt logo header và thumbnail danh sách. Thumbnail mặc định tắt.
     455
     456= 1.3.4 =
     457Sửa lỗi menu dài căn phải chèn lên logo trên iPad; cập nhật cơ chế phát hiện tràn menu.
     458
     459= 1.3.3 =
     460Tối ưu header và trải nghiệm mobile: menu thích ứng, searchbar, vùng chạm và nội dung dài.
     461
     462= 1.3.2 =
     463Thêm 2 bộ màu tối có sẵn: "Tối mặc định" và "Tối ấm", chọn trong Giao diện > Simple TN. Không đổi bố cục.
     464
     465= 1.3.1 =
     466Bảng màu tối chỉnh được trong Giao diện > Simple TN (7 màu, mặc định nền #0f0f11). Không đổi bố cục.
     467
     468= 1.3.0 =
     469Thêm nền tối và nút chuyển nền sáng/tối trên header; có thể tắt trong Giao diện > Simple TN. Không đổi bố cục.
     470
     471= 1.2.12 =
     472Nới khoảng cách giữa meta (ngày, chuyên mục) và tiêu đề ở hero trang chủ và đầu trang đọc. Không đổi bố cục khác.
     473
     474= 1.2.11 =
     475Sửa lỗi chọn menu header/footer không áp dụng với template part đã tùy biến trong Site Editor. Không đổi giao diện.
     476
     477= 1.2.10 =
     478Thêm trang cài đặt Giao diện > Simple TN để bật/tắt ngày đăng, tên tác giả và chọn menu header/footer. Submenu ở footer mở lên trên. Không đổi bố cục mặc định.
     479
    234480= 1.2.9 =
    235481Đổi tên theme thành Simple TN, cập nhật tài liệu và bỏ code SEO không còn dùng. Không đổi bố cục.
    … …  
    238484Cập nhật tài liệu và đóng gói; không thay đổi giao diện.
    239485
     486== Kiểm tra bản 1.3.18 ==
     487
     488* TOC: 51 assertion PHP pass trên PHP 8.0 và 8.3; kiểm tra HTML render xác nhận script inline trong head và stylesheet tham gia ngân sách inline core. Giữ kiểm tra mục lục ở 6 độ rộng, bàn phím, focus, anchor/history, sticky header, reduced motion và fallback không JavaScript.
     489* Đo cold-load fixture cục bộ với Chromium, 3 mẫu mỗi bản ở 390/1440px, giả lập độ trễ 120 ms/resource: request giảm 9 xuống 7; trung vị DOMContentLoaded giảm khoảng 259 xuống 134 ms trên mobile và 258 xuống 138 ms trên desktop. HTML nén tăng khoảng 1,2 KB; đây không phải Web Vitals hay cam kết tốc độ website thật, chưa đo lợi ích khi cache trình duyệt đã ấm.
     490* Tab README: kiểm tra nội dung đầy đủ khớp file sau escaping, quyền truy cập, tab mặc định/fallback, không có form lưu hay dependency color picker; tab Cài đặt giữ đủ field/nonce và cách lưu hiện tại.
     491* Các kiểm tra Table và hồi quy 1.3.17 bên dưới vẫn mô tả phạm vi fixture, không thay thế kiểm thử plugin/CSS riêng của website.
     492
     493== Kiểm tra bản 1.3.17 ==
     494
     495* PHP 8.0: kiểm tra cú pháp toàn bộ PHP của theme; chạy lại các test hiện có cho palette/cài đặt, hero excerpt, query Home/archive, pagination cũ, link ảnh, tìm kiếm và mục lục trên WordPress thử nghiệm dùng một lần 7.1.4.
     496* Table block trên Chromium với stylesheet core WordPress thử nghiệm 7.1.4: 28 tổ hợp viewport/context/layout, mỗi tổ hợp gồm 6 mẫu bảng (2, 3, 4, 10 cột, URL dài và bảng ngắn); bao phủ header/footer/caption, số/ngày, text dài, stripes, viền/nền, auto/fixed. Độ rộng 320, 375, 390, 430, 768, 1024 và 1440px. Test context editor dùng HTML fixture, không thay cho thử trực tiếp Gutenberg.
     497* Các test hồi quy browser cho mobile, tìm kiếm header, menu thích ứng, thumbnail danh sách và chiều rộng theo cover đã pass. Kiểm tra cú pháp JavaScript, JSON cấu hình/style và tương phản chữ ở cả 8 bộ màu sáng/tối đã pass.
     498* Fixed layout được đối chiếu kích thước cell và computed style trước/sau; các rule auto mới không làm đổi kết quả trên fixture. Không cần migrate database, sửa nội dung bài hoặc đặt lại template để nhận CSS Table mới.
     499* Giới hạn: chưa kiểm tra trực tiếp trên WordPress 7.0, Gutenberg đang mở, thiết bị cảm ứng thật, screen reader hoặc CSS/plugin riêng của website. Firefox/WebKit chưa chạy lại cho bản này do runtime thiếu browser binary đúng phiên bản. Các con số kiểm tra accessibility ở phần dưới là lịch sử của các bản tương ứng, không phải một đợt audit WCAG mới cho 1.3.17.
     500
    240501== Privacy ==
    241502
    242 Theme không thu thập, lưu hay gửi dữ liệu người dùng. Theme không đặt cookie, không tải script theo dõi hay quảng cáo, không gọi tài nguyên bên ngoài; font được đóng gói trong theme. Bình luận và tìm kiếm do WordPress core và plugin của site xử lý; xem chính sách quyền riêng tư của site.
     503Theme không tự thu thập hoặc gửi dữ liệu phân tích người dùng; các cài đặt giao diện được lưu trong database WordPress. Theme không đặt cookie, không tải script theo dõi hay quảng cáo, không gọi tài nguyên bên ngoài; font được đóng gói trong theme. Nút chuyển nền tối lưu lựa chọn sáng/tối trong localStorage của trình duyệt; lựa chọn này không được gửi lên máy chủ hay dịch vụ bên ngoài, và xoá dữ liệu trang trong trình duyệt sẽ xoá nó. Bình luận và tìm kiếm do WordPress core và plugin của site xử lý; xem chính sách quyền riêng tư của site.
    243504
    244505== Accessibility ==
    245506
    246 Theme hướng tới WCAG 2.2 AA. Đã kiểm tra:
    247 
    248 * axe-core 4.10 (WCAG 2.2 AA + best practice): 0 vi phạm trên Home, archive, search, single và 404 ở 320, 390, 820, 1024 và 1440px, cả hai style variation.
    249 * Bàn phím: liên kết, nút, form, menu mobile và panel tìm kiếm đều dùng được; focus hiển thị rõ.
     507Theme hướng tới WCAG 2.2 AA và hướng dẫn accessibility-ready của WordPress. Tuyên bố accessibility, phương pháp kiểm tra, giới hạn và nơi báo lỗi nằm trong accessibility.txt ở thư mục gốc theme. Đây chưa phải chứng nhận WCAG hay phê duyệt của WordPress.org.
     508
     509Phạm vi kiểm tra:
     510
     511* axe-core 4.14.0: 192 trường hợp trên Home, archive, search, single, page và 404, cả 8 bộ màu sáng/tối ở 320 và 1440px; không báo vi phạm tự động. Một số kiểm tra cần xem xét thủ công, không thể kết luận đạt WCAG chỉ từ kết quả axe.
     512* Từ 1.3.7, kiểm tra tương phản trên cả 8 bộ màu sáng/tối: chữ chính, chữ phụ trên nền/nền phụ, màu nhấn trên nền và chữ trên nút nhấn đạt tối thiểu 4,5:1. Đây là kiểm tra bảng màu, không thay thế kiểm tra WCAG toàn trang.
     513* TOC 1.3.13: Chromium ở 320, 390, 781, 782, 1024 và 1440px; kiểm tra bàn phím, focus, anchor/back/forward, sticky header, reduced motion và fallback không JavaScript. axe-core không báo vi phạm trong phạm vi mục lục; chưa kiểm tra với screen reader.
     514* Trang cài đặt: đã kiểm tra nhãn, focus bàn phím, color picker và không tràn ngang ở 375, 768, 1024 và 1440px.
     515* Bàn phím: đã kiểm tra skip link, menu mobile Enter/Escape và trả focus, tìm kiếm, link tiêu đề bài; ảnh trùng đích không tạo thêm điểm Tab. Form bình luận giữ nhãn và thuộc tính bắt buộc của WordPress core.
     516* Chưa kiểm tra NVDA/VoiceOver và chưa hoàn tất đánh giá conformance toàn bộ; xem giới hạn đầy đủ trong accessibility.txt.
     517* Nút chuyển nền tối dùng button thật, có `aria-pressed`, nhãn đổi theo trạng thái, vùng chạm 44px trên header và 56px trong menu mobile.
     518* Bảng màu tối mặc định đã kiểm tra contrast chữ/nền: "Tối mặc định" 17,4:1 / 8,0:1 / 9,2:1 và "Tối ấm" 16,0:1 / 7,9:1 / 9,1:1 (chữ chính / chữ phụ / nhấn, WCAG AA). Nếu tự đổi bảng màu tối, cần kiểm tra lại contrast.
    250519* Skip link "Skip to content" do WordPress core tự thêm vào thẻ main.
    251520* Reflow ở 320px, không tràn ngang.
    … …  
    254523
    255524Phản hồi về khả năng tiếp cận: https://thanhnghiep.top
    256 Cập nhật lần cuối: 29/10/2026.
     525Cập nhật lần cuối: 31/10/2026.
    257526
    258527== Resources ==
  • simple-tn/1.3.18/style.css

    r356199 r356992  
    33Author: Nghiệp
    44Author URI: https://thanhnghiep.top
    5 Description: Block theme tối giản cho blog cá nhân. Mobile-first, tập trung vào trải nghiệm đọc, không sidebar, không JavaScript từ theme. Màu, font, menu và footer chỉnh được trong Site Editor.
     5Description: Block theme tối giản cho blog cá nhân. Mobile-first, tập trung vào trải nghiệm đọc, không sidebar, JavaScript tối thiểu cho chuyển nền tối, menu thích ứng và mục lục bài viết. Màu, font, menu và footer chỉnh được trong Site Editor; bật/tắt ngày, tác giả, nền tối và chọn menu nhanh trong Giao diện > Simple TN.
    66Requires at least: 7.0
    77Tested up to: 7.1
    88Requires PHP: 8.0
    9 Version: 1.2.9
     9Version: 1.3.18
    1010License: GNU General Public License v2 or later
    1111License URI: https://www.gnu.org/licenses/gpl-2.0.html
  • simple-tn/1.3.18/styles/warm.json

    r356199 r356992  
    4242                                }
    4343                        ]
     44                },
     45                "custom": {
     46                        "dark-palette": {
     47                                "base": "#16120e",
     48                                "surface": "#211b15",
     49                                "contrast": "#f4ede3",
     50                                "muted": "#b3a79a",
     51                                "border": "#3a3027",
     52                                "accent": "#e9a2b1",
     53                                "accent-contrast": "#1a0e12"
     54                        }
    4455                }
    4556        }
  • simple-tn/1.3.18/theme.json

    r356199 r356992  
    256256                                }
    257257                        ]
     258                },
     259                "custom": {
     260                        "dark-palette": {
     261                                "base": "#0f0f11",
     262                                "surface": "#1a1a1e",
     263                                "contrast": "#f4f4f5",
     264                                "muted": "#a7a7ae",
     265                                "border": "#2e2e33",
     266                                "accent": "#7fb7ff",
     267                                "accent-contrast": "#0b0b0d"
     268                        }
    258269                }
    259270        },
Note: See TracChangeset for help on using the changeset viewer.