Skip to main content

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 dict Inline CSS styles applied to the dropdown container
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
submenu_max_width string/number/list Maximum width of submenus, so they don't grow too wide when labels are long; long labels wrap within this width. Defaults to the dropdown control's width. A single CSS width for all levels (e.g. '300px', '25vw', a number as px, or 'none' to disable), or a list for per-level control.
style dict Inline CSS styles applied to the dropdown container
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

Metadata

Release files for dash-dropdown-components 1.1.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for dash-dropdown-components 1.1.2
File Size Uploaded
dash_dropdown_components-1.1.2.tar.gz 636.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dash-dropdown-components 1.1.2
File Interpreter ABI Platform
dash_dropdown_components-1.1.2-py3-none-any.whl Python 3 none any Details

Total release size: 1.3 MB

Release files / dash_dropdown_components-1.1.2.tar.gz

Download URL dash_dropdown_components-1.1.2.tar.gz
Size 636.2 kB
Tags Source
SHA-256 checksum
How to use checksums
ecdfca538e2365465643a60630fa0c650f9afb455870a5df0285b0551d0321ae
BLAKE2b-256 checksum
How to use checksums
1454afd14fa25aaa6e920f9a7bf426c3d58ea9be90f3d32b394f2a2a7c00be69
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.20

Release files / dash_dropdown_components-1.1.2-py3-none-any.whl

Download URL dash_dropdown_components-1.1.2-py3-none-any.whl
Size 639.7 kB
Tags Python 3
SHA-256 checksum
How to use checksums
5b8ec82b2655d522bdf95ae3c3a8dddcc2b3d868c13c9b6300da2b1f10fe77f2
BLAKE2b-256 checksum
How to use checksums
d4e155fe1ebf930b35b9d00f36a6b1692a2acc128804805ee369d4f708546889
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/6.2.0 CPython/3.10.20

Release history Release notifications | RSS feed

This release

1.1.2 This release

2 release files

1.1.1

2 release files

1.0.1

2 release files

1.0.0

2 release files

0.0.13

2 release files

0.0.12

2 release files

0.0.11

2 release files

0.0.10

2 release files

0.0.9

2 release files

0.0.8

2 release files

0.0.7

2 release files

0.0.6

2 release files

0.0.5

2 release files

0.0.4

2 release files

0.0.3

2 release files

0.0.2

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page