Skip to main content

Dropdown

The Dropdown component provides a floating menu that appears on trigger interaction. It's ideal for contextual actions, navigation menus, and option lists.

Overview

Dropdown provides a complete menu solution with:

  • Multiple trigger modes (click, hover, focus)
  • Configurable placement
  • Animation support
  • Nested/cascading menus
  • Custom trigger content
  • Auto-close behavior

Basic Usage

{
uuid: "my-dropdown",
name: "actions_dropdown",
component_type: "dropdown",
input: {
label: { type: "string", value: "Actions" }
},
inputHandlers: {
options: `
return [
{ label: 'Edit', value: 'edit', icon: 'edit' },
{ label: 'Duplicate', value: 'duplicate', icon: 'copy' },
{ label: 'Delete', value: 'delete', icon: 'trash' }
];
`
},
event: {
onItemClick: `
const action = EventData.value;
if (action === 'edit') {
$editMode = true;
} else if (action === 'delete') {
$showDeleteConfirm = true;
}
`
}
}

Component Inputs

PropertyTypeDefaultDescription
optionsarray[]Array of menu items
labelstring''Trigger label (if no children)
placeholderstring''Placeholder text
showbooleanfalseProgrammatically control open state
triggerstring'click'Trigger mode: 'click', 'hover', 'focus', 'manual'
placementstring'bottom'Menu placement
animationstring'fade'Animation: 'none', 'fade', 'slide', 'scale'
arrowbooleanfalseShow arrow pointing to trigger
autoClosebooleantrueClose on item click
closeOnOutsideClickbooleantrueClose on outside click
closeOnEscapebooleantrueClose on Escape key
offsetnumber4Distance from trigger
maxHeightstring'300px'Maximum dropdown height
minWidthstring'auto'Minimum dropdown width
statestring'default'State: 'default', 'disabled'
sizestring'medium'Size: 'small', 'medium', 'large'

Events

onItemClick

Triggered: When a menu item is clicked

EventData:

{
value: any // Item value
item: object // Full item object
additionalData: any // Custom item data
}

onOpen / onClose

Triggered: When dropdown opens/closes


Custom Trigger Content

The dropdown supports custom trigger content via child components:

{
uuid: "custom-dropdown",
component_type: "dropdown",
childrenIds: ["trigger-button"],
inputHandlers: {
options: `
return [
{ label: 'Profile', value: 'profile', icon: 'user' },
{ label: 'Settings', value: 'settings', icon: 'settings' },
{ type: 'divider' },
{ label: 'Logout', value: 'logout', icon: 'log-out' }
];
`
}
}

Common Patterns

Context Menu

{
component_type: "dropdown",
input: {
trigger: { type: "string", value: "click" },
placement: { type: "string", value: "bottom-start" }
},
inputHandlers: {
options: `
return [
{ label: 'Cut', value: 'cut', icon: 'scissors' },
{ label: 'Copy', value: 'copy', icon: 'copy' },
{ label: 'Paste', value: 'paste', icon: 'clipboard' },
{ type: 'divider' },
{ label: 'Delete', value: 'delete', icon: 'trash', danger: true }
];
`
},
event: {
onItemClick: `
const action = EventData.value;
switch (action) {
case 'cut': await CutSelection(); break;
case 'copy': await CopySelection(); break;
case 'paste': await PasteFromClipboard(); break;
case 'delete': await DeleteSelection(); break;
}
`
}
}

User Menu

{
component_type: "dropdown",
input: {
trigger: { type: "string", value: "click" },
placement: { type: "string", value: "bottom-end" }
},
inputHandlers: {
options: `
return [
{ label: $currentUser?.name || 'User', value: 'header', disabled: true },
{ type: 'divider' },
{ label: 'Profile', value: 'profile', icon: 'user' },
{ label: 'Settings', value: 'settings', icon: 'settings' },
{ type: 'divider' },
{ label: 'Logout', value: 'logout', icon: 'log-out', danger: true }
];
`
},
event: {
onItemClick: `
if (EventData.value === 'logout') {
await Logout();
navigateTo('login');
} else {
navigateTo(EventData.value);
}
`
}
}

See Also