{% extends "basis.html" %}{% from "schalter.html" import schalter %} {# Ory-Anmeldung (Bau 16.10.2026, Mockups Runde 2): eine Vorlage für Registrieren, Anmelden, Code, Bist du’s?, zweiter Faktor, Zugang vergessen, Adresse bestätigen und Konto & Anmeldewege. Alle Formulare posten an Timbres Vorschalter (v.action), nie direkt an Kratos. Fehler nach Neuladen (B2): Titel „Fehler: …“, Zusammenfassung oben (fokussiert von anmeldung.js), Felder mit aria-invalid + aria-describedby. Ohne Skript gehen Code, Passwort und Dienste. #} {% set ta = ta %} {% block titel %}{% if v.fehler %}{{ ta.fehler_praefix }}{% endif %}{{ ta.titel[v.seite] }} – Timbre{% endblock %} {% block kopf %}{% endblock %} {% block hauptklasse %} class="an-haupt"{% endblock %} {% block inhalt %}{% set ansicht = v.seite %} {% macro fehlerliste() %}{% if v.fehler %}

{{ ta.fehler_ueberschrift }}

{% endif %}{% endmacro %} {% macro hinweise() %}{% for h in v.hinweise %}

{{ h.text }}

{% endfor %}{% endmacro %} {% macro feldfehler(id) %}{% for f in v.fehler %}{% if f.feld == id %}{{ f.text }}{% endif %}{% endfor %}{% endmacro %} {% macro invalid(id) %}{% for f in v.fehler if f.feld == id %}{% if loop.first %} aria-invalid="true" aria-describedby="{{ id }}-fehler"{% endif %}{% endfor %}{% endmacro %} {% macro csrf() %}{% endmacro %} {% macro dienste_knoepfe(name="provider") %}{% if v.dienste %}
{% for d in v.dienste %}{% endfor %}
{% endif %}{% endmacro %} {% macro fuenf(ist) %}
    {% for s in ta.schritte %}
  1. {{ s }}{% if loop.index < ist %} – {{ ta.erledigt }}{% endif %}
  2. {% endfor %}
{% endmacro %} {% if ansicht == "registrieren" %}

{{ t.store.los if neutral else ta.reg_marke }}

{{ ta.reg_zeile }} {{ ta.reg_akzent }}

{# Early Bird / Store-Fassungen (11.11.2026): ohne die Sätze der Warteliste (texte_earlybird.py) #} {% set E = t.earlybird %}

{{ E.reg_text if neutral else ta.reg_text }}

{# M7: Dienste nur versprechen, wenn sie eingerichtet sind #} {{ fuenf(1) }}

{{ ta.titel.registrieren }}

{{ fehlerliste() }}{{ hinweise() }}
{{ csrf() }} {{ feldfehler('f-zustimmung') }}
{{ feldfehler('f-adresse') }}

{{ ta.reg_hinweis }}

{{ ta.lieber_passwort }}

{{ ta.passwort_erklaerung }}

{{ dienste_knoepfe() }}

{{ ta.reg_fuss }} {{ ta.anmelden_link }}

{% elif ansicht == "code" %}

{{ ta.code_titel }}

{{ fehlerliste() }}{{ hinweise() }} {% set vielleicht = v.art == "recovery" or (v.art == "login" and v.einheitlich) %} {% set teile = (ta.code_text_vielleicht if vielleicht else ta.code_text).split("{adresse}") %}

{{ teile[0] }}{{ v.adresse }}{{ teile[1] }}

{{ csrf() }} {% if v.art == "registration" %} {% elif v.art == "login" %} {% endif %}{# Zugang/Bestätigen: keine Adresse mitschicken – Kratos würde sonst einen neuen Code senden statt zu prüfen #}
{{ ta.code_hilfe }}{{ feldfehler('f-code') }}
{% if v.art in ("registration", "login") %}{% endif %}
{% elif ansicht in ("anmelden", "bistdus") %}

{{ ta.anm_titel if ansicht == "anmelden" else ta.bistdus_titel }}

{% if ansicht == "bistdus" %}

{{ ta.bistdus_text }}

{% endif %} {% if anm_hinweis %}

{{ ta['hinweis_' ~ anm_hinweis] }}

{% endif %} {{ fehlerliste() }}{{ hinweise() }} {% if v.passkey_challenge %}
{{ csrf() }}

{{ ta.passkey_hilfe }}

{% endif %} {% if "code" in v.gruppen %}
{{ csrf() }}
{{ feldfehler('f-adresse') }}
{% if ansicht == "anmelden" %}{{ dienste_knoepfe() }}{% endif %}
{% endif %} {% if "password" in v.gruppen %}
{{ ta.mit_passwort }}
{{ csrf() }}
{{ feldfehler('f-passwort') }} {{ schalter(tasten.passwort_zeigen, ta.passwort_anzeigen, klasse="klein an-nurjs", daten={"zeigen": "f-passwort"}) }}
{% endif %} {% if ansicht == "anmelden" %} {% endif %}
{% elif ansicht == "zweiter" %} {# Meldung 24.10.2026: alle vorhandenen zweiten Faktoren anbieten – Passkey (ein Klick) → App-Code → Wiederherstellungscode (dezent, nur offen, wenn er der einzige Weg ist). Passkey läuft über einen eigenen refresh-Flow (passkey_schritt). #}

{{ ta.zweiter_titel }}

{{ ta.zweiter_text_passkey if passkey_schritt else ta.zweiter_text }}

{{ fehlerliste() }}{{ hinweise() }} {% if passkey_schritt %}
{{ csrf() }}

{{ ta.passkey_hilfe }}

{% if anderer_weg %}

{{ ta.anderer_faktor }}

{% endif %} {% else %} {% set hat_totp = "totp" in v.gruppen %}{% set hat_lookup = "lookup_secret" in v.gruppen %} {% if passkey_weg %}{{ ta.passkey_bestaetigen }} {% if hat_totp %}{% endif %}{% endif %} {% if hat_totp %}
{{ csrf() }}
{{ ta.totp_hilfe }}{{ feldfehler('f-totp') }}
{% endif %} {% if hat_lookup %} {% set lookup_form %}
{{ csrf() }}
{{ feldfehler('f-lookup') }}
{% endset %} {% if passkey_weg or hat_totp %}
{{ ta.kein_zugriff_passkey_app if (passkey_weg and hat_totp) else (ta.kein_zugriff_passkey if passkey_weg else ta.handy_nicht_da) }} {{ lookup_form }}
{% else %}{{ lookup_form }}{% endif %} {% endif %} {% endif %}

{{ ta.ohne_faktor }}

{% elif ansicht in ("zugang", "bestaetigen") %}

{{ ta.zugang_titel if ansicht == "zugang" else ta.bestaetigen_titel }}

{{ ta.zugang_text if ansicht == "zugang" else ta.bestaetigen_text }}

{{ fehlerliste() }}{{ hinweise() }}
{{ csrf() }}
{{ feldfehler('f-adresse') }}
{% if ansicht == "zugang" %} {% if dienste_an %}

{{ ta.zugang_dienste }}

{% endif %}
{{ ta.postfach_frage }}

{{ ta.postfach_text }}

{% endif %}
{% else %}{# Konto & Anmeldewege (Settings-Flow) #}

{{ ta.konto_titel }}

{{ ta.konto_intro }}

{{ fehlerliste() }}{{ hinweise() }} {% if wiederhergestellt %}

{{ ta.wiederhergestellt }}

{% endif %} {% if absicht in ("passkey", "passwort") %}

{{ ta['absicht_' ~ absicht] }}

{% endif %}

{{ ta.schutz_titel | replace("{n}", schutz_stufe | string) }}

    {% for titel, unter in ta.schutz_stufen %}
  1. {{ titel }}{{ unter }}{% if loop.index <= schutz_stufe %} – {{ ta.erledigt }}{% endif %}
  2. {% endfor %}
{% if nutzer.schutz_an %}

{{ ta.schutz_an_text }}

{% else %}

{{ ta.postfach_schluessel }}

{{ ta.schutz_knopf }}

{% endif %}

{{ ta.passkeys_titel }}

{% if v.passkeys %}
    {% for p in v.passkeys %}
  • {{ p.name }}{% if p.angelegt %}{{ ta.angelegt | replace("{datum}", p.angelegt) }}{% endif %}
    {{ csrf() }}
  • {% endfor %}
{% else %}

{{ ta.passkeys_leer }}

{% endif %} {% if v.passkey_create %}
{{ csrf() }}

{% endif %}

{{ ta.passkey_geraet }}

{{ ta.app_titel }}

{% if v.totp_da %}

{{ ta.app_verbunden }}

{{ csrf() }}
{% else %}

{{ ta.app_fehlt }}

{{ ta.einrichten }}

{% endif %}
{% if v.verbunden or v.verbindbar or dienste_an %}

{{ ta.dienste_titel }}

{% if v.verbunden or v.verbindbar %}
    {% for d in v.verbunden %}
  • {{ ta.dienst_name[d] or d }}{{ ta.verbunden }}
    {{ csrf() }}
  • {% endfor %} {% for d in v.verbindbar %}
  • {{ ta.dienst_name[d] or d }}
    {{ csrf() }}
  • {% endfor %}
{% else %}

{{ ta.dienste_leer }}

{% endif %}
{% endif %}
{# Wiederherstellungscodes (Meldung 25.10.2026): vorhandene Codes nur bewusst ersetzen – Rückfrage per Häkchen, Timbre prüft sie auch serverseitig (neu_bestaetigt). „Codes anzeigen“ = lookup_secret_reveal (Kratos zeigt dieselben Codes). #} {% set w = wege or {} %}

{{ ta.s_codes_titel }}

{% if v.codes %} {% if v.codes_offen %}

{{ ta.codes_neu_offen if w.lookup_secret else ta.s_codes_text }}

{% else %}

{{ ta.s_codes_text }}

{% endif %} {% if v.codes_benutzt %}

{{ ta.codes_benutzt | replace("{n}", v.codes_benutzt | string) }}

{% endif %}

{% elif w.lookup_secret %}

{{ ta.codes_vorhanden }}

{% else %}

{{ ta.codes_fehlen }}

{% endif %} {% if v.codes and v.codes_offen %}
{{ csrf() }} {{ feldfehler('f-gesichert') }}
{% elif w.lookup_secret %} {% if v.codes_zeigen and not v.codes %}
{{ csrf() }}
{% endif %}
{{ ta.codes_neu }}
{{ csrf() }}

{{ ta.codes_neu_warnung }}

{{ feldfehler('f-codes-neu') }}
{% else %}
{{ csrf() }}
{% endif %}
{% if letzter_weg %}

{{ ta.letzter_weg_hinweis }}

{% endif %}

{{ ta.mail_titel }}

{{ nutzer.email }}
{{ ta.code_immer }}

{% if "password" in v.gruppen %}
{{ csrf() }}
{{ ta.passwort_regel }}{{ feldfehler('f-passwort') }} {{ schalter(tasten.passwort_zeigen, ta.passwort_anzeigen, klasse="klein an-nurjs", daten={"zeigen": "f-passwort"}) }}
{% endif %}

{{ ta.geraete_titel }}

{{ ta.geraete_text }}

{{ ta.loeschen_titel }}

{{ ta.loeschen_text }}

{{ ta.loeschen_link }}

{% endif %} {% endblock %}