{# Form Macros =========== Reusable form input components. Usage: {% from 'shared/macros/forms.html' import form_input, form_select, form_textarea, form_checkbox, password_input, input_with_icon %} {{ form_input('Email', 'email', 'formData.email', type='email', required=true) }} {{ form_select('Status', 'formData.status', [{'value': 'active', 'label': 'Active'}]) }} {{ form_textarea('Description', 'formData.description', rows=4) }} {{ password_input('Password', 'formData.password', required=true) }} {{ input_with_icon('Search', 'query', 'search', icon='search', icon_position='left') }} #} {# Form Input ========== A text input field with label, validation, and error handling. Parameters: - label: Field label - name: Input name attribute - x_model: Alpine.js x-model binding - type: Input type (default: 'text') - placeholder: Placeholder text - required: Whether the field is required (default: false) - disabled: Alpine.js expression for disabled state - error: Alpine.js expression for error message - help: Help text shown below the input - maxlength: Maximum length - min: Minimum value (for number inputs) - max: Maximum value (for number inputs) - step: Step value (for number inputs) - autocomplete: Autocomplete attribute - class_extra: Additional CSS classes for the input #} {% macro form_input(label, name, x_model, type='text', placeholder='', required=false, disabled=none, error=none, help=none, maxlength=none, min=none, max=none, step=none, autocomplete=none, class_extra='') %} {% endmacro %} {# Form Select =========== A select dropdown with label and error handling. Parameters: - label: Field label - x_model: Alpine.js x-model binding - options: List of options [{'value': '', 'label': ''}] or Alpine.js expression - name: Input name attribute - required: Whether the field is required (default: false) - disabled: Alpine.js expression for disabled state - error: Alpine.js expression for error message - placeholder: First empty option text (default: 'Select...') - on_change: Alpine.js @change handler #} {% macro form_select(label, x_model, options=[], name='', required=false, disabled=none, error=none, placeholder='Select...', on_change=none) %} {% endmacro %} {# Form Select (Dynamic Options) ============================= A select dropdown with options from Alpine.js. Parameters: - label: Field label - x_model: Alpine.js x-model binding - options_var: Alpine.js variable containing options array - value_key: Key for option value (default: 'value') - label_key: Key for option label (default: 'label') - ... (other params same as form_select) #} {% macro form_select_dynamic(label, x_model, options_var, value_key='value', label_key='label', name='', required=false, disabled=none, error=none, placeholder='Select...', on_change=none) %} {% endmacro %} {# Form Textarea ============= A textarea field with label and error handling. Parameters: - label: Field label - x_model: Alpine.js x-model binding - name: Input name attribute - rows: Number of rows (default: 3) - placeholder: Placeholder text - required: Whether the field is required (default: false) - disabled: Alpine.js expression for disabled state - error: Alpine.js expression for error message - maxlength: Maximum length #} {% macro form_textarea(label, x_model, name='', rows=3, placeholder='', required=false, disabled=none, error=none, maxlength=none) %} {% endmacro %} {# Form Checkbox ============= A checkbox input with label. Parameters: - label: Checkbox label - x_model: Alpine.js x-model binding - name: Input name attribute - disabled: Alpine.js expression for disabled state - help: Help text shown below #} {% macro form_checkbox(label, x_model, name='', disabled=none, help=none) %} {% if help %} {{ help }} {% endif %} {% endmacro %} {# Form Toggle Switch ================== A toggle switch (styled checkbox). Parameters: - label: Toggle label - x_model: Alpine.js x-model binding - disabled: Alpine.js expression for disabled state #} {% macro form_toggle(label, x_model, disabled=none) %}
{{ label }}
{% endmacro %} {# Form Radio Group ================ A group of radio buttons. Parameters: - label: Group label - name: Radio group name - x_model: Alpine.js x-model binding - options: List of options [{'value': '', 'label': ''}] - inline: Whether to display inline (default: false) #} {% macro form_radio_group(label, name, x_model, options=[], inline=false) %}
{{ label }}
{% for option in options %} {% endfor %}
{% endmacro %} {# Search Input ============ A search input with icon. Parameters: - x_model: Alpine.js x-model binding - placeholder: Placeholder text (default: 'Search...') - on_input: Alpine.js @input handler (e.g., 'debouncedSearch()') - class_extra: Additional CSS classes #} {% macro search_input(x_model, placeholder='Search...', on_input=none, class_extra='') %}
{% endmacro %} {# Filter Select ============= A compact select for filtering (no label, inline style). Parameters: - x_model: Alpine.js x-model binding - options: List of options [{'value': '', 'label': ''}] - on_change: Alpine.js @change handler - placeholder: First option text (default: 'All') #} {% macro filter_select(x_model, options=[], on_change=none, placeholder='All') %} {% endmacro %} {# Password Input ============== A password input with show/hide toggle. Parameters: - label: Field label - x_model: Alpine.js x-model binding - name: Input name attribute - placeholder: Placeholder text (default: 'Enter password') - required: Whether the field is required (default: false) - disabled: Alpine.js expression for disabled state - error: Alpine.js expression for error message - help: Help text shown below the input - minlength: Minimum password length - autocomplete: Autocomplete attribute (default: 'current-password') - show_strength: Whether to show password strength indicator (default: false) #} {% macro password_input(label, x_model, name='password', placeholder='Enter password', required=false, disabled=none, error=none, help=none, minlength=none, autocomplete='current-password', show_strength=false) %}
{% if show_strength %}

{% endif %}
{% endmacro %} {# Input with Icon =============== A text input with an icon on the left or right. Parameters: - label: Field label - x_model: Alpine.js x-model binding - name: Input name attribute - icon: Icon name (uses $icon helper) - icon_position: 'left' | 'right' (default: 'left') - type: Input type (default: 'text') - placeholder: Placeholder text - required: Whether the field is required - disabled: Alpine.js expression for disabled state - error: Alpine.js expression for error message - on_click_icon: Alpine.js handler when icon is clicked (makes icon a button) #} {% macro input_with_icon(label, x_model, name, icon, icon_position='left', type='text', placeholder='', required=false, disabled=none, error=none, on_click_icon=none) %} {% endmacro %} {# File Input ========== A styled file input with drag and drop support. Parameters: - label: Field label - name: Input name attribute - accept: Accepted file types (e.g., 'image/*', '.pdf,.doc') - multiple: Allow multiple files (default: false) - max_size: Maximum file size in MB (for display only) - on_change: Alpine.js handler when files are selected - help: Help text #} {% macro file_input(label, name, accept='*', multiple=false, max_size=none, on_change=none, help=none) %}

Click to upload or drag and drop

{% if help %}

{{ help }}

{% elif max_size %}

Max file size: {{ max_size }}MB

{% endif %}
{% endmacro %} {# Searchable Select ================= A select dropdown with search/filter functionality. Parameters: - label: Field label - x_model: Alpine.js x-model binding for selected value - options_var: Alpine.js variable containing options array - value_key: Key for option value (default: 'value') - label_key: Key for option label (default: 'label') - search_var: Alpine.js variable for search query (default: 'searchQuery') - open_var: Alpine.js variable for dropdown open state (default: 'isOpen') - placeholder: Placeholder text (default: 'Select...') - search_placeholder: Search input placeholder (default: 'Search...') - required: Whether the field is required - disabled: Alpine.js expression for disabled state - no_results_text: Text shown when no results (default: 'No results found') Usage:
{{ searchable_select('Category', 'selected', 'filteredOptions', value_key='id', label_key='name') }}
#} {% macro searchable_select(label, x_model, options_var, value_key='value', label_key='label', search_var='searchQuery', open_var='isOpen', placeholder='Select...', search_placeholder='Search...', required=false, disabled=none, no_results_text='No results found') %}
{% endmacro %} {# Multi-Select with Tags ====================== A multi-select dropdown that shows selected items as tags. Parameters: - label: Field label - selected_var: Alpine.js variable for selected values array - options_var: Alpine.js variable containing options array - value_key: Key for option value (default: 'value') - label_key: Key for option label (default: 'label') - placeholder: Placeholder text (default: 'Select items...') - max_items: Maximum number of items (optional) Required Alpine.js methods: toggleOption(option) - Add/remove option from selection removeOption(value) - Remove option by value isSelected(value) - Check if option is selected getLabel(value) - Get label for a value #} {% macro multi_select(label, selected_var, options_var, value_key='value', label_key='label', placeholder='Select items...', max_items=none) %}
{% if max_items %}

/ {{ max_items }} selected

{% endif %}
{% endmacro %}