Hono Design System
Hono · ระบบจองหนังสือ · v1.0

Hono Design System

ชุด token และ component กลางสำหรับหน้าจองหนังสือ ค้นหา และจัดการการรับเล่มของ Hono ทุกค่าประกาศเป็น CSS variables ใน :root แตะชื่อตัวแปรหรือรหัสสีเพื่อคัดลอกได้ทันที

Tokens

สี 4 ตัวจาก moodboard เป็นค่าดิบ (--palette-*) ส่วน component ใช้ token เชิงความหมาย (--color-*) ซึ่งปรับเฉดให้ข้อความผ่าน WCAG AA ทั้งธีมสว่างและมืด

B892FFSoft Periwinkle · Primary
FFC2E2Blush Pop · Secondary
FF90B3Cotton Candy · Accent
FBFFB9Cream · Highlight

Spacing

ใช้เป็น gap / padding ทั้งหมด ห้ามใช้ค่าที่ไม่อยู่ในสเกล

Radius

sm สำหรับปุ่ม/ช่องกรอก · md สำหรับกล่อง/ตาราง · lg สำหรับ Card และ Modal

Shadow

มี 2 ระดับเท่านั้น: sm สำหรับสิ่งที่วางบนหน้า, md สำหรับสิ่งที่ลอยเหนือหน้า

Typography

IBM Plex Sans Thai ทุกระดับ ภาษาไทยมีสระบน-ล่างและวรรณยุกต์ จึงตั้ง line-height ของ Body ไว้ 1.7 เพื่อไม่ให้บรรทัดชนกัน

H1--text-h1 · 32 / 700
จองหนังสือเล่มโปรด รับได้ที่สาขาใกล้บ้าน
H2--text-h2 · 24 / 600
หนังสือที่คุณจองไว้
H3--text-h3 · 20 / 600
สถาปัตยกรรมพื้นถิ่นล้านนา
Body--text-body · 16 / 400

หนังสือที่จองไว้จะถูกเก็บไว้ที่เคาน์เตอร์ 3 วันทำการนับจากวันที่ได้รับแจ้ง หากไม่มารับภายในกำหนด ระบบจะยกเลิกการจองและส่งต่อให้ผู้ที่รอคิวถัดไปโดยอัตโนมัติ

Small--text-small · 14 / 400

ISBN 978-616-7800-12-4 · เลขเรียก 720.9593 ส134 · ชั้น 2 โซน B

Button

4 แบบ × 3 ขนาด พร้อมสถานะ Hover / Focus / Disabled / Loading ลองกดปุ่มในคอลัมน์ Loading เพื่อดูการทำงานจริง หรือกด Tab เพื่อดู focus ring

ขนาด S / M / L
แบบS · 32pxM · 40pxL · 48px
Primary
Secondary
Ghost
Destructive
สถานะ (ขนาด M)
แบบDefaultHoverFocusDisabledLoading
Primary
Secondary
Ghost
Destructive

✓ ใช้เมื่อไหร่

  • Primary — การกระทำหลักของหน้า 1 ปุ่มต่อหน้าจอ เช่น "จองเล่มนี้", "ยืนยันการจอง"
  • Secondary — ทางเลือกที่สำคัญรองลงมา เช่น "เพิ่มในรายการอยากอ่าน"
  • Ghost — การกระทำเสริมที่ไม่ควรแย่งสายตา เช่น "ดูรายละเอียด", "ยกเลิก" ใน Modal
  • Destructive — การกระทำที่ย้อนกลับไม่ได้ เช่น ยกเลิกการจอง ควรมี Modal ยืนยันก่อนเสมอ
  • Loading — ระหว่างส่งข้อมูล ให้คงความกว้างปุ่มและปิดการกดซ้ำ

✕ ไม่ควรใช้เมื่อไหร่

  • อย่าวาง Primary หลายปุ่มในกลุ่มเดียวกัน ผู้ใช้จะไม่รู้ว่าควรกดอะไร
  • อย่าใช้ Destructive กับการกระทำที่ย้อนกลับได้ เช่น "ล้างตัวกรอง" ให้ใช้ Ghost
  • อย่าใช้ปุ่มแทนลิงก์ไปหน้าอื่น ถ้าพาไปหน้าใหม่ให้ใช้ <a>
  • อย่าเขียนข้อความกว้าง ๆ อย่าง "ตกลง" หรือ "ส่ง" ให้บอกสิ่งที่จะเกิดขึ้นจริง
  • อย่าปิดปุ่ม (Disabled) โดยไม่บอกเหตุผลใกล้ ๆ ปุ่ม

Input · Select · Checkbox

ทุกช่องมี label อยู่ด้านบนเสมอ ข้อความ error ผูกกับช่องด้วย aria-describedby และบอกวิธีแก้ ลองพิมพ์รหัสสมาชิกแล้วกด Tab ออกจากช่อง

ดูได้จากบัตรสมาชิก ขึ้นต้นด้วย HN- ตามด้วยตัวเลข 6 หลัก
เบอร์โทรไม่ครบ กรอกให้ครบ 10 หลัก เช่น 081-234-5678
หนังสือจะถูกส่งไปสาขานี้ภายใน 2 วันทำการ
ระบบกรอกให้อัตโนมัติจากเล่มที่เลือก
การแจ้งเตือน

✓ ใช้เมื่อไหร่

  • Input — ข้อมูลที่ผู้ใช้ต้องพิมพ์เอง เช่น รหัสสมาชิก เบอร์โทร คำค้นหา
  • Select — ตัวเลือก 5–15 รายการที่รู้ชุดแน่นอน เช่น สาขา หมวดหนังสือ
  • Checkbox — ตัวเลือกเปิด/ปิดที่เลือกได้หลายข้อพร้อมกัน หรือยอมรับเงื่อนไข
  • Error — แสดงหลังผู้ใช้ออกจากช่องหรือกดส่ง พร้อมบอกวิธีแก้ที่ทำได้ทันที

✕ ไม่ควรใช้เมื่อไหร่

  • อย่าใช้ placeholder แทน label ข้อความจะหายเมื่อเริ่มพิมพ์
  • อย่าใช้ Select ถ้ามีแค่ 2–3 ตัวเลือก ให้แสดงเป็นตัวเลือกให้เห็นทั้งหมด
  • อย่าใช้ Select ถ้ามีเกิน 15 รายการ เช่น รายชื่อหนังสือ ให้ใช้ช่องค้นหาแทน
  • อย่าแสดง error ตั้งแต่ผู้ใช้ยังพิมพ์ไม่จบ และอย่าบอกแค่ด้วยสีแดง ต้องมีข้อความกำกับ

Badge สถานะ

สถานะของหนังสือและการจองใน Hono สื่อด้วยทั้งสี จุดนำหน้า และข้อความ จึงอ่านได้แม้ไม่เห็นสี

ว่าง ยืมได้ จองแล้ว พร้อมรับที่สาขา เกินกำหนดรับ ยกเลิกแล้ว
successมีเล่มว่างในสาขา กดจองได้ทันที
infoจองสำเร็จ อยู่ระหว่างจัดส่งไปสาขา
warningหนังสือรออยู่ที่เคาน์เตอร์ ต้องรับภายใน 3 วัน
dangerเลยวันรับแล้ว ระบบจะยกเลิกอัตโนมัติ
neutralการจองที่ปิดไปแล้ว ไม่ต้องทำอะไรต่อ

✓ ใช้เมื่อไหร่

  • บอกสถานะที่เปลี่ยนได้ของสิ่งหนึ่ง เช่น สถานะเล่ม สถานะการจอง
  • ในตารางหรือ Card ที่ผู้ใช้ต้องกวาดตาหาสิ่งที่ต้องทำต่อ
  • ข้อความสั้น 1–3 คำ

✕ ไม่ควรใช้เมื่อไหร่

  • อย่าใช้ Badge เป็นปุ่มหรือลิงก์ เพราะหน้าตาไม่บอกว่ากดได้
  • อย่าใช้แสดงหมวดหมู่หรือแท็กหนังสือ ใช้สีสถานะกับสิ่งที่ไม่ใช่สถานะจะทำให้สับสน
  • อย่าเพิ่มสีใหม่นอก 5 สถานะนี้ ถ้ามีสถานะใหม่ให้จัดเข้ากลุ่มที่ใกล้ที่สุด

Card

Card หนังสือ 1 ใบ = 1 เล่ม ปกเล่มใช้สีจาก palette หมุนเวียนเมื่อไม่มีรูปปก

720.9593 ส134สถาปัตยกรรมพื้นถิ่นล้านนา
สมชาย นิลอาธิ · 2566 · 312 หน้า
ว่าง 2 เล่ม
895.913 ว252ทะเลในฤดูฝน
วรรณา แก้วประเสริฐ · 2568 · 208 หน้า
คิวจอง 3 คน
641.5959 ก412ครัวไทยสี่ภาค
กมลา ศรีสุข · 2565 · 256 หน้า
งดให้จองชั่วคราว
เล่มอยู่ระหว่างซ่อมปก เปิดให้จองอีกครั้ง 20 พ.ย. 2569

✓ ใช้เมื่อไหร่

  • แสดงรายการหนังสือแบบ grid ที่ผู้ใช้เลือกดูด้วยภาพปก
  • เนื้อหาแต่ละใบเป็นหน่วยเดียวกัน มีการกระทำหลักของตัวเอง 1 อย่าง
  • หน้าค้นหา หน้าแนะนำหนังสือ หน้าหนังสือใหม่

✕ ไม่ควรใช้เมื่อไหร่

  • อย่าใช้เมื่อต้องเปรียบเทียบหลายคอลัมน์ เช่น ประวัติการจอง ให้ใช้ Table
  • อย่าซ้อน Card ใน Card
  • อย่าใส่ปุ่ม Primary มากกว่า 1 ปุ่มในใบเดียว

Table

ตัวเลขและรหัสใช้ตัวเลขความกว้างเท่ากันเพื่อให้เรียงตรงคอลัมน์ บนมือถือตารางเลื่อนแนวนอนในกรอบของตัวเอง

รายการจองล่าสุด · สาขาสยาม
รหัสการจองหนังสือผู้จองวันรับสถานะการกระทำ
HN-2569-0142สถาปัตยกรรมพื้นถิ่นล้านนา720.9593 ส134ปิยะนุช ส.08 พ.ย. 2569พร้อมรับที่สาขา
HN-2569-0139ทะเลในฤดูฝน895.913 ว252ธนากร ม.10 พ.ย. 2569จองแล้ว
HN-2569-0131เศรษฐศาสตร์ข้าวไทย338.17 ป213ณัฐชา ร.02 พ.ย. 2569เกินกำหนดรับ
HN-2569-0127ครัวไทยสี่ภาค641.5959 ก412อรุณี ท.30 ต.ค. 2569รับแล้ว
HN-2569-0120ประวัติศาสตร์สยามฉบับย่อ959.3 ช521กิตติพัฒน์ จ.—ยกเลิกแล้ว

✓ ใช้เมื่อไหร่

  • ข้อมูลหลายแถวที่ต้องเทียบกันตามคอลัมน์ เช่น ประวัติการจอง รายการรอรับ
  • หน้าสำหรับเจ้าหน้าที่ที่ต้องเรียง ค้นหา และจัดการทีละหลายรายการ
  • ใส่ caption บอกว่าตารางนี้คืออะไร

✕ ไม่ควรใช้เมื่อไหร่

  • อย่าใช้จัด layout หน้า ให้ใช้ grid/flex
  • อย่าใช้เมื่อมีแค่ 1–2 คอลัมน์ ให้ใช้รายการธรรมดา
  • บนมือถือ ถ้าผู้ใช้ทั่วไปต้องดู ให้พิจารณาเปลี่ยนเป็น Card แทนการเลื่อนแนวนอน

tokens.css

คัดลอกไฟล์นี้ไปวางในโปรเจกต์ แล้ว import ก่อน stylesheet อื่น ทุกค่าบนหน้านี้มาจากไฟล์เดียวกันนี้

ดูโค้ด tokens.css