Svelte-Tutorial

Lilys Svelte-Bibliothek ist die kanonische Implementierung: Svelte-5-Runes, typisierte Props, Rest-Prop-Spread und Zwei-Wege-Bindung mit bind:value.

Was du baust

Ein kleines Kontaktformular — beschriftetes Eingabefeld, Absenden-Schaltfläche, Zwei-Wege-Bindung, echtes Tastatur- und Screenreader-Verhalten — zuerst nackt, dann gestaltet, in etwa 10 Minuten.

Bevor du anfängst

Du brauchst git, Node 22 oder neuer und pnpm 10 oder neuer. Jedes Svelte-5-Projekt funktioniert — eine frische npx sv create -App reicht.

Schritt 1 — Den Code holen

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

Die Komponenten liegen in src/lib/components/{Name}/, ein Verzeichnis pro Komponente mit der .svelte -Datei, ihren Tests, ihren Stories und ihrer Dokumentation nebeneinander. Kopiere die benötigten Verzeichnisse in deine App, oder hänge dich ans Repo und importiere direkt.

Schritt 2 — Deine erste Komponente

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

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

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

Rendert <button class="button" type="button">. Die Props sind typisiert: type, disabled, pressed (rendert aria-pressed (rendert label (ein aria-label für Umschalt-Buttons),

Schritt 3 — Ein kleines Formular zusammensetzen

<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 nimmt das sichtbare label als eigene Prop statt als verschachtelte Label-Komponente — gib es einmal an, bei Fieldund TextInputvon label liefert den zugänglichen Namen. TextInput's value zum Überschreiben) und jedes zusätzliche Attribut wird auf die Wurzel verteilt. $bindable ist eine bind:value -Rune-Prop, daher

Geprüft am 2026-08-29: gibt dir sofort Zwei-Wege-Bindung. svelte/server genau dieses Snippet wurde über <label for> kompiliert und auf ein einzelnes, korrekt verknüpftes Label geprüft Label innerhalb von Field— ein früherer Entwurf verschachtelte ein separates zwei Labels (eines leer) rendert, weil Field bereits ein eigenes aus dem label darin, was Folgendes rendert: Die zusammengesetzte Kontaktformular-Route ist dasselbe Muster, getestet mit echten e2e- und axe-Tests.

Prüfe deine Arbeit: Starte die App, und das Formular sieht schlicht aus — genau wie beabsichtigt: Die Gestaltung kommt noch. Drücke Tab: Der Fokus wandert durch jedes Bedienelement, das Label wird angesagt und das Absenden funktioniert. Das Verhalten ist fertig; das Aussehen gehört dir und kommt als Nächstes.

Schritt 4 — Gestalten

Alles oben wird als reine Struktur gerendert, bereit für deine Styles. Gestalte die Klassen-Hooks — .button, .text-input, .label, .field — in deinem globalen Stylesheet, oder binde ein fertiges Theme ein in app.html:

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

Anpassungen pro Instanz laufen über die class -Prop, die an den Basis-Hook angehängt wird: <Button class="wide"> rendert class="button wide".

Schritt 5 — Alles in Aktion sehen

SvelteKit-Beispiel-App ist derselbe Katalog vollständig gestaltet, mit Live-Demos, Playwright-e2e-Tests und einer axe-core-Barrierefreiheits-Baseline:

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

Nächste Schritte

Fragen unterwegs? Die Hilfeseite steckt voller Antworten — und wenn ein Schritt klarer sein könnte, sag es uns und wir verbessern das Tutorial gern.