{% macro input_hidden(name, value) %}
{% apply spaceless %}
    <input type="hidden" name="{{ name }}" value="{{ value }}">
{% endapply %}
{% endmacro %}

{% macro input_csrf(name) %}
{% from _self import input_hidden %}
{% apply spaceless %}
    {{ input_hidden(name|default('_csrf'), csrf_token()) }}
{% endapply %}
{% endmacro %}

{% macro input_text(name, class, value, type, placeholder, required, attributes, tabindex, autofocus, raw) %}
{% apply spaceless %}
    <input type="{{ type|default('text') }}" {% if name|length > 0 %}name="{{ name }}"{% else %}readonly{% endif %}
        class="{% if not raw|default(false) %}input__text{% if name|length < 1 %} input__text--readonly{% endif %}{% endif %}{{ class|length > 0 ? ' ' ~ class : '' }}"
        {% if placeholder|length > 0 %}placeholder="{{ placeholder }}"{% endif %}
        {% if value|length > 0 %}value="{{ value }}"{% endif %} {% if required|default(false) %}required{% endif %}
        {% if tabindex > 0 %}tabindex="{{ tabindex }}"{% endif %} {% if autofocus|default(false) %}autofocus{% endif %}
        {% for name, value in attributes|default([]) %}
            {{ name }}{% if value|length > 0 %}="{{ value }}"{% endif %}
        {% endfor %}>
{% endapply %}
{% endmacro %}

{% macro input_checkbox_raw(name, checked, class, value, radio, attributes, disabled) %}
{% apply spaceless %}
    <input type="{{ radio ? 'radio' : 'checkbox' }}" class="{{ class|length > 0 ? class : 'input__checkbox__input' }}"
        {% if name|length > 0 %}name="{{ name }}"{% endif %}
        {% if checked %}checked{% endif %}
        {% if disabled %}disabled{% endif %}
        {% if value|length > 0 %}value="{{ value }}"{% endif %}
        {% for name, value in attributes|default([]) %}
            {{ name }}{% if value|length > 0 %}="{{ value }}"{% endif %}
        {% endfor %}>
{% endapply %}
{% endmacro %}

{% macro input_checkbox(name, text, checked, class, value, radio, attributes, disabled) %}
{% from _self import input_checkbox_raw %}
{% apply spaceless %}
    <label class="input__checkbox{% if radio %} input__checkbox--radio{% endif %}{% if disabled %} input__checkbox--disabled{% endif %}{{ class|length > 0 ? ' ' ~ class : '' }}">
        {{ input_checkbox_raw(name, checked, '', value, radio, attributes, disabled) }}
        <div class="input__checkbox__display">
            <div class="input__checkbox__display__icon"></div>
        </div>
        {% if text|length > 0 %}
            <div class="input__checkbox__text">
                {{ text }}
            </div>
        {% endif %}
    </label>
{% endapply %}
{% endmacro %}

{% macro input_file_raw(name, class, accepts, attributes) %}
{% apply spaceless %}
    <input type="file" {% if name|length > 0 %}name="{{ name }}"{% endif %}
        class="{{ class|length > 0 ? class : 'input__upload__input' }}"
        {% if accepts|length > 0 %}accept="{{ accepts|join(',') }}"{% endif %}
        {% for name, value in attributes|default([]) %}
            {{ name }}{% if value|length > 0 %}="{{ value }}"{% endif %}
        {% endfor %}>
{% endapply %}
{% endmacro %}

{% macro input_file(name, class, accepts, attributes) %}
{% from _self import input_file_raw %}
{% apply spaceless %}
    <label class="input__upload">
        {{ input_file_raw(name, class, accepts, attributes) }}
        <div class="input__upload__selection">
            Click here to select a file!
        </div>
        <script>
            const parent = document.currentScript.parentNode,
                input = parent.querySelector('input[type="file"]'),
                display = parent.querySelector('.input__upload__selection');
            input.addEventListener('change', ev => display.textContent = Array.from(ev.target.files).map(f => f.name).join(', '));
        </script>
    </label>
{% endapply %}
{% endmacro %}

{% macro input_select_option(value, key, selected) %}
{% apply spaceless %}
    <option{% if key|length > 0 %} value="{{ key }}"{% endif %}{% if selected %} selected{% endif %}>
        {{ value }}
    </option>
{% endapply %}
{% endmacro %}

{% macro input_select(name, options, selected, value_name, key_name, only_values, class, attributes) %}
{% from _self import input_select_option %}
{% apply spaceless %}
    <select class="input__select{{ class|length > 0 ? ' ' ~ class : '' }}"
        {% if name|length > 0 %}name="{{ name }}"{% endif %}
        {% for name, value in attributes|default([]) %}
            {{ name }}{% if value|length > 0 %}="{{ value }}"{% endif %}
        {% endfor %}>
        {% for key, value in options %}
            {% set option_value = value_name|length > 0 ? value[value_name] : value %}
            {% set option_key = only_values ? '' : (key_name|length > 0 ? value[key_name] : key) %}
            {{ input_select_option(option_value, option_key, option_key|default(option_value) == selected) }}
        {% endfor %}
    </select>
{% endapply %}
{% endmacro %}

{% macro input_colour(name, class, value) %}
{% apply spaceless %}
    <label class="input__colour{% if class %} {{ class }}{% endif %}">
        <div class="input__colour__overlay"></div>
        <input type="color" {% if name|length > 0 %}name="{{ name }}"{% else %}readonly onclick="return false"{% endif %}
        value="{{ value }}" class="input__colour__control">
    </label>
{% endapply %}
{% endmacro %}