Principles
Atomic Thinking
Design system ของ B.Grimm จัดลำดับชั้นแบบ atomic — จากเล็กไปใหญ่:
Token → Atom → Molecule → Component → Pattern → Page
| ชั้น | ตัวอย่าง |
|---|---|
| Token | color.primary, space.4, radius.md (ดู Design Tokens) |
| Atom | ปุ่ม, input field, ไอคอน, label |
| Molecule | Search bar (input + icon + button), form field (label + input + helper text) |
| Component | Card, Navbar, Modal |
| Pattern | Dashboard layout, checkout flow |
| Page | หน้าเว็บที่ประกอบจาก pattern ข้างต้น |
ทั้ง 6 ขั้นด้านบนสืบสีมาจาก token เดียวกันคือ color.primary — เปลี่ยนที่ขั้นที่ 1 ขั้นเดียว ทุกขั้นถัดไปเปลี่ยนตามหมด
หลักการ: แก้ที่ token ชั้นล่างสุดเท่าที่เป็นไปได้ — ถ้าต้องแก้สีปุ่มทั้งเว็บ ให้แก้ที่ token ไม่ใช่ไล่แก้ทีละ component
Naming Convention
ชื่อ component ต้อง ตรงกันทั้ง Figma และโค้ด เพื่อให้ designer/developer คุยกันด้วยคำเดียวกัน — ใช้ PascalCase สำหรับชื่อ component (ButtonPrimary, CardFeature) และ kebab-case สำหรับ CSS class/utility (btn-primary, card-feature)
ห้ามตั้งชื่อ component ตามหน้าตา (OrangeButton) — ให้ตั้งตามบทบาท (ButtonPrimary) เพราะสีอาจเปลี่ยนตาม theme/dark mode แต่บทบาทไม่เปลี่ยน
#FF9956 เพื่อคง contrast แต่บทบาท "ปุ่มหลัก" ไม่เปลี่ยน — ชื่อจึงยังใช้ได้OrangeButton — ทุกคนที่อ่านโค้ดต่อจะสับสนกฎเดียวกันกับ CSS class: btn-primary ถูก / btn-orange ผิด
Consistency ข้าม Framework
เว็บไซต์/แอปของ B.Grimm ถูกสร้างด้วยหลาย framework (Tailwind, MUI, Vanilla CSS/HTML) ตามแต่ละโปรเจกต์ — design system ต้องหน้าตาเหมือนกันไม่ว่าจะ implement ด้วยอะไร เพราะทุก framework ดึงค่าจาก token ชุดเดียวกัน (tokens/bgrimm.tokens.json)
| Framework | รายละเอียดการ implement |
|---|---|
| Figma | Figma Variables Setup |
| Tailwind | Tailwind Config |
| MUI | MUI Theme |
| Vanilla CSS/HTML | CSS Variables Guide |
ทั้งสามช่องได้ค่าจาก bgrimm.tokens.json ชุดเดียวกัน — สี #FF6727, radius 8px, padding 8/16px, ตัวหนา 700 เท่ากันหมด
เจออาการนี้เมื่อไหร่ ให้ไล่กลับไปแก้ที่ bgrimm.tokens.json แล้ว re-sync ทุก framework — ห้าม patch ทีละที่
หากพบว่าหน้าตา component ต่างกันระหว่าง framework โดยไม่ตั้งใจ — แปลว่า token ไม่ sync กัน ให้แก้ที่ต้นทาง (bgrimm.tokens.json) ไม่ใช่ patch เฉพาะจุด