{# CSS styling #}
<style>
    button[type=submit].freeform-processing {
        display: inline-flex;
        flex-wrap: nowrap;
        align-items: center;
    }
    button[type=submit].freeform-processing:before {
        content: "";
        display: block;
        flex: 1 0 11px;
        width: 11px;
        height: 11px;
        margin-right: 10px;
        border-style: solid;
        border-width: 2px;
        border-color: transparent transparent #fff #fff;
        border-radius: 50%;
        animation: freeform-processing .5s linear infinite;
    }
    @keyframes freeform-processing {
        0% {
            transform: rotate(0);
        }
        100% {
            transform: rotate(1turn);
        }
    }
    .freeform-pages {
        padding: 0;
        margin: 0 0 10px;
        list-style: none;
    }
    .freeform-pages:after {
        content: "";
        display: table;
        clear: both;
    }
    .freeform-pages li {
        float: left;
        margin: 0 10px 0 0;
    }
    .freeform-row {
        display: block;
        margin: 0 -15px;
    }
    .freeform-row:after {
        content: "";
        display: table;
        clear: both;
    }
    .freeform-row .freeform-column {
        display: block;
        padding: 10px 15px;
        float: left;
        box-sizing: border-box;
    }
    .freeform-row .freeform-column:after {
        content: "";
        display: table;
        clear: both;
    }
    .freeform-row .freeform-column > .freeform-row:first-child {
        margin-top: -10px;
    }
    .freeform-row .freeform-column label {
        display: block;
    }
    .freeform-row .freeform-column .input-group-one-line label {
        display: inline-block;
        padding-right: 10px;
    }
    .freeform-row .freeform-column .freeform-label,
    .freeform-group .freeform-label {
        font-weight: bold;
    }
    .freeform-row .freeform-column .freeform-label.freeform-required:after {
        content: "*";
        margin-left: 5px;
        color: red;
    }
    .freeform-row .freeform-column .freeform-input {
        width: 100%;
        display: block;
        box-sizing: border-box;
    }
    .freeform-row .freeform-column .freeform-input[type=checkbox],
    .freeform-row .freeform-column .freeform-input[type=radio] {
        width: auto;
        display: inline;
        margin-right: 5px;
    }
    .freeform-row .freeform-column .freeform-input-only-label {
        font-weight: normal;
    }
    .freeform-row .freeform-column .freeform-input-only-label > .freeform-input {
        display: inline-block;
        width: auto;
        margin-right: 5px;
    }
    .freeform-row .freeform-column .freeform-errors {
        list-style: none;
        padding: 0;
        margin: 5px 0 0;
    }
    .freeform-row .freeform-column .freeform-errors > li {
        color: red;
    }
    .freeform-row .freeform-column .freeform-instructions {
        margin: 0 0 5px;
        font-size: 13px;
        color: #aba7a7;
    }
    .freeform-row .freeform-column-1 {
        width: 8.3333333333%}
    .freeform-row .freeform-column-2 {
        width: 16.6666666667%}
    .freeform-row .freeform-column-3 {
        width: 25%}
    .freeform-row .freeform-column-4 {
        width: 33.3333333333%}
    .freeform-row .freeform-column-5 {
        width: 41.6666666667%}
    .freeform-row .freeform-column-6 {
        width: 50%}
    .freeform-row .freeform-column-7 {
        width: 58.3333333333%}
    .freeform-row .freeform-column-8 {
        width: 66.6666666667%}
    .freeform-row .freeform-column-9 {
        width: 75%}
    .freeform-row .freeform-column-10 {
        width: 83.3333333333%}
    .freeform-row .freeform-column-11 {
        width: 91.6666666667%}
    .freeform-row .freeform-column-12 {
        width: 100%}
    .freeform-form-errors {
        padding: 15px;
        border: 1px solid #f5c6cb;
        background: #f8d7da;
        border-radius: 5px;
        color: #721c24;
    }
    .freeform-form-errors > p {
        margin: 0;
    }
    .freeform-group {
        width: 100%;
        padding: 0 15px;
    }
</style>

{# Render the opening form tag #}
{{ form.renderTag({
    attributes: {
        row: { class: "freeform-row" },
        success: { class: "freeform-form-success" },
        errors: { class: "freeform-form-errors" },
    },
    buttons: {
        attributes: {
            container: { class: "freeform-button-container" },
            column: { class: "freeform-button-column" },
            buttonWrapper: { class: "freeform-button-wrapper" },
            submit: { class: "freeform-button-submit" },
            back: { class: "freeform-button-back" },
            save: { class: "freeform-button-save" },
        },
    },
    fields: {
        "@global": {
            attributes: {
                container: { class: "freeform-column" },
                input: {
                    novalidate: true,
                    class: "freeform-input",
                },
                label: { class: "freeform-label" },
                instructions: { class: "freeform-instructions" },
                error: { class: "freeform-errors" },
            },
        },
        ":required": {
            attributes: {
                label: { "+class": "freeform-required" },
            },
        },
        ":errors": {
            attributes: {
                input: { "+class": "is-invalid has-validation" },
            },
        },
        "@group": {
            attributes: {
                label: { "+class": "group-label" },
            },
        },
        "@signature": {
            attributes: {
                input: { "-class": "freeform-input" },
            },
        }
    },
}) }}

{# JS overrides #}
<script>
var form = document.querySelector('[data-id="{{ form.anchor }}"]');
if (form) {
    form.addEventListener("freeform-stripe-appearance", function (event) {
        event.elementOptions.appearance = Object.assign(
            event.elementOptions.appearance,
            {
                variables: {
                    colorPrimary: "#0d6efd",
                },
            }
        );
    });
}
</script>

{# Success and error message handling for non-AJAX forms #}
{% if not form.settings.ajax %}
    {% if form.submittedSuccessfully %}
        <div{{ form.attributes.success }}>
            <p>{{ form.settings.successMessage | t('freeform') }}</p>
        </div>
    {% endif %}
    {% if form.hasErrors %}
        <div{{ form.attributes.errors }}>
            <p>{{ form.settings.errorMessage | t('freeform') }}</p>

            {% if form.errors|length %}
                <ul>
                    {% for error in form.errors %}
                        <li>{{ error }}</li>
                    {% endfor %}
                </ul>
            {% endif %}
        </div>
    {% endif %}
{% endif %}

{# Render page tabs if multi-page #}
{% if form.pages|length > 1 %}
    <ul class="freeform-pages">
        {% for page in form.pages %}
            <li {% if form.currentPage.index == page.index %}class="active"{% endif %}>
                {% if form.currentPage.index == page.index %}
                    <b>{{ page.label }}</b>
                {% else %}
                    {{ page.label }}
                {% endif %}
            </li>
        {% endfor %}
    </ul>
{% endif %}

{# Build form rows and fields #}
{% macro renderRows(form, rows) %}
    {% for row in rows %}
        {% set width = (12 / (row|length)) %}
        <div{{ form.attributes.row }}>
            {% for field in row %}
                {% do field.setParameters({
                    attributes: {
                        container: { class: [
                            "freeform-column-" ~ width,
                            "freeform-fieldtype-" ~ field.type,
                        ]},
                    },
                }) %}
                {% if field.type == "group" %}
                    <div class="freeform-group">
                        <label{{ field.attributes.label }}>
                            {{ field.label }}
                        </label>
                        <div>
                            {{ _self.renderRows(form, field.layout) }}
                        </div>
                    </div>
                {% else %}
                    {{ field.render }}
                {% endif %}
            {% endfor %}
        </div>
    {% endfor %}
{% endmacro %}

{# Display form field rows and columns #}
{{ _self.renderRows(form, form.rows) }}

{# Render the closing form tag #}
{{ form.renderClosingTag }}