Schema config chuẩn của theme · v1
Schema chuẩn gồm 111 key, do hệ thống quản lý trong modules/themeconfig/standard.json. Mọi theme đều nhận schema này khi mở cấu hình và khi render. Theme không cần sao chép schema chuẩn.
File và cấu trúc
Chỉ có thư mục config/; các file nằm phẳng:
- config/config_schema.json: default của key chuẩn và định nghĩa field riêng của theme.
- config/config_data.json: giá trị user đã lưu.
- config/theme.json: thông tin theme hiện có, không thay bằng bộ schema này.
- config/nav-{key}.json: profile navigation riêng, tiếp tục giữ cơ chế hiện có.
Phiên bản schema chuẩn là 1 trong mã hệ thống. Không thêm trường version vào config_schema.json/config_data.json vì hai file này là map key → field/value.
Schema bất biến
Field chuẩn có type, label, group, standard_config=1, locked=true và translatable do hệ thống quy định. Theme chỉ được bổ sung default cho field chuẩn. Các thuộc tính type, locked, fallback, css_variable của theme không thay thế định nghĩa chuẩn. Xóa một key chuẩn khỏi file theme không xóa key đó khỏi schema có hiệu lực. Không có API xóa schema hệ thống. Field riêng vẫn khai báo bình thường và không được dùng trùng key chuẩn để đổi kiểu.
Thứ tự ưu tiên
1. Thiết kế riêng của element hoặc profile menu đã lưu.
2. config_data.json của website.
3. Default trong config_schema.json của theme.
4. Key fallback chuẩn, ví dụ button_radius → border_radius.
5. Default của element, nằm trong fallback CSS var.
Giá trị trống/null không tạo biến CSS riêng; 0 và false vẫn có ý nghĩa. User đổi theme config thì preview render lại và các element đang theo theme nhận giá trị mới. Không copy màu/font đã tính ra vào JSON của element.
Config thiết kế phát ra CSS variables --skai-{key-với-dấu-gạch-ngang}. Số của key kích thước có css_unit=px được chuyển sang px; line-height không tự thêm px. Font là CSS font-family; theme tự cung cấp font-face/stylesheet, hệ thống không tự tải font từ mạng.
Ví dụ schema theme
{
"primary_color": {"default": "#f46b16"},
"border_radius": {"default": 8},
"body_font": {"default": "Inter, system-ui, sans-serif"},
"brand_story": {"type": "textarea", "label": "Câu chuyện thương hiệu", "group": "Riêng của theme", "default": ""}
}Ví dụ giá trị user
{
"primary_color": "#14532d",
"on_primary_color": "#ffffff",
"button_radius": "12px",
"body_font_size": "16px",
"h1_font_size": "48px",
"h1_font_size_mobile": "30px",
"logo": {"src": "/assets/logo.svg", "alt": "Tên thương hiệu"},
"site_name": "t:brand.name"
}Element hệ thống và thiết kế riêng
Tất cả 104 định nghĩa element hệ thống đã có liên kết font chuẩn. Những thuộc tính màu, bo góc, khoảng cách, chữ và bóng có vai trò tương ứng được nối với token chuẩn, giữ fallback của element. Button mặc định dùng button_primary_background → primary_color và button_primary_color → on_primary_color. Button theo kiểu có tone primary/secondary dùng token của tone đó. Kiểu chữ tiêu đề có key riêng cho H1–H6 và tablet/mobile.
Logo lấy configs.logo khi chưa có ảnh riêng và logo_source=theme. Chọn logo_source=custom để dùng riêng, kể cả khi muốn để trống. Link, ảnh hoặc nội dung đã nhập riêng vẫn được giữ.
Trong tab Thiết kế, thuộc tính dùng token hiển thị nhãn Theo theme. Nhập giá trị mới tạo override riêng. Nhấn ↺ để bỏ override và trở lại default kế thừa của element. Responsive giữ thứ tự desktop → tablet → mobile như hiện tại.
Các preset mới trong thư viện dùng token thay cho những giá trị mẫu mang vai trò giao diện chung. Page/layout JSON cũ không bị sửa tự động: không thể phân biệt chắc chắn màu mẫu cũ và màu user chủ ý chọn. Muốn chuyển một thuộc tính cũ sang theo theme, reset thuộc tính đó hoặc đổi sang CSS var có fallback.
Custom element và theme code
.my-primary-button {
background: var(--skai-button-primary-background, #6d28d9);
color: var(--skai-button-primary-color, #ffffff);
border-radius: var(--skai-button-radius, 6px);
font-family: var(--skai-body-font, inherit);
}Trong layout HTML cần có {{ head_content }} để nhận biến CSS; trang Visual được engine thêm biến trực tiếp vào style render. Custom element có thể khai báo cùng biểu thức var trong default_styles. User styles vẫn ghi đè default_styles.
Key header/footer chỉ áp dụng khi template gắn đúng vai trò đó. Không gắn màu footer vào mọi Menu dọc vì Menu dọc còn dùng ở sidebar. Key liên hệ, mạng xã hội và SEO là dữ liệu chuẩn để theme dùng qua configs; chúng không tự chèn nội dung, tạo menu hoặc thay markup SEO. Xem Object configs để đọc dữ liệu trong Lingo. Cơ chế fallback của CSS variables không tự thay toàn bộ các giá trị thô trong object configs.
Tương thích và đa ngôn ngữ
Giữ tên key đang dùng như primary_color, secondary_color, body_font, heading_font, border_radius. site_name đọc thêm name hoặc site_title khi chưa có giá trị chuẩn. Alias không ghi đè dữ liệu cũ. Các file legacy settings_schema.json/settings_data.json/setting_data.json vẫn được đọc theo quy tắc tương thích hiện có.
Nội dung văn bản hỗ trợ tham chiếu t: theo locale đang render. Màu sắc, kích thước và font không dịch. logo_dark/logo_mobile là các nguồn tùy chọn để theme chọn theo bố cục; element Logo mặc định dùng logo.
Danh sách key chuẩn
| Key | Kiểu | Nhóm / ý nghĩa | Kế thừa | Đơn vị CSS |
|---|---|---|---|---|
site_name | text | Thương hiệu · Tên website | Default element / theme | — |
tagline | text | Thương hiệu · Khẩu hiệu | Default element / theme | — |
logo | image | Thương hiệu · Logo | Default element / theme | — |
logo_dark | image | Thương hiệu · Logo nền tối | Default element / theme | — |
logo_mobile | image | Thương hiệu · Logo mobile | Default element / theme | — |
favicon | image | Thương hiệu · Favicon | Default element / theme | — |
primary_color | color | Màu sắc · Màu chủ đạo | Default element / theme | — |
secondary_color | color | Màu sắc · Màu phụ | Default element / theme | — |
accent_color | color | Màu sắc · Màu nhấn | Default element / theme | — |
on_primary_color | color | Màu sắc · Chữ trên màu chủ đạo | Default element / theme | — |
on_secondary_color | color | Màu sắc · Chữ trên màu phụ | Default element / theme | — |
on_accent_color | color | Màu sắc · Chữ trên màu nhấn | Default element / theme | — |
background_color | color | Màu sắc · Nền trang | Default element / theme | — |
surface_color | color | Màu sắc · Nền bề mặt | Default element / theme | — |
text_color | color | Màu sắc · Chữ nội dung | Default element / theme | — |
muted_text_color | color | Màu sắc · Chữ phụ | Default element / theme | — |
heading_color | color | Màu sắc · Chữ tiêu đề | text_color | — |
border_color | color | Màu sắc · Màu viền | Default element / theme | — |
success_color | color | Màu sắc · Thành công | Default element / theme | — |
warning_color | color | Màu sắc · Cảnh báo | Default element / theme | — |
error_color | color | Màu sắc · Lỗi | Default element / theme | — |
info_color | color | Màu sắc · Thông tin | Default element / theme | — |
body_font | text | Kiểu chữ · Font nội dung | Default element / theme | — |
heading_font | text | Kiểu chữ · Font tiêu đề | body_font | — |
body_font_size | text | Kiểu chữ · Cỡ chữ nội dung | Default element / theme | px |
body_line_height | text | Kiểu chữ · Chiều cao dòng nội dung | Default element / theme | — |
heading_line_height | text | Kiểu chữ · Chiều cao dòng tiêu đề | Default element / theme | — |
body_font_weight | text | Kiểu chữ · Độ đậm nội dung | Default element / theme | — |
heading_font_weight | text | Kiểu chữ · Độ đậm tiêu đề | body_font_weight | — |
h1_font_size | text | Kiểu chữ · Cỡ H1 · Desktop | Default element / theme | px |
h1_font_size_tablet | text | Kiểu chữ · Cỡ H1 · Tablet | h1_font_size | px |
h1_font_size_mobile | text | Kiểu chữ · Cỡ H1 · Mobile | h1_font_size_tablet | px |
h2_font_size | text | Kiểu chữ · Cỡ H2 · Desktop | Default element / theme | px |
h2_font_size_tablet | text | Kiểu chữ · Cỡ H2 · Tablet | h2_font_size | px |
h2_font_size_mobile | text | Kiểu chữ · Cỡ H2 · Mobile | h2_font_size_tablet | px |
h3_font_size | text | Kiểu chữ · Cỡ H3 · Desktop | Default element / theme | px |
h3_font_size_tablet | text | Kiểu chữ · Cỡ H3 · Tablet | h3_font_size | px |
h3_font_size_mobile | text | Kiểu chữ · Cỡ H3 · Mobile | h3_font_size_tablet | px |
h4_font_size | text | Kiểu chữ · Cỡ H4 · Desktop | Default element / theme | px |
h4_font_size_tablet | text | Kiểu chữ · Cỡ H4 · Tablet | h4_font_size | px |
h4_font_size_mobile | text | Kiểu chữ · Cỡ H4 · Mobile | h4_font_size_tablet | px |
h5_font_size | text | Kiểu chữ · Cỡ H5 · Desktop | Default element / theme | px |
h5_font_size_tablet | text | Kiểu chữ · Cỡ H5 · Tablet | h5_font_size | px |
h5_font_size_mobile | text | Kiểu chữ · Cỡ H5 · Mobile | h5_font_size_tablet | px |
h6_font_size | text | Kiểu chữ · Cỡ H6 · Desktop | Default element / theme | px |
h6_font_size_tablet | text | Kiểu chữ · Cỡ H6 · Tablet | h6_font_size | px |
h6_font_size_mobile | text | Kiểu chữ · Cỡ H6 · Mobile | h6_font_size_tablet | px |
container_width | text | Bố cục · Rộng khung nội dung | Default element / theme | px |
container_padding | text | Bố cục · Đệm khung nội dung | Default element / theme | px |
section_spacing | text | Bố cục · Khoảng cách section | Default element / theme | px |
element_gap | text | Bố cục · Khoảng cách element | Default element / theme | px |
grid_gap | text | Bố cục · Khoảng cách lưới | Default element / theme | px |
border_radius | number | Viền và bóng · Bo góc (px) | Default element / theme | px |
border_radius_small | number | Viền và bóng · Bo góc nhỏ (px) | border_radius | px |
border_radius_large | number | Viền và bóng · Bo góc lớn (px) | border_radius | px |
border_width | number | Viền và bóng · Dày viền (px) | Default element / theme | px |
shadow_small | text | Viền và bóng · Đổ bóng nhỏ | Default element / theme | — |
shadow_medium | text | Viền và bóng · Đổ bóng vừa | Default element / theme | — |
shadow_large | text | Viền và bóng · Đổ bóng lớn | Default element / theme | — |
button_font_weight | text | Nút bấm · Độ đậm chữ nút | body_font_weight | — |
button_padding_x | text | Nút bấm · Đệm ngang nút | Default element / theme | px |
button_padding_y | text | Nút bấm · Đệm dọc nút | Default element / theme | px |
button_radius | text | Nút bấm · Bo góc nút | border_radius | px |
button_primary_background | color | Nút bấm · Nền · primary | primary_color | — |
button_primary_color | color | Nút bấm · Chữ · primary | on_primary_color | — |
button_primary_hover_background | color | Nút bấm · Nền hover · primary | button_primary_background | — |
button_primary_hover_color | color | Nút bấm · Chữ hover · primary | button_primary_color | — |
button_secondary_background | color | Nút bấm · Nền · secondary | secondary_color | — |
button_secondary_color | color | Nút bấm · Chữ · secondary | on_secondary_color | — |
button_secondary_hover_background | color | Nút bấm · Nền hover · secondary | button_secondary_background | — |
button_secondary_hover_color | color | Nút bấm · Chữ hover · secondary | button_secondary_color | — |
link_color | color | Liên kết · Màu link | primary_color | — |
link_hover_color | color | Liên kết · Màu link hover | link_color | — |
link_underline | checkbox | Liên kết · Gạch chân link | Default element / theme | — |
input_background | color | Form · Nền input | surface_color | — |
input_color | color | Form · Chữ input | text_color | — |
input_border_color | color | Form · Viền input | border_color | — |
input_focus_color | color | Form · Viền focus | primary_color | — |
input_radius | text | Form · Bo góc input | border_radius | px |
input_padding_x | text | Form · Đệm ngang input | Default element / theme | px |
input_padding_y | text | Form · Đệm dọc input | Default element / theme | px |
card_background | color | Card · Nền card | surface_color | — |
card_border_color | color | Card · Viền card | border_color | — |
card_radius | text | Card · Bo góc card | border_radius | px |
card_shadow | text | Card · Bóng card | shadow_small | — |
card_padding | text | Card · Đệm card | Default element / theme | px |
header_background | color | Header · Nền header | background_color | — |
header_text_color | color | Header · Chữ header | text_color | — |
header_height | text | Header · Cao header | Default element / theme | px |
header_logo_width | text | Header · Rộng logo header | Default element / theme | px |
footer_background | color | Footer · Nền footer | surface_color | — |
footer_text_color | color | Footer · Chữ footer | text_color | — |
footer_heading_color | color | Footer · Tiêu đề footer | heading_color | — |
footer_link_color | color | Footer · Link footer | link_color | — |
footer_link_hover_color | color | Footer · Link footer hover | link_hover_color | — |
email | text | Liên hệ · Email | Default element / theme | — |
phone | text | Liên hệ · Điện thoại | Default element / theme | — |
working_hours | text | Liên hệ · Giờ làm việc | Default element / theme | — |
address | textarea | Liên hệ · Địa chỉ | Default element / theme | — |
map_url | url | Liên hệ · URL bản đồ | Default element / theme | — |
facebook | url | Mạng xã hội · Facebook | Default element / theme | — |
instagram | url | Mạng xã hội · Instagram | Default element / theme | — |
youtube | url | Mạng xã hội · Youtube | Default element / theme | — |
tiktok | url | Mạng xã hội · Tiktok | Default element / theme | — |
linkedin | url | Mạng xã hội · Linkedin | Default element / theme | — |
zalo | url | Mạng xã hội · Zalo | Default element / theme | — |
seo_title | text | SEO · Tiêu đề SEO mặc định | Default element / theme | — |
seo_description | textarea | SEO · Mô tả SEO mặc định | Default element / theme | — |
social_image | image | SEO · Ảnh chia sẻ | Default element / theme | — |
transition_duration | text | Chuyển động · Thời gian chuyển động | Default element / theme | — |
transition_easing | text | Chuyển động · Nhịp chuyển động | Default element / theme | — |
Kiểm thử khi thay đổi schema
- Sửa primary_color hai lần: nút theo theme đổi theo, nút có backgroundColor riêng giữ nguyên.
- Theme thiếu config: default element vẫn render đúng.
- border_radius=0 và link_underline=false không bị coi là trống.
- Theme khai báo primary_color là html: schema có hiệu lực vẫn là color.
- Lưu rồi tải lại: JSON element không bị ghi màu/font đã resolve.
- Logo riêng không bị configs.logo thay thế.
- Kiểm tra font và H1–H6 trên ba breakpoint.
- Mỗi lần thêm key cần cập nhật standard.json, tài liệu và test. Không đổi nghĩa key cũ âm thầm.