{# 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) %}
Click to upload or drag and drop
{% if help %}{{ help }}
{% elif max_size %}Max file size: {{ max_size }}MB
{% endif %}/ {{ max_items }} selected
{% endif %}