เริ่มต้นกับ Lily
เลือกเฟรมเวิร์ก โคลนโมโนรีโพ แล้วเปิดไลบรารี headless หรือแอปตัวอย่างของมัน จากนั้นเริ่มประกอบหน้าของคุณเอง ชอบเส้นทางที่มีคนนำทางไหม? เริ่มกับ บทเรียน.
ติดตั้ง
Lily อยู่ในโมโนรีโพ Git เดียว โดยมีไดเรกทอรีสำหรับไลบรารี headless แพ็กเกจตัวช่วย และแอปตัวอย่างของแต่ละเฟรมเวิร์ก วิธีลองที่เร็วที่สุดคือโคลนโมโนรีโพแล้วเปิดไลบรารี headless สำหรับสแตกของคุณ:
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-react-headless
pnpm install
รูปแบบเดียวกันใช้ได้กับเฟรมเวิร์กอื่น:
@lilydesignsystem/html-headless— ไม่ต้องติดตั้ง ให้คัดลอกไฟล์.html@lilydesignsystem/svelte-headless—pnpm install@lilydesignsystem/react-headless—pnpm install@lilydesignsystem/vue-headless—pnpm install@lilydesignsystem/angular-headless—pnpm install@lilydesignsystem/nunjucks-headless—pnpm installlily-design-system-blazor-headless—dotnet build
ไลบรารี headless ออกแบบมาให้โคลนหรือนำไปรวมไว้ในโปรเจกต์ — ถือซอร์สโค้ดเป็นแหล่งความจริงและคัดลอกสิ่งที่คุณต้องการ ตัวช่วยการตั้งค่า ยังมีให้ในรูปแพ็กเกจที่ติดตั้งได้พร้อมไปป์ไลน์บิลด์และเผยแพร่ (npm สำหรับเฟรมเวิร์ก JS, NuGet สำหรับ Blazor)
ใช้คอมโพเนนต์ headless
คอมโพเนนต์ headless มี HTML เชิงความหมาย ARIA และ props — แต่ไม่มี CSS นี่คือ Button ในแต่ละเฟรมเวิร์ก:
HTML
<button class="button" type="button" aria-label="Save">
Save
</button>
Svelte
<script>
import Button from "lily-design-system-svelte-headless/components/Button/Button.svelte";
</script>
<Button onclick={save}>Save</Button>
React
import Button from "lily-design-system-react-headless/components/Button";
<Button onClick={save}>Save</Button>
Vue
<script setup>
import Button from "lily-design-system-vue-headless/components/Button.vue";
</script>
<Button @click="save">Save</Button>
Angular
import { Button } from "@lilydesignsystem/angular-headless";
@Component({
imports: [Button],
template: `<lily-button (click)="save()">Save</lily-button>`,
})
Blazor
<Button OnClick="Save">Save</Button>
Nunjucks
{% from "components/button/macro.njk" import button %}
{{ button({ text: "Save", type: "button" }) }}
ใช้ตัวอย่างที่มีสไตล์
แอปตัวอย่างมี CSS เส้นทาง และหน้าเดโมเต็มรูปแบบ วิธีทดลองที่เร็วที่สุดคือเริ่มแอปตัวอย่าง SvelteKit, Next, Nuxt, Analog หรือ Eleventy แล้วดูเดโมที่ /components.
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-svelte-sveltekit-examples
pnpm install
pnpm run dev
จากนั้นเปิด http://localhost:5173 และเรียกดู /components.
สไตล์และโทเค็นการออกแบบ
แต่ละคอมโพเนนต์เรนเดอร์ด้วยคลาสแบบ kebab-case หนึ่งคลาสบนองค์ประกอบราก ตัวอย่างเช่น <Button> เรนเดอร์เป็น <button class="button"> จัดสไตล์ได้ตามต้องการ:
.button {
background: var(--my-primary);
color: #fff;
padding: 0.75rem 1.5rem;
border-radius: 0.5rem;
}
.button:hover { background: var(--my-primary-hover); }
จานสีเริ่มต้นของ Lily (ใช้ในแอปตัวอย่าง) คือ:
- หลัก:
#2563eb - อันตราย:
#dc2626 - คำเตือน:
#f59e0b - สำเร็จ:
#16a34a - พื้นหลังหน้า:
#f9fafb - พื้นหลังการ์ด:
#ffffff
สิ่งเหล่านี้เป็นข้อเสนอแนะ ไม่ใช่ข้อบังคับ แทนที่ด้วยจานสีแบรนด์ของคุณเอง แล้ว Lily จะปรับตามอย่างยินดี
ธีมสำเร็จรูป
ไม่อยากเขียน CSS ตั้งแต่ต้นใช่ไหม Lily มาพร้อม ธีมอ้างอิงแบบอิสระ 57 ธีม ในไดเรกทอรี themes/ แต่ละธีมคือสไตล์ชีตเดียวที่มุ่งเป้าไปที่คลาสฮุกของ Lily — ลิงก์แล้วก็มีสไตล์ทันที:
<link rel="stylesheet" href="/assets/themes/united-kingdom-government-digital-service.css" />
ชุดนี้ครอบคลุม:
- ภาครัฐ — NHS England, NHS Scotland และ NHS Wales (แต่ละแห่งมีรุ่นสำหรับผู้ป่วยและผู้ปฏิบัติงาน) GOV.UK GDS และ U.S. Web Design System
- ได้แรงบันดาลใจจากผู้ให้บริการ — Adobe Spectrum, Mozilla Protocol
- อเนกประสงค์ — light, dark, nord, dracula, wireframe และอีกกว่าสามสิบธีม
ตัวเลือกของธีมใช้ :where(...) ดังนั้น CSS ของคุณเองจึงชนะเสมอในด้านความจำเพาะ จับคู่กับตัวช่วย theme-picker ด้านล่างเพื่อสลับขณะรันไทม์ หรือทำตาม
บทเรียนการจัดธีม.
ตัวช่วยการตั้งค่า
แต่ละเฟรมเวิร์กมีตัวเลือกขนาดเล็กแปดตัว แต่ละตัวเป็นแพ็กเกจ
lily-design-system-{framework}-{package} ของตัวเอง (และ picker-bar ที่ประกอบเข้าด้วยกัน) แต่ละตัวเป็นปุ่มไอคอนแบบ headless ที่เปิดป๊อปอัป — กล่องรายการ รายการลิงก์ ฟอร์มค้นหา หรือ (สำหรับ date-time-picker) กล่องโต้ตอบเลือกวันที่ — ไม่ใช่
<select> แบบเนทีฟ ปลอดภัยต่อ SSR และไม่มี CSS:
-
theme-picker — โหลดสไตล์ชีตของธีมขณะรันไทม์โดยสลับ
<link>ที่จัดการอยู่ ตั้งค่าdata-themeบนเอกสาร และเลือกเก็บถาวรลงในlocalStorage. -
locale-picker — ตั้งค่า
langและdir(พร้อมการตรวจจับ RTL อัตโนมัติ) เพื่อให้ไลบรารี i18n ของคุณตามได้ ไม่แปลเอง -
text-size-picker — ตั้งค่า
data-text-sizeบนเอกสาร CSS ของคุณจับคู่แต่ละค่ากับขนาดฟอนต์ -
motion-picker — ตั้งค่า
data-motionบนเอกสาร โดยเริ่มจากการตั้งค่าลดการเคลื่อนไหวของผู้เข้าชม CSS และสคริปต์ของคุณตัดสินใจว่าจะระงับอะไร - search-picker — ปุ่มไอคอนที่เปิดช่องค้นหา การส่งจะนำไปยังหน้าค้นหา ดูแลการกระทำ ไม่ใช่การตั้งค่า
- link-picker — ไอคอนบ้านที่เปิดเมนูลิงก์หน้าที่แอปของคุณกำหนด (หน้าแรก เกี่ยวกับเรา ติดต่อเรา นโยบายความเป็นส่วนตัว …) ดูแลการกระทำ ไม่ใช่การตั้งค่า
- share-picker — เปิดชีตแชร์แบบเนทีฟหรือรายการปลายทางที่ผู้ใช้ไลบรารีกำหนด พร้อมคัดลอก URL ดูแลการกระทำ ไม่ใช่การตั้งค่า: ไม่ใช้อะไร ไม่เก็บอะไร
-
date-time-picker — ช่องข้อความพร้อมกล่องโต้ตอบเลือกวันที่ตาม APG สำหรับวันที่ เวลา หรือทั้งสองอย่าง ดูแลค่าของฟอร์ม ไม่ใช่การตั้งค่า: สตริง ISO แปลงไปมากับ
<input type="date">.
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-svelte-theme-picker
แคตตาล็อก Svelte เป็นข้อมูลอ้างอิงหลัก พอร์ตของ React, Vue, Angular, HTML, Nunjucks, Web Components และ Blazor ตรงกับมันทุกข้อตกลง ดู บทเรียนตัวช่วย.
การเข้าถึง
คอมโพเนนต์มุ่งเป้าไปที่ WCAG 2.2 AAA โดยทำตามรูปแบบเหล่านี้:
- องค์ประกอบ HTML เชิงความหมายแทน
<div>s. <label for="id">ทั่วไปaria-labelledby/aria-describedbyสำหรับการอ้างอิงข้ามaria-invalid+aria-errormessageสำหรับสถานะข้อผิดพลาดrole="alert"และaria-liveสำหรับเนื้อหาที่เปลี่ยนแปลงaria-pressed,aria-expanded,aria-currentสำหรับสถานะ-
tabindexแบบ roving สำหรับกริด
ตัวบ่งชี้โฟกัสให้ผู้ใช้ไลบรารีเป็นผู้จัดหาโดยตั้งใจ — Lily ไม่วาดวงแหวนโฟกัสเริ่มต้นที่ขัดกับการออกแบบของคุณ แอปตัวอย่างรักษาเส้นฐาน axe-core ที่สะอาดตลอดเส้นทางทั้งหมด
การรองรับหลายภาษา
ทุกป้ายกำกับ ตัวยึดตำแหน่ง ข้อความข้อผิดพลาด และข้อความบนปุ่มเป็น prop ไม่มีสตริงที่เขียนตายตัว ใส่เฟรมเวิร์กแปลภาษาที่คุณชอบ — Paraglide, i18next, vue-i18n, react-intl, ไฟล์ .resx อะไรก็ได้
สำหรับวันที่ ตัวเลข และสกุลเงิน คอมโพเนนต์รับสตริงที่จัดรูปแบบไว้แล้ว: คุณจัดรูปแบบด้วย Intl.DateTimeFormat /
Intl.NumberFormat / ไลบรารีที่คุณชอบ แล้วส่งผลลัพธ์เข้ามา
ตัวช่วย locale-picker แจ้งภาษาและพื้นที่ที่เลือกให้ไลบรารี i18n ของคุณโดยตั้งค่า lang และ dir บนรากของเอกสาร
การทดสอบ
แต่ละโครงการย่อยของเฟรมเวิร์กมาพร้อมการทดสอบของตัวเองโดยใช้สแตกที่เป็นธรรมเนียมของมัน:
- HTML: WebDriverIO ที่รันเบราว์เซอร์จริง
- Svelte: Vitest +
@testing-library/svelte. - React: Vitest +
@testing-library/react. - Vue: Vitest +
@testing-library/vue. - Angular: Vitest + TestBed (ผ่านปลั๊กอิน Analog Vite)
- Nunjucks: Vitest พร้อมตัวช่วยเรนเดอร์
- Blazor: bUnit
การทดสอบใช้ เฉพาะ matcher ที่มากับ Vitest — ไม่ใช้
jest-dom matcher เลย ซึ่งทำให้ชุดทดสอบพกพาได้ แอปตัวอย่างเพิ่มชุดทดสอบ Playwright แบบ end-to-end เส้นฐานการเข้าถึง axe-core และการกวาดตรวจวิวพอร์ตแบบตอบสนอง
เอเจนต์ AI
ไซต์นี้เผยแพร่ llms.txt และ llms.json ที่รากของไซต์ — แผนที่ที่คัดสรรของหน้าสำคัญที่สุด สำหรับเครื่องมือใดก็ตามที่ทำตาม ข้อตกลง llms.txt.
โมโนรีโพหลักยังมาพร้อม
Claude Skills:
lily-design-system-skill สองรายการ: skill อเนกประสงค์ที่ครอบคลุมแนวคิด คำศัพท์ และรูปแบบการประกอบของ Lily สำหรับทุกคนที่สร้างด้วยระบบนี้ และ lily-design-system-maintainer-skill skill เชิงเทคนิคที่ครอบคลุมโครงสร้างไฟล์ที่จำเป็นและเครื่องมือของโมโนรีโพสำหรับทุกคนที่ทำงานกับมัน ทั้งสองอยู่ที่รากของ
โมโนรีโพหลัก.
การแก้ปัญหา
คอมโพเนนต์แสดงผลแต่ดูไม่มีสไตล์
นั่นคือ headless ที่ทำงานตามที่ตั้งใจ — ไม่มี CSS มากับคอมโพเนนต์ เขียน CSS กับคลาส kebab-case ของคอมโพเนนต์ (แสดงอยู่ใน ทุกหน้าของแคตตาล็อก) หรือลิงก์หนึ่งใน 57 ธีมสำเร็จรูป.
CSS ของฉันดูเหมือนไม่มีผลเหนือธีม
ควรมีผล — ตัวเลือกของธีมถูกห่อด้วย :where(...) ซึ่งมีความจำเพาะเป็นศูนย์ หากกฎยังแพ้ ให้ตรวจสอบว่าสไตล์ชีตของคุณโหลดหลัง <link> ของธีม และตัวเลือกตรงกับคลาสฮุกของคอมโพเนนต์จริง ๆ
pnpm install ล้มเหลวด้วยข้อผิดพลาดเรื่อง peer หรือเวอร์ชัน
ใช้ pnpm ปัจจุบัน (v10+) และ Node 22+ แต่ละโครงการย่อยตรึงเวอร์ชันเฟรมเวิร์กไว้ใน package.json ของตัวเอง หากเครื่องมือส่วนกลางของคุณเก่ากว่านั้น pnpm env use --global lts คือวิธีแก้ที่เร็วที่สุด
โปรแกรมอ่านหน้าจออ่านชื่อของตัวควบคุมผิด
ตรวจสอบ prop label ที่จำเป็นของคอมโพเนนต์ — คอมโพเนนต์ที่ไม่มีข้อความให้เห็นต้องมี และ
aria-label / aria-labelledby ที่ผู้ใช้ส่งผ่าน rest-props จะชนะการเชื่อมต่อในตัวโดยตั้งใจ แต่ละหน้าของแคตตาล็อกบันทึกข้อตกลง ARIA ของคอมโพเนนต์
ตัวช่วย theme-picker ไม่สลับสไตล์ชีต
ตรวจสอบว่า themesUrl ชี้ไปยังไดเรกทอรีที่เบราว์เซอร์ดึงได้ (ให้บริการไฟล์ใน themes/ เป็นแอสเซ็ตสแตติก) และ slug ของธีมใน prop themes ตรงกับชื่อไฟล์ ตัวช่วยสลับ href ของ
<link data-lily-theme-picker> ที่จัดการอยู่หนึ่งตัว — ตรวจดูใน devtools เพื่อดู URL ที่ถูกร้องขอ
มีอย่างอื่นพัง
เปิด issue พร้อมขั้นตอนทำซ้ำแบบน้อยที่สุดที่ github.com/LilyDesignSystem/lily-design-system — หรือดู ชุมชนและการสนับสนุน.
การสมทบ
Lily ยังใหม่และยินดีรับความร่วมมือ การสมทบที่มีประโยชน์ที่สุดในตอนนี้คือ:
- คอมโพเนนต์ใหม่ (โดยเฉพาะรูปแบบจากระบบการออกแบบที่มั่นคง)
- ธีมใหม่ — แต่ละธีมคือสไตล์ชีตอิสระหนึ่งไฟล์ เป็น PR แรกที่ขอบเขตชัดเจน
- การจัดสไตล์ตัวอย่างที่ดีขึ้น — แสดงให้เห็นว่าทำอะไรได้บ้าง
- การแปลสตริงของแอปตัวอย่าง
- รายงานข้อบกพร่องพร้อมขั้นตอนทำซ้ำแบบน้อยที่สุด
- การตรวจสอบการเข้าถึงด้วยโปรแกรมอ่านหน้าจอและเทคโนโลยีช่วยเหลือ
เปิด issue และ PR ได้ที่ github.com/LilyDesignSystem/lily-design-system.
ชุมชนและการสนับสนุน
- คำถามและรายงานข้อบกพร่อง — เปิด issue ที่ github.com/LilyDesignSystem/lily-design-system.
- อีเมล — ผู้ดูแลอ่าน joel@joelparkerhenderson.com และยินดีรับความร่วมมือ คำแนะนำ และข้อเสนอแนะ
- มิเรอร์ — Lily ยังถูกพุชไปยัง Codeberg และ GitLab เพื่อให้คุณมีส่วนร่วมจากฟอร์จที่คุณชอบ
- ความประพฤติ — โครงการนี้ใช้หลักปฏิบัติมาตรฐาน โปรดมีน้ำใจและเชื่อในเจตนาดี
คำถามที่พบบ่อย
ทำไมจึงเป็น headless แทนที่จะมีสไตล์?
คอมโพเนนต์ที่มีสไตล์สำเร็จรูปสะดวก — จนกว่าจะไม่เข้ากับแบรนด์ของคุณ คอมโพเนนต์ headless ต้องทำงานมากขึ้นเล็กน้อยตอนแรกแต่ให้คุณควบคุมการออกแบบด้านภาพได้ทั้งหมด แอปตัวอย่างและ 57 ธีมแสดงวิธีจัดสไตล์ คุณจะใช้ตามนั้นหรือแทนที่ทั้งหมดก็ได้ ข้อโต้แย้งฉบับยาวอยู่ที่ ทำไมต้อง Lily.
ทำไมมีคอมโพเนนต์มากมายขนาดนี้?
Lily มุ่งครอบคลุมรูปแบบที่แอปส่วนใหญ่ต้องการโดยไม่บังคับให้คุณสร้างเองตั้งแต่ต้น — รวมถึงของเชิงลึกอย่างช่องป้อนตัวระบุระดับชาติและ scrollytelling แบบบรรณาธิการ แคตตาล็อกนำมาจากระบบการออกแบบที่มั่นคงหลายสิบแห่งรวมกับงานดั้งเดิม — ดู เกี่ยวกับ.
ใช้ Lily กับ Tailwind ได้ไหม?
ได้ แต่ละคอมโพเนนต์เปิดเผยคลาสรากแบบ kebab-case หนึ่งคลาส พร้อม className / class ที่ผู้ใช้กำหนด วางยูทิลิตีของ Tailwind ทับได้ตามใจ
ใช้ Lily กับเฟรมเวิร์ก CSS เชิงความหมายอย่าง DaisyUI ได้ไหม?
ได้ ชื่อคลาสแบบ kebab-case บนองค์ประกอบรากทำงานเป็นฮุก CSS เชิงความหมาย จับคู่ Lily กับเฟรมเวิร์กเชิงความหมาย แล้วคุณจะได้คอมโพเนนต์ที่มีสไตล์สำเร็จรูปซึ่งยังเคารพ ARIA และ i18n
มีแพ็กเกจ npm ไหม?
ตัวช่วยการตั้งค่า มีให้ในรูปแพ็กเกจพร้อมไปป์ไลน์เผยแพร่ npm/NuGet ไลบรารีคอมโพเนนต์ headless ออกแบบมาให้โคลนหรือนำไปรวมไว้ในโปรเจกต์ — ซอร์สโค้ดคือสิ่งที่ส่งมอบ คุณจึงอ่าน ตัดแต่ง และเป็นเจ้าของสิ่งที่คุณส่งออกได้อย่างแท้จริง การเผยแพร่ไลบรารี headless ไปยังเรจิสทรียังอยู่ในแผนงาน
ทำไมจึงมีหลายสัญญาอนุญาต?
โครงการที่ต่างกันมีความต้องการสัญญาอนุญาตต่างกัน BSD และ MIT ผ่อนปรน Apache-2.0 มีการให้สิทธิบัตร และตัวเลือก GPL สนับสนุน copyleft เลือกอันที่เหมาะกับสถานการณ์ของคุณ
ฉันจะรายงานข้อบกพร่องหรือขอฟีเจอร์ได้อย่างไร?
เปิด issue บนรีโพซิทอรี GitHub หรืออีเมลถึง joel@joelparkerhenderson.com.