Przełącznik motywu
Na tej stronie
sitelo-ui samo rozstrzyga tryb ciemny na podstawie prefers-color-scheme — witryna, której odpowiada podążanie za systemem operacyjnym, nie potrzebuje z tej strony niczego. Przełącznik służy do tego, żeby czytający mógł to nadpisać.
To jeden z pięciu komponentów, które potrzebują skryptu, bo wybór żyje w localStorage, a odczytać go może tylko skrypt. Przycisk sam pobiera ten skrypt przy pierwszym naciśnięciu.
Jak to ustawić
Dwie rzeczy w head i przycisk tam, gdzie ma być:
import { styles, themeScript, themeToggle } from 'sitelo/ui'
head(
themeScript(), // stosuje zapisany wybór przed pierwszym malowaniem
styles(),
)
body(
appBar({ brand: 'Moja strona' },
appBarSpacer(),
appBarActions(themeToggle()),
),
)Nie ma trzeciego pliku. themeScript() jest blokujący i wbudowany celowo — cokolwiek odroczonego maluje się jako pierwsze, a to dokładnie ten ciemny błysk, któremu ma zapobiegać — a samo przełączenie jedzie na przycisku:
<button data-su-theme-toggle
onclick="import('/su/theme.js').then(m=>m.toggle(this))">Używaj ich w parze. themeScript() jest też tym, co przy załadowaniu oznacza przycisk jako aria-pressed: nic jeszcze nie zostało naciśnięte, więc sam przycisk nie może wiedzieć, jaki motyw się rozstrzygnął.
Przełącznik
Ikona jest czystym CSS-em, czytanym wprost z atrybutu motywu — więc jest poprawna już przy pierwszym malowaniu, zanim wykona się jakikolwiek skrypt. Pokazuje, na co kliknięcie przełączy.
stack({ direction: 'row', gap: 'md', align: 'center' },
themeToggle(),
themeToggle({ variant: 'soft' }),
themeToggle({ variant: 'outline' }),
)Te przyciski działają — ta strona ładuje runtime. Kliknięcie ustawia data-su-theme na <html>, czyli własny atrybut sitelo-ui, więc zmieniają się tylko komponenty sitelo-ui na tej stronie. Reszta witryny idzie za własnym data-theme, ustawianym przez przełącznik w górnym pasku. Na Twojej witrynie byłby tylko jeden z nich.
W pasku aplikacji
appBar({ brand: 'sitelo' },
appBarNav(navLink({ href: '#docs', current: true }, 'Dokumentacja')),
appBarSpacer(),
appBarActions(
themeToggle(),
button({ size: 'sm' }, 'Zacznij'),
),
)Jak rozstrzyga się motyw
Po kolei: wygrywa jawny data-theme albo data-su-theme na dowolnym przodku; w przeciwnym razie decyduje prefers-color-scheme. Honorowane są obie nazwy atrybutów, żeby sitelo-ui mogło siedzieć wewnątrz witryny, która ma już własny przełącznik motywu — a dokładnie to robi ta dokumentacja.
Sterowanie samodzielne
Runtime eksportuje te same funkcje, których używa przycisk, na własną kontrolkę albo trójstanowy wybór jasny / ciemny / systemowy.
import { getTheme, setTheme, toggleTheme } from 'sitelo/ui/client'
getTheme() // 'light' | 'dark' — rozstrzygnięty, nie zapisany
toggleTheme() // przełącz
setTheme('dark') // przypnij
setTheme('system') // zdejmij nadpisanie i znów idź za systememPropsy
| Prop | Typ | Domyślnie | Opis |
|---|---|---|---|
label | string | 'Toggle dark mode' | Dostępna nazwa i podpowiedź. |
variant | 'solid' | 'soft' | 'outline' | 'ghost' | 'link' | 'ghost' | Wariant przycisku. |
color | 'primary' | 'neutral' | 'success' | 'warning' | 'danger' | 'neutral' | Z której palety czerpać. |
themeScript() przyjmuje opcjonalny nonce, dla witryny z polityką bezpieczeństwa treści.