Navigation

Dropdown Menu

Group actions in a compact menu.

Open ↗
Dropdown Menu interaction recorded with the Blinc headless renderer
Hybrid · dark · native recording · 2×

Usage and properties

Group actions in a compact menu. Apply CSS after the component layer to restyle the documented parts.

Use the installation guide to add blinc_cn and its component stylesheet. Create the fixture bindings once, and return the demo from your UI builder. Values marked Bound accept Signal/Computed sources where the API supports them; structural options configure the component at construction.

PropertyTypeUpdate modelThis example
labelstringConstructionProject actions
item / item_with_shortcutMenu itemsCallbackRename / Save / Archive

Keyboard and interaction

Tab reaches the trigger; Down or Up opens it at the first or last row. In the open menu Up and Down wrap through enabled rows, Home and End jump to the ends, Enter or Space activates, Right opens a submenu and Left returns. Escape closes and restores focus; Tab closes and moves on.

Customizing it

Add application CSS after the default component layer. These selectors are the restyling surface for this component:

  • .cn-dropdown-trigger
  • .cn-chevron
  • .cn-dropdown-menu
  • .cn-menu-item
  • .cn-dropdown-item
  • .cn-dropdown-item--has-submenu

Theme and component variables: --primary, --text-primary, --text-secondary, --surface, --border, --radius-default, --duration-fast, --ease-state.

Built-in themes

The Live theme control installs Blinc's own theme bundles, including their colours, focus rings, corner shapes and motion tokens.

pub fn theme_bundle_for(name: &str) -> blinc_theme::ThemeBundle {
    match name {
        "restrained" => blinc_theme::RestrainedTheme::bundle(),
        "expressive" => blinc_theme::ExpressiveTheme::bundle(),
        _ => blinc_theme::HybridTheme::bundle(),
    }
    .with_css(blinc_cn::cn_styles::CN_STYLES)
}

Download the default widget and component stylesheets. Sample assets and licenses are available in the asset guide.

Documentation

From the canonical component guide.

Add rows and callbacks directly to the builder:

let action = ctx.use_signal(String::new());

dropdown_menu("Options")
    .item("Edit", move || action.set("edit".to_string()))
    .item_with_shortcut("Save", "Cmd+S", move || action.set("save".to_string()))
    .item_disabled("Archive")
    .separator()
    .item("Delete", move || action.set("delete".to_string()))

Shortcut labels display hints; application code supplies any global shortcut bindings. dropdown_menu_custom(|open| div()...) supplies a custom trigger. .min_width(..), .position(..), .align(..) and .offset(..) place the menu.

While the menu is open, Up and Down wrap through enabled rows, Home and End jump to the first and last, and Enter or Space activates the focused row. Right opens a submenu; Left returns to its parent row. Escape closes the current menu and restores focus. Tab closes the menu and continues past its trigger; Shift+Tab moves back. Disabled rows and separators are skipped. Down or Up on a closed trigger opens at its first or last enabled row. A pointer opens with focus on the panel, ready for the first arrow key.

.cn-dropdown-trigger styles the visual trigger. Its surrounding [aria-haspopup="menu"] element holds keyboard focus, including for custom triggers; restyle [aria-haspopup="menu"]:focus-visible for its outline. The panel and its rows share the .cn-menu, .cn-menu-item, .cn-menu-item-label, .cn-menu-shortcut and .cn-menu-separator rules with other menus:

.cn-dropdown-trigger:hover { background: #1e1e2a; }
.cn-menu-item:hover, .cn-menu-item:focus-visible { background: var(--accent-subtle); }

Platforms and version

The component API is available in Blinc 0.6.0. The Live example runs in a dedicated worker and requires a compatible GPU surface. Preview and Code remain available when Live cannot start. The canvas has a descriptive label; a full screen-reader DOM mirror is not provided. The gallery integration is based on revision e2e55c24e078.

Recordings and live demos use the default Hybrid theme with bundled Noto Sans. The recording uses a 560 × 320 logical viewport at twice that resolution. Live follows its container and actual display density. Source base revision · Exact build source · Artifact versions and checksums · Font license.