Skip to content

Dropdown

Attaches a button menu to an element
import { Dropdown } from '@ensdomains/thorin'
<Dropdown
  align="left"
  items={[
    {
      label: 'Dashboard',
      onClick: () => null,
      color: 'text',
      icon: <DotGridSVG />,
    },
    {
      label: 'Disconnect',
      onClick: () => null,
      color: 'red',
      icon: <ExitSVG />,
    },
  ]}
  label="Account"
/>

Props
#

name
type
default
description
align
"left" | "right"
left
The alignment of the dropdown relative to the button
buttonProps
any
-
The props passed to the button for the dropdown
cancelLabel
string
Cancel
The label for the cancel button when showing an action sheet
chevron
boolean
true
A chevron in the button
children
ReactNode
-
An optional custom dropdown button
direction
"down" | "up"
down
The direction that the dropdown menu will open from
height
string | number
-
The height of the dropdown menu. If specified, dropdown will be scrollable
indicatorColor
any
-
The colour of the indicator
isOpen
boolean
-
If defined, dropdown is controlled externally
items
DropdownItem[]
[]
An array of objects conforming to the DropdownItem interface.
keepMenuOnTop
boolean
false
If true, the dropdown will stay above the button when open
label
ReactNode
-
The label of the dropdown button
menuLabelAlign
"flex-start" | "flex-end" | "center"
-
The alignment of the menu button labels
mobileWidth
string | number
150
The width of the dropdown menu on mobile, in px
responsive
boolean
true
If true, displays an action sheet when in mobile
setIsOpen
Dispatch<SetStateAction<boolean>>
-
-
shortThrow
boolean
false
If true, decreases the distance of the dropdown animation.
width
string | number
150
The width of the dropdown menu, in px

Dropdown Item Props
#

name
type
default
description
color
"blue" | "green" | "indigo" | "orange" | "pink" | "purple" | "red" | "teal" | "yellow" | "grey" | "accent" | "accentSecondary" | "accentSecondaryHover" | "accentTertiary" | "accentText" | "accentGradient" | "background" | "backgroundHide" | "backgroundSecondary" | "backgroundTertiary" | "border" | "borderSecondary" | "borderTertiary" | "foreground" | "foregroundSecondary" | "foregroundSecondaryHover" | "foregroundTertiary" | "groupBackground" | "groupBorder" | "gradients" | "text" | "textPlaceholder" | "textSecondary" | "textTertiary"
-
The color of the label.
disabled
boolean
-
The disabled attribute of button element.
href
string
-
A link that opens on click.
icon
ReactNode
-
An icon that leads the label.
label
string
-
The text label.
onClick
() => void
-
An event handler for click events.
showIndicator
boolean | Colors
-
A dot indicator.

Direction
#

<>
  <div style={{ height: '300px' }} />
  <Dropdown
    direction="up"
    items={[
      { label: 'Dashboard', onClick: () => null, color: 'text' },
      { label: 'Disconnect', onClick: () => null, color: 'red' },
    ]}
    label="Account"
  />
</>

Align
#

<DeleteMe flexDirection="row" justifyContent="space-between">
  <Dropdown
    align="left"
    items={[
      { label: 'Text Label 1', onClick: () => null },
      { label: 'Text Label 2', onClick: () => null },
      { label: 'Text Label 3', onClick: () => null },
      { label: 'Text Label 4', onClick: () => null },
    ]}
    label="Left"
  />
  <Dropdown
    align="right"
    items={[
      { label: 'Text Label 1', onClick: () => null },
      { label: 'Text Label 2', onClick: () => null },
      { label: 'Text Label 3', onClick: () => null },
      { label: 'Text Label 4', onClick: () => null },
    ]}
    label="Right"
  />
</DeleteMe>

Short Throw
#

<DeleteMe flexDirection="row" justifyContent="space-between">
  <Dropdown
    align="left"
    items={[
      { label: 'Text Label 1', onClick: () => null },
      { label: 'Text Label 2', onClick: () => null },
      { label: 'Text Label 3', onClick: () => null },
      { label: 'Text Label 4', onClick: () => null },
    ]}
    label="Regular Throw"
  />
  <Dropdown
    align="right"
    items={[
      { label: 'Text Label 1', onClick: () => null },
      { label: 'Text Label 2', onClick: () => null },
      { label: 'Text Label 3', onClick: () => null },
      { label: 'Text Label 4', onClick: () => null },
    ]}
    label="Short Throw"
    shortThrow
  />
</DeleteMe>

Scrollable
#

<Dropdown
  height={200}
  items={[
    { label: 'Text Label 1', onClick: () => null },
    { label: 'Text Label 2', onClick: () => null },
    { label: 'Text Label 3', onClick: () => null },
    { label: 'Text Label 4', onClick: () => null },
    { label: 'Text Label 5', onClick: () => null },
    { label: 'Text Label 6', onClick: () => null },
    { label: 'Text Label 7', onClick: () => null },
    { label: 'Text Label 8', onClick: () => null },
  ]}
  label="Scrollable"
/>

Item with Indicator
#

<Dropdown
  align="left"
  items={[
    {
      label: 'None',
      onClick: () => null,
      color: 'text',
      icon: <DotGridSVG />,
    },
    {
      label: 'Default',
      onClick: () => null,
      color: 'text',
      icon: <CogSVG />,
      showIndicator: true,
    },
    {
      label: 'Custom',
      onClick: () => null,
      color: 'red',
      icon: <ExitSVG />,
      showIndicator: 'red',
    },
  ]}
  label="Account"
  width={200}
/>

Custom Indicator Colour
#

<Dropdown
  align="left"
  indicatorColor="red"
  items={[
    {
      label: 'None',
      onClick: () => null,
      color: 'text',
      icon: <DotGridSVG />,
    },
    {
      label: 'Default',
      onClick: () => null,
      color: 'text',
      icon: <CogSVG />,
      showIndicator: true,
    },
    {
      label: 'Custom',
      onClick: () => null,
      color: 'red',
      icon: <ExitSVG />,
      showIndicator: 'red',
    },
  ]}
  label="Account"
  width={200}
/>

Custom button
#

<Dropdown
  items={[
    { label: 'English', onClick: () => null, color: 'text' },
    { label: '简体中文', onClick: () => null, color: 'text' },
    { label: 'Français', onClick: () => null, color: 'text' },
    { label: 'Español', onClick: () => null, color: 'text' },
  ]}
  label="Language"
>
  <button>Custom button</button>
</Dropdown>

Custom menu button
#

<Dropdown
  items={[
    <Button
      key="item1"
      prefix={<PlusSVG />}
      shadowless
      size="small"
      tone="accent"
    >
      Item1
    </Button>,
    <Button key="item2" prefix={<PlusSVG />} shadowless size="small" tone="red">
      Item2
    </Button>,
  ]}
  label="Custom"
/>

Items with icons
#

Items as link
#

Edit on GitHub