Gå til innholdet

Toast

Elementet er beholderen, ikke meldingen. Du legger det inn én gang i appen og kaller show() når noe skal meldes.

Beholderen er en role="status"-region, ikke role="alert". En melding som dukker opp i hjørnet skal ikke avbryte det skjermleseren holder på med. Er beskjeden så viktig at den må avbryte, hører den hjemme i en Alert i selve siden.

// main.ts, kjøres én gang når appen starter
import { defineFsToast } from "@fristil/designsystem/toast"
import "@fristil/designsystem/toast.css"
defineFsToast()

fs.toast() gir tre attributtsett, og bare det første skriver du selv:

const varsler = fs.toast({ label: "Meldinger" })
<fs-toast role="status" aria-live="polite" aria-label="Meldinger" data-ignore-morph></fs-toast>

I JSX sprer du region, ikke hele objektet:

<fs-toast {...fs.toast().region} />

varsler.toast og varsler.close er klassene på selve meldingen og lukkeknappen. Dem lager komponenten, så du trenger dem bare hvis serveren patcher inn en melding, som i en Datastar-app.

data-ignore-morph er ikke valgfri. Komponenten lager og fjerner sine egne meldinger inne i regionen, og uten attributtet river en oppdatering fra serveren dem bort, fordi serverens utgave av regionen er tom. Se Markup og oppførsel.

<fs-toast id="meldinger" label="Meldinger"></fs-toast>
<script type="module">
import { defineFsToast } from "@fristil/designsystem/toast"
defineFsToast()
const meldinger = document.getElementById("meldinger")
document.getElementById("lagre").addEventListener("click", async () => {
await lagre()
meldinger.show("Søknaden er lagret", { color: "success" })
})
</script>

Beholderen legges inn én gang, og meldingene kommer fra koden. Det er forskjellen fra de andre komponentene: her kaller du en metode framfor å sette et attributt.

<fs-toast id="meldinger" label="Meldinger"></fs-toast>
<button class="fs-button" id="lagre" type="button">Lagre søknaden</button>
<script type="module">
import { defineFsToast } from "@fristil/designsystem/toast"
defineFsToast()
const meldinger = document.getElementById("meldinger")
document.getElementById("lagre").addEventListener("click", async () => {
try {
await lagre()
meldinger.show("Søknaden er lagret", { color: "success" })
} catch {
meldinger.show("Klarte ikke å lagre. Prøv igjen.", { color: "danger", duration: 0 })
}
})
</script>

En feilmelding står til brukeren lukker den, derfor duration: 0.

NavnHva det er
durationStandard levetid i millisekunder. 0 lar meldingene bli stående.
labelTekst som sier hva regionen er. Blir aria-label.
show(tekst, valg)Viser en melding og returnerer elementet
dismiss(melding)Fjerner én melding
clear()Fjerner alle

Valgene til show():

ValgStandardEffekt
colorneutralsuccess, warning eller danger gir en farget kant
durationfra elementetMillisekunder før meldingen forsvinner
closeLabelLukk meldingTekst på lukkeknappen

En melding som forsvinner av seg selv er en tilgjengelighetsfelle: den som leser sakte, bruker forstørrelse eller skjermleser rekker ikke å lese den. Komponenten gjør to ting med det:

  • Lukkeknappen er alltid der.
  • Tiden stopper mens musa er over meldingen, eller mens fokus er inne i den.

Skal beskjeden kunne leses igjen senere, hører den ikke hjemme her. En kvittering skal stå i siden.

KlasseHva det er
.fs-toastÉn melding. Fargen kommer fra data-color.
.fs-toast__closeLukkeknappen
VariabelStandard
--fs-toast-spacevar(--size-4)
--fs-toast-widthmin(24rem, calc(100vw - var(--size-8)))
--fs-toast-paddingvar(--size-3) var(--size-4)
--fs-toast-radiusvar(--size-1)

Beholderen slipper klikk gjennom når den er tom, så den ikke stenger for knapper under seg.

Se Tilpasning for hvordan variablene og laget virker.

  • Én ting om gangen. Fem meldinger oppå hverandre leses opp etter hverandre, og ingen av dem får oppmerksomhet.
  • Ikke legg viktige handlinger i en melding som forsvinner. Angre-knappen bør stå i siden.
  • Feil som stopper brukeren hører i en Alert eller en Error Summary, ikke i hjørnet.
  • Teksten skal si hva som skjedde, ikke bare «Ferdig».