{# Dropdown Macros =============== Reusable dropdown menu components with Alpine.js integration. Usage: from 'shared/macros/dropdowns.html' import dropdown, dropdown_menu, context_menu Basic dropdown: call dropdown('Actions', 'isDropdownOpen') dropdown_item('Edit', 'edit()', icon='pencil') dropdown_item('Delete', 'delete()', icon='trash', variant='danger') endcall Context menu (3-dot icon): call context_menu('itemMenu', 'isMenuOpen') dropdown_item('View', 'view()') dropdown_divider() dropdown_item('Delete', 'delete()', variant='danger') endcall #} {# Dropdown ======== A dropdown menu triggered by a button. Parameters: - label: Button label - open_var: Alpine.js variable for open state (default: 'isDropdownOpen') - position: 'left' | 'right' (default: 'right') - icon: Button icon (default: 'chevron-down') - variant: 'primary' | 'secondary' | 'ghost' (default: 'secondary') - size: 'sm' | 'md' (default: 'md') - width: Dropdown width class (default: 'w-48') #} {% macro dropdown(label, open_var='isDropdownOpen', position='right', icon='chevron-down', variant='secondary', size='md', width='w-48') %} {% set variants = { 'primary': 'text-white bg-purple-600 hover:bg-purple-700 border-transparent', 'secondary': 'text-gray-700 dark:text-gray-300 bg-white dark:bg-gray-800 hover:bg-gray-50 dark:hover:bg-gray-700 border-gray-300 dark:border-gray-600', 'ghost': 'text-gray-600 dark:text-gray-400 bg-transparent hover:bg-gray-100 dark:hover:bg-gray-700 border-transparent' } %} {% set sizes = { 'sm': 'px-3 py-1.5 text-xs', 'md': 'px-4 py-2 text-sm' } %} {% set positions = { 'left': 'left-0', 'right': 'right-0' } %}