{% extends "basis.html" %}{% block titel %}{{ ax.seitentitel }}{% endblock %}{% block weich %} data-weich{% endblock %}{% block inhalt %} {# Analysen (23.10.2026, Variante A „Signalkette“ + Raster-Zeile aus C + Werte-Felder aus B; Konzept und Evaluation in .superpowers/sdd/2026-10-23-analysen-prototypen/). Ohne JavaScript steht der Stand beim Laden fertig da: Teile mit data-fuer erscheinen nur in ihren Zuständen (CSS über #ana[data-zustand]), der Verlauf geht mit
. analysen.js fragt danach /api/v1/analysen ab (alle 5 s, solange die Seite sichtbar ist) und trägt nur über textContent/Attribute ein. Bewegung nur über transform/opacity; reduzierte Bewegung: alles steht. Feste Höhen (Werte, Titel, Stationen) halten CLS 0. #} {% set z = a.zustand if a else "nichts" %}{% set j = a.jetzt if a else {} %}{% set l = a.lauf if a else {} %} {% set st = j.station if j and j.station is not none else -1 %}{% set ms = j.messung if j and j.messung is not none else -1 %} {% set pause_bis = a.speicher.pause_bis | uhrzeit if a and a.speicher.pause_bis else "" %} {% macro marken() %}{{ ax.pause_weiter | replace("{bis}", pause_bis) }}{{ ax.zustand.fehler }}{% endmacro %} {% macro pegel(klasse="") %}{% endmacro %} {% macro track_name(t) %}{{ (t.titel if t and t.titel else ax.ohne_namen) }}{% endmacro %} {% macro datei(t) %}{% if t and t.format %}{{ t.format }}{% if t.mb %} · {{ t.mb | string | dezimal(sprache) }} MB{% endif %}{% elif t and t.mb %}{{ t.mb | string | dezimal(sprache) }} MB{% endif %}{% endmacro %} {% macro lauf_eintrag(v, offen=false) %}{% set ges = v.gesamt or 0 %}
  • {{ v.beginn | kurzdatum(sprache) }} {{ v.beginn | uhrzeit }}–{{ v.ende | uhrzeit }} {{ ax.art[v.art] or v.art }} · {{ v.dauer_s | dauer }}{% if v.pausen %} · {{ ax.pause_n if v.pausen | length == 1 else ax.pausen_n | replace("{n}", v.pausen | length | string) }}{% endif %} {{ v.gemessen | zahl(sprache) }} {{ ax.gemessen }}{{ v.nicht_lesbar | zahl(sprache) }} {{ ax.nicht_lesbar }}{{ v.uebersprungen | zahl(sprache) }} {{ ax.uebersprungen }} {{ ges | zahl(sprache) }}
    {% if v.pausen %}
      {% for p in v.pausen %}
    • {{ ax.pause_zeile | replace("{von}", p.von | uhrzeit) | replace("{bis}", p.bis | uhrzeit) }}{% if p.grund %} · {{ ax.gruende.get(p.grund) or ax.pause_gruende.get(p.grund) or p.grund }}{% endif %}
    • {% endfor %}
    {% endif %} {% if v.gruende %}
      {% for g in v.gruende %}
    • {{ track_name(g) }}{% if g.artist %} {{ g.artist }}{% endif %}{% if g.format %} {{ datei(g) }}{% endif %} {{ ax.gruende.get(g.grund) or g.grund }}
    • {% endfor %}{% if v.gruende_mehr %}
    • {{ ax.gruende_mehr | replace("{n}", v.gruende_mehr | string) }}
    • {% endif %}
    {% endif %} {% if v.beispiele %}

    {{ ax.ok_tracks }}

    {{ v.beispiele | join(" · ") }}

    {% endif %} {% if v.gemessen and v.art == "analyse" %}

    {{ ax.zur_library }}

    {% endif %} {% if not v.pausen and not v.gruende and not v.beispiele %}

    –

    {% endif %}
  • {% endmacro %}
    {% if eb.lavalampe %}{% endif %}

    {{ ax.eyebrow }}

    {{ ax.titel }}

    {{ ax.lead }}

    {{ ax.jetzt }}

    {% for k in ["laeuft", "pause", "nichts", "fehler"] %}{{ ax.zustand[k] }}{% endfor %}
    {# 3er-Block Zahlen: Tracks (mit Raster-Zeile des Laufs) · Restzeit · Tempo #}
    {{ ax.zahlen_namen[0] }}
    {{ ax.n_von_m | replace("{n}", (l.n or 0) | zahl(sprache)) | replace("{m}", (l.m or 0) | zahl(sprache)) }}
    {% set ras = l.raster or "" %}{% set w = ras.count("w") + ras.count("a") %}
    {% for c in ras %}{% endfor %}
    {{ ax.raster_je | replace("{n}", (l.raster_je or 1) | string) }}
    {{ ax.zahlen_namen[1] }}
    {% if z == "pause" %}{{ ax.pause_weiter | replace("{bis}", pause_bis) }}{% elif z == "fehler" %}–{% else %}{{ rest(l.rest_s) }}{% endif %}
    {{ ax.zahlen_namen[2] }}
    {% if l.je_track_s %}{{ ax.je_track | replace("{s}", l.je_track_s | round | int | string) }}{% else %}–{% endif %}
    {# Meldungen je Zustand #}

    {{ ax.pause_titel | replace("{bis}", pause_bis) }}

    {{ ax.pause_gruende.get(a.speicher.hinweis) if a and a.speicher.hinweis else "" }} {{ ax.pause_text | replace("{bis}", pause_bis) }}

    {% set letzt = a.verlauf[0] if a and a.verlauf else none %}

    {{ ax.nichts_titel }}

    {% if letzt %}{{ (ax.nichts_text_eins if letzt.gemessen == 1 else ax.nichts_text) | replace("{datum}", letzt.ende | kurzdatum(sprache)) | replace("{n}", letzt.gemessen | zahl(sprache)) }}{% else %}{{ ax.nichts_leer }}{% endif %}

    {% set unb = a.speicher.unbekannt if a else 0 %}

    {{ ax.nichts_knopf_eins if unb == 1 else ax.nichts_knopf | replace("{n}", unb | zahl(sprache)) }}

    {% set fh = a.speicher.hinweis if a and a.speicher.hinweis in ["anmeldung", "schluessel", "adresse", "kontingent"] else ("kontingent" if a and a.warteschlange.kontingent_frei <= 0 else "allgemein") %}

    {{ ax.fehler_titel[fh] }}

    {{ ax.fehler_text | replace("{n}", (a.warteschlange.vorgemerkt if a else 0) | zahl(sprache)) }}

    {{ ax.fehler_knopf.kontingent if fh == "kontingent" else ax.fehler_knopf.speicher }}

    {# Strecke A: fünf Stationen wie ein Kanalzug, der Puls wandert, die Schiene füllt sich; Messen mit fünf LEDs #}
      {% for name in ax.stationen %}{% set i = loop.index0 %}
    1. {{ name }}{% if i < st %} – {{ ax.fertig_markiert }}{% elif i == st %} – {{ ax.jetzt_markiert }}{% endif %} {{ marken() }}{{ ax.stationen_hilfe[i] }} {% if i == 2 %}
        {% for m in ax.messungen %}{% set k = loop.index0 %}
      1. {{ m }}{% if st > 2 or (st == 2 and k < ms) %} – {{ ax.fertig_markiert }}{% elif st == 2 and k == ms %} – {{ ax.jetzt_markiert }}{% endif %}
      2. {% endfor %}
      {% endif %} {{ pegel("a-pegel") }}
    2. {% endfor %}

    {{ ax.gerade }}

    {% set tr = j.track if j else none %}

    {% if tr %}{{ track_name(tr) }}{% else %}–{% endif %}{{ tr.artist if tr else "" }}

    {{ datei(tr) }}{{ ax.wartet }}{{ ax.holt_gleich }}

    {{ pegel("ana-pegel-klein") }}{{ ax.live }}

    {% set f = a.fertig if a else none %}

    {{ ax.werte_titel }}{% if f %} · {{ track_name(f) }}{% endif %}

    {% set wv = f.werte if f else {} %}
    {{ ax.werte.bpm }}
    –{{ wv.bpm if wv.bpm else "" }}
    {{ ax.werte.key }}
    –{{ wv.key.text if wv.key else "" }}
    {{ ax.werte.energie }}
    –{{ wv.energie or "" }}
    {{ ax.werte.genre }}
    –{{ wv.genre.name if wv.genre else "" }} {% if wv.genre %}{{ wv.genre.prozent }} %{% endif %}
    {{ ax.werte.vocals }}
    –{% if f and wv.vocals is not none %}{{ wv.vocals }} %{% endif %}

    {{ ax.werte_leer }}

    {% if steckbrief() %}{# Library-Steckbrief (12.11.2026): nur mit dem Schalter TIMBRE_STECKBRIEF (app._steckbrief: nie Store-Fassungen, Live-Demo, Offline-Paket) – ist er aus, steht hier nichts. Der Weg liegt dort, wo die Frage entsteht: bei der Analyse. static/steckbrief_knopf.js zeigt die Zeile (ohne JavaScript bleibt sie verborgen) und lädt beim ersten Tipp static/steckbrief.js. #} {% endif %}{% if luecken() %}{# Lücken-Finder (12.11.2026): nur mit dem Schalter TIMBRE_LUECKEN (app._luecken: nie Store-Fassungen, Live-Demo, Offline-Paket) – ist er aus, steht hier nichts. Direkt beim Steckbrief: beide lesen dieselbe Analyse. static/luecken_knopf.js zeigt die Zeile (ohne JavaScript bleibt sie verborgen) und lädt beim ersten Tipp static/luecken.js. #} {% endif %}{% if dubletten() %}{# Dubletten (12.11.2026): nur mit dem Schalter TIMBRE_DUBLETTEN (app._dubletten: nie Store-Fassungen, Live-Demo, Offline-Paket) – ist er aus, steht hier nichts. Dritte Zeile bei Steckbrief und Lücken-Finder. static/dubletten_knopf.js zeigt die Zeile (ohne JavaScript bleibt sie verborgen) und lädt beim ersten Tipp static/dubletten.js. #} {% endif %}
    {% set ps = l.pausen or [] %}

    {{ ax.pausen }}

      {% for p in ps %}
    • {% if p.bis %}{{ ax.pause_zeile | replace("{von}", p.von | uhrzeit) | replace("{bis}", p.bis | uhrzeit) }}{% else %}{{ ax.pause_offen | replace("{von}", p.von | uhrzeit) }}{% endif %}{% if p.grund %} · {{ ax.pause_gruende.get(p.grund) or p.grund }}{% endif %}
    • {% endfor %}
    {% set nm = a.nachmessungen if a else [] %}

    {{ ax.nachmessung }} {% for x in nm %}{% if not loop.first %} · {% endif %}{{ (ax.nachmessung_pause if x.pausiert else ax.nachmessung_text) | replace("{art}", ax.nachmessung_arten[x.art]) | replace("{n}", x.n | zahl(sprache)) | replace("{m}", x.m | zahl(sprache)) | replace("{rest}", t.status.rest.noch | replace("{zeit}", rest(x.rest_s))) }}{% endfor %}

    {% if a and a.mail is not none %}
    {% endif %} {% if a and a.speicher.verbunden %}{% endif %}
    {% set ws = a.warteschlange if a else {"anzahl": 0, "naechste": [], "platz": none, "vorgemerkt": 0, "kontingent_frei": 0} %}

    {{ ax.warteschlange }}

    {{ ws.anzahl | zahl(sprache) }} {{ ax.vorgemerkt }}

    {{ ax.naechste }}

      {% for i in range(5) %}{% set n = ws.naechste[i] if ws.naechste | length > i else none %} {{ track_name(n) if n else "" }}{{ n.artist if n else "" }}{{ datei(n) if n else "" }}{% endfor %}
    {% set weiter = ws.weitere or 0 %}

    {{ ax.weitere | replace("{n}", weiter | zahl(sprache)) }}

    {% if ws.platz == 1 %}{{ ax.platz_eins }}{% elif ws.platz == 2 %}{{ ax.platz_ein_konto }}{% elif ws.platz %}{{ ax.platz | replace("{p}", ws.platz | string) | replace("{k}", (ws.platz - 1) | string) }}{% endif %}

    {% if ws.kontingent_frei >= ws.vorgemerkt %}{{ ax.reicht | replace("{n}", ws.vorgemerkt | zahl(sprache)) }}{% else %}{{ ax.reicht_teil | replace("{k}", ws.kontingent_frei | zahl(sprache)) | replace("{n}", ws.vorgemerkt | zahl(sprache)) }}{% endif %}

    {{ ax.leer }}

    {{ ax.verlauf }}

    {{ ax.verlauf_lead }}

    {% set ern = a.speicher.erneut if a else 0 %}

    {{ ax.erneut_hinweis }}

    {% set vl = verlauf_liste if verlauf_liste is defined and verlauf_liste is not none else (a.verlauf if a else []) %}
      {% for v in vl %}{{ lauf_eintrag(v, loop.first) }}{% endfor %}

    {{ ax.verlauf_leer }}

    {% set weiter_v = verlauf_weiter if verlauf_weiter is defined else (a.verlauf_weiter if a else false) %}

    {{ ax.aelter }}

    {{ ax.mail_hinweis }} {{ ax.mail_link }}.

    {% if steckbrief() %} {% endif %}{% if luecken() %} {% endif %}{% if dubletten() %} {% endif %} {% if eb.lavalampe %}{% endif %} {% endblock %}