ข้ามไปยังเนื้อหา

คู่มือการปรับปรุงสไตล์

คู่มือนี้จัดทำเอกสารสำหรับ design system token และ component class ที่ใช้งานใน styles/custom.css โดยทำหน้าที่เป็นเอกสารอ้างอิงสำหรับ token ของ border, surface, shadow, radius, button, gradient, transition, focus และ typography ที่ใช้ทั่วทั้งธีม

สถานะ: design token และ component class ทั้งหมดที่อธิบายไว้ด้านล่างได้รับการนำไปใช้งานแล้วและพร้อมให้ใช้งาน

แต่ละส่วนจะจัดทำเอกสารสำหรับประเภท token:

  1. คำจำกัดความของ token — CSS custom properties พร้อมค่าสำหรับโหมดสว่าง/มืด
  2. การแมป component — component ของธีมที่ใช้แต่ละ token
  3. หมายเหตุการนำไปใช้ — คำแนะนำการใช้งานและข้อควรพิจารณาด้านการเข้าถึง

ตาราง token จะแยกตาม โหมดสว่าง และ โหมดมืด ในกรณีที่ค่าแตกต่างกัน


ธีมใช้ border แบบ alpha-transparent แทนสีเทาทึบ ซึ่งช่วยให้ border ปรับตัวได้อย่างเป็นธรรมชาติกับพื้นหลังทุกประเภท

/* รูปแบบ border แบบ alpha-transparent */
border: 1px solid var(--f5-border-default); /* neutral ที่ alpha 20% */
/* โหมดสว่าง */
:root[data-theme='light'] {
--f5-border-faint: #3434341a; /* --f5-black-3 ที่ 10% */
--f5-border-default: #34343433; /* --f5-black-3 ที่ 20% */
--f5-border-strong: #22222266; /* --f5-black-4 ที่ 40% */
}
/* โหมดมืด */
:root {
--f5-border-faint: #f5f5f51a; /* --f5-white-2 ที่ 10% */
--f5-border-default: #f5f5f533; /* --f5-white-2 ที่ 20% */
--f5-border-strong: #cccccc66; /* --f5-white-4 ที่ 40% */
}
Tokenความทึบแสงกรณีการใช้งาน
--f5-border-faint10%ตัวแบ่งที่ละเอียด, แถวตาราง
--f5-border-default20%border ค่าเริ่มต้น, กรอบ card
--f5-border-strong40%border ที่เน้นชัดเจน, สถานะ active

สถานะ: เสร็จสมบูรณ์ — นำไปใช้งานแล้วใน styles/custom.css

Semantic surface token สำหรับสถานะ hover และ active

Tokenค่าวัตถุประสงค์
--f5-white#ffffffพื้นหลังหลัก
--f5-white-1#faf9f7Sidebar, พื้นที่ที่ละเอียด
--f5-white-2#f5f5f5Surface ที่ยกสูง
--f5-surface-hovervar(--f5-white-2)การเติมสีเมื่อ hover
--f5-surface-activevar(--f5-white-3)การเติมสีเมื่อกด/active
Tokenค่าวัตถุประสงค์
--f5-black#000000พื้นหลังหลัก
--f5-black-4#222222Sidebar, พื้นที่ที่ละเอียด
--f5-surface-hovervar(--f5-black-3)การเติมสีเมื่อ hover
--f5-surface-activevar(--f5-black-2)การเติมสีเมื่อกด/active
:root[data-theme='light'] {
--f5-surface-hover: var(--f5-white-2); /* #f5f5f5 */
--f5-surface-active: var(--f5-white-3); /* #e6e6e6 */
}
:root {
--f5-surface-hover: var(--f5-black-3); /* #343434 */
--f5-surface-active: var(--f5-black-2); /* #666666 */
}

สถานะ: เสร็จสมบูรณ์ — นำไปใช้งานแล้วใน styles/custom.css


ธีมใช้ shadow แบบ alpha ที่มีสีกลาง พร้อมค่าสองชั้นเพื่อความลึกที่เป็นธรรมชาติ โหมดสว่างใช้ --f5-black-3 (#343434) เป็นฐานสี ส่วนโหมดมืดใช้ #cccccc

:root[data-theme='light'] {
--f5-shadow-inset: inset 0px 1px 2px 1px #3434341a;
--f5-shadow-low:
0px 1px 1px 0px #3434340d,
0px 2px 2px 0px #3434340d;
--f5-shadow-mid:
0px 2px 3px 0px #3434341a,
0px 8px 16px -10px #34343433;
--f5-shadow-high:
0px 2px 3px 0px #34343426,
0px 16px 16px -10px #34343433;
--f5-shadow-higher:
0px 2px 3px 0px #3434341a,
0px 12px 28px 0px #34343440;
}
:root {
--f5-shadow-inset: inset 0px 1px 2px 1px #cccccc0d;
--f5-shadow-low:
0px 1px 1px 0px #cccccc0a,
0px 2px 2px 0px #cccccc0a;
--f5-shadow-mid:
0px 2px 3px 0px #cccccc0d,
0px 8px 16px -10px #cccccc1a;
--f5-shadow-high:
0px 2px 3px 0px #cccccc1a,
0px 16px 16px -10px #cccccc1a;
--f5-shadow-higher:
0px 2px 3px 0px #cccccc0d,
0px 12px 28px 0px #cccccc26;
}
Componentระดับ Shadow
.swatch, .icon-card--f5-shadow-low (ขณะพัก)
.starlight-aside--f5-shadow-low
.expressive-code .frame--f5-shadow-mid
.mermaid-container--f5-shadow-mid
Card เมื่อ hover--f5-shadow-mid
Dropdown, popover--f5-shadow-high
Modal--f5-shadow-higher

สถานะ: เสร็จสมบูรณ์ — ระดับ shadow ทั้งหมด (inset, low, mid, high, higher) นำไปใช้งานแล้วใน styles/custom.css


:root {
--f5-radius-xs: 0.1875rem; /* 3px — badge, tag */
--f5-radius-sm: 0.3125rem; /* 5px — รายการ nav, control ขนาดเล็ก */
--f5-radius-md: 0.375rem; /* 6px — card, code block */
--f5-radius-lg: 0.5rem; /* 8px — modal, container ขนาดใหญ่ */
--f5-radius-full: 999px; /* pill, มนเต็มรูปแบบ */
}
ComponentRadius Token
.swatch--f5-radius-md (6px)
.icon-card--f5-radius-md (6px)
.starlight-aside--f5-radius-md (6px)
.expressive-code .frame--f5-radius-md (6px)
.mermaid-container--f5-radius-lg (8px)
.edit-link--f5-radius-full (pill)
รายการ nav ของ Sidebar--f5-radius-sm (5px)
Badge--f5-radius-xs (3px)

สถานะ: เสร็จสมบูรณ์ — ระดับ radius (xs, sm, md, lg, full) นำไปใช้งานแล้วใน styles/custom.css


/* รายการนำทางของ Sidebar */
nav.sidebar a {
border-radius: var(--f5-radius-sm); /* 5px */
padding: 0.25rem 0.5rem; /* 4px 8px */
min-height: 2.25rem; /* 36px */
display: flex;
align-items: center;
transition: background-color 0.15s ease, color 0.15s ease;
}
/* hover โหมดสว่าง */
:root[data-theme='light'] nav.sidebar a:hover {
background-color: var(--f5-white-2); /* #f5f5f5 */
}
/* hover โหมดมืด */
:root nav.sidebar a:hover {
background-color: var(--f5-black-3); /* #343434 */
}
/* ตัวบ่งชี้หน้าที่ active */
nav.sidebar a[aria-current="page"] {
background-color: var(--f5-white-3); /* #e6e6e6 สำหรับโหมดสว่าง */
font-weight: 600;
}
:root:not([data-theme='light']) nav.sidebar a[aria-current="page"] {
background-color: var(--f5-black-2); /* #666666 → ปรับเพื่อความสามารถในการอ่าน */
}
nav.sidebar a[aria-current="page"] {
border-left: 3px solid var(--sl-color-accent);
padding-left: calc(0.5rem - 3px); /* ชดเชยสำหรับ border */
}

สถานะ: เสร็จสมบูรณ์ — hover, active และตัวบ่งชี้ accent ของ sidebar นำไปใช้งานแล้วใน styles/custom.css


/* Primary — ใช้ F5 Red เป็น brand action */
.btn-primary {
background: var(--f5-red);
color: var(--f5-white);
border: none;
border-radius: var(--f5-radius-sm);
padding: 0.625rem 1rem;
font-weight: 500;
font-size: 0.875rem;
transition: background-color 0.15s ease, box-shadow 0.15s ease;
}
.btn-primary:hover {
background: var(--f5-red-3);
box-shadow: var(--f5-shadow-low);
}
/* Secondary — สไตล์ outline */
.btn-secondary {
background: transparent;
color: var(--sl-color-gray-2);
border: 1px solid var(--f5-border-default);
border-radius: var(--f5-radius-sm);
padding: 0.625rem 1rem;
font-weight: 500;
font-size: 0.875rem;
transition: background-color 0.15s ease, border-color 0.15s ease;
}
.btn-secondary:hover {
background: var(--f5-surface-hover);
border-color: var(--f5-border-strong);
}
/* Tertiary — ghost/text เท่านั้น */
.btn-tertiary {
background: transparent;
color: var(--sl-color-accent);
border: none;
border-radius: var(--f5-radius-sm);
padding: 0.625rem 1rem;
font-weight: 500;
font-size: 0.875rem;
transition: background-color 0.15s ease;
}
.btn-tertiary:hover {
background: var(--f5-surface-hover);
}
ขนาดPaddingขนาดฟอนต์ความสูงต่ำสุด
เล็ก0.375rem 0.75rem0.8125rem (13px)32px
กลาง (ค่าเริ่มต้น)0.625rem 1rem0.875rem (14px)40px
ใหญ่0.75rem 1.5rem1rem (16px)48px

สถานะ: เสร็จสมบูรณ์ — ตัวแปร button ทั้งหมด (primary, secondary, tertiary, critical) และระดับขนาด (sm, ค่าเริ่มต้น, lg) นำไปใช้งานแล้วใน styles/custom.css


ใช้จานสี F5 brand:

/* gradient hero หลัก — River blue */
.hero-gradient-primary {
background: linear-gradient(135deg, var(--f5-river-2) 0%, var(--f5-river) 100%);
/* #6e8dcc → #0e41aa */
}
/* การล้างหน้าแบบจาง — โทนอบอุ่นที่ละเอียด */
:root[data-theme='light'] .hero-gradient-faint {
background: linear-gradient(180deg, #faf9f7 0%, #f5f5f5 100%);
}
:root .hero-gradient-faint {
background: linear-gradient(180deg, #222222 0%, #000000 100%);
}
/* ตัวแปร eggplant สำหรับหน้า feature */
.hero-gradient-eggplant {
background: linear-gradient(135deg, var(--f5-eggplant-2) 0%, var(--f5-eggplant) 100%);
/* #9c59c9 → #62228b */
}
/* ตัวแปร brand red สำหรับประกาศ */
.hero-gradient-red {
background: linear-gradient(135deg, var(--f5-red-2) 0%, var(--f5-red) 100%);
/* #f06680 → #e4002b */
}
/* vignette แบบ radial เพื่อความลึก */
.hero-vignette::after {
content: '';
position: absolute;
inset: 0;
background: radial-gradient(ellipse at center, transparent 40%, rgba(0, 0, 0, 0.15) 100%);
pointer-events: none;
}
/* การจางลงสู่พื้นหลังของหน้าที่ด้านล่าง */
.hero-fade::after {
content: '';
position: absolute;
bottom: 0;
left: 0;
right: 0;
height: 30%;
background: linear-gradient(to bottom, transparent, var(--sl-color-black));
pointer-events: none;
}

สถานะ: เสร็จสมบูรณ์ — hero gradient (primary, eggplant, red, faint) และ overlay (hero-fade, hero-vignette) นำไปใช้งานแล้วใน styles/custom.css


:root {
--f5-transition-fast: 0.15s ease;
--f5-transition-base: 0.2s ease;
--f5-transition-bounce: 0.2s cubic-bezier(0.68, -0.2, 0.265, 1.15);
--f5-transition-decelerate: 0.6s cubic-bezier(0.5, 1, 0.89, 1);
--f5-transition-spring: 0.2s cubic-bezier(0.54, 1.5, 0.38, 1.11);
}
TokenระยะเวลาEasingกรณีการใช้งาน
--f5-transition-fast0.15seaseสถานะ hover ส่วนใหญ่, การเปลี่ยนสี
--f5-transition-base0.2seaseการเติมพื้นหลัง, การเปลี่ยน border
--f5-transition-bounce0.2scubic-bezier(0.68, -0.2, 0.265, 1.15)Switch, toggle
--f5-transition-decelerate0.6scubic-bezier(0.5, 1, 0.89, 1)ตัวบ่งชี้ tab, แผงเลื่อน
--f5-transition-spring0.2scubic-bezier(0.54, 1.5, 0.38, 1.11)Tooltip, การเข้า popover
Propertyปลอดภัยสำหรับ Animateหมายเหตุ
background-colorใช่มาตรฐานสำหรับการเติมสีเมื่อ hover
colorใช่การเปลี่ยนสีข้อความ
border-colorใช่การเน้น border เมื่อ hover
box-shadowใช่การเปลี่ยน elevation (ใช้ will-change หากกระตุก)
transformใช่Scale, translate เพื่อ feedback
opacityใช่Fade in/out
width, heightหลีกเลี่ยงทำให้เกิด layout reflow
padding, marginหลีกเลี่ยงทำให้เกิด layout reflow
/* รายการ nav ของ Sidebar */
nav.sidebar a {
transition: background-color var(--f5-transition-fast),
color var(--f5-transition-fast);
}
/* Card — shadow ยกสูงเมื่อ hover */
.swatch, .icon-card {
transition: box-shadow var(--f5-transition-base),
transform var(--f5-transition-base);
}
.swatch:hover, .icon-card:hover {
box-shadow: var(--f5-shadow-mid);
transform: translateY(-1px);
}
/* Button */
.btn-primary, .btn-secondary, .btn-tertiary {
transition: background-color var(--f5-transition-fast),
border-color var(--f5-transition-fast),
box-shadow var(--f5-transition-fast);
}
/* ลิงก์ */
a {
transition: color var(--f5-transition-fast);
}

สถานะ: เสร็จสมบูรณ์ — transition token ทั้งห้า (fast, base, bounce, decelerate, spring) และ transition ของ component นำไปใช้งานแล้วใน styles/custom.css


ธีมใช้รูปแบบ double-ring พร้อม inner ring แบบ inset และ outer glow:

/* Action focus — ใช้ F5 River blue */
:root {
--f5-focus-action: inset 0 0 0 1px var(--f5-river), 0 0 0 3px var(--f5-river-2);
/* inset 0 0 0 1px #0e41aa, 0 0 0 3px #6e8dcc */
--f5-focus-critical: inset 0 0 0 1px var(--f5-red-3), 0 0 0 3px var(--f5-red-2);
/* inset 0 0 0 1px #a70020, 0 0 0 3px #f06680 */
}
/* ใช้กับ element แบบ interactive */
a:focus-visible,
button:focus-visible,
input:focus-visible,
select:focus-visible,
textarea:focus-visible {
outline: none;
box-shadow: var(--f5-focus-action);
}
/* ตัวแปร critical สำหรับปุ่มที่ทำลายข้อมูล */
.btn-critical:focus-visible {
box-shadow: var(--f5-focus-critical);
}
  • รูปแบบ double-ring ตรงตามข้อกำหนด WCAG 2.2 Focus Appearance (outline ที่มีความคมชัดขั้นต่ำ 2px)
  • การใช้ box-shadow แทน outline ช่วยให้ border-radius ถูกนำมาพิจารณา
  • :focus-visible ทำให้ ring ปรากฏเฉพาะสำหรับการนำทางด้วยแป้นพิมพ์ ไม่ใช่การคลิกเมาส์

สถานะ: เสร็จสมบูรณ์ — รูปแบบ focus double-ring (action, critical) และสไตล์ :focus-visible นำไปใช้งานแล้วใน styles/custom.css


:root {
--sl-font: "proximaNova", system-ui, "Segoe UI", Helvetica, Arial, sans-serif;
--sl-font-heading: "neusaNextProWide", system-ui, "Segoe UI", Helvetica, Arial, sans-serif;
--sl-line-height-headings: 1.1;
}
ระดับขนาดความสูงบรรทัดการใช้งาน
Display 5001.875rem (30px)1.267--sl-text-h1
Display 4001.5rem (24px)1.333--sl-text-h2
Display 3001.125rem (18px)1.333--sl-text-h3
Display 2001rem (16px)1.5--sl-text-h4
Display 1000.8125rem (13px)1.385Overline text
Body 3001rem (16px)1.5เนื้อหาหลัก
Body 2000.875rem (14px)1.429ข้อความ Sidebar, คำอธิบายภาพ
Body 1000.8125rem (13px)1.385ตัวพิมพ์เล็ก
ด้านค่าหมายเหตุ
ความสูงบรรทัดหัวเรื่อง1.1หัวเรื่องแบบแน่นเพื่อผลกระทบ brand; พิจารณา 1.2 เพื่อความสามารถในการอ่าน
ความสูงบรรทัดเนื้อหา1.5 (ค่าเริ่มต้น Starlight)เหมาะสำหรับการอ่าน
ฟอนต์ฟอนต์ brand แบบกำหนดเองproximaNova (เนื้อหา), neusaNextProWide (หัวเรื่อง)
น้ำหนักหัวเรื่องh1-h2: 700, h3: 500, h4-h6: 700 uppercaseมีความเห็นชัดเจนเพื่อความสอดคล้องของ brand

ลำดับความสำคัญ: ไม่จำเป็นต้องเปลี่ยนแปลง typography ปัจจุบันมีการกำหนดไว้อย่างชัดเจนและเหมาะสมกับ brand การปรับ heading line height เล็กน้อย (1.1 เป็น 1.2) เป็นตัวเลือกที่ไม่บังคับ


design token ทั้งหมดถูกนำไปใช้งานใน 5 sprint:

SprintขอบเขตToken ที่เพิ่ม
1. รากฐานShadow + border radius--f5-shadow-* (5 ระดับ), --f5-radius-* (5 ระดับ)
2. Sidebar + SurfaceNavigation + interactive token--f5-surface-hover, --f5-surface-active, --f5-border-* (3 ระดับ), --f5-transition-fast
3. Buttonระบบ component.btn-primary, .btn-secondary, .btn-tertiary, .btn-critical, ตัวแปรขนาด
4. Hero GradientBackground utility.hero-gradient-primary, -eggplant, -red, -faint, .hero-vignette, .hero-fade
5. Focus + Transitionการเข้าถึง + การขัดเกลา--f5-focus-action, --f5-focus-critical, --f5-transition-* (5 token), เอฟเฟกต์ hover ของ card

:root {
/* ระดับ border radius */
--f5-radius-xs: 0.1875rem; /* 3px */
--f5-radius-sm: 0.3125rem; /* 5px */
--f5-radius-md: 0.375rem; /* 6px */
--f5-radius-lg: 0.5rem; /* 8px */
--f5-radius-full: 999px;
/* ระยะเวลา transition */
--f5-transition-fast: 0.15s ease;
--f5-transition-base: 0.2s ease;
--f5-transition-bounce: 0.2s cubic-bezier(0.68, -0.2, 0.265, 1.15);
--f5-transition-decelerate: 0.6s cubic-bezier(0.5, 1, 0.89, 1);
--f5-transition-spring: 0.2s cubic-bezier(0.54, 1.5, 0.38, 1.11);
/* Focus ring */
--f5-focus-action: inset 0 0 0 1px var(--f5-river), 0 0 0 3px var(--f5-river-2);
--f5-focus-critical: inset 0 0 0 1px var(--f5-red-3), 0 0 0 3px var(--f5-red-2);
/* Shadow โหมดมืด (ค่าเริ่มต้น) */
--f5-shadow-low: 0px 1px 1px 0px #cccccc0a, 0px 2px 2px 0px #cccccc0a;
--f5-shadow-mid: 0px 2px 3px 0px #cccccc0d, 0px 8px 16px -10px #cccccc1a;
--f5-shadow-high: 0px 2px 3px 0px #cccccc1a, 0px 16px 16px -10px #cccccc1a;
--f5-shadow-higher: 0px 2px 3px 0px #cccccc0d, 0px 12px 28px 0px #cccccc26;
/* Border โหมดมืด */
--f5-border-faint: #f5f5f51a;
--f5-border-default: #f5f5f533;
--f5-border-strong: #cccccc66;
/* Surface โหมดมืด */
--f5-surface-hover: var(--f5-black-3);
--f5-surface-active: var(--f5-black-2);
}
:root[data-theme='light'] {
/* Shadow โหมดสว่าง */
--f5-shadow-low: 0px 1px 1px 0px #3434340d, 0px 2px 2px 0px #3434340d;
--f5-shadow-mid: 0px 2px 3px 0px #3434341a, 0px 8px 16px -10px #34343433;
--f5-shadow-high: 0px 2px 3px 0px #34343426, 0px 16px 16px -10px #34343433;
--f5-shadow-higher: 0px 2px 3px 0px #3434341a, 0px 12px 28px 0px #34343440;
/* Border โหมดสว่าง */
--f5-border-faint: #3434341a;
--f5-border-default: #34343433;
--f5-border-strong: #22222266;
/* Surface โหมดสว่าง */
--f5-surface-hover: var(--f5-white-2);
--f5-surface-active: var(--f5-white-3);
}