โทเคน

ค่าทุกตัวมาจากไฟล์เดียว tokens/tokens.mjs แล้วสร้างเป็น CSS และ JSON อัตโนมัติ ตารางด้านล่างแสดงแบรนด์ที่เลือกอยู่ สลับแบรนด์เพื่อเทียบ

สามชั้นของโทเคน

คอมโพเนนต์อ่านเฉพาะชั้น semantic และ component จึงเปลี่ยนแบรนด์ได้ด้วย data-brand ตัวเดียว

ตัวอย่าง
/* 1. primitive: ค่าดิบของแบรนด์ */
--p-lime: #cdf46e;

/* 2. semantic: ชื่อตามหน้าที่ ค่าสว่างและมืดในตัวเดียว */
--primary: light-dark(var(--p-lime), var(--p-lime-neon));

/* 3. component: ปุ่มควรรู้จักแค่ชั้นนี้ */
.ds-btn[data-variant="primary"] { background: var(--primary); }

สีดิบของแบรนด์

ใช้ผ่าน semantic เท่านั้น ยกเว้นงานแบรนด์โดยตรง เช่น โปสเตอร์หรือภาพประกอบ

paper--p-paper#f8f7f4
paper-2--p-paper-2#f1efeb
paper-3--p-paper-3#e6e3dd
paper-white--p-paper-white#fefdfb
ink--p-ink#26262b
ink-2--p-ink-2#4f4f57
ash--p-ash#66666d
lime--p-lime#cdf46e
lime-deep--p-lime-deep#b8e64f
lime-ink--p-lime-ink#3d5c00
lime-neon--p-lime-neon#b9ff38
lime-soft--p-lime-soft#eef8d2
graphite--p-graphite#0f100e
graphite-2--p-graphite-2#181a17
graphite-3--p-graphite-3#252823
graphite-4--p-graphite-4#1f221e
bone--p-bone#ecece6
bone-2--p-bone-2#c4c5bd
ash-dark--p-ash-dark#9a9c94
tint-blue--p-tint-blue#dcebff
tint-butter--p-tint-butter#fff0c4
tint-sage--p-tint-sage#d8f3e2
tint-coral--p-tint-coral#ffdfe4
tint-lime--p-tint-lime#e4f9aa
mist--p-mist#f5f5f7
mist-2--p-mist-2#ececf0
ink--p-ink#1d1d1f
ink-2--p-ink-2#3a3b45
ash--p-ash#5f6068
slate--p-slate#4b4e6d
slate-deep--p-slate-deep#3a3c57
peri--p-peri#8b8ff7
peri-ink--p-peri-ink#4a4fc4
peri-soft--p-peri-soft#e4e5ff
peri-light--p-peri-light#b4b7ff
sun--p-sun#ffd166
sun-soft--p-sun-soft#fff1cc
mint--p-mint#9be3c9
mint-soft--p-mint-soft#ddf6ec
peach--p-peach#ffc4a8
peach-soft--p-peach-soft#ffe6da
night--p-night#111226
night-2--p-night-2#181a33
night-3--p-night-3#23254a
haze--p-haze#ececf8
haze-2--p-haze-2#c5c7e0
ash-dark--p-ash-dark#a0a2c4

สีตามหน้าที่

คอลัมน์คอนทราสต์วัดสีตัวอักษรเทียบพื้นหลังหลัก bg ของธีมนั้น

โทเคนสว่างมืดใช้กับ
--bgpapergraphiteพื้นหลังของหน้า
--bg-altpaper-2graphite-2แถบสลับ แถบข้าง บล็อกโค้ด
--surfacepaper-whitegraphite-2การ์ด ช่องกรอก เมนู
--surface-raised#ffffffgraphite-3ป๊อปโอเวอร์ หน้าต่าง toast
--surface-sunkenpaper-2#0a0b0aหลุม ราง พื้นที่ยุบ
--fgink
14.06 AAA
bone
16.09 AAA
ข้อความหลักและหัวข้อ
--fg-2ink-2
7.57 AAA
bone-2
10.96 AAA
ข้อความรอง คำอธิบาย
--mutedash
5.32 AA
ash-dark
6.87 AA
คำบรรยาย placeholder เมตาดาทา
--linergb(38 38 43 / 0.1)rgb(236 236 230 / 0.13)เส้นบางและเส้นคั่น
--line-strongrgb(38 38 43 / 0.5)rgb(236 236 230 / 0.46)ขอบช่องกรอก ปุ่ม outline (3:1 กับพื้น)
--accentlimelime-neonเครื่องหมายแบรนด์และพื้นสี ห้ามใช้เป็นข้อความบนพื้นสว่าง
--on-accentinkgraphiteข้อความบนพื้น accent
--accent-textlime-ink
7.18 AAA
lime-neon
15.83 AAA
ข้อความและลิงก์สีแบรนด์
--accent-softlime-soft#1d2312แถวที่เลือก ไฮไลต์อ่อน
--primarylimelime-neonพื้นปุ่มหลัก
--on-primaryinkgraphiteข้อความบนปุ่มหลัก
--primary-hoverlime-deep#cbff6bปุ่มหลักเมื่อชี้
--secondaryinkboneพื้นปุ่มรอง
--on-secondarypapergraphiteข้อความบนปุ่มรอง
--secondary-hover#3a3a41#ffffffปุ่มรองเมื่อชี้
--focusinkboneเส้นโฟกัส
--focus-halolimelime-neonวงรอบเส้นโฟกัส
--success#3b7527
5.21 AA
#9be37a
12.41 AAA
ข้อความและไอคอนสำเร็จ
--success-soft#e3f1da#17220fพื้นสถานะสำเร็จ
--warning#8a5600
5.75 AA
#f2b84b
10.66 AAA
ข้อความและไอคอนเตือน
--warning-soft#fbefd6#2a2110พื้นสถานะเตือน
--danger#b8372b
5.42 AA
#ff8a6b
8.27 AAA
ข้อผิดพลาดและการกระทำที่ย้อนไม่ได้
--on-danger#ffffffgraphiteข้อความบนพื้น danger
--danger-soft#fbe4e1#2c1612พื้นสถานะผิดพลาด
--info#2b59c3
5.90 AA
#8fb0ff
8.92 AAA
ข้อความและไอคอนแจ้งข้อมูล
--info-soft#e3ebfb#151c2eพื้นสถานะแจ้งข้อมูล
--overlayrgb(38 38 43 / 0.42)rgb(0 0 0 / 0.7)ฉากหลังของหน้าต่างและแผง
--tint-1tint-blue#1a2028สีกระดาษ เย็น
--tint-2tint-butter#23211aสีกระดาษ อุ่น
--tint-3tint-sage#1b2119สีกระดาษ สดชื่น
--tint-4tint-coral#261d19สีกระดาษ นุ่ม
--tint-accenttint-lime#1d2312สีกระดาษ ของแบรนด์
--selection-bglimelime-neonพื้นข้อความที่เลือก
--selection-fginkgraphiteข้อความที่เลือก
โทเคนสว่างมืดใช้กับ
--bgmistnightพื้นหลังของหน้า
--bg-altmist-2night-2แถบสลับ แถบข้าง บล็อกโค้ด
--surface#fdfdffnight-2การ์ด ช่องกรอก เมนู
--surface-raised#ffffffnight-3ป๊อปโอเวอร์ หน้าต่าง toast
--surface-sunkenmist-2#0b0c1cหลุม ราง พื้นที่ยุบ
--fgink
15.46 AAA
haze
15.74 AAA
ข้อความหลักและหัวข้อ
--fg-2ink-2
10.20 AAA
haze-2
11.09 AAA
ข้อความรอง คำอธิบาย
--mutedash
5.74 AA
ash-dark
7.43 AAA
คำบรรยาย placeholder เมตาดาทา
--linergb(29 29 31 / 0.09)rgb(236 236 248 / 0.12)เส้นบางและเส้นคั่น
--line-strongrgb(75 78 109 / 0.68)rgb(236 236 248 / 0.42)ขอบช่องกรอก ปุ่ม outline (3:1 กับพื้น)
--accentperiperiเครื่องหมายแบรนด์และพื้นสี ห้ามใช้เป็นข้อความบนพื้นสว่าง
--on-accent#14153anightข้อความบนพื้น accent
--accent-textperi-ink
6.01 AA
peri-light
9.80 AAA
ข้อความและลิงก์สีแบรนด์
--accent-softperi-soft#262a5cแถวที่เลือก ไฮไลต์อ่อน
--primaryslateperiพื้นปุ่มหลัก
--on-primary#ffffffnightข้อความบนปุ่มหลัก
--primary-hoverperi-inkperi-lightปุ่มหลักเมื่อชี้
--secondaryrgb(255 255 255 / 0.72)rgb(255 255 255 / 0.08)พื้นปุ่มรอง
--on-secondaryinkhazeข้อความบนปุ่มรอง
--secondary-hover#ffffffrgb(255 255 255 / 0.16)ปุ่มรองเมื่อชี้
--focusperi-inkperi-lightเส้นโฟกัส
--focus-halorgb(139 143 247 / 0.35)rgb(139 143 247 / 0.4)วงรอบเส้นโฟกัส
--success#1d7a46
4.91 AA
#6fd6a0
10.37 AAA
ข้อความและไอคอนสำเร็จ
--success-softmint-soft#13281fพื้นสถานะสำเร็จ
--warning#8a5a00
5.44 AA
sun
12.79 AAA
ข้อความและไอคอนเตือน
--warning-softsun-soft#2a2412พื้นสถานะเตือน
--danger#b42318
6.04 AA
#ff8a80
8.08 AAA
ข้อผิดพลาดและการกระทำที่ย้อนไม่ได้
--on-danger#ffffffnightข้อความบนพื้น danger
--danger-softpeach-soft#2e1616พื้นสถานะผิดพลาด
--infoperi-ink
6.01 AA
peri-light
9.80 AAA
ข้อความและไอคอนแจ้งข้อมูล
--info-softperi-soft#1f2250พื้นสถานะแจ้งข้อมูล
--overlayrgb(29 29 31 / 0.35)rgb(5 6 18 / 0.72)ฉากหลังของหน้าต่างและแผง
--tint-1peri-soft#1f2250สีกระดาษ เย็น
--tint-2sun-soft#2a2412สีกระดาษ อุ่น
--tint-3mint-soft#13281fสีกระดาษ สดชื่น
--tint-4peach-soft#2e1c16สีกระดาษ นุ่ม
--tint-accentperi-soft#262a5cสีกระดาษ ของแบรนด์
--selection-bgperi-soft#2f3470พื้นข้อความที่เลือก
--selection-fginkhazeข้อความที่เลือก

คู่สีที่ต้องผ่าน

ตรวจทุกครั้งที่สร้างโทเคน ข้อความต้องได้ 4.5:1 เส้นขอบช่องกรอกและวงโฟกัสต้องได้ 3:1

ตัวหน้าพื้นขั้นต่ำสว่างมืด
fgbg4.5:114.06 AAA16.09 AAA
fg-2bg4.5:17.57 AAA10.96 AAA
mutedbg4.5:15.32 AA6.87 AA
mutedsurface4.5:15.60 AA6.30 AA
mutedbg-alt4.5:14.96 AA6.30 AA
accent-textbg4.5:17.18 AAA15.83 AAA
accent-textaccent-soft4.5:16.96 AA13.39 AAA
on-primaryprimary4.5:112.02 AAA15.83 AAA
on-primaryprimary-hover4.5:110.38 AAA16.40 AAA
on-secondarysecondary4.5:114.06 AAA16.09 AAA
on-accentaccent4.5:112.02 AAA15.83 AAA
on-dangerdanger4.5:15.80 AA8.27 AAA
successbg4.5:15.21 AA12.41 AAA
warningbg4.5:15.75 AA10.66 AAA
dangerbg4.5:15.42 AA8.27 AAA
infobg4.5:15.90 AA8.92 AAA
successsuccess-soft4.5:14.75 AA10.74 AAA
warningwarning-soft4.5:15.40 AA8.87 AAA
dangerdanger-soft4.5:14.78 AA7.39 AAA
infoinfo-soft4.5:15.28 AA7.94 AAA
line-strongbg3:13.03 3:14.13 3:1
line-strongsurface3:13.07 3:14.08 3:1
focusbg3:114.06 AAA16.09 AAA
fgtint-14.5:112.46 AAA13.82 AAA
fgtint-24.5:113.28 AAA13.58 AAA
ตัวหน้าพื้นขั้นต่ำสว่างมืด
fgbg4.5:115.46 AAA15.74 AAA
fg-2bg4.5:110.20 AAA11.09 AAA
mutedbg4.5:15.74 AA7.43 AAA
mutedsurface4.5:16.15 AA6.85 AA
mutedbg-alt4.5:15.31 AA6.85 AA
accent-textbg4.5:16.01 AA9.80 AAA
accent-textaccent-soft4.5:15.29 AA7.12 AAA
on-primaryprimary4.5:18.05 AAA6.47 AA
on-primaryprimary-hover4.5:16.55 AA9.80 AAA
on-secondarysecondary4.5:116.44 AAA12.84 AAA
on-accentaccent4.5:16.15 AA6.47 AA
on-dangerdanger4.5:16.57 AA8.08 AAA
successbg4.5:14.91 AA10.37 AAA
warningbg4.5:15.44 AA12.79 AAA
dangerbg4.5:16.04 AA8.08 AAA
infobg4.5:16.01 AA9.80 AAA
successsuccess-soft4.5:14.71 AA8.74 AAA
warningwarning-soft4.5:15.28 AA10.71 AAA
dangerdanger-soft4.5:15.50 AA7.40 AAA
infoinfo-soft4.5:15.29 AA7.95 AAA
line-strongbg3:13.40 3:13.66 3:1
line-strongsurface3:13.52 3:13.61 3:1
focusbg3:16.01 AA9.80 AAA
fgtint-14.5:113.58 AAA12.77 AAA
fgtint-24.5:114.99 AAA13.18 AAA

ตัวอักษร

ตัวอย่างใช้ฟอนต์และขนาดของแบรนด์ที่เลือกอยู่ ขนาดหัวข้อยืดหยุ่นตามความกว้างจอด้วย clamp()

display: Archivobody: Archivothai: Anuphanmono: Geist Mono
display: Inter Tightbody: Geistthai: Noto Sans Thaimono: Geist Mono
--text-displayเติบโตทีละองศา.ds-display
--text-h1เรียนด้วยกัน เติบโตไปด้วยกัน.ds-h1
--text-h2บทเรียนที่ออกแบบมาเพื่อคุณ.ds-h2
--text-h3หัวข้อย่อยของการ์ดและส่วน.ds-h3
--text-leadย่อหน้านำสั้นๆ ที่บอกว่าส่วนนี้เกี่ยวกับอะไร.ds-lead
--text-bodyเนื้อหาหลักอ่านสบายด้วยระยะบรรทัด 1.6 รองรับสระบนและล่างของภาษาไทย.ds-body
--text-smallคำอธิบายใต้ช่องกรอกและข้อความรอง.ds-small
--text-metaMetadata · 2026.ds-meta

ระยะห่าง

ฐาน 4 px ใช้ร่วมกันทั้งสองแบรนด์

--space-14px
--space-28px
--space-312px
--space-416px
--space-524px
--space-632px
--space-748px
--space-864px
--space-996px
--space-10144px

มุมโค้ง

กฎของรูปทรง: ปุ่มและชิปเป็นแคปซูล การ์ดและสื่อ 28 px พื้นผิวเล็ก 14 ถึง 18 px ช่องกรอก 10 ถึง 14 px

--radius-xs
--radius-sm
--radius-md
--radius-lg
--radius-pill

เงา

ASWINOLOGY° ใช้เงาน้อยและนุ่ม Lurnelle ใช้เงาดินเหนียวที่มีแสงด้านในเพื่อให้พื้นผิวดูนูน

--shadow-sm
--shadow-md
--shadow-lg

โมชัน

ดูการเคลื่อนไหวจริงและตัวอย่าง GSAP ได้ที่หน้าโมชัน

โทเคนค่า
--ease-outcubic-bezier(0.16, 1, 0.3, 1)
--ease-in-outcubic-bezier(0.76, 0, 0.24, 1)
--ease-springcubic-bezier(0.34, 1.56, 0.64, 1)
--dur-fast180ms
--dur-base320ms
--dur-slow700ms
โทเคนค่า
--ease-outcubic-bezier(0.16, 1, 0.3, 1)
--ease-in-outcubic-bezier(0.65, 0, 0.35, 1)
--ease-springcubic-bezier(0.34, 1.4, 0.64, 1)
--dur-fast160ms
--dur-base280ms
--dur-slow600ms

โทเคนระดับคอมโพเนนต์

ส่วนที่ทำให้แต่ละแบรนด์เป็นตัวเอง เทียบสองแบรนด์ในตารางเดียว

โทเคนASWINOLOGY°Lurnelle
--btn-radiusvar(--radius-pill)var(--radius-pill)
--btn-shadownone0 8px 20px -12px light-dark(rgb(75 78 109 / 0.3), rgb(0 0 0 / 0.5)), inset 0 1px 0 light-dark(#ffffff, rgb(255 255 255 / 0.06))
--btn-primary-shadownone0 14px 26px -12px light-dark(rgb(75 78 109 / 0.55), rgb(139 143 247 / 0.35)), inset 0 -4px 8px rgb(0 0 0 / 0.16), inset 0 3px 6px rgb(255 255 255 / 0.22)
--btn-chip-bgvar(--fg)transparent
--btn-chip-fgvar(--bg)currentColor
--btn-chip-size32px20px
--field-radiusvar(--radius-sm)var(--radius-md)
--field-bgvar(--surface)light-dark(rgb(255 255 255 / 0.78), rgb(255 255 255 / 0.04))
--card-radiusvar(--radius-lg)var(--radius-lg)
--card-bgvar(--surface)light-dark(rgb(255 255 255 / 0.62), rgb(35 37 74 / 0.55))
--card-bordervar(--line)light-dark(rgb(255 255 255 / 0.9), rgb(236 236 248 / 0.1))
--card-shadownonevar(--shadow-md)
--card-blurnoneblur(18px) saturate(170%)
--card-hover-shadowvar(--shadow-md)var(--shadow-lg)
--panel-radiusvar(--radius-md)var(--radius-md)
--chip-radiusvar(--radius-pill)var(--radius-pill)
--header-bglight-dark(rgb(248 247 244 / 0.82), rgb(15 16 14 / 0.82))light-dark(rgb(255 255 255 / 0.66), rgb(24 26 51 / 0.66))
--header-radius0pxvar(--radius-pill)
--btn-outline-hover-bgvar(--fg)var(--surface-raised)
--btn-outline-hover-fgvar(--bg)var(--accent-text)
--btn-outline-hover-bordervar(--fg)var(--accent)
--btn-ghost-hover-bgvar(--bg-alt)var(--accent-soft)
--btn-ghost-hover-fgvar(--fg)var(--accent-text)
--btn-secondary-bordertransparentlight-dark(rgb(75 78 109 / 0.18), rgb(236 236 248 / 0.16))
--btn-secondary-blurnoneblur(12px)
--switch-thumb-offvar(--muted)var(--surface-raised)
--switch-thumb-shadownonevar(--shadow-sm), 0 2px 6px light-dark(rgb(75 78 109 / 0.25), rgb(0 0 0 / 0.5))
--chip-on-bgvar(--fg)var(--accent-soft)
--chip-on-fgvar(--bg)var(--accent-text)
--chip-on-bordervar(--fg)var(--accent)
--progress-barvar(--fg)var(--primary)
--tablist-bgtransparentvar(--surface-sunken)
--tablist-pad0px4px
--tablist-radius0pxvar(--radius-pill)
--tablist-bordervar(--line)transparent
--tab-radius0pxvar(--radius-pill)
--tab-active-bgtransparentvar(--surface-raised)
--tab-active-linevar(--fg)transparent
--tab-active-shadownonevar(--shadow-sm), 0 4px 12px -6px light-dark(rgb(75 78 109 / 0.35), rgb(0 0 0 / 0.5))
--dialog-shadowvar(--shadow-lg)var(--shadow-lg)
--only-aswinologycontentsnone
--only-lurnellenonecontents
--mark-colorvar(--accent)var(--accent)

z-index และ breakpoint

ใช้ชั้นตามระบบเท่านั้น ไม่ตั้ง z-index ลอยๆ

zค่า
--z-base1
--z-sticky20
--z-header40
--z-overlay60
--z-dialog70
--z-toast80
--z-tooltip90
breakpointค่า
sm640px
md768px
lg1024px
xl1280px