Intro
En modal er et midlertidig vindu eller lag som åpnes på en nettside. Modalen fanger brukerens oppmerksomhet, samtidig som konteksten til nettsiden beholdes. Den er nyttig når brukeren må ta stilling til informasjon eller fokusere på en spesifikk oppgave.
Egnet til:
- Å få brukeren til å fokusere på en spesifikk oppgave
- Å sikre at brukeren får med seg viktig informasjon
Uegnet til:
- Omfattende eller komplekst innhold som krever langvarig interaksjon
- Viktig informasjon som brukeren må ha tilgang til kontinuerlig
Eksempler
Lukkeknappen i headeren kan skjules, men da må du ha en annen knapp som lukker modalen.
Headeren tilbys som en egen komponent for de tilfellene du trenger mer fleksiblitet enn header-propen gir deg. Begge varianter har mulighet for å skjule lukkeknappen.
Det er ikke støtte for å ha <form> som direkte barn av <Modal>. Legg <form> enten rundt hele modalen eller inni <Modal.Body>. Sistnevnte gjør det mulig å sette method="dialog", som gjør at modalen lukkes ved submit.
Husk at det er lett å klikke utenfor ved et uhell. Ikke bruk 'closeOnBackdropClick' hvis det kan føre til at brukeren mister data eller går glipp av viktig informasjon.
Retningslinjer
Design
Modal er bygd opp i 3 deler: header, body og footer.
Header
Komponenten kommer med mulighet til å tilpasse innholdet i headeren. Du kan vise et ikon, optional label og lukk-knapp.
Body
Body er hovedinnholdet i modalen.
Footer
Kan inneholde en primær-, en sekundær- og en tertiærknapp. Primærknapp ligger helt til høyre i footeren. Ved bruk av to knapper brukes primær- og sekundærknapp. Hvis du trenger tre knapper plasseres tertiærknappen til venstre.
Bruk
- Begrens bruk av modaler
- Ikke bruk mer enn tre knapper
- Sørg for at modalens formål er tydelig og relevant for brukerens nåværende kontekst
- Ikke overveld brukere med unødvendig informasjon eller handlinger
- Ikke bruk modal når det kreves navigering mellom flere trinn
- Unngå handlinger som krever ytterligere informasjonskilder som ikke er tilgjengelig i modalen.
Innhold
- Tittelen bør alltid være med for å tydeliggjøre for brukeren at konteksten er endret. For skjermleserbrukere er dette ekstra viktig fordi de ikke vil se det som ligger under modalen.
- Hold innholdet kortfattet og fokusert. Unngå å overvelde brukere med for mye informasjon. Bruk overskrifter, underoverskrifter og punktlister for å gjøre innholdet skannbart.
Figma
I Figma er komponenten designet med en slot-komponent som gjør det mulig å legge til eget innhold samtidig som variantene bevares.
Lukke modal
Sørg for at det alltid er en synlig og enkel måte å lukke modalen på. Det vanligste er å ha en lukkeknapp øverst til høyre. Hvis det ikke passer må du ha en annen knapp i modalen som kan brukes til å lukke den, for eksempel en avbryt-knapp.
Modal på mobil
Under brekkpunktet 768px fjernes margene på modalen slik at hele viewporten kan utnyttes.
Plassering av modal
Modalen plasseres alltid sentrert horisontalt og vertikalt i viewporten. Modalen legger seg alltid over annet innhold på nettsiden.
Automatisk testing
Modalen har en kort animasjon når den åpnes, som du kanskje må ta høyde for i automatiske tester. Du kan feks. legge på en liten forsinkelse, eller aktivere "prefers-reduced-motion" hvis testmiljøet støtter dette.
Tilgjengelighet
Tilgjengelig navn
Hvis du bruker header
-propen vil modalen automatisk få aria-labelledby
knyttet opp mot header.heading
. Hvis du ikke bruker header
-propen må du huske å sette enten aria-label
eller aria-labelledby
selv. Om det er brukt en beskrivende tittel i modalen så er aria-labelledby
et godt valg for å tilgjengeliggjøre den for skjermlesere.
Fokushåndtering
Fokus skal flyttes inn i modalen når den åpnes, og tilbake når den lukkes. Dette hånteres i de fleste tilfeller automatisk. Modalen bruker dialog
-elementet, hvor standard oppførsel er at første fokuserbare element får fokus når modalen åpnes. Siden dette ofte vil være lukke-knappen, har vi valgt å sette autoFocus
på dialog
-elementet, slik at det elementet får fokus i stedet. I skrivende stund fungerer dette imidlertid bare i Firefox.
Når modalen lukkes, flyttes fokus tilbake der det var da modalen ble åpnet. Hvis dette elementet ikke finnes lenger, kan det være hensiktsmessig å manuelt sette fokus på det neste elementet. Fokus kan bare settes utenfor modalen etter at den er lukket. Hvis du lukker modalen ved hjelp av open
-propen vil det gå en render-syklus før den lukkes. I så fall kan du for eksempel sette fokus i onClose
.
Interaksjon med tastatur
Modalen kan som standard lukkes med Escape-tasten. Dette kan i noen tilfeller overstyres slik: onCancel={(e) => e.preventDefault()}
. Se Props/JSDoc for mer info.
Annet
Legg merke til at elementene i footer vises i motsatt rekkefølge. Dette er for at primærknappen skal komme til høyre og samtidig være først i tab-rekkefølgen.
Når modalen åpnes, settes det en klasse på body-elementet med CSSen overflow: hidden
for å hindre at resten av siden kan scrolles. For å unngå at innholdet flytter på seg når scrollbaren skjules/vises kan du bruke scrollbar-gutter: stable
.
Props
Modal
header?
- Type:
{ label?: string; icon?: ReactNode; heading: string; size?: "medium" | "small"; closeButton?: boolean | undefined; } | undefined
- Description:
children
- Type:
ReactNode
- Description:
open?
- Type:
boolean
- Description:
onClose?
- Type:
ReactEventHandler<HTMLDialogElement>
- Description:
onBeforeClose?
- Type:
(() => boolean)
- Description:
onCancel?
- Type:
ReactEventHandler<HTMLDialogElement>
- Description:
closeOnBackdropClick?
- Type:
boolean
- Default:false
- Description:
width?
- Type:
number | "medium" | "small" | `${number}${string}`
- Default:fit-content (up to 700px)
portal?
- Type:
boolean
- Description:
className?
- Type:
string
- Description:
aria-labelledby?
- Type:
string
- Description:
aria-label?
- Type:
string
- Description:
ref?
- Type:
LegacyRef<HTMLDialogElement>
- Description:
Modal.Header
closeButton?
- Type:
boolean
- Default:true
- Description:
className?
- Type:
string
ref?
- Type:
LegacyRef<HTMLDivElement>
- Description:
Modal.Body
className?
- Type:
string
ref?
- Type:
LegacyRef<HTMLDivElement>
- Description:
Modal.Footer
className?
- Type:
string
ref?
- Type:
LegacyRef<HTMLDivElement>
- Description:
Tokens
For å bruke --ac-modal-backdrop
må du ha med pseudo-elementet ::backdrop
til slutt i selektoren.
Token | Fallback |
---|---|
--ac-modal-bg | --a-surface-default |
--ac-modal-backdrop | --a-surface-backdrop |
--ac-modal-width-small | 450px |
--ac-modal-width-medium | 700px |