Посібник з Svelte

Бібліотека Lily для Svelte — канонічна реалізація: runes Svelte 5, типізовані властивості, розповсюдження rest-prop і двостороннє зв’язування з bind:value.

Що ви створите

Невелика контактна форма — поле з міткою, кнопка надсилання, двостороннє зв’язування, справжня поведінка клавіатури та зчитувача екрана — спочатку «гола», потім стилізована, приблизно за 10 хвилин.

Перш ніж почати

Вам потрібні git, Node 22 або новіший і pnpm 10 або новіший. Підійде будь-який проєкт Svelte 5 — свіжий npx sv create застосунок цілком підійде.

Крок 1 — Отримайте код

git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-svelte-headless
pnpm install
pnpm test        # vitest — thousands of component cases
pnpm run storybook   # browse all 571 components

Компоненти живуть у src/lib/components/{Name}/, по одному каталогу на компонент з файлом .svelte , його тестами, stories та документацією поряд. Скопіюйте потрібні каталоги у свій застосунок або залежте від репозиторію й імпортуйте напряму.

Крок 2 — Ваш перший компонент

<script>
  import Button from "#lib/components/Button/Button.svelte";

  function save() { console.log("saved"); }
</script>

<Button onclick={save}>Save</Button>

Рендерить <button class="button" type="button">. Властивості типізовані: type, disabled, pressed (рендерить aria-pressed для кнопок-перемикачів), label ( aria-label перевизначення), а будь-який додатковий атрибут розповсюджується на корінь.

Крок 3 — Складіть невелику форму

<script>
  import Form from "#lib/components/Form/Form.svelte";
  import Field from "#lib/components/Field/Field.svelte";
  import TextInput from "#lib/components/TextInput/TextInput.svelte";
  import Button from "#lib/components/Button/Button.svelte";

  let name = $state("");
</script>

<Form label="Contact form" onsubmit={handleSubmit}>
  <Field label="Full name" required>
    <TextInput id="name" label="Full name" bind:value={name} required />
  </Field>
  <Button type="submit">Save</Button>
</Form>

Field приймає видиму label як власну властивість, а не вкладений компонент мітки — передайте її один раз, на Field, і TextInputу label надає доступну назву. TextInput's value це $bindable rune-властивість, тож bind:value одразу дає вам двостороннє зв’язування.

Перевірено 2026-08-29: цей точний фрагмент було скомпільовано через svelte/server і перевірено на єдиний, правильно пов’язаний <label for> — ранній чернетковий варіант вкладав окремий Label всередині Field, що рендерило дві мітки (одну порожню), оскільки Field уже рендерить власну з label властивість. складений маршрут контактної форми — той самий шаблон, перевірений справжніми e2e- та axe-тестами.

Перевірте свою роботу: запустіть застосунок — форма виглядає простою, саме як і задумано: стилізація ще попереду. Натисніть Tab: фокус проходить через кожен елемент керування, мітка озвучується, а надсилання працює. Поведінка готова; вигляд — ваш, і він наступний.

Крок 4 — Стилізуйте

Усе вище рендериться як чиста структура, готова до ваших стилів. Стилізуйте клас-гачки — .button, .text-input, .label, .field — у своїй глобальній таблиці стилів або підключіть готову тему в app.html:

<link rel="stylesheet" href="/themes/dark.css" />

Налаштування для окремих екземплярів ідуть через class властивість, яка додається до базового гачка: <Button class="wide"> рендерить class="button wide".

Крок 5 — Побачте все в дії

Приклад застосунку SvelteKit — той самий каталог повністю стилізований, з живими демо, e2e-тестами Playwright та базовою лінією доступності axe-core:

git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-svelte-sveltekit-examples
pnpm install && pnpm run dev

Наступні кроки

Питання по дорозі? сторінка допомоги повна відповідей — а якщо якийсь крок може бути зрозумілішим, повідомте нам і ми із задоволенням покращимо посібник.