Akordeon
Na tej stronie
Każda sekcja to <details>. Otwieranie, zamykanie, obsługa klawiatury i wyszukiwanie w stronie pochodzą od przeglądarki, a akordeon działa przy wyłączonym JavaScripcie — co przy najczęstszym zastosowaniu, czyli FAQ, ma znaczenie.
Podstawowy akordeon
Czym jest sitelo?
Czy wysyła runtime?
Czy mogę użyć TypeScriptu?
accordion({
items: [
{ title: 'Czym jest sitelo?', content: 'Generatorem stron statycznych zbudowanym na Vite. Strony to funkcje zwracające HTML.' },
{ title: 'Czy wysyła runtime?', content: 'Nie. Nic nie trafia do przeglądarki, dopóki sam nie podlinkujesz skryptu.' },
{ title: 'Czy mogę użyć TypeScriptu?', content: 'Tak — .ht.ts i .ht.tsx to rozszerzenia stron jak każde inne.' },
],
})Domyślnie otwarty
Otwarty na wejściu
Zamknięty
accordion({
items: [
{ title: 'Otwarty na wejściu', content: 'Ten ma open: true.', open: true },
{ title: 'Zamknięty', content: 'Ten nie ma.' },
],
})Jeden naraz
Wspólne name czyni sekcje wzajemnie wyłącznymi — otwarcie jednej zamyka pozostałe. To własne zachowanie przeglądarki dla <details name>, a nie skrypt.
Pierwsza
Druga
Trzecia
accordion({
name: 'demo-exclusive',
items: [
{ title: 'Pierwsza', content: 'Otwórz inną, a ta się zamknie.', open: true },
{ title: 'Druga', content: 'Ta też.' },
{ title: 'Trzecia', content: 'Otwarta jest zawsze tylko jedna.' },
],
})Bogata treść
Buduj sekcje przez accordionItem(), gdy treść to więcej niż akapit.
Instalacja
Dodaj pakiet i jego towarzysza do znaczników:
npm install sitelo javascript-to-htmlKonfiguracja
Opcjonalna. Opcje Vite leżą pod kluczem vite.
sitelo.config.jsWdrożenie
Opublikuj katalog wyjściowy na dowolnym hostingu statycznym.
accordion(
accordionItem({ title: 'Instalacja', open: true },
stack({ gap: 'sm' },
text({ variant: 'small', tone: 'muted' }, 'Dodaj pakiet i jego towarzysza do znaczników:'),
code('npm install sitelo javascript-to-html'),
),
),
accordionItem({ title: 'Konfiguracja' },
stack({ gap: 'sm' },
text({ variant: 'small', tone: 'muted' }, 'Opcjonalna. Opcje Vite leżą pod kluczem vite.'),
code('sitelo.config.js'),
),
),
accordionItem({ title: 'Wdrożenie' },
stack({ gap: 'sm' },
text({ variant: 'small', tone: 'muted' }, 'Opublikuj katalog wyjściowy na dowolnym hostingu statycznym.'),
stack({ direction: 'row', gap: 'sm', wrap: true },
chip({ size: 'sm' }, 'Netlify'),
chip({ size: 'sm' }, 'Vercel'),
chip({ size: 'sm' }, 'Cloudflare Pages'),
chip({ size: 'sm' }, 'GitHub Pages'),
),
),
),
)FAQ
Kształt, dla którego ten komponent istnieje: treść, która już jest w HTML-u, zwinięta do przejrzenia i znajdowalna przez wyszukiwarkę, bo nigdy nie opuściła strony.
Czy naprawdę bez konfiguracji?
Jak działają trasy dynamiczne?
A wyszukiwanie?
return (() => {
const faq = [
['Czy naprawdę bez konfiguracji?', 'Projekt z jednym plikiem w src/ i bez konfiguracji się buduje. Cała reszta jest opcjonalna.'],
['Jak działają trasy dynamiczne?', 'Nawiasy w nazwach plików. generateStaticParams wylicza, co zbudować.'],
['A wyszukiwanie?', 'Ustaw pagefind: true, a build zindeksuje każdą stronę.'],
]
return accordion({
name: 'demo-faq',
items: faq.map(([title, content]) => ({ title, content })),
})
})()Propsy
accordion():
| Prop | Typ | Domyślnie | Opis |
|---|---|---|---|
items | Array | [] | Ciągi znaków albo obiekty { title, content, open }. |
name | string | — | Wspólna nazwa czyni sekcje wzajemnie wyłącznymi. |
accordionItem():
| Prop | Typ | Domyślnie | Opis |
|---|---|---|---|
title | Child | — | Wiersz summary. |
open | boolean | false | Czy startuje rozwinięta. |
name | string | — | Ten sam efekt co na rodzicu, gdy budujesz elementy ręcznie. |