Akordeon

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?
Generatorem stron statycznych zbudowanym na Vite. Strony to funkcje zwracające HTML.
Czy wysyła runtime?
Nie. Nic nie trafia do przeglądarki, dopóki sam nie podlinkujesz skryptu.
Czy mogę użyć TypeScriptu?
Tak — .ht.ts i .ht.tsx to rozszerzenia stron jak każde inne.
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
Ten ma open: true.
Zamknięty
Ten nie ma.
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
Otwórz inną, a ta się zamknie.
Druga
Ta też.
Trzecia
Otwarta jest zawsze tylko jedna.
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-html
Konfiguracja

Opcjonalna. Opcje Vite leżą pod kluczem vite.

sitelo.config.js
Wdrożenie

Opublikuj katalog wyjściowy na dowolnym hostingu statycznym.

NetlifyVercelCloudflare PagesGitHub Pages
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?
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 (() => {
  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():

PropTypDomyślnieOpis
itemsArray[]Ciągi znaków albo obiekty { title, content, open }.
namestring—Wspólna nazwa czyni sekcje wzajemnie wyłącznymi.

accordionItem():

PropTypDomyślnieOpis
titleChild—Wiersz summary.
openbooleanfalseCzy startuje rozwinięta.
namestring—Ten sam efekt co na rodzicu, gdy budujesz elementy ręcznie.