Komponenter
Popover
Popover vises over andre elementer i grensesnittet og er koblet til et spesifikt element. Den brukes til å vise tilleggsinformasjon, interaktive elementer eller korte forklaringer uten å navigere bort fra siden.
React
const Preview = () => { return ( <Popover.TriggerContext> <Popover.Trigger>Åpne popover</Popover.Trigger> <Popover placement='top'> Popoveret gir en rask beskjed. Her kan du vise brukeren informasjon som er relevant for konteksten. </Popover> </Popover.TriggerContext> ); }; render(<Preview />)
- id
- Description
id to connect the trigger with the popover - required when not using Popover.Context.
- Type
string
- placement
- Description
Placement of the popover on the trigger.
- Type
Placement- Default
top
- open
- Description
When a boolean is provided, the popover will be controlled.
- Type
boolean- Default
undefined
- variant
- Description
Change the background color of the popover.
- Type
"default" | "tinted"- Default
default
- onOpen
- Description
Callback when the popover wants to open.
- Type
() => void
- onClose
- Description
Callback when the popover wants to close.
- Type
() => void
- autoPlacement
- Description
Whether to enable auto placement.
- Type
boolean- Default
true
- asChild
- Description
Change the default rendered element for the one passed as a child, merging their props and behavior.
- Type
boolean- Default
false
| Name | Type | Default | Description |
|---|---|---|---|
| id | string | - | id to connect the trigger with the popover - required when not using Popover.Context. |
| placement | Placement | top | Placement of the popover on the trigger. |
| open | boolean | undefined | When a boolean is provided, the popover will be controlled. |
| variant | "default" | "tinted" | default | Change the background color of the popover. |
| onOpen | () => void | - | Callback when the popover wants to open. |
| onClose | () => void | - | Callback when the popover wants to close. |
| autoPlacement | boolean | true | Whether to enable auto placement. |
| asChild | boolean | false | Change the default rendered element for the one passed as a child, merging their props and behavior. |
Bruk
React og popovertarget
Når du bruker Popover uten Popover.TriggerContext, kobler du selv sammen utløseren og Popover.
Da brukes popovertarget i små bokstaver, slik at alle versjoner av React korrekt gjengir attributtet.
Når du bruker @digdir/designsystemet-react utvider vi @types/react-dom til å akseptere dette.
Polyfill
Popover bruker popover (mozilla.org).
Dette apiet er klassifisert som Baseline: Newly available (mozilla.org) fra april 2024, da Firefox som siste nettleser la det til.
I noen tilfeller kan en oppleve at brukere av ulike grunner er låst til eldre nettleserversjoner, og da kan det være aktuelt å legge til en Popover-Polyfill (github.com) for å sikre at Popover fungerer for alle.
Eksempler
Standard
React
const Preview = () => { return ( <Popover.TriggerContext> <Popover.Trigger>Åpne popover</Popover.Trigger> <Popover placement='top'> Popoveret gir en rask beskjed. Her kan du vise brukeren informasjon som er relevant for konteksten. </Popover> </Popover.TriggerContext> ); }; render(<Preview />)
Inline trigger
Du kan bruke Popover inline i tekst med stiplet understrek:
React
const DottedUnderline = () => { return ( <Popover.TriggerContext> <Paragraph> Vi bruker <Popover.Trigger inline>design tokens</Popover.Trigger> for å sikre at vi har en konsistent design. </Paragraph> <Popover data-color='neutral'> <Paragraph> <strong style={{ display: 'block', }} > Design tokens </strong> Design tokens er en samling av variabler som definerer designet i et designsystem. </Paragraph> </Popover> </Popover.TriggerContext> ); }; render(<DottedUnderline />)
Kontrollert
Du kan kontrollere når popover er åpen eller lukket:
React
const Controlled = () => { const [open, setOpen] = useState(false); return ( <Popover.TriggerContext> <Popover.Trigger onClick={() => setOpen(!open)}>Slett</Popover.Trigger> <Popover open={open} onClose={() => setOpen(false)} data-color='danger'> <Paragraph>Er du sikker på at du vil slette?</Paragraph> <div style={{ display: 'flex', gap: 'var(--ds-size-2)', marginTop: 'var(--ds-size-2)', }} > <Button onClick={() => setOpen(false)} data-size='sm' data-color='danger' > Slett </Button> <Button data-variant='tertiary' onClick={() => setOpen(false)} data-size='sm' > Avbryt </Button> </div> </Popover> </Popover.TriggerContext> ); }; render(<Controlled />)
Uten TriggerContext
Du kan også bruke Popover uten TriggerContext ved å bruke popovertarget:
React
const WithoutContext = () => { const [open, setOpen] = useState(false); return ( <> <Button data-color='danger' popovertarget='my-popover' onClick={() => setOpen(!open)} > Slett </Button> <Popover id='my-popover' open={open} onClose={() => setOpen(false)} data-color='danger' > <Paragraph>Er du sikker på at du vil slette?</Paragraph> <Button onClick={() => setOpen(false)} data-size='sm' style={{ marginTop: 'var(--ds-size-2)' }} > Slett </Button> </Popover> </> ); }; render(<WithoutContext />)
HTML
Du kan bruke popover i ren HTML ved å bruke popover-attributtet på et element og koble det til en trigger med popovertarget.
Klassenvnet ds-popover blir brukt på elementet som er popoveren.
I React bruker vi floating-ui (floating-ui.com) for plassering, og dette er et bibliotek som også kan brukes i rene JavaScript-applikasjoner.
Vi anbefaler å lese om popover (mozilla.org).
data-placement er brukt for å plassere pila riktig.
Dette attributtet henger sammen med en "plugin" vi har laget for floating-ui.
Den er portabel til andre som bruker floating-ui, og du finner koden på github.com.
Inline popover
Dersom du vil ha triggeren inline i tekst må du fortsatt bruke <button>, men du kan legge på data-popover="inline" for å få riktig styling.
CSS variabler og data-attributter
| Navn | Verdi |
|---|---|
| --dsc-popover-background | var(--ds-color-surface-default) |
| --dsc-popover-border-width | var(--ds-border-width-default) |
| --dsc-popover-border-style | solid |
| --dsc-popover-border-color | var(--ds-color-border-default) |
| --dsc-popover-color | var(--ds-color-text-default) |
| --dsc-popover-arrow-size | var(--ds-size-3) |
| --dsc-popover-border-radius | var(--ds-border-radius-md) |
| --dsc-popover-max-width | 300px |
| --dsc-popover-padding | var(--ds-size-3) var(--ds-size-4) |
| --dsc-popover-box-shadow | var(--ds-shadow-md) |
| Navn | Verdi |
|---|---|
| data-placement | top, left, right, bottom |
| data-variant | default, tinted |
| data-popover | inline |