Sumi / Styleguide v2.0 · SUMI · ATOMIC
Design System · v2.0 · Wabi-sabi

Sumi ·

Hệ thống thiết kế theo triết lý wabi-sabi, sắp xếp theo Atomic Design — tokens, typography, atoms, molecules, organisms, templates. Đặt tên theo quy ước Sumi của dự án.

Kiến trúc
CSS @layer · design tokens
Phân tầng
Atoms → Molecules → Organisms → Templates
Tokens
color · type · spacing · motion · elevation
Cập nhật
2026 · 05 · 30
01Tokens · Palettetokens.css

Palette — mực, giấy washi, và hai sắc nhấn.

Mọi giá trị màu là CSS custom property trong tokens.css. Tham chiếu bằng var(--sumi-900), var(--washi-100), var(--shu-red)… — không hardcode hex trong component.

Sumi · mực --sumi-900 → --sumi-500

--sumi-900
#1A1614
— mực sâu
--sumi-800
#2B2422
— text mặc định
--sumi-700
#4A413C
— hover state
--sumi-600
#6B5F56
— text muted
--sumi-500
#8B7E72
— text subtle

Accents --shu-red · --ginkgo (dùng tiết kiệm)

--shu-red
#B8423A
朱 · dấu triện
--shu-red-soft
#C6635B
hover state
--ginkgo
#D4A437
銀杏 · lá ngân hạnh
--ginkgo-soft
#E0B85C
hover state

Washi · giấy --washi-50 → --washi-400

--washi-50
#FAF6EC
— giấy · elevated
--washi-100
#F5F1E8
— page bg
--washi-200
#EFE9DC
— subtle bg
--washi-300
#E5DDC8
— border
--washi-400
#C9BFA6
— border strong

Semantic slots color · border · text

TokenMapDùng cho
--color-textsumi-800Body text mặc định
--color-text-headingsumi-900Heading
--color-text-mutedsumi-600Caption · metadata
--color-bgwashi-100Page background
--color-bg-elevatedwashi-50Card · surface nổi
--color-borderwashi-300Hairline · table border
--color-accentshu-redLink hover · dấu nhấn
02Typography.type-*

Type scale — display, body, mono.

Ba họ chữ: display (Cormorant Garamond) cho heading, body (EB Garamond) cho prose, mono (JetBrains Mono) cho UI. Class tiện ích .type-<variant> dùng cho UI ngoài prose.

.type-h1
Mài mực trên nghiên đá
Cormorant · 64px · 300
.type-h2
Article title
Cormorant · 44px · 400
.type-h3
Section heading
Cormorant · 34px · 400
.type-h4
Subsection heading
Cormorant · 26px · 400
.type-h5
Card title heading
Cormorant · 20px · 500
.type-h6
Compact heading
Cormorant · 17px · 500
.type-subtitle1
Lead paragraph — italic, mở bài tóm tắt ý chính.
Cormorant italic · 20px
.type-subtitle2
Italic emphasis — câu nhấn ngắn trong prose.
Cormorant italic · 17px
.type-body1
Body text mặc định — render kỹ chữ "ấ", "ậ", "ọ", "ỹ".
EB Garamond · 17px
.type-body2
Body small — caption trong card, footer.
EB Garamond · 14px
.type-button
SUBSCRIBE TO NEWSLETTER
JetBrains · 14px · 0.12em
.type-caption
2026 · 05 · 22 — 7 min read
JetBrains · 12px · 0.05em
03Spacing · Motion · Elevation--space-* · --ease-* · --shadow-*

8px grid, góc vuông, chuyển động chậm rãi.

Spacing 8px base

TokenValueVisual
--space-1 8px
--space-2 16px
--space-3 24px
--space-4 32px
--space-5 48px
--space-6 64px
--space-7 96px
--space-8 128px
--space-9 192px

Motion

--ease-outcubic-bezier(0.16, 1, 0.3, 1) · mặc định
--ease-in-outcubic-bezier(0.65, 0, 0.35, 1)
--duration-fast250ms
--duration-base400ms · UI mặc định
--duration-slow600ms · letter-spacing

Elevation

nonedefault
--shadow-smcard rest
--shadow-mdcard hover
--shadow-lgmodal
04Atoms15 components

Atoms — đơn vị nhỏ nhất, không phụ thuộc gì khác.

Button .btn · variant: primary | ghost | text | seal · accent

Hover signature: letter-spacing 0.12em → 0.16em (600ms ease-out)

sm · base · lg · disabled

IconButton .icon-btn

Stroke 1.5px · currentColor · 24×24 viewBox

Tag / Chip .tag · default | filled | accent | ginkgo · sm

Essay Triết học Filled Featured Draft SM

Avatar .avatar · circle | square | rounded · sm | base | lg

Badge .badge-wrap > .badge | .badge-dot

3 12

Field .field · label + input + helper

Letters from Sumi · monthly · no tracking
⌘K
Comment phải có ít nhất 20 ký tự.

Checkbox · Radio · Switch

Divider .divider · .divider-text · .path-divider


Plain — .divider

墨 · 渋い · 間

Link .link · .link-hover · .link-plain

Progress .progress · --_remain

Cao 2px · gradient sumi-900 → shu-red. --_remain = phần còn lại.

Skeleton .skeleton-text · .skeleton-rect

Seal .seal · red | sumi | ginkgo · sm | base | lg

Wabi-sabi extension — cảm giác đóng dấu tay, transform rotate(-2deg)

05Molecules7 components

Molecules — atoms gộp thành đơn vị có nghĩa.

Card .card · header · content · actions

Trần Hồng Phú

2026 · 05 · 22 · 7 min read

Khi tôi bắt đầu mài mực thật, sắc đen đầu tiên hôm đó tệ hơn tôi tưởng.

Quote · Essay

Ba câu hỏi trước khi viết

Không phải bài nào cũng đáng viết. Đây là filter giữa cảm hứng và bản nháp.

Alert .alert · info | warning | error | success

— NoteKhoảng trống trong layout không phải là chỗ để lấp đầy.
⚠ WarningKhông kết hợp shu-red và ginkgo trong cùng một section.
⊗ ErrorSubscription failed — check email and try again.
✓ SuccessSubscription confirmed — kiểm tra email để xác nhận.

List .list · .list-item · avatar + text

  • Mài mực: một bài thực tập về sự không hoàn hảo

    Essay · 2026 · 05 · 22 · 12 min

    Featured
  • Khoảng trống giữa hai chữ Hán

    Essay · 2026 · 05 · 10 · 8 min

  • Sao tôi quay lại với serif

    Note · 2026 · 04 · 28 · 2 min

Breadcrumbs

Tabs

PullQuote .pull-quote · .pull-quote-cite

Một blog cá nhân không phải là tạp chí. Nó là một không gian — và không gian cần có chỗ để thở. — Sumi · v2.0
06Organisms4 components

Organisms — sections phức tạp, có layout riêng.

AppBar .appbar · sticky · backdrop blur

→ Xem sticky AppBar ở đầu trang. Nền color-mix(... 85%, transparent) + backdrop-filter: blur(12px).

Drawer

Dialog

Xoá bài viết này?

"Mài mực" sẽ bị xoá vĩnh viễn. Không thể hoàn tác.

ArticleCard .article-card-featured · 2fr/3fr (Fukinsei)

Featured · Essay

2026 · 05 · 22 — 12 min read

Mài mực: một bài thực tập về sự không hoàn hảo

Khi tôi bắt đầu mài mực thật, sắc đen đầu tiên hôm đó tệ hơn tôi tưởng. Đến chiều thì tay đã quen, nhưng sắc đen vẫn không bao giờ giống nhau hai lần.

ArticleCard .article-card-list

Note · 2026 · 05 · 18 · 3 min

Ba câu hỏi tôi tự hỏi trước khi viết một bài blog

Không phải bài nào cũng đáng viết. Đây là filter giữa cảm hứng và bản nháp.

Essay · 2026 · 05 · 10 · 8 min

Khoảng trống giữa hai chữ Hán

Người Nhật gọi đó là "ma". Ở giữa hai âm, hai động tác, hai chữ.

ArticleCard .article-card-grid

Essay

Chữ "đủ" trong tiếng Việt

"Vừa đủ" không phải "vừa vừa". Là chính xác đến mức không cần thêm.

Note

Bút chì 4B và tờ A5

Sketch tool nào cũng được, miễn tay quen với nó hơn phím tắt.

Essay

Khi nào nên xoá một bài blog cũ

Tôi xoá bài cũ mỗi 18 tháng. Đây là tiêu chí tôi dùng.

07Templatespage scaffolds

Templates — layout scaffolds với slot cho content.

ArticleLayout grid 3 cột (TOC | content | aside) ≥ 1100px. Container + Stack là layout primitives.

ArticleLayout .article-layout · 220px | 608px | 220px

Essay · 2026 · 05 · 22

Mài mực: một bài thực tập về sự không hoàn hảo

Khi tôi bắt đầu mài mực thật, sắc đen đầu tiên hôm đó tệ hơn tôi tưởng.

Quá loãng. Lần thứ hai quá đặc. Đến chiều thì tay đã quen, nhưng sắc đen vẫn không bao giờ giống nhau hai lần.

⚠ NoteNếu lần đầu mày mài quá loãng — không sao. Đó là tín hiệu, không phải lỗi.

Stack .stack-flex / .stack-row · .stack-1..3 · .stack-divider

row · spacing 2

column · spacing 1 · divider

Mài mực, lần đầu Sai một, sửa hai Sắc đen một chiều