Design system

Đen – trắng, chữ có chân, dòng vừa tầm mắt, nhiều lề. Không ảnh trang trí, không gradient, không bóng đổ — thứ duy nhất “nổi” là chữ.

Phiên bản 6 · Dựng từ DESIGN.md và tokens.css mỗi lần build: đổi token thì trang này đổi theo.

Phỏng theo DESIGN.md “Claude” (VoltAgent/awesome-design-md, giấy phép MIT), đổi sang đen – trắng cho mza.vn.

Ba nền đọc

Cùng một trang ở Sáng, Giấy và Tối. Người đọc chọn trong “Cài đặt đọc”; chưa chọn thì theo máy.

Sáng

Chữ là thứ duy nhất nổi

Một trang đọc tốt để người đọc quên mất giao diện.

Cập nhật lần cuối: 10/2026 · Còn 6 phút

Thân bài chữ có chân, dòng vừa tầm mắt, link gạch chân và đoạn người đọc đánh dấu.

Từ thực tế

Khối duy nhất trong thân bài có nền.

Nút chính
Giấy

Chữ là thứ duy nhất nổi

Một trang đọc tốt để người đọc quên mất giao diện.

Cập nhật lần cuối: 10/2026 · Còn 6 phút

Thân bài chữ có chân, dòng vừa tầm mắt, link gạch chân và đoạn người đọc đánh dấu.

Từ thực tế

Khối duy nhất trong thân bài có nền.

Nút chính
Tối

Chữ là thứ duy nhất nổi

Một trang đọc tốt để người đọc quên mất giao diện.

Cập nhật lần cuối: 10/2026 · Còn 6 phút

Thân bài chữ có chân, dòng vừa tầm mắt, link gạch chân và đoạn người đọc đánh dấu.

Từ thực tế

Khối duy nhất trong thân bài có nền.

Nút chính

Màu

Mực đen là màu thương hiệu duy nhất, còn lại là các bậc xám ấm. Tương phản tính với màu nền của từng nền đọc.

TokenSángGiấyTốiDùng cho
ink--color-ink#111111tương phản 18,9:1#141413tương phản 17,5:1#f5f4eftương phản 16,7:1chữ chính, nút chính, viền nhấn — màu thương hiệu
body--color-body#2b2b2btương phản 14,2:1#3d3d3atương phản 10,3:1#d9d7d0tương phản 12,8:1thân bài
muted--color-muted#6b6b6btương phản 5,3:1#6c6a64tương phản 5,1:1#a09d96tương phản 6,8:1chữ phụ: ngày cập nhật, "Còn N phút", nhãn tầng
muted-soft--color-muted-soft#9a9a9atương phản 2,8:1#9a9a9atương phản 2,7:1#9a9a9atương phản 6,6:1chỉ cho đường gạch chân link, viền vô hiệu — KHÔNG dùng cho chữ (tương phản < 4.5:1)
hairline--color-hairline#e4e4e4tương phản 1,3:1#e6dfd8tương phản 1,3:1#2e2c29tương phản 1,3:1đường kẻ, viền thẻ
canvas--color-canvas#ffffff#faf9f5#141413
surface-soft--color-surface-soft#f6f6f4tương phản 1,1:1#f5f0e8tương phản 1,1:1#1f1e1btương phản 1,1:1nền khối phụ: "Từ thực tế", gate
surface-strong--color-surface-strong#ececeatương phản 1,2:1#ebe6dftương phản 1,2:1#2a2825tương phản 1,3:1nền thanh tiến độ, nút phụ khi nhấn
primary—#111111tương phản 18,9:1#111111tương phản 17,9:1#111111tương phản 1,0:1
on-primary--color-on-primary#fffffftương phản 18,9:1#fffffftương phản 18,4:1#141413tương phản 16,7:1tương phản tính trên ink
highlight--color-highlight#e9e6dctương phản 1,2:1#e8e0d2tương phản 1,2:1#3a3832tương phản 1,6:1nền đoạn người đọc đánh dấu
focus-ring--color-focus-ring#111111tương phản 18,9:1#111111tương phản 17,9:1#f5f4eftương phản 16,7:1vòng focus 2px + offset 2px; trên nút đen dùng vòng ngoài màu canvas + vòng đen
scrim--color-scrimrgba(17,17,17,0.5)rgba(17,17,17,0.5)rgba(17,17,17,0.5)nền tối sau popup/ngăn kéo (40–60%)
success--color-success#2f6b3btương phản 6,4:1#2f6b3btương phản 6,1:1#2f6b3btương phản 2,9:1chỉ tô chữ trạng thái, luôn kèm ký hiệu/chữ
error--color-error#a3261btương phản 7,4:1#a3261btương phản 7,0:1#a3261btương phản 2,5:1chỉ tô chữ lỗi biểu mẫu, luôn kèm chữ "Lỗi:" hoặc biểu tượng
accent-alt—#5b3fd1tương phản 6,8:1#5b3fd1tương phản 6,5:1#5b3fd1tương phản 2,7:1dự phòng, không dùng mặc định

Chữ

Chữ có chân cho tiêu đề và thân bài, chữ không chân cho giao diện, chữ đều cho code — cả ba tự host, đủ dấu tiếng Việt.

Literata

--font-serif · thân bài, câu định nghĩa, tiêu đề

Aa Ăă Ââ Đđ Êê Ôô Ơơ Ưư

ặ ỗ ữ ỹ Ợ — dấu chồng

Trọng lượng đang dùng

  • 400 Đọc chậm, hiểu kỹ
  • 400 italic Đọc chậm, hiểu kỹ
  • 600 Đọc chậm, hiểu kỹ

Be Vietnam Pro

--font-sans · giao diện

Aa Ăă Ââ Đđ Êê Ôô Ơơ Ưư

ặ ỗ ữ ỹ Ợ — dấu chồng

Trọng lượng đang dùng

  • 400 Đọc chậm, hiểu kỹ
  • 500 Đọc chậm, hiểu kỹ

JetBrains Mono

--font-mono · chỉ tải ở trang có khối code

Aa Ăă Ââ Đđ Êê Ôô Ơơ Ưư

ặ ỗ ữ ỹ Ợ — dấu chồng

Trọng lượng đang dùng

  • 400 Đọc chậm, hiểu kỹ

Thang chữ

  • Đọc chậm, hiểu kỹ

    display-lg · --text-display-lg · clamp(1.75rem, 1.2rem + 2.6vw, 2.75rem) · 600 · 1.15 · chuột/trackpad từ 1200px: clamp(2.25rem, 1.25rem + 1.25vw, 2.5rem)

  • Bạn đang gặp chuyện gì?

    display-md · --text-display-md · clamp(1.5rem, 1.2rem + 1.4vw, 2rem) · 600 · 1.2

  • Kết quả đo được sau ba tháng

    heading-h2 · --text-heading-h2 · clamp(1.3125rem, 1.15rem + 0.7vw, 1.625rem) · 600 · 1.3

  • Từ thực tế

    heading-h3 · --text-heading-h3 · 1.1875rem · 600 · 1.35

  • Một câu định nghĩa ngắn, nghiêng, ngay dưới tiêu đề.

    definition · --text-definition · clamp(1.125rem, 1.05rem + 0.4vw, 1.3125rem) · 400 · 1.5

  • Thân bài đọc ở cỡ người đọc chọn; dấu chồng như ặ, ỗ, ữ, ỹ vẫn rõ ở mọi nấc.

    body-read · var(--read-size) · 400 · 1.7

  • Chữ giao diện cho menu, nút và nhãn.

    body-ui · --text-body-ui · 1rem · 400 · 1.5 · chuột/trackpad từ 1200px: 0.9375rem

  • Cập nhật lần cuối: 10/2026

    label · --text-label · 0.8125rem · 500 · 1.4

  • Gửi →

    button · 1rem · 500 · 1.2

  • npm run build

    code · --text-code · 0.9375rem · 400 · 1.6

  • 1.500 · 2,5 · 200.000 đ

    numbers · tabular-nums

Nhịp đọc

Độ dài dòng và cỡ chữ người đọc tự chỉnh bằng nút Aa; chưa chỉnh thì theo thiết bị.

Độ rộng dòng

  • Hẹp · 29em · --measure-narrow

  • Vừa · 33em · --measure-medium

  • Rộng · 37.5em · --measure-wide

  • Rộng — máy tính chuột/trackpad · 34.5em

Cỡ chữ thân bài theo nấc

Nấc 1Nấc 2Nấc 3Nấc 4Nấc 5
Điện thoại, dưới 768px16px17px18pxmặc định20px22px
Máy tính bảng, màn cảm ứng rộng17px18px19pxmặc định21px23px
Máy tính chuột/trackpad từ 1200px16px17px18pxmặc định20px22px

Khoảng cách đoạn: 1.1em

Tốc độ đọc 200 từ/phút — giả định, dùng cho “Còn N phút”

Khoảng cách và khung

Nhịp 4/8px, một khung chung từ 1200px, vùng bấm vừa ngón tay.

Nhịp khoảng cách

  • xxs · 4px · --space-xxs: 4px
  • xs · 8px · --space-xs: 8px
  • sm · 12px · --space-sm: 12px
  • md · 16px · --space-md: 16px
  • lg · 24px · --space-lg: 24px
  • xl · 32px · --space-xl: 32px
  • xxl · 48px · --space-xxl: 48px
  • section · clamp(48px, 8vw, 80px) · --space-section: clamp(48px, 8vw, 80px)

Bo góc

  • none0
  • sm4px · nút, ô nhập
  • md8px · thẻ, khối gate, popover, ngăn kéo
  • pill9999px · chip trụ, tab tầng

Mốc bề rộng

xs · 320px
sàn — mọi màn phải dùng được, không cuộn ngang
sm · 375px
iPhone mini, iPhone 6–8, SE 2/3
md · 768px
máy tính bảng dọc
lg · 1200px
mục lục + "Trong bài này" hiện cạnh bài (UC-113)
short-height · max-height: 600px
máy màn thấp (SE 1 = 568px) và điện thoại xoay ngang — giảm thanh dính

Lề hai bên

<360px
16px
360–767px
20px
768–1199px
32px
>=1200px
lề của container

Khung chung

Từ 1200px: mục lục 240px + 2 × khoảng cột clamp(40px, 3.5vw, 56px) + cột giữa 39rem + ‘Trong bài này’ 220px ≈ 1196–1236px, căn giữa; lề ngoài tối thiểu {spacing.xl}. dưới 1200px giữ lề gutter như cũ.

Vùng bấm

  • coarse · 44pxcảm ứng (pointer: coarse) ở mọi bề rộng, và mọi màn dưới 1200px — icon nhỏ hơn thì nới vùng bấm
  • fine · 32pxchuột/trackpad từ 1200px — (pointer: fine) and (min-width: 1200px); vẫn vượt mức AA 24px của WCAG 2.5.8
  • gap-min · 8px
  • input-font-min · 16pxtránh iOS tự phóng khi bấm vào ô nhập

Lớp chồng

TokenGiá trịBiến CSSDùng cho
content0—
sticky10--z-stickythanh menu, thanh tiến độ
dropdown20--z-dropdownmenu Chủ đề ▾
drawer40--z-drawermục lục điện thoại, ghi chú
popover50--z-popovercài đặt đọc, popover chọn chữ
notice60--z-noticethông báo cookie (ADR-30) — trên popover, dưới popup ủng hộ
modal100—popup ủng hộ
toast1000—

Chuyển động

Ít và ngắn, chỉ đổi độ mờ và vị trí. Máy bật giảm chuyển động thì tắt hết.

Thời lượng fast
150ms · --duration-fast
Thời lượng base
200ms · --duration-base
Thời lượng slow
300ms · --duration-slow
Đường cong enter
cubic-bezier(0.2, 0, 0, 1) · --ease-enter
Đường cong exit
cubic-bezier(0.4, 0, 1, 1) · --ease-exit

Luật: chỉ animate transform/opacity; tối đa 1–2 chuyển động mỗi màn; prefers-reduced-motion: reduce → tắt hết chuyển động, kể cả cuộn mượt.

Máy bật giảm chuyển động (prefers-reduced-motion) thì mọi chuyển động trên trang, kể cả cuộn mượt tới mục, đều tắt.

Thành phần

Bản sống dựng bằng chính các thành phần của trang; chữ nhỏ dưới mỗi mẫu là tên của nó trong DESIGN.md.

Nút chính và nút phụ · button-primary · button-secondary

Đội kỹ thuật? Xem các bài Làm thế nào →

Link chữ · text-link
Chip trụ · pillar-chip
Tab tầng · tier-tabs
5 báo cáo từ các phòng ban, và CEO không biết là nên tin cái nàoPrinciples ›
Thẻ nỗi đau · pain-card

Từ thực tế

Câu chuyện thật từ một lần triển khai, đặt trong khối có nền nhạt và vạch đen bên trái.

Ô “Từ thực tế” · from-practice-box
Ô “Nhận bài mới” — vô hiệu, như ở trang thật khi chưa nối máy chủ; không có nút “Tiếp tục với Google” · email-box
Trước / Tiếp — dòng gọn và khối cuối bài · prev-next
Mời tác giả một ly cà phê

Câu hỏi & bình luận

Chưa có bình luận nào.

Tiếp tục với Google
Cuối bài — Trước/Tiếp, nút ☕, ô “Nhận bài mới”, rồi “Câu hỏi & bình luận” (chưa có phiên: có “Tiếp tục với Google”); mỗi khối cách nhau spacing.xl; bản vô hiệu · end-of-post · donate-button · comment-form
A → BChỉ số đo trước và sau
Thẻ “Kết quả thật” · result-card
Thông báo cookie — bản tĩnh, không tự hiện · cookie-notice

Đọc tiếp: 3 email, 2 số điện thoại nhưng là 1 khách hàng: hợp nhất dữ liệu khách hàng — từ chỗ bạn dừng

Dòng “Đọc tiếp” — bản tĩnh · continue-reading

Liên hệ

Khối liên hệ — dữ liệu mẫu, các dòng không dẫn đi đâu (trang thật lấy kênh tác giả khai ở quản trị) · contact-list
Ảnh chia sẻ — thẻ bài vuông 1080×1080 trên năm nền và ảnh trích dẫn cùng khổ, vẽ lúc build bằng bố cục của bảng “Chia sẻ” · share-sheet · share-backgrounds

Ảnh, minh hoạ, chữ trong bài

Trích nguyên văn từ DESIGN.md.

Ảnh

  • Ảnh chỉ dùng khi mang thông tin (sơ đồ, ảnh chụp màn hình, số liệu); không ảnh minh hoạ cho vui, không ảnh stock.
  • Hiển thị qua <picture> (AVIF → WebP → gốc), rộng tối đa bằng cột chữ, khai kích thước để không giật trang.
  • Alt tiếng Việt nói ảnh cho thấy điều gì; chú thích ngắn dưới ảnh, chữ phụ.
  • Ảnh chụp màn hình: đã ẩn danh; cắt sát; chữ trong ảnh trên điện thoại phải đọc được — không được thì cắt vùng chính hoặc cho phóng to.
  • Nền Tối: không đảo màu ảnh; thêm viền mảnh và giảm chói nhẹ.
  • Bấm ảnh để xem lớn (lớp phủ, Esc/nút đóng); điện thoại phóng bằng hai ngón.
  • Video YouTube chỉ tải khi bấm, giữ chỗ 16:9.

Minh hoạ và sơ đồ

  • Phong cách nét đen, kiểu bản vẽ sách kỹ thuật: không màu, không gradient, không bóng; nét 1.5–2px.
  • SVG dùng currentColor nên tự đúng ở Sáng/Giấy/Tối; phân nhóm bằng nền xám nhạt hoặc hoạ tiết sọc/chấm, không bằng màu.
  • Chữ trong sơ đồ là chữ thật, font giao diện, tiếng Việt có dấu, ≥ 13px khi xem ở 320px.
  • Sơ đồ rộng: có bản dọc cho điện thoại, hoặc khung cuộn ngang có dòng “Vuốt ngang để xem hết”.
  • Sơ đồ phức tạp có khối gập “Mô tả sơ đồ” bằng chữ cho trình đọc màn hình và người đọc chậm.

Chữ trong bài (quy ước tiếng Việt)

  • Căn trái, không căn đều; không ngắt từ; tiêu đề cân dòng (tiêu đề bài từ 1200px: tránh chữ mồ côi, không cân dòng — để không tách đôi cụm như “dữ / liệu”), đoạn văn tránh chữ mồ côi (trình duyệt hỗ trợ thì dùng).
  • Ngoặc kép cong “…”; gạch nối giữa câu ” – ”; khoảng số “2020–2026”.
  • Số kiểu Việt: 1.500 · 2,5 · 200.000 đ; khoảng trắng không ngắt giữa số và đơn vị.
  • Đậm cho từ khoá (ít), nghiêng cho câu định nghĩa và thuật ngữ tiếng Anh; không gạch chân ngoài link.
  • Link nói đích đến; link ra ngoài có dấu ↗.
  • Bảng: số căn phải, chữ số đều độ rộng, ô số không xuống dòng (thử ở 320px: “200.000 đ” bị gãy thành hai dòng nếu thiếu); trên điện thoại bảng cuộn ngang trong khung, cột đầu dính.

Tiêu chuẩn đọc

Trích nguyên văn từ DESIGN.md. Trượt một mục là lỗi cần sửa trước khi đăng.

Đo được, kiểm ở mọi mẫu trang (chi tiết trong reading-standard):

Tiêu chuẩn Mức
WCAG 2.2 AA toàn trang; tương phản thân bài AAA (≥ 7:1)
Co giãn 320px / phóng chữ 200% / tự giãn dòng–chữ không cuộn ngang, không mất chữ, không chồng lấn
Vùng bấm ≥ 44×44px (cảm ứng, dưới 1200px); ≥ 32px với chuột/trackpad từ 1200px
Độ dài dòng / giãn dòng 45–75 ký tự / 1.6–1.8
Lighthouse mobile Accessibility 100 · SEO 100 · Best Practices ≥ 95 · Performance ≥ 90
axe-core 0 lỗi nghiêm trọng
Thử tay đọc trọn bài bằng VoiceOver, TalkBack; chỉ dùng bàn phím

Nên và không nên

Trích nguyên văn từ DESIGN.md.

Nên

  • Để chữ làm việc: mỗi màn một cỡ tiêu đề, một cỡ thân bài, một cỡ nhãn.
  • Dùng token trong code; nền khối phụ chỉ surface-soft.
  • Kiểm trước khi giao: 320 · 375 · 768 · 1024 · 1440px và các khung MacBook 1440×900 · 1470×956 · 1512×982 · 1728×1117; xoay ngang; ba nền; chữ hệ thống 200%; tự giãn dòng/chữ; reduced-motion; JS tắt; PWA standalone trên iPhone có tai thỏ; ảnh và sơ đồ ở nền Tối; bảng reading-standard.

Không nên

  • Không màu thương hiệu thứ hai; tím chỉ bật khi có lý do đo được.
  • Không gradient, bóng lớn, ảnh nền, icon trang trí, emoji làm biểu tượng, ảnh stock, ảnh minh hoạ không mang thông tin.
  • Không căn đều hai bên, không ngắt từ, không sơ đồ dùng màu để phân biệt.
  • Không chữ không chân cho thân bài; không chữ dưới 13px; không chặn phóng to.
  • Không chữ “sách”, “chương”, “mode”, “How-to”, “Case study” trên giao diện (BR-01, ADR-28).
  • Không tải font, icon, script từ máy chủ bên thứ ba — hai ngoại lệ có tên: script Cloudflare Turnstile (challenges.cloudflare.com) phục vụ kiểm tra chống máy tự động (reader UC-201 AC-10, ADR-32), và CHỈ tải lười khi người đọc bấm/focus vào ô nhập email hoặc form bình luận; khung trình phát YouTube của ô video (publishing UC-110 AC-1, pages/privacy.md: “chỉ tải khi bạn bấm vào video”), CHỈ tạo khi người đọc bấm nút phát — trước đó trang không có khung nhúng hay script nào của YouTube (nguồn ảnh bìa video còn [OPEN] ở UC-110; tới khi tác giả chọn, ô video là khung 16:9 site tự vẽ) (ADR-32 sửa đổi 2026-10-20).
  • Không cuộn ngang trang; không hai thanh dính chồng nhau trên màn thấp; không 100vh thuần.
  • Không khối mời email dính/nổi/trượt vào khi cuộn; không nút đen tô kín cho ô email.
  • Không popup, không hộp hay dải tự hiện, không lớp phủ che chữ — ngoại lệ có tên duy nhất: cookie-notice (ADR-30: thông báo, không xin đồng ý; không scrim, không lấy focus, đóng × là không hiện lại). Không thêm hộp tự hiện nào khác “theo cùng kiểu”.

Xem tệp DESIGN.md — Tệp gốc, nguyên văn, dạng chữ thô.

Cài đặt đọc

Cỡ chữ
Nấc 3/5
Nền
Độ rộng dòng

Nhớ trên máy này.