Komponenter
Dropdown
Dropdown er en generisk nedtrekksliste. Den legger grunnmuren for å bygge menyer og lister.
React
const Preview = () => { return ( <Dropdown.TriggerContext> <Dropdown.Trigger>Dropdown</Dropdown.Trigger> <Dropdown placement='bottom-end'> <Dropdown.Heading>First heading</Dropdown.Heading> <Dropdown.List> <Dropdown.Item> <Dropdown.Button>Button 1.1</Dropdown.Button> </Dropdown.Item> <Dropdown.Item> <Dropdown.Button>Button 1.2</Dropdown.Button> </Dropdown.Item> </Dropdown.List> <Dropdown.Heading>Second heading</Dropdown.Heading> <Dropdown.List> <Dropdown.Item> <Dropdown.Button>Button 2.1</Dropdown.Button> </Dropdown.Item> <Dropdown.Item> <Dropdown.Button>Button 2.2</Dropdown.Button> </Dropdown.Item> </Dropdown.List> </Dropdown> </Dropdown.TriggerContext> ); }; render(<Preview />)
Se Popover for props.
Bruk
Dropdown bruker Popover internt.
React og popovertarget
Når du bruker popover uten Dropdown.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
Dropdown bruker Popover API (mozilla.org). Dette apiet er klassifisert som Baseline:
Newly available (mozilla.org) fra april 2024,
med 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 Dropdown fungerer for alle.
Eksempel
Kontrollert
Dersom du sender inn open, så bruker du Dropdown kontrollert. Du kan bruke onClose for å få beskjed når Dropdown vil lukkes.
React
const Controlled = () => { const [open, setOpen] = useState(false); return ( <Dropdown.TriggerContext> <Dropdown.Trigger onClick={() => setOpen(!open)}> Dropdown {open ? <ChevronDownIcon aria-hidden /> : <ChevronUpIcon aria-hidden />} </Dropdown.Trigger> <Dropdown open={open} onClose={() => setOpen(false)}> <Dropdown.List> <Dropdown.Item> <Dropdown.Button onClick={() => setOpen(false)}> Trykk på meg lukker </Dropdown.Button> </Dropdown.Item> <Dropdown.Item> <Dropdown.Button onClick={() => setOpen(false)}> Eg lukker også </Dropdown.Button> </Dropdown.Item> </Dropdown.List> </Dropdown> </Dropdown.TriggerContext> ); }; render(<Controlled />)
Uten TriggerContext
Dropdown bruker popover APIet, så du kan bruke Dropdown uten Dropdown.Trigger.
Du må da legge til popovertarget={id} på Dropdown, og id på Dropdown.
React
const WithoutTrigger = () => { return ( <> <Button popovertarget='dropdown'>Dropdown</Button> <Dropdown id='dropdown'> <Dropdown.List> <Dropdown.Item> <Dropdown.Button>Item</Dropdown.Button> </Dropdown.Item> </Dropdown.List> </Dropdown> </> ); }; render(<WithoutTrigger />)
HTML
Du kan bruke native popover-api direkte i HTML. Dette kan brukes uten JavaScript, dersom du ikke vil polyfille.
Merk deg at elementet med popover="manual" bruker to klasser, ds-popover og ds-dropdown.
Du velger selv om du vil bruke popover="manual" eller bare popover for å åpne dropdownen.
CSS variabler og data-attributter
| Navn | Verdi |
|---|---|
| --dsc-dropdown-padding | var(--ds-size-3) var(--ds-size-2) |
| --dsc-dropdown-item-padding | var(--ds-size-2) var(--ds-size-4) |
| --dsc-dropdown-item-size | var(--ds-size-12) |
| --dsc-dropdown-background | var(--ds-color-neutral-surface-default) |
| --dsc-dropdown-border-width | var(--ds-border-width-default) |
| --dsc-dropdown-border-style | solid |
| --dsc-dropdown-border-color | var(--ds-color-neutral-border-subtle) |
| --dsc-popover-arrow-size | var(--ds-size-2) |
Ingen relevante data-attributter funnet.
Referanser
Vi bruker ul og li tags i dropdownen, valget er basert på disse:
- https://www.w3.org/WAI/tutorials/menus/flyout/#flyoutnavkbbtn
- https://www.w3.org/WAI/ARIA/apg/patterns/menu-button