Svelte 튜토리얼

Lily의 Svelte 라이브러리가 기준 구현입니다: Svelte 5 룬, 타입이 지정된 props, 나머지 props 펼치기, 그리고 다음을 통한 양방향 바인딩: 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 파일, 테스트, 스토리, 문서가 나란히 있습니다. 필요한 디렉터리를 앱에 복사하거나, 저장소에 의존해 바로 import하세요.

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">. props에는 타입이 지정되어 있습니다: 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 을 중첩된 레이블 컴포넌트가 아니라 별도의 prop으로 받습니다 — 한 번만 전달하면 Field, 그리고 TextInput의 대응하는 label 이 접근 가능한 이름을 제공합니다. TextInput's value 는 $bindable 룬 prop이므로 bind:value 를 쓰면 바로 양방향 바인딩이 됩니다.

2026-08-29 확인 완료: 이 스니펫 그대로를 다음을 통해 컴파일하고 svelte/server 올바르게 연결된 레이블이 하나뿐임을 확인했습니다 <label for> — 이전 초안에서는 별도의 Label 안의 Field를 중첩해서, 렌더링 결과는 두 개의 레이블(하나는 비어 있음)이 렌더링되었습니다. Field 가 label prop. 문의 폼 조합 라우트 도 같은 패턴이며, 실제 e2e 및 axe 테스트로 검증됩니다.

작동 확인: 앱을 실행하면 폼이 밋밋해 보입니다 — 의도한 대로이며 스타일은 앞으로 입힙니다. Tab키를 눌러 보세요. 포커스가 모든 컨트롤을 따라 이동하고, 레이블이 읽히며, 제출도 동작합니다. 동작은 완성되었고, 모양은 당신 몫이며 다음 단계입니다.

4단계 — 스타일 입히기

위의 모든 것은 순수한 구조로 렌더링되며 스타일을 기다립니다. 클래스 훅에 스타일을 입힙니다 — .button, .text-input, .label, .field — 전역 스타일시트에서, 또는 준비된 테마를 다음에서 링크합니다: app.html:

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

인스턴스별 조정은 다음을 통해 합니다: class prop으로 하며, 기본 훅에 덧붙습니다: <Button class="wide"> 렌더링 결과: class="button wide".

5단계 — 전체가 동작하는 모습 보기

SvelteKit 예제 앱 은 같은 카탈로그를 완전히 스타일링하여 라이브 데모, Playwright e2e 테스트, 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

다음 단계

진행하다가 궁금한 점이 있다면 도움말 페이지 에 답이 많이 있습니다. 어떤 단계가 더 명확해질 수 있다면 알려 주세요 . 기꺼이 튜토리얼을 개선하겠습니다.