Skip to content
wdj

Select

Partial Input

Kumo-styled Alpine dropdown with groups, rich options and multiple selection; native form values and fallback.

Kumo reference: kumo-ui.com/components/select/

Presentation commands show demo feedback. Read the interaction guide to connect real actions.

Basic

Show template
{% load wdj %}
<div class="w-[200px] max-w-full">
{% include "wdj/components/select.html" with id="select_basic" name="select_basic" options=audit_select_fruits label="Favorite fruit" selected="apple" only %}
</div>

Placeholder

Show template
{% load wdj %}
<div class="w-[200px] max-w-full">{% include "wdj/components/select.html" with name="select_placeholder" label="Category" placeholder="Choose a category..." options=select_issues only %}</div>

Label

Show template
{% load wdj %}
<div class="grid w-full max-w-lg gap-4">
{% include "wdj/components/select.html" with name="select_label" options=environments label="Environment" only %}
</div>

Description

Choose the category that best describes your issue

Choose the category that best describes your issue

Show template
{% load wdj %}
<div class="w-[280px] max-w-full">{% include "wdj/components/select.html" with name="select_description" label="Issue type" description="Choose the category that best describes your issue" options=select_issues placeholder="Select an option" only %}</div>

Selected value

Show template
{% load wdj %}
<div class="grid w-full max-w-lg gap-4">
{% include "wdj/components/select.html" with name="select_selected_value" options=environments selected="staging" label="Environment" only %}
</div>

Required

Show template
{% load wdj %}
<div class="grid w-full max-w-lg gap-4">
{% include "wdj/components/select.html" with name="select_required" options=environments label="Environment" required=True only %}
</div>

Disabled

Show template
{% load wdj %}
<div class="grid w-full max-w-lg gap-4">
{% include "wdj/components/select.html" with name="select_disabled" options=environments label="Environment" disabled=True only %}
</div>

Error

Show template
{% load wdj %}
<div class="w-[280px] max-w-full">{% include "wdj/components/select.html" with name="select_error" label="Issue type" error="Please select an issue type" options=select_issues placeholder="Select an option" only %}</div>

Groups

Europe

Americas

Show template
{% load wdj %}
<div class="grid w-full max-w-lg gap-4">
{% include "wdj/components/select.html" with name="select_groups" options=grouped_options label="Region" only %}
</div>

Small

Show template
{% load wdj %}
<div class="grid w-full max-w-lg gap-4">
{% include "wdj/components/select.html" with name="select_small" options=environments label="Small" size="sm" only %}
</div>

Large

Show template
{% load wdj %}
<div class="grid w-full max-w-lg gap-4">
{% include "wdj/components/select.html" with name="select_large" options=environments label="Large" size="lg" only %}
</div>

Plain options

Show template
{% load wdj %}
<div class="grid w-full max-w-lg gap-4">
{% include "wdj/components/select.html" with name="select_plain_options" options=regions label="Region" only %}
</div>

Native fallback

Show template
{% load wdj %}
<div class="grid w-full max-w-lg gap-4">
  {% include "wdj/components/select.html" with mode="native" name="select_native" label="Native environment" options=environments only %}
</div>

Placement

Show template
{% load wdj %}
<div class="grid w-full justify-items-center gap-4 sm:grid-cols-2">
<div class="w-[200px] max-w-full">{% include "wdj/components/select.html" with id="select-bottom" label="side=bottom (default)" selected="earth" options=select_planets only %}</div>
<div class="w-[200px] max-w-full">{% include "wdj/components/select.html" with id="select-top" label="side=top" selected="earth" options=select_planets side="top" only %}</div>
<div class="w-[200px] max-w-full">{% include "wdj/components/select.html" with id="select-end" label="align=end" selected="earth" options=select_planets align="end" only %}</div>
<div class="w-[200px] max-w-full">{% include "wdj/components/select.html" with id="select-offset" label="sideOffset=12" selected="earth" options=select_planets side_offset=12 only %}</div>
</div>

Custom value rendering

Show template
{% load wdj %}
<div class="w-[200px] max-w-full">{% include "wdj/components/select.html" with id="select-language" name="language" label="Language" selected="en" options=select_languages only %}</div>

Author with rich options

Select the primary author for this document

Select the primary author for this document

Show template
{% load wdj %}
<div class="w-[200px] max-w-full">{% include "wdj/components/select.html" with id="select-author" name="author" label="Author" description="Select the primary author for this document" placeholder="Select an author" options=select_authors only %}</div>

Disabled items

Show template
{% load wdj %}
<div class="w-[200px] max-w-full">{% include "wdj/components/select.html" with id="select-plan" label="Plan" selected="free" options=select_plans only %}</div>

Groups with disabled options

Available

Unavailable

Show template
{% load wdj %}
<div class="w-[260px] max-w-full">{% include "wdj/components/select.html" with id="select-regions" name="region" label="Server region" placeholder="Select a region..." options=select_regions only %}</div>

Loading from server

Show template
{% load wdj %}
<div id="select-async" class="w-[200px] max-w-full" hx-get="{% url 'showcase:select_assignees' %}" hx-trigger="load delay:2s" hx-swap="outerHTML">{% include "wdj/components/select.html" with id="select-assignee" label="Assignee" loading=True only %}</div>

Custom popup

Show template
{% load wdj %}
{% include "wdj/components/select.html" with mode="custom" id="audit-select-custom-popup" name="environment" label="Environment" options=audit_options only %}

Top placement

Show template
{% load wdj %}
{% include "wdj/components/select.html" with mode="custom" id="audit-select-top-placement" name="environment" label="Environment" side="top" options=audit_options only %}

Rich option rendering

Show template
{% load wdj %}
{% include "wdj/components/select.html" with mode="custom" id="audit-select-rich-option-rendering" name="environment" label="Environment" options=audit_options only %}

Loading popup

Show template
{% load wdj %}
{% include "wdj/components/select.html" with mode="custom" id="audit-select-loading-popup" name="environment" label="Environment" loading=True options=audit_options only %}

Multiple popup choices

Show template
{% load wdj %}
<div class="w-[250px] max-w-full">{% include "wdj/components/select.html" with id="select-columns" name="columns" label="Visible columns" multiple=True options=select_columns selected_values=select_initial_columns max_display_items=3 placeholder="Select columns..." only %}</div>

Grouped popup options

Fruits

Vegetables

Show template
{% load wdj %}
<div class="w-[220px] max-w-full">{% include "wdj/components/select.html" with id="select-food" name="food" label="Food" options=select_foods placeholder="Pick a food..." only %}</div>

Long popup list

Show template
{% load wdj %}
{% include "wdj/components/select.html" with mode="custom" id="audit-select-long-popup-list" name="environment" label="Environment" options=audit_long_options only %}

Selected option alignment

Opens below the trigger

Opens below the trigger

Selected option lands on the trigger

Selected option lands on the trigger

Show template
{% load wdj %}
<div class="flex w-full flex-wrap justify-center gap-8">
<div class="w-[200px] max-w-full">{% include "wdj/components/select.html" with id="select-anchored" label="Anchored (default)" description="Opens below the trigger" options=select_planets selected="mars" only %}</div>
<div class="w-[200px] max-w-full">{% include "wdj/components/select.html" with id="select-aligned" label="Aligned to selection" description="Selected option lands on the trigger" options=select_planets selected="mars" align_selected=True only %}</div>
</div>

API Reference

Prop Type Default Description
string custom Select: custom Alpine popup by default; native explicitly requests the platform picker. Tabs has its own local/navigation contract.
string unset Name; pass the documented value shown in the examples.
list[dict] [] Select: value/label/display_label/disabled/selected or groups with options. Combobox input: value/label/disabled/group/icon/description; button search also supports Select groups.
string unset Initial server selection: one value, a list for multiple=True, or selected flags on native options.
list[dict] unset Selected values; pass the documented value shown in the examples.
string unset Placeholder; pass the documented value shown in the examples.
string unset Visible accessible label. Supply an explicit aria-label via attrs when the control is bare.
bool False Optional; pass the documented value shown in the examples.
string unset Label tooltip; pass the documented value shown in the examples.
string unset Description; pass the documented value shown in the examples.
string unset Validation message; implies error styling and accessible error association.
bool False Required; pass the documented value shown in the examples.
bool False Disabled; pass the documented value shown in the examples.
bool False Multiple; pass the documented value shown in the examples.
string unset Visible options; pass the documented value shown in the examples.
string base Size; pass the documented value shown in the examples.
string component-specific Variant; pass the documented value shown in the examples.
string unset Stable unique DOM ID; important for HTMX targets and focus restoration.
dict {} Dictionary of escaped native, HTMX or Alpine attributes. Literal Tailwind classes only.
string unset Field class; pass the documented value shown in the examples.
string bottom Side; pass the documented value shown in the examples.
string start Align; pass the documented value shown in the examples.
string unset Side offset; pass the documented value shown in the examples.
string unset Align offset; pass the documented value shown in the examples.
bool False Loading; pass the documented value shown in the examples.
bool False Align selected; pass the documented value shown in the examples.
string unset Max display items; pass the documented value shown in the examples.
string unset Display summary; pass the documented value shown in the examples.
bool False Select: show a search field inside the popup, with case- and accent-insensitive filtering.
string unset Search placeholder; pass the documented value shown in the examples.
string unset Empty message; pass the documented value shown in the examples.
string unset Searchable button: default control styling or ghost.

Accessibility notes

Every interactive component keeps real semantics and keyboard support: native controls where possible, ARIA only where necessary, and a visible focus ring. See the Accessibility page for the shared contract.

Read the accessibility contract

Components

Components overview
AutocompleteFree-form input with local or HTMX-filtered suggestions.
BadgeSolid, tinted, outline and dot status labels.
BannerInline message bar with variants and optional action.
BreadcrumbsTrail navigation in two sizes.
ButtonVariants, sizes, shapes, icons and loading state.
ButtonGroupJoins a small set of tightly-coupled buttons into a single control (split buttons).
CheckboxSingle checkbox and indeterminate state.
ClipboardTextRead-only text field with a one-click copy-to-clipboard button.
Code / CodeHighlightedEscaped Pygments grammar highlighting, multiline tokens, line numbers, highlighted lines and localized copying.
CollapsibleComposable disclosure component for showing and hiding content.
Combobox / AutocompleteKumo-styled input/button triggers, search inside the popup, grouped local choices and debounced HTMX search.
CommandPaletteAccessible spotlight search overlay with Cmd+K keyboard shortcut.
DatePickerKumo-styled date and datetime popups; inline single, multiple and range calendars with bounds/presets.
DateRangePickerStyled popup or inline range calendar with bounds, presets and separately named form values.
DialogNative <dialog> modal with focus management.
DrawerEdge-anchored modal panel. LayerDialog has its own layered component.
DropdownMenuNative details menu with delegated keyboard navigation and dismissal.
EmptyEmpty-state placeholder with icon and action.
FieldLabel + description + error wrapper. Built into each control.
FlowDirected diagrams with branches, SVG connectors, custom anchors and responsive local scrolling.
GridResponsive CSS grid layout container with preset column configurations.
InlineCopyTextCompact borderless copy control for IDs and short values.
InputText field with label, description, leading/trailing icons.
InputAreaMulti-line textarea with auto-resize option.
InputGroupInput field with seamless prefix, suffix, and addon attachments.
LabelForm field label, optional marker and tooltip.
LayerCardCompound surface card with distinct primary and secondary layers.
LayerDialogLayered native modal with actions, forms, nested dialogs and pending states.
LinkInline, current and plain text links.
LoaderAnimated spinner in three sizes.
MenuBarCompact view selector using native radio semantics.
MeterProgress bar showing a measured value within a known range.
PaginationA page navigation component for navigating through paginated content.
PopoverAnchored popup with interactive content.
RadioRadio group, vertical and horizontal.
SelectKumo-styled Alpine dropdown with groups, rich options and multiple selection; native form values and fallback.
SensitiveInputPassword/secret input with reveal toggle and copy button.
SeparatorHorizontal / vertical rules with optional label.
SidebarRecursive navigation groups, account/zone views, search, loading, resize and full-screen mobile breadcrumbs.
SkeletonShimmer placeholder.
SliderInset single/range selection with vertical grips, value badges, endpoint labels and native keyboard/form behavior.
SurfaceBordered surface panel with header slot.
SwitchOn/off toggle in three sizes.
TableServer-driven table: sort, filter, select and paginate the full dataset.
Table of contentsPage section navigation tree with active link indicator.
TabsSegmented and underline tabs with a sliding indicator, responsive overflow and local Alpine or URL/HTMX state.
TagInputMulti-value badge input for tags and recipients.
TextHeading, body, secondary, success, error and mono text.
ToastyExpandable notification stack with variants, paused expiry and a live region.
ToolbarCompact grouped controls with shared borders, composed filters and keyboard arrow navigation.
TooltipHover and focus tooltip with grouped delays, Escape dismissal and viewport bounds.
↑ ↓ Navigate ↵ Select