Skip to main content

Dropdown components for Dash

Project description

PyPI Downloads

📦 dash_dropdown_components

Custom dropdown components for Plotly Dash similar to dcc.Dropdown, offering advanced functionality such as nested options and improved multi-select behavior.

📥 Installation

pip install dash-dropdown-components

Showcase

screencap

🧩 Components

🔽 Dropdown

A customizable dropdown component that enhances the standard Dash dropdown with additional features.

✅ Features

  • Emulates dcc.Dropdown - Drop-in replacement for most use cases.
  • Stays open on select – When multi=True, the dropdown stays open after selection (unlike dcc.Dropdown).
  • Smart multi→single behavior – When switching multi=True to multi=False dynamically, the first selected item is automatically preserved—no need for callbacks. – Clearable for multi=True and not clearable for multi=False by default, or control using clearable option.
  • Multi-select support – Supports selecting multiple items.
  • Searchable – Optionally enable a search term.

⚙️ Properties

Property Type Description
id string Unique component ID
options list[dict,str] List of options with label and value keys, or list with values
value string or list Selected value(s)
multi bool Enable multiple selections
searchable bool Enables search
clearable bool Whether or not the dropdown is "clearable", that is, whether or not a small "x" appears on the right of the dropdown that removes the selected value.
placeholder string Placeholder text when nothing is selected
disabled bool If True, this dropdown is disabled and the selection cannot be changed.
hide_options_on_select bool If True, options are removed when selected
style bool Whether dropdown closes on selection (default True)
className string Optional CSS class for styling

🌲 MultiLevelDropdown

A hierarchical dropdown component that supports nested options (multilevel structure), allowing for structured category selection.

✅ Features

  • Nested options – Supports arbitrarily nested dropdowns.
  • Expandable submenus – Submenus open and close interactively.
  • Custom labels – Each level supports custom labeling and values.

⚙️ Properties

Property Type Description
id string Unique component ID
options list[dict,str] List of dicts of options with label, value and optional nested options keys (recursive)
value string or list Selected value(s)
multi bool Enable multiple selections
clearable bool Whether or not the dropdown is "clearable", that is, whether or not a small "x" appears on the right of the dropdown that removes the selected value.
placeholder string Placeholder text when nothing is selected
disabled bool If True, this dropdown is disabled and the selection cannot be changed.
hide_options_on_select bool If True, options are removed when selected
submenu_widths list Control the width of the submenu for each level. Can be in percentage of the preceding level or fixed widths
style bool Whether dropdown closes on selection (default True)
className string Optional CSS class for styling

💡 Usage Example

import dash_dropdown_components as ddc
from dash import Dash, callback, html, Input, Output, dcc

app = Dash(__name__)

options = [
    {'value': 'banana', 'label': 'Banana'},
    {'value': 'apple', 'label': 'Apple'},
    {'value': 'strawberry', 'label': 'Strawberry'},
    {'value': 'kiwi', 'label': 'Kiwi'},
    {'value': 'orange', 'label': 'Orange'},
    {'value': 'blueberry', 'label': 'Blueberry'},
    {'value': 'lemon', 'label': 'Lemon'},
    {'value': 'lime', 'label': 'Lime'},
    {'value': 'mandarin', 'label': 'Mandarin'},
]

multi_level_options = [
    {
        'label': 'Fruits',
        'value': 'fruits',
        'options': [
            { 'label': 'Apple', 'value': 'apple' },
            { 'label': 'Banana', 'value': 'banana' },
            { 'label': 'Berries',
              'value': 'berries',
              'options': [
                  { 'label': 'Strawberry', 'value': 'strawberry'},
                  { 'label': 'Blueberry', 'value': 'blueberry'}
                ]
            }
    ]},
    {
        'label': 'Vegetables',
        'value': 'vegetables',
        'options': [
            {
            'label': 'Potato',
            'value': 'potato'
            },
            {
            'label': 'Carrot',
            'value': 'carrot'
            },
    ]}
]; 

app.layout = html.Div(
    [
html.Div([
        html.P('ddc.Dropdown'),
        dcc.RadioItems(id='ddc-dd-multi',
                       options=[{'label': 'Multi: True', 'value': True},
                                {'label': 'Multi: False', 'value': False}],
                       value=False),
        ddc.Dropdown(
            id='ddc-dd',
            options=options,
            value=options[0]['value'],
            multi=False,
            disabled=False,
            searchable=True,
            hide_options_on_select=True
        ),
        html.Div(id='ddc-dd-selection')
    ], style={'width': '25%', 'display': 'inline-block'}),
html.Div([
        html.P('ddc.MultiLevelDropdown'),
        dcc.RadioItems(id='ddc-mldd-multi',
                       options=[{'label': 'Multi: True', 'value': True},
                                {'label': 'Multi: False', 'value': False}],
                       value=False),
        ddc.MultiLevelDropdown(
            id='ddc-mldd',
            options=multi_level_options,
            value=['fruits', 'banana'],
            multi=False,
            disabled=False,
            hide_options_on_select=True,
            submenu_widths=['10vw', '20vw']
        ),
        html.Div(id='ddc-mldd-selection')
    ], style={'width': '25%', 'display': 'inline-block'}),
],
style={'display': 'flex', 'flexDirection': 'row'})


@callback(Output('ddc-dd-selection', 'children'),
          Input('ddc-dd', 'value'))
def display_output(value):
    return 'You have entered {}'.format(value)

@callback(Output('ddc-mldd-selection', 'children'),
          Input('ddc-mldd', 'value'))
def display_output(value):
    return 'You have entered {}'.format(value)

@callback(Output('ddc-dd', 'multi'),
          Input('ddc-dd-multi', 'value'))
def set_multi(multi):
    return multi

@callback(Output('ddc-mldd', 'multi'),
          Input('ddc-mldd-multi', 'value'))
def set_multi(multi):
    return multi


if __name__ == '__main__':
    app.run(debug=True)

📝 License

This project is licensed under the MIT License. See the LICENSE file for details.


🔗 Links

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dash_dropdown_components-1.0.1.tar.gz (632.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dash_dropdown_components-1.0.1-py3-none-any.whl (638.6 kB view details)

Uploaded Python 3

File details

Details for the file dash_dropdown_components-1.0.1.tar.gz.

File metadata

  • Download URL: dash_dropdown_components-1.0.1.tar.gz
  • Upload date:
  • Size: 632.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.10.20

File hashes

Hashes for dash_dropdown_components-1.0.1.tar.gz
Algorithm Hash digest
SHA256 7379a427bd60aa7e9ccdd7936ba664f3018e52d63300864071bcadb3e4ecdf4e
MD5 40c6279f2c6085c15c3314635718135a
BLAKE2b-256 582efb186374a7215d534fa6545b17a82bb1c0ed792113181c04fd5f26fecb94

See more details on using hashes here.

File details

Details for the file dash_dropdown_components-1.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for dash_dropdown_components-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e09150c445452abf59d929c3a62824eee967dfad377f8ecc5faa2c8aae21c5bf
MD5 eee00e93af94296b99dbaa7ed0d3dfc6
BLAKE2b-256 1b7b2bd240ac63f6c736e474271552c23fe91b313fc429829c011af8336e765b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page