storybook github

1thay

trăm nghe không bằng một thấy

hệ thống thiết kế dành cho một người, được một người làm ra. phục vụ saas dashboards, infographics, và các giao diện giàu dữ liệu. đề cao trải nghiệm đọc, trực quan hóa thông tin, và cảm giác sử dụng.

tài liệu liên quan: design.md · design-tokens.md · figma.md · astro.md · storybook.md · project-logs.md · CLAUDE.md


tổ chức dự án & quy tắc đặt tên

cấu trúc thư mục

1thay-com/
├── 1thay.md              # triết lý & quy chuẩn (file này)
├── design.md             # machine-readable spec (chuẩn google design.md)
├── design-tokens.md      # token chi tiết & brand themes
├── project-logs.md       # nhật ký quyết định & tự cải tiến
├── src/
│   ├── tokens/           # css custom properties, tailwind config
│   ├── components/       # astro + storybook components
│   ├── layouts/          # page layouts
│   ├── pages/            # astro pages (landing, dashboard, docs, prototype)
│   └── styles/           # global styles
├── public/               # static assets
├── storybook/            # storybook config & stories
└── .github/              # ci/cd workflows

quy tắc đặt tên file

  • kebab-case cho mọi file và thư mục: button-primary.astro, brand-colors.css
  • số thứ tự dùng leading zero nếu cần: 01-overview.md, 02-colors.md
  • không viết tắt trừ khi đã là chuẩn ngành: btnbutton, nhưng ui được chấp nhận

quy tắc đặt tên token

--<category>-<property>-<variant>-<state>
category mô tả ví dụ
color màu sắc --color-blue-reputa-600
font typography --font-display, --font-text
space spacing --space-md, --space-lg
radius bo góc --radius-sm, --radius-md
shadow đổ bóng --shadow-sm, --shadow-lg
size kích thước --size-icon-md, --size-btn-h
z stacking --z-modal, --z-tooltip
opacity độ mờ --opacity-disabled, --opacity-overlay
border viền --border-width, --border-color

quy tắc đặt tên component

  • tên component: PascalCase trong code, kebab-case trong file
  • variant: dùng data attribute data-variant="..." hoặc props
  • state: :hover, :focus-visible, [aria-disabled], [aria-invalid]

quy trình ra quyết định

nguyên tắc cơ bản

  1. visual-first — mọi quyết định phải được kiểm chứng bằng mắt. không tranh luận trên figma hay code khi chưa thấy kết quả render
  2. lowercase — toàn bộ văn bản giao diện viết thường, trừ tên riêng và nhãn hiệu
  3. bento grid — layout dùng grid system lấy cảm hứng từ bento, ưu tiên module chữ nhật có bán kính bo góc đồng nhất
  4. reading first — khoảng cách dòng, cỡ chữ, độ tương phản phải tối ưu cho đọc trước, sau đó mới đến thẩm mỹ
  5. data clarity — số liệu, biểu đồ, bảng biểu phải rõ ràng, dễ so sánh, không che giấu thông tin sau hiệu ứng

tiêu chí đánh giá

tiêu chí câu hỏi kiểm tra
nhất quán có dùng đúng token không? có lặp lại giá trị hardcoded không?
đọc được contrast ratio có đạt aa không? line-height có đủ không?
phản hồi hover/focus/active có rõ ràng không? loading state có không?
đáp ứng mobile có vỡ layout không? tablet có thiếu không gian không?

giải quyết xung đột

khi có 2 lựa chọn thiết kế mâu thuẫn:

  1. render cả 2 ra màn hình
  2. đặt cạnh nhau
  3. chọn cái nhìn rõ hơn, dễ đọc hơn, ít gây phân tâm hơn
  4. nếu vẫn không rõ → chọn cái đơn giản hơn

hệ thống design tokens

phân cấp

global       →  spacing, radius, shadow, opacity, z-index, size
  └─ brand   →  color palette, font families
     └─ semantic → success, warning, error, info, surface, text
        └─ component → button, card, input, table, chart, badge

quy tắc:

  • global tokens không phụ thuộc brand — dùng chung cho tất cả
  • brand tokens định nghĩa bảng màu và font cho từng brand
  • semantic tokens ánh xạ từ brand tokens sang mục đích sử dụng
  • component tokens chỉ dùng trong nội bộ component, không export ra ngoài

multi-brand

hệ thống hỗ trợ nhiều brand thông qua theme variables. mỗi brand định nghĩa một bộ màu riêng, cùng chia sẻ global tokens.

brand hiện có:

  • blue-reputa (mặc định) — phát triển từ #064BAE
  • red-premier — phát triển từ #A10B2E

cách thêm brand mới:

  1. định nghĩa base color
  2. tạo palette 5 mức (900, 800, 700, 600, 400)
  3. ánh xạ semantic tokens
  4. thêm vào design-tokens.md

kiểm thử & đánh giá

design qa checklist

  • token được dùng đúng tên, không hardcode giá trị
  • màu sắc nhất quán với brand palette
  • typography đúng font family và scale
  • spacing dùng đúng scale (4, 8, 16, 24, 32, 48, 64)
  • border radius đúng scale (2, 4, 8, 12, 16, full)
  • responsive: mobile (< 768px), tablet (768-1024px), desktop (> 1024px)

accessibility

  • color contrast đạt wcag aa (4.5:1 cho text thường, 3:1 cho text lớn)
  • focus indicator rõ ràng trên mọi interactive element
  • target size tối thiểu 24px cho touch
  • aria label đầy đủ cho component

visual regression

  • mỗi lần đổi token → chụp screenshot trước/sau
  • so sánh side-by-side
  • ghi nhận khác biệt vào project-logs.md

hệ sinh thái & quy trình làm việc

figma (thiết kế)
  ↕ sync tokens
storybook (design.1thay.com)
  ↕ phát triển & test component
astro (1thay.com)
  → landing page · dashboard · docs · prototype
github
  → cloudflare pages (deploy)

quy trình hàng ngày

  1. thiết kế trên figma → token được export ra code
  2. phát triển component trong storybook → test isolated
  3. tích hợp vào astro page → test toàn diện
  4. push lên github → cloudflare pages auto deploy
  5. review kết quả → ghi nhận vào project-logs.md

tự động hóa

  • design lint — kiểm tra design.md hợp lệ
  • visual regression test — so sánh screenshot trước/sau
  • cloudflare pages — auto deploy từ github