{% extends "public_base.html" %} {% import "configurator/_macros.html" as ck %} {# What an option card says about its feature: the name with its released version, what it does, and its package. The package is two boxes, the org and the name, so a narrow card wraps after the slash rather than at the hyphen in "splent-io"; the org is the same everywhere, so a phone hides it (skin_store). The description and version come from the marketplace index and are simply left out for a feature it does not publish. #} {% macro option_body(feature, auto=true) -%} {{ feature.short }}{% if feature.version %} v{{ feature.version }}{% endif %}{% if feature.external %} {{ _("external") }}{% endif %} {% if feature.description %}{{ feature.description }}{% endif %} {% if feature.org %}{{ feature.org }}/{% endif %}{{ feature.package }} {% if auto %}{{ _("required by your selection") }}{% endif %} {%- endmacro %} {# The feature's marketplace page, in a new tab so the selection stays put. A link inside a label follows the link and leaves the checkbox alone. #} {% macro option_link(feature) -%} {% if feature.url %}{{ ck.icon("external-link", 15) }}{% endif %} {%- endmacro %} {% block title %}{{ _("Configure %(name)s", name=spl.name) }}{% endblock %} {% block head %} {% endblock %} {% block hero %}

{{ spl.name }}

{% if spl.description %}

{{ spl.description }}

{% endif %}
{% endblock %} {% block content %}
{# ── Step 2: feature selection ──────────────────────────────────── #}

{{ _("Lowercase letters, digits and underscores.") }}

{% if tree.mandatory %}

{{ ck.icon("lock") }}{{ _("Core features") }}

{{ _("Always included in every product of this line.") }}

{% for feature in tree.mandatory %} {% endfor %}
{% endif %} {% for group in tree.groups %} {# An "or" group takes any number of its members, so its options are checkboxes; an alternative takes one, so they are radios. #} {% set multiple = group.kind == "or" %}

{{ ck.icon("git-branch") }}{{ group.owner }}

{% if multiple and group.required %} {{ _("Pick at least one.") }} {% elif multiple %} {{ _("Pick any number, or none.") }} {% elif group.required %} {{ _("Exclusive group. Pick exactly one.") }} {% else %} {{ _("Exclusive group. Pick one at most.") }} {% endif %}

{% for member in group.members %} {% endfor %} {% if not group.required and not multiple %} {% endif %}
{% endfor %} {% if tree.optional %}

{{ ck.icon("plus") }}{{ _("Optional features") }}

{{ _("Dependencies are added automatically as you select.") }}

{% for feature in tree.optional %} {% endfor %}
{% endif %} {# A phone shows the panel below every option, so checking one gave no feedback in sight. This bar keeps the verdict at the bottom of the screen while the options scroll, and rests at the end of them, right above the panel it points to, so it never covers anything there. A wide screen has the panel beside the options and never shows it (skin_store). Not a live region: the panel already announces the verdict. #}
{{ ck.icon("loader", 18) }} {{ ck.icon("check-circle", 18) }} {{ ck.icon("x-circle", 18) }} {{ ck.icon("alert-triangle", 18) }} {{ _("Checking the selection") }} {{ _("See commands") }}{{ ck.icon("arrow-down", 14) }}
{# ── Step 3: live validation + commands (sticky) ────────────────── #}
{% endblock %} {% block scripts %} {% endblock %}