motthay

bên trong motthay — thiết kế một tumblog tĩnh

#005

Dự án

motthay là gì?

Motthay là một tumblog cá nhân tĩnh, đánh số tuần tự, dùng duy nhất font Newsreader cho toàn bộ văn bản. Không border, không card box — phân tách hoàn toàn bằng tương phản màu nền giữa các zone.

Motthay là một phần của astr0 monorepo — 6 site Astro chia sẻ chung component library.

Motthay chọn sự đơn giản có chủ đích. Một schema duy nhất. Mọi entry là một file Markdown với frontmatter tối thiểu. Không field type. Không discriminated union. Chỉ có title, date, tags, và nội dung. Font Newsreader cho toàn bộ văn bản, JetBrains Mono cho metadata. Hệ thống zone full-width phân tách bằng màu nền.

Sự đơn giản không phải là thiếu vắng — nó là kết quả của việc đã bỏ đi mọi thứ không cần thiết.

Typography

Newsreader — một font cho tất cả

Writing
Newsreader Variable — font serif thiết kế cho văn bản dài, Production Type.

Motthay dùng Newsreader Variable cho cả heading và body. Phân biệt bằng weight: Semibold (600) cho heading, Regular (400) cho body. Metadata dùng JetBrains Mono — không bao giờ lẫn vào body text.

Base size 1.25rem (20px), content width 44rem (704px). Một font duy nhất tạo ra sự đồng nhất hiếm thấy trên web. Cảm giác như đọc sách in, không phải website.

1.25rem Base Font Size
44rem Content Width

Trích dẫn

Blockquote & Pull Quote

Old books

Blockquote căn phải, chữ 1.5rem, Newsreader italic. Không dùng border-left — thay vào đó là căn phải để tạo cảm giác như lời trích dẫn được đặt riêng biệt khỏi dòng chảy chính. Dòng nguồn trong thẻ <footer> hiển thị bằng Mono, muted:

Thiết kế không phải là cách nó trông như thế nào. Thiết kế là cách nó hoạt động.

— Steve Jobs

Có ba phản hồi cho một thiết kế — có, không, và WOW! Wow mới là thứ để nhắm tới.

— Milton Glaser

Pull quote căn giữa, 1.75rem, "" tự động qua CSS:

Code không thừa mới là code đẹp — cũng như thơ, mỗi dòng đều có lý do để tồn tại.
đôi khi điều khó nhất không phải là thêm vào — mà là bỏ đi

Thư viện ảnh

Bấm vào ảnh để mở lightbox. Nhấn Esc hoặc click ra ngoài để đóng.

Horizontal scroll — .scroller

Mountains Code Digital Workspace Laptop

Spotlight

Ảnh nổi bật

Design workspace
`.spotlight` — ảnh căn giữa với khoảng trắng rộng, kèm chú thích nhỏ.

So sánh

Side-by-side — .compare

Before Trước — có border + card box
After Sau — zone layout không border

Video

Video nhúng

Code

Syntax Highlight

// Không còn entryNumbers utility — slug là số
export async function getStaticPaths() {
  const entries = await getCollection('entries', ({ data }) => {
    return data.status !== 'draft' || import.meta.env.DEV
  })
  return entries.map(e => ({ params: { slug: e.slug } }))
}
/* Zone layout — không border, không card box */
.entry-card { padding: var(--space-6) 0; }
.entry-card__title {
  font-family: var(--font-heading);
  font-weight: var(--weight-semibold);
}

Liên kết

Link ngoài trong đoạn văn tự động có mũi tên — ví dụ: trang https://astro.build">Astro framework hoặc https://pages.cloudflare.com">Cloudflare Pages. Dùng Markdown [text](url) như bình thường, CSS tự thêm mũi tên cho link có href bắt đầu bằng http.

Link card dạng block — chỉ có tiêu đề + mũi tên , gọn và thanh lịch:

Astro — The Web Framework for Content-Driven Websites

Newsreader — Production Type

Cloudflare Pages — Deploy & Hosting

Link inline với arrow — dùng .link-row trong đoạn văn: xem thêm astr0 monorepo trên GitHub để hiểu cấu trúc toàn bộ dự án, hoặc đọc tài liệu Astro để học cách build SSG.

Kiến trúc

Hệ thống Zone

Minimal desk

Motthay không dùng border hay card box. Mỗi vùng chức năng là một section full-width với màu nền riêng — gray-50 cho header/hero, gray-100 cho feed, trong suốt cho entry cards. Tương phản giữa các sắc độ xám tạo chiều sâu không cần đường kẻ.

Entry cards hoàn toàn trong suốt — không background, border, hay border-radius. Chỉ text + 3rem gap. Không divider. Hover: title chuyển accent. Cảm giác như đọc danh sách ghi chép trên một tờ giấy dài, thay vì các “thẻ” riêng biệt.

Theme toggle (Moon/Sun) dùng Lucide icons + Alpine.js. Chế độ sáng/tối tự động theo mặt trời Sài Gòn (10.82°N, 106.63°E), kiểm tra mỗi 15 phút và khi tab focus lại.

Header & Herogray-50

Feedgray-100

Cards — trong suốt

Footergray-50

Tiến trình

Timeline

  • 2026-06-22 Thiết kế ban đầu 2 rounds phản biện với 3 chuyên gia. Astro SSG, 4-type schema.
  • 2026-06-26 Rebrand — đơn giản hóa Bỏ discriminated union, single schema. Newsreader heading.
  • 2026-07-01 Xóa bài cũ, viết mới 26 entry placeholder → 4 bài chất lượng. Cập nhật hamhub.
  • 2026-07-08 Typography + Zone Newsreader toàn bộ. Zone full-width layered. Không border.
  • 2026-07-08 Đánh số + Style system 001.md, unlisted status, 30+ content class CSS.
  • Chương

    Chapter Markers

    01 Tạo file với số tiếp theo

    Xem số lớn nhất trong entries/, tạo file kế tiếp. Không cần nghĩ tên.

    02 Frontmatter tối thiểu

    titledate bắt buộc. Tags, excerpt, image, pinned đều optional.

    03 Markdown + CSS class

    Markdown thuần, mở rộng với HTML cho gallery, video, và 30+ class CSS.

    Cards

    Card Grid

    Đánh số

    001.md → /001. Không slug, không utility.

    Newsreader

    Một font cho tất cả. Semibold + Regular.

    Zone Layout

    Full-width màu nền, không border, không box.

    Unlisted

    Truy cập link, ẩn khỏi feed và tags.

    Stack

    Công nghệ

    5.1 Astro
    <1s Build
    Astro 5.1 Newsreader JetBrains Mono Tailwind CSS Custom Properties Alpine.js Lucide Icons Shiki Cloudflare Pages pnpm GitHub Actions
    Zero-JS-first: Không analytics. Không i18n. HTML tĩnh + CSS + Alpine cho theme toggle. Build <1s.
    Design workspace
    `.full-bleed` — ảnh tràn rộng hơn content card.
    Bài này status: unlisted — vào bằng /005, không hiện trên feed hay /tags. 30+ class CSS có sẵn — không JS (trừ lightbox), không dependency mới. Link ngoài tự động có ↗. Xem source 005.md để học cách viết.