Dropdown

A fully accessible dropdown component with smooth animations, keyboard navigation, grouped options, and dark mode support.

Basic Usage

Add data-name to the wrapper to name the hidden input for form use.

<div class="dropdown" data-name="framework" style="width:220px">
  <button class="dropdown-btn">Select framework…</button>
  <div class="dropdown-content">
    <div class="dropdown-label">Frontend</div>
    <div class="dropdown-item" data-value="react">React</div>
    <div class="dropdown-item" data-value="vue">Vue</div>
    <div class="dropdown-item active" data-value="svelte">Svelte</div>
    <div class="dropdown-divider"></div>
    <div class="dropdown-label">Backend</div>
    <div class="dropdown-item" data-value="express">Express</div>
    <div class="dropdown-item" data-value="fastify">Fastify</div>
  </div>
</div>

With Disabled Items

Use aria-disabled="true" for non-selectable placeholder items.

Initialisation

import { initDropdowns } from '@kerkhoff-ict/solora/dist/index.js';

// Call once after DOM is ready
initDropdowns();

// Re-run after dynamic content injection
document.addEventListener('sol:rerender', () => initDropdowns());

Keyboard Support

KeyAction
/ Navigate items
EnterSelect focused item
EscapeClose dropdown
TabMove focus out (closes dropdown)

API

Element / AttributeDescription
.dropdownWrapper element
data-nameName for the hidden <input> (form submit)
.dropdown-btnToggle button
.dropdown-contentThe menu panel
.dropdown-itemSelectable option
.dropdown-item.activePre-selected item
.dropdown-labelGroup heading (not selectable)
.dropdown-dividerHorizontal rule between groups
data-valueValue written to the hidden input
aria-disabled="true"Non-selectable / placeholder item