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
Unable to parse html
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. |
PopoverTrigger
- inline
- Description
Will render the trigger as inline text.
- Type
boolean- Default
false false
- asChild
- Description
Change the default rendered element for the one passed as a child, merging their props and behavior.
- Type
boolean- Default
false false
- command
- Type
string
- commandfor
- Type
string
- variant
- Description
Specify which variant to use
- Type
"primary" | "secondary" | "tertiary"- Default
'primary'
- icon
- Description
Toggle icon only styling, pass icon as children When combined with loading, the loading-icon will be shown instead of the icon.
- Type
boolean- Default
false
- loading
- Description
Toggle loading state. Pass an element if you want to display a custom loader.
- Type
ReactNode- Default
false
- type
- Description
Specify the type of button. Unset when `asChild` is true
- Type
"button" | "submit" | "reset"- Default
'button'
| Name | Type | Default | Description |
|---|---|---|---|
| inline | boolean | false false | Will render the trigger as inline text. |
| asChild | boolean | false false | Change the default rendered element for the one passed as a child, merging their props and behavior. |
| command | string | - | - |
| commandfor | string | - | - |
| variant | "primary" | "secondary" | "tertiary" | 'primary' | Specify which variant to use |
| icon | boolean | false | Toggle icon only styling, pass icon as children When combined with loading, the loading-icon will be shown instead of the icon. |
| loading | ReactNode | false | Toggle loading state. Pass an element if you want to display a custom loader. |
| type | "button" | "submit" | "reset" | 'button' | Specify the type of button. Unset when `asChild` is true |
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
Unable to parse html
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
Unable to parse html
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.
Merk at vi ikke bruker onClick på triggeren, dropdownen håndterer dette internt on sendet til onOpen og onClose.
React
Unable to parse html
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
Unable to parse html
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.
Når du bruker @digdir/designsystemet-web legger vi på en listener som automatisk plasserer popoveren riktig ved hjelp av floating-ui.
Du kan styre plassering med attributt på selve popoveren.
| attribute | type | default | required |
|---|---|---|---|
| data-placement | string | top | false |
| data-overscroll | 'contain' | undefined | undefined | undefined |
| data-autoplacement | boolean | true | false |
Dersom du ikke bruker klassen ds-popover må du legge til CSS-egenskapen --_ds-floating på popover-elementet. Dette kan være top, bottom, left eller right.
Vi anbefaler å lese om popover (mozilla.org).
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) |
| --dsc-popover-placement | top |
| Navn | Verdi |
|---|---|
| data-overscroll | contain |
| data-floating| | top, right, bottom, left |
| data-variant | default, tinted |
| data-popover | inline |