Komponenter
Dialog
Det er to typer dialoger, en modal og en ikke-modal. En modal dialog tvinger brukerne til å ta stilling til noe før de kan fortsette å bruke siden. En Ikke-modal dialog lar brukerne fortsette å bruke siden, selv om dialogen er åpen.
React
Unable to parse html
const Preview = () => { return ( <Dialog.TriggerContext> <Dialog.Trigger>Open Dialog</Dialog.Trigger> <Dialog> <Heading style={{ marginBottom: 'var(--ds-size-2)' }}> Dialog header </Heading> <Paragraph style={{ marginBottom: 'var(--ds-size-2)' }}> Lorem ipsum dolor sit, amet consectetur adipisicing elit. Blanditiis doloremque obcaecati assumenda odio ducimus sunt et. </Paragraph> <Paragraph data-size='sm'>Dialog footer</Paragraph> </Dialog> </Dialog.TriggerContext> ); }; render(<Preview />)
Bruk modal Dialog når
- brukerne skal bekrefte en kritisk handling, som å slette noe de ikke kan angre
- brukerne skal se en bestemt dialog og må forholde seg til den
- du skal sikre at brukeren får med seg viktig informasjon
Unngå modal Dialog når
- innholdet er omfattende eller komplekst
- innholdet er ett av flere steg i en prosess
- du skal varsle om noe som ikke krever at brukerne gjør noe, bruk heller
Alerteller "ikke-modal"Dialog - du vil gi kort informasjon som brukerne kan velge om de vil se, bruk
Popover
Se også mønsteret om systemvarsler for mer informasjon om når modal Dialog bør brukes.
Mange kaller denne komponenten bare for «modal». I Designsystemet bruker vi Dialog, som er basert på det innebygde HTML-elementet <dialog>, og skiller mellom modale og ikke-modale dialoger (nngroup.com) basert på hvordan de oppfører seg.
Eksempel
Modal Dialog
Eksempel på en modal dialog som tvinger brukerne til å ta stilling til noe før de kan fortsette å bruke siden.
React
Unable to parse html
const ModalDialog = () => ( <Dialog.TriggerContext> <Dialog.Trigger>Åpne modal Dialog</Dialog.Trigger> <Dialog id='my-dialog-modal'> <Dialog.Block> <Paragraph data-size='sm'>Bekreft endring</Paragraph> <Heading>Er du sikker på at du vil endre søknaden? </Heading> </Dialog.Block> <Dialog.Block> <Paragraph> OBS! Du bør ikke endre søknaden etter at fristen har gått ut. Hvis du endrer søknaden nå, er du ikke lenger med i kommende opptak. Ring kontaktsenteret på telefon 00 00 00 00 hvis du trenger veiledning. </Paragraph> </Dialog.Block> <Dialog.Block> <div style={{ display: 'flex', gap: 'var(--ds-size-4)', marginTop: 'var(--ds-size-4)', }} > <Button variant='primary' data-color='danger' command='close' commandfor='my-dialog-modal' > Ja, endre </Button> <Button variant='secondary' command='close' commandfor='my-dialog-modal' > Avbryt </Button> </div> </Dialog.Block> </Dialog> </Dialog.TriggerContext> ); render(<ModalDialog />)
Ikke-modal Dialog
Ikke-modale dialoger er nyttige når brukerne skal kunne fortsette å jobbe samtidig som vinduet er åpent. NB: Sørg for at elementer som får fokus ikke skjules bak dialogen.
React
Unable to parse html
const NonModalDialog = () => ( <Dialog.TriggerContext> <Dialog.Trigger>Åpne ikke-modal Dialog</Dialog.Trigger> <Dialog modal={false} style={{ zIndex: '10', top: 'calc(100vh - 290px)', left: 'calc(100vw - 385px)', margin: 0, maxWidth: '350px', }} > <Heading style={{ marginBottom: 'var(--ds-size-4)' }}> Vi ønsker din mening </Heading> <Label htmlFor='my-textarea'>Hvordan var din opplevelse?</Label> <Textarea id='my-textarea' style={{ marginBottom: 'var(--ds-size-6)', }} /> <Button>Send inn</Button> </Dialog> </Dialog.TriggerContext> ); render(<NonModalDialog />)
Dialog som drawer
Med placement vil Dialog oppføre seg som en såkalt "drawer" fra den posisjonen du setter.
React
Unable to parse html
const Drawer = () => { const [placement, setPlacement] = useState<DialogProps['placement']>('bottom'); const [modal, setModal] = useState(true); return ( <> <Checkbox label='Modal' checked={modal} style={{ marginBottom: 'var(--ds-size-4)' }} onChange={(e) => setModal(e.target.checked)} /> <Fieldset onChange={(e: ChangeEvent<HTMLFieldSetElement>) => { const target = e.target as unknown as HTMLInputElement; setPlacement(target.value as DialogProps['placement']); }} > <div style={{ display: 'flex', flexWrap: 'wrap', gap: 'var(--ds-size-5)', marginBottom: 'var(--ds-size-8)', }} > <Radio name='drawer' label='Center' value='center' /> <Radio name='drawer' label='Top' value='top' /> <Radio name='drawer' label='Bottom' value='bottom' /> <Radio name='drawer' label='Left' value='left' /> <Radio name='drawer' label='Right' value='right' /> </div> </Fieldset> <Dialog.TriggerContext> <Dialog.Trigger>Open Dialog</Dialog.Trigger> <Dialog modal={modal} closedby='any' placement={placement} style={{ zIndex: '10' }} > <Dialog.Block> <Paragraph> This is a {modal ? 'modal' : 'non-modal'} Dialog with{' '} <code>placement="{placement}"</code> </Paragraph> </Dialog.Block> </Dialog> </Dialog.TriggerContext> </> ); }; render(<Drawer />)
Retningslinjer
Begrens bruk av Dialog fordi det bryter flyten og forstyrrer brukerne. Ikke avbryt brukerne med mindre det er nødvendig. Avbrytelser forstyrrer arbeidsflyten og bør bare brukes når innholdet er viktig nok eller kan forhindre at brukerne gjør feil. Brukerne forstår kanskje ikke hvorfor dialogen dukker opp, hvordan den lukkes eller om de må gjøre noe. Dette gjelder særlig for brukere med konsentrasjonsvansker, nedsatt syn eller skjermleser.
Lukking av Dialog
Sørg for at brukeren alltid har en synlig og enkel måte å lukke en Dialog på. Det vanligste er en lukkeknapp (X) øverst til høyre. Den skal være synlig selv om dialogen inneholder mye innhold og brukeren må scrolle. Hvis det ikke passer må du ha en annen knapp som kan lukke dialogen, for eksempel en avbryt-knapp.
Vurder nøye om dialogen kan lukkes ved å klikke utenfor. For kritiske valg bør brukeren lukke dialogen aktivt.
Når brukeren lukker dialogen uten å ta et aktivt valg, skal dette tilsvare det minst kritiske eller minst destruktive alternativet.
Tekst
Overskriften skal gjøre det tydelig for brukerne at de må gjøre noe. Det kan være lurt at overskriften er et spørsmål.
Innholdet må være kort, men ha informasjonen brukerne trenger for å ta et valg. Bruk knappene til å gi brukerne en tydelig vei videre.
Gjør det tydelig hva som skjer når brukeren velger et alternativ, særlig hvis handlingen ikke kan angres.
Rediger denne siden på github.com (åpnes i ny fane)