Tutorial Angular
Komponen mandiri Angular 20 — input sinyal, deteksi perubahan OnPush, templat inline, nol NgModules, nol CSS.
Apa yang akan Anda bangun
Formulir kontak kecil — kolom berlabel, tombol kirim, pengikatan dua arah, perilaku papan ketik dan pembaca layar yang nyata — pertama polos, lalu bergaya, dalam sekitar 10 menit.
Sebelum memulai
Anda memerlukan git, Node 22 atau lebih baru, dan pnpm 10 atau lebih baru. Proyek Angular 20 mana pun bisa — Angular CLI atau Analog.
Langkah 1 — Dapatkan kodenya
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-angular-headless
pnpm install
pnpm test # vitest + TestBed, all 571 components
pnpm run build-storybook
Komponen berupa berkas datar di components/ —
Button.ts, TextInput.ts — masing-masing komponen mandiri dengan templat inline, plus spec dan story-nya. Barrel
index.ts mengekspor ulang setiap komponen; pnpm build
menghasilkan bundel Angular Package Format melalui ng-packagr.
Langkah 2 — Komponen pertama Anda
import { Component } from "@angular/core";
import { Button } from "@lilydesignsystem/angular-headless";
@Component({
selector: "app-save-bar",
standalone: true,
imports: [Button],
template: `<lily-button (click)="save()">Save</lily-button>`,
})
export class SaveBar {
save() { console.log("saved"); }
}
Setiap komponen mendeklarasikan selektor lily-* dan merender elemen semantik dengan kait kelasnya —
<button class="button" type="button"> di sini. Input berbasis sinyal: label() untuk sebuah aria-label
untuk menimpa, className() untuk menambahkan kelas.
Langkah 3 — Susun formulir kecil
import { Component, signal } from "@angular/core";
import { Form, Field, TextInput, Button } from "@lilydesignsystem/angular-headless";
@Component({
selector: "app-contact-form",
standalone: true,
imports: [Form, Field, TextInput, Button],
template: `
<lily-form label="Contact form" (submit)="handleSubmit($event)">
<lily-field label="Full name" [required]="true">
<lily-text-input id="name" label="Full name" [(value)]="name" />
</lily-field>
<lily-button type="submit">Save</lily-button>
</lily-form>
`,
})
export class ContactForm {
name = signal("");
}
lily-field menerima label yang terlihat sebagai input
label miliknya sendiri, bukan komponen label bersarang — teruskan sekali, di kolom, dan lily-text-inputyang cocok dari
label memberikan nama yang dapat diakses. Komponen mirip input mengekspos nilai model() sehingga pengikatan dua arah banana-box [(value)]
langsung bekerja — kompatibel dengan zoneless sepenuhnya.
Diverifikasi 2026-08-29: draf sebelumnya menyarangkan komponen Label terpisah di dalam lily-field, yang merender dua label (satu kosong) karena
lily-field sudah merender labelnya sendiri dari input
label — ditemukan dengan memeriksa kode sumber komponen.
Rute formulir kontak gabungan
adalah pola yang sama, diuji dengan pengujian e2e dan axe yang nyata.
Periksa pekerjaan Anda: jalankan aplikasi dan formulir tampak polos — persis seperti yang dimaksudkan: penataan gaya masih akan datang. Tekan Tab: fokus berpindah melalui setiap kontrol, label diumumkan, dan pengiriman berfungsi. Perilakunya selesai; tampilan adalah milik Anda dan menjadi langkah berikutnya.
Langkah 4 — Beri gaya
Beri gaya pada kait kelas — .button, .text-input,
.label, .field — di styles.css, atau tambahkan tema siap pakai ke larik styles di
angular.json / tautkan di index.html:
<link rel="stylesheet" href="/themes/adobe-spectrum.css" />
Langkah 5 — Lihat semuanya bekerja
Aplikasi contoh Angular + Analog menampilkan katalog lengkap dengan perutean berbasis berkas dan Vite:
git clone https://github.com/LilyDesignSystem/lily-design-system
cd lily-design-system/lily-design-system-angular-examples
pnpm install && pnpm run dev
Langkah berikutnya
- Tema — pengalihan saat berjalan dengan pembantu theme-picker Angular.
- Pembantu preferensi — bahasa dan ukuran teks.
- Katalog komponen — properti, ARIA, dan papan ketik per komponen.
Ada pertanyaan di tengah jalan? Halaman bantuan penuh jawaban — dan jika suatu langkah bisa lebih jelas, beri tahu kami dan kami dengan senang hati akan memperbaiki tutorial ini.