Skip to content

Demos

Default dropdown

No value is defined, but a title is given.

const data = [
// Every data item can, beside "content" - contain what ever
{
// (optional) can be what ever
selected_key: 'key_0',
// (optional) is show instead of "content", once selected
selected_value: 'Item 1 Value',
// Item content as a string or array
content: 'Item 1 Content',
},
{
selected_key: 'key_1',
content: ['Item 2 Value', 'Item 2 Content'],
},
{
selected_value: (
<NumberFormat always_selectall ban>
11345678962
</NumberFormat>
),
content: [
<NumberFormat key="ban" always_selectall ban>
11345678962
</NumberFormat>,
'Bank account number',
],
},
{
selected_key: 'key_2',
selected_value: 'Item 3 Value',
content: ['Item 3 Content A', 'Item 3 Content B'],
},
{
selected_key: 'key_3',
selected_value: 'Item 4 Value',
content: ['Item 4 Content A', <>Custom Component</>],
},
]
render(
<Dropdown
data={data}
label="Label:"
title="Please select a value"
on_change={({ data }) => {
console.log('on_change', data)
}}
/>
)

Dropdown with different item content directions

<Dropdown
label="Label:"
data={[
['Vertical', 'alignment'],
<>
<P modifier="medium">Vertical</P>
<P>alignment</P>
</>,
<Dropdown.HorizontalItem key="item-1">
<P modifier="medium" right="x-small">
Horizontal
</P>
<P>alignment</P>
</Dropdown.HorizontalItem>,
]}
{...visualTestProps(
globalThis.IS_TEST &&
window.location.search.includes('item-directions')
)}
/>

Icon on left side

<Dropdown
label="Label:"
icon_position="left"
data={data}
value={3}
skip_portal={true}
on_change={({ data: selectedDataItem }) => {
console.log('on_change', selectedDataItem)
}}
on_show={() => {
console.log('on_show')
}}
/>

ActionMenu

The ActionMenu will change its characteristics in mobile view. It will hide the title, and the DrawerList will be placed on the bottom of the page.

<Dropdown
title="ActionMenu"
action_menu={true}
align_dropdown="left"
data={[
<>
<IconPrimary icon="check" right />
Save
</>,
<>
<IconPrimary icon="download" right />
Download
</>,
]}
/>

MoreMenu

No lasting selection will be made.

<Dropdown
more_menu={true}
size="small"
title="Choose an item"
data={() => [
<Link href="/" key="item-1">
Go to this Link
</Link>,
'Or press on me',
<>Custom component</>,
]}
right="small"
{...visualTestProps(
globalThis.IS_TEST && window.location.search.includes('left-side')
)}
/>
<Dropdown
prevent_selection={true}
align_dropdown="right"
size="small"
title={null}
aria-label="Choose an item"
data={() => [
<Link href="/" key="item-1">
Go to this Link
</Link>,
'Or press on me',
<>Custom component</>,
]}
right="small"
{...visualTestProps(
globalThis.IS_TEST && window.location.search.includes('right-side')
)}
/>
<Dropdown
more_menu={true}
title="Choose an item"
data={[
<Link href="/" key="item-1">
Go to this Link
</Link>,
'Or press on me',
<>Custom component</>,
]}
right="small"
/>
<Dropdown
prevent_selection={true}
align_dropdown="right"
title={null}
aria-label="Choose an item"
data={[
<Link href="/" key="item-1">
Go to this Link
</Link>,
'Or press on me',
<>Custom component</>,
]}
on_change={({ value }) => {
console.log('on_change', value)
}}
on_select={({ active_item }) => {
console.log('on_select', active_item)
}}
/>

Dropdown as tertiary variant

<Dropdown
variant="tertiary"
independent_width={true}
icon_position="left"
align_dropdown="left"
data={data}
/>

Custom item events

const CustomComponent = () => (
<CustomComponentInner
onTouchStart={preventDefault}
onClick={(e) => {
console.log('Do something different')
preventDefault(e)
}}
>
Custom event handler
</CustomComponentInner>
)
const CustomComponentInner = styled.span`
display: block;
width: 100%;
margin: -1rem -2rem -1rem -1rem;
padding: 1rem 2rem 1rem 1rem;
`
const preventDefault = (e) => {
e.stopPropagation()
e.preventDefault()
}
render(
<Dropdown
action_menu
right
label="Label:"
title="Choose an item"
data={() => [
<Link href="/" key="item-1">
Go to this Link
</Link>,
'Or press on me',
<CustomComponent key="item-2" />,
]}
on_change={({ value }) => {
console.log('More menu:', value)
}}
suffix={<HelpButton title="Modal Title">Modal content</HelpButton>}
{...visualTestProps(
globalThis.IS_TEST &&
window.location.search.includes('action_menu-custom')
)}
/>
)

Dropdown in different sizes

Four sizes are available: small, default, medium and large

<FormRow direction="vertical">
<Dropdown label="Label:" size="default" bottom data={() => data} />
<Dropdown label="Label:" size="medium" bottom data={() => data} />
<Dropdown label="Label:" size="large" bottom data={() => data} />
</FormRow>

Custom width

const CustomWidthOne = styled(Dropdown)`
.dnb-dropdown__shell {
width: 10rem;
}
`
const CustomWidthTwo = styled(Dropdown)`
&.dnb-dropdown--is-popup .dnb-drawer-list__root {
width: 12rem;
}
`
const CustomWidthThree = styled(Dropdown)`
/** Change the "__shell" width */
.dnb-dropdown__shell {
width: 10rem;
}
/** Change the "__list" width */
.dnb-drawer-list__root {
width: 20rem;
}
`
const CustomWidthFour = styled(Dropdown)`
width: 60%;
min-width: 224px; /** 14rem (please use pixels on min-width!) */
max-width: 25rem;
/** In case we have a label */
.dnb-form-label + .dnb-dropdown__inner {
width: 100%;
}
`
render(
<FormRow direction="vertical">
<CustomWidthOne
label="Label:"
size="default"
icon_position="left"
bottom
data={data}
/>
<CustomWidthTwo
label="Label:"
size="small"
more_menu
bottom
data={data}
/>
<CustomWidthThree
label="Label:"
size="large"
align_dropdown="right"
bottom
data={data}
/>
<CustomWidthFour
title="Min and max width"
stretch={true}
bottom
data={data}
/>
</FormRow>
)

Dropdown with status

And vertical label layout.

Message to the user
<Dropdown
data={data}
label="Label:"
label_direction="vertical"
status="Message to the user"
/>

Findable list

With long list to make it scrollable and searchable

const scrollableData = [
{
content: 'A',
},
{
content: 'B',
},
{
selected_value: (
<NumberFormat always_selectall ban>
11345678962
</NumberFormat>
),
content: [
<NumberFormat key="ban-1" always_selectall ban>
11345678962
</NumberFormat>,
'C',
],
},
{
selected_value: (
<NumberFormat always_selectall ban>
15349648901
</NumberFormat>
),
content: [
<NumberFormat key="ban-2" always_selectall ban>
15349648901
</NumberFormat>,
'D',
],
},
{
content: 'E',
},
{
selected_key: 'key_1',
selected_value: 'Find me by keypress',
content: ['F', 'F', 'F', 'F'],
},
{
content: 'G',
},
{
content: 'H',
},
]
render(
<Dropdown
data={scrollableData}
value="key_1" // use either index (5) or selected_key: 'key_1'
label="Label:"
/>
)

Disabled dropdown

<Dropdown disabled data={['Disabled Dropdown']} label="Label:" />

Disabled tertiary dropdown

<Dropdown
disabled
variant="tertiary"
data={['Disabled Dropdown']}
label="Disabled tertiary dropdown"
/>

DrawerList opened

Only to visualize and used for visual testing

  • Brukskonto - Kari Nordmann
  • Sparekonto - Ole Nordmann
  • Feriekonto - Kari Nordmann med et kjempelangt etternavnsen
  • Oppussing - Ole Nordmann