{# Startseiten-Animation „vorher → nachher“ (Bau 06.11.2026, Zweig start-scrolly; Konzept docs/konzepte/2026-11-06-start-scrolly/): ein Makro je Szene (SVG, viewBox 480 × 400) und das Library-Fenster des Hero. Daten und Geometrie: startseite_szenen.py (`sz`), Texte: texte_szenen.py (`t.szenen`). Das Endbild steht im HTML; static/szenen.js (nachgeladen) setzt nur Klassen. Bewegte Teile tragen data-f (erste Phase), data-f2 (zweite Phase, .p2), data-c (Dateikarte → Zeile), data-w/-w2 (wachsen von links); ihre Startlage steht als --x/--y/--r/--s, die Verzögerung als --d im style-Attribut. Erfunden und als Beispiel markiert. #} {% import "symbole.html" as SY %} {% macro zaehler(z) %}{{ z.text }}{% endmacro %} {% macro keychip(k, x, y, w=34, h=20, stil=none, attr="data-f") %}{{ k.ok }}{% endmacro %} {% macro enchip(n, x, y, w=34, h=20, stil=none, attr="data-f", fs=11) %}{{ sz.ez[n] }}{% endmacro %} {# ---------- 1 · Chaos: Dateinamen fliegen durcheinander in den Ordner ---------- #} {% macro szene_chaos(S) %}{% set s = S.s %}{% set c = sz.chaos %} {{ s.ordner }}{{ s.beispiel }} {% for ch in c.chips %}{{ ch.name }}{% endfor %} {{ zaehler(c.zahl) }}{{ s.dateien }} {{ s.mit_bpm }} 0{{ s.mit_key }} 0{{ s.sortiert }} 0 {% endmacro %} {# ---------- 2 · Analyse: dieselben Dateikarten ordnen sich zur Liste (.an → .p2), dann kommen die Werte ---------- #} {% macro szene_analyse(S) %}{% set s = S.s %}{% set a = sz.analyse %} {{ s.titel }}BPM ●Key ●{{ s.energie_kurz }} ◆{{ s.genre_mix }} ◆ {% for z in a.zeilen %}{{ z.datei }} {{ z.titel }}{{ z.artist }} {{ z.bpm }}{{ keychip(z.key, 262, z.y + 13, stil=z.f_key, attr="data-f2") }}{{ enchip(z.en, 310, z.y + 13, stil=z.f_en, attr="data-f2") }}{% for b in z.band %}{% endfor %} {% endfor %} {{ zaehler(a.zahl) }}{{ s.analysiert | replace("{n}", sz.gesamt) }} ● {{ s.gemessen }}◆ {{ s.modell }} {% endmacro %} {# ---------- 3 · Klang: Mix-Oktagon baut sich im Uhrzeigersinn auf, Punkte ähnlicher Tracks fliegen in ihr Feld ---------- #} {% macro szene_oktagon(S) %}{% set s = S.s %}{% set o = sz.oktagon %} {% for y, w in o.reihen %}{{ s[w] }}{% endfor %} {{ s.mehr }}{{ s.weniger }} {{ s.beispiel }} {% for f in o.felder %} {% if f.mitte %}{{ s.jetzt }}{{ keychip(f.key, f.cx - 17, f.y + 26) }}{{ o.bpm }} BPM{{ s.energie }} ++ {% else %}{{ f.sym }} {{ f.n }}{% if f.wort %}{{ s[f.wort] }}{% endif %}{% for k in f.chips %}{{ keychip(k, k.x, k.y, w=30, h=17) }}{% endfor %}{% endif %} {% endfor %}{% for p in o.punkte %}{% endfor %} {{ zaehler(o.zahl) }}{{ s.passen }} ● {{ s.je_punkt }}{{ s.nah }} {% endmacro %} {# ---------- 4 · Ordnen: Energiekurve Opener → Closing (links → rechts = Zeit, oben = mehr), Playlists, Cover fächern sich auf und ordnen sich zum Plattenkoffer ---------- #} {% macro szene_ordnen(S) %}{% set s = S.s %}{% set k = sz.ordnen.kurve %}{% set ko = sz.ordnen.koffer %} {% for st in k.stufen %}{{ enchip(st.s, k.x0 - 40, st.y - 8, w=30, h=16, fs=10) }}{% endfor %} {% for p in k.punkte %}{% endfor %} {{ s.opener }}{{ s.peak }}{{ s.closing }} {{ s.tag_lists }} {% for l in sz.ordnen.listen %}{{ s.listen[loop.index0] }}{{ l.n }}{% endfor %} {# Plattenkoffer (08.11.2026, Zweig texte-koffer): acht Cover mit ihrer Platte fächern sich auf und ordnen sich zur Reihe im Koffer; Kreppband mit dem Szenario des Tages (sz.szenario), Zähler 0 → 38. Endbild = Reihe (ohne Skript, reduzierte Bewegung). #} {{ SY.plattenkoffer("s-ikon", 16, ko.x, 195) }}{{ s.koffer }} {% for c in ko.cover %}{% endfor %} {% set e = sz.szenario %}{{ e.name }} {{ zaehler(ko.zahl) }}{{ s.tracks }}{{ s.aus | replace("{n}", ko.gesamt) }} {{ s.beispiel }} {% endmacro %} {# ---------- 5 · Zurück: vier Listen wandern als Playlists nach Rekordbox (nur als Wort, kein Logo, keine Oberfläche) ---------- #} {% macro szene_zurueck(S) %}{% set s = S.s %}{% set z = sz.zurueck %}{% set zi = z.ziel %} {{ s.aus_timbre }}{{ s.beispiel }} {% for q in z.quellen %}{% set name = sz.szenario.name if q.koffer else s.listen[q.liste] %}{{ s.koffer if q.koffer else s.tag_list }}{{ name }}{{ q.n }} {% for p in q.pakete %}{% endfor %} {% endfor %}Rekordbox{{ s.ziel }} {% for r in zi.zeilen %}{{ sz.szenario.name if r.liste == 3 else s.listen[r.liste] }}{% endfor %} {{ zaehler(z.zahl) }}{{ s.zurueck }} {{ s.bleiben }}{{ s.dateien_bleiben }} {% endmacro %} {# ---------- Hero: Library-Fenster, das sich selbst füllt und den ersten Track spielt (nur CSS, kein Skript) ---------- #} {% macro fenster(S) %}{% set F = S.fenster %}{% set e = sz.erster %} {% endmacro %} {# Library-Fenster mit Umschalter „Ordner | Klang“ (11.11.2026, Zweig eindruck-start; nur im neuen Hero, start.html): zwei Radio-Felder vor dem Fenster, nur CSS (Geschwister-Selektor, werkzeuge/tokens_held.py) – „Klang“ ist von Anfang an gewählt (dieselben fünf Tracks, nach Tempo/Energie geordnet, mit allen Werten), „Ordner“ zeigt dieselben Dateien nach Dateiname und ohne Werte. Jede Ansicht ist ein eigenes Bild mit eigener Beschreibung; die abgewählte ist für alle unsichtbar. #} {% macro fenster_wahl(S) %}{% set F = S.fenster %}{% set e = sz.erster %}

{{ F.sortiert }}

{% endmacro %} {# ---------- Der Bereich unter dem Hero: Zeitleiste (klebt), fünf Szenen auf der Bühne, fünf Kapiteltexte ---------- #} {% macro scrolly(S) %}
{% set zahlen = [sz.gesamt, "", sz.passen, sz.koffer_n, sz.sortiert] %} {# „Mehr in der Hilfe“ je Kapitel (ersetzt die Links der alten Akte; Anker geprüft in tests/test_startseite.py) #} {% set hilfe_anker = [[], ["was-misst-timbre", "genres"], ["oktagon"], ["tagliste", "filtern"], ["rekordbox", "export"]] %} {% set bilder = [szene_chaos, szene_analyse, szene_oktagon, szene_ordnen, szene_zurueck] %} {% for k in S.kapitel %}{% set i = loop.index0 %} {% set p2 = {1: sz.analyse.p2, 3: sz.ordnen.p2}.get(i) %}
{{ bilder[i](S) }}

0{{ loop.index }} · {{ k[0] }}

{{ k[1] }}

{{ k[2] }}

{{ k[3] | replace("{name}", sz.szenario.name) }}

{% set anker = hilfe_anker[i] %}{% if anker %}

{{ t.leit.mehr }} {% for a in anker %}{{ t.hilfe.links[a] }}{% if not loop.last %}{% endif %}{% endfor %}

{% endif %}
{% endfor %}
{% endmacro %}