{# ── S-142 wizard step body wrapper ────────────────────────────────────── Common scaffolding for all six step bodies. Inputs: * ``step`` — int 1..6 of the step being rendered. * ``step_labels`` — tuple[str, ...] (so the header reads from the same constant as the rail). * ``has_back`` — bool, suppress the Back button on step 1. * ``has_next`` — bool, suppress the Next button on step 6. Step body content (the ``content`` block) is the only seam S-143 needs to override — the navigation form below stays untouched so flows always POST to ``/wizard/step/{step}`` with the right HTMX swap target. The form posts to the body slot via HTMX so the rail + URL stay stable. ── #}
Step {{ step }}

{{ step_labels[step - 1] }}

{# ── S-144 Open in Studio handoff ────────────────────────────────────── Pure UI: jump to the full Studio without re-loading state. Both surfaces bind to the same ``app.state.workspace`` singleton, so the schema / spec / last_result the user loaded in the wizard appear in Studio on the very first render — no state transfer payload needed. Plain ```` (progressive enhancement: works without JS). The ``ml-auto`` utility pushes the anchor to the right end of the header flex row, placing it visually top-right of the step body card. The stable ``data-testid`` is the seam parallel sibling stories key off to confirm the affordance is rendered without duplicating it. ── #} Open in Studio →
{% block content %}{% endblock %}
{% block extra_fields %}{% endblock %}
{% if has_back %} {% else %} {% endif %}
{% if has_next %} {% else %} {% endif %}