Modal eller ikke? Velg mellom <dialog> og popover
Designsystemet bruker to native overleggs-mekanismer, valgt etter om innholdet skal blokkere
resten av siden eller ikke. Begge legger seg i nettleserens «top layer» - ingen av dem trenger
håndrullet z-index:
| Behov | Mekanisme | Brukes av |
|---|---|---|
| Blokkerer resten av siden til brukeren svarer (skjema, bekreftelse) | Native <dialog> med showModal() | <lm-dialog>, <lm-confirm-dialog> |
| Skal kunne vises samtidig med (over) en allerede åpen dialog: varsel, undermeny, forslagsliste | popover="manual", styrt fra JS med showPopover()/hidePopover() | <lm-toast>, <lm-menu-button> |
| Hover-/fokus-utløst hjelpetekst, uten å stjele fokus fra det den beskriver | interestfor koblet mot et popover-element (med native-title-reserve der støtte mangler) | <lm-tooltip> |
Tommelfingerregel: spør «må brukeren svare på dette før de kan gjøre noe annet på siden?». Ja ->
<dialog>. Nei, men det må likevel kunne vises oppå en åpen dialog ->
popover.
Hvorfor popover - ikke position: fixed + z-index
Et element med popover-attributtet flyttes automatisk til «top layer» - det samme laget
nettleseren selv bruker til <dialog> og fullskjerm-video. Det gir tre ting gratis,
som ellers må bygges for hånd med position: fixed og et stadig økende z-index-tall:
- Garantert øverst - uansett hvilken stabling/
transform/overflow: hiddenresten av siden har, siden top layer ligger utenfor det vanlige dokument-treet. - Native light-dismiss - klikk utenfor eller Escape lukker et
popover="auto"-element uten egenclick-utenfor-lytter. Komponentene over bruker bevisstpopover="manual"når de trenger å styre lukking selv (f.eks.<lm-toast>som skal bli stående til den utløper), men arver fortsatt top layer-plasseringen. - Ingen z-index-krig - et
<lm-toast>-varsel skal vises over en åpen<lm-dialog>, noe et vanligz-indexaldri kan garantere siden en åpen<dialog>alltid ligger i sitt eget top layer-lag uansett hvor høyt tallet er.
Lag-rekkefølge når flere overlegg er åpne samtidig
Vanlige, ikke-top-layer-elementer (en fastplassert sidepanel-kant, en badge oppå et kort) bruker de to
trinnene i designsystem/tokens/lagrekkefolge/:
--z-overlay for vanlige flytende kontroller, --z-overlay-top for varsler som
eksplisitt skal ligge over andre overlegg. Bruk disse fremfor et nytt, tilfeldig tall - og legg aldri et
nytt z-index-nivå til uten å diskutere om det faktisk trengs.
Ekte topp-lag-elementer (<dialog>/popover) trenger ikke disse tokenene i
det hele tatt - rekkefølgen mellom dem styres i stedet av åpningsrekkefølge (sist åpnet ligger
øverst), som er nøyaktig oppførselen <lm-toast> er avhengig av for å kunne vises over
en allerede åpen dialog.