{% extends "basis.html" %}{% set seiten_module = ("dig",) if modus in ('ansehen', 'export', 'erzeugen', 'regeln') else () %}{% block titel %}{{ (liste.name ~ ' – ' if liste else '') ~ t.playlists.titel }} – Timbre{% endblock %}{% block koerperklasse %} class="breit plweit"{% endblock %}{% block hauptklasse %} class="breit"{% endblock %}{% block weich %} data-weich{% endblock %}{% block inhalt %} {% set p = t.playlists %}{% set x = t.tagliste %}{% set g = t.generator %} {# Set bauen (23.10.2026): Menü „+ Playlist ▾“ (Set bauen · Intelligente Playlist · Leere Playlist). Ohne Skript verborgen wie früher „+ Neue Playlist“; setbau.js öffnet und schließt es (Enter, ↑/↓, Esc mit Fokus zurück). #} {% macro plusmenue(ort) %}{% endmacro %} {% macro zeichen(l) %}{% if l.art and l.art != 'fest' %}{% endif %}{% endmacro %} {% macro unsichtbar_intelligent(l) %}{% if l.art and l.art != 'fest' %} ({{ g.intelligent }}){% endif %}{% endmacro %} {# Reiter „Playlists“ (16.10.2026, konzept.md R2.3): Werkbank. Links die Schiene mit drei Gruppen (Deine Tag Lists · Geteilt mit dir *kommt* · Rekordbox-XML einlesen *kommt*), rechts je nach Adresse „Alle Listen“, „Welche Tag List?“ oder eine Tag List im Modus Ansehen · Export (je Modus eine URL; geordnet wird seit 24.10.2026 in Ansehen). Schiene, „Alle Listen“ und „Welche Tag List?“ stehen ohne Skript da; die Tag List selbst zeichnet tagliste.js (Werte aus N13). Unter 900 px wird die Schiene zur Zeile „Tag List: … ▾“, die ein Blatt mit denselben Einträgen öffnet. #} {% macro schiene(kennung) %} {# Store-Apps (iOS, Mac App Store) zeigen keine angekündigten Funktionen; die Mac-App kann XML schon einlesen (TP2 0915, 09.11.2026). „Die Platten zuerst“ (11.11.2026): mit Menü C stehen die „kommt“-Platzhalter auch im Web nicht mehr in der Arbeitsfläche. #} {% if not store_app and not menue_c %}

{{ p.geteilt }}

{{ p.geteilt_kurz }} {{ p.kommt }}

{% if not desktop_app %}

{{ p.einlesen }}

{{ p.einlesen_kurz }} {{ p.kommt }}

{% endif %}
{% endif %} {% endmacro %} {# Live-Demo (24.10.2026): /demo/set-bauen zeigt nur Generator bzw. Baukasten – ohne Schiene (die Tag Lists der Demo liegen im Browser und öffnen sich in der Library), mit dem Band der Demo darüber. #} {% if demo %}{% include "demo_band.html" %}{% endif %}
{% if not demo %}
{{ schiene("tl-listen") }}
{% endif %}
{% if not demo %}{% endif %} {% if modus == 'alle' %}

{{ p.eyebrow }}

{{ p.titel }}

{{ plusmenue("kopf") }}

{{ p.satz }}

{% if listen %}
{% for l in listen %}{% endfor %}
{{ p.caption_alle | replace('{n}', listen | length | string) | replace('{max}', max_listen | string) }}
{{ p.spalten.name }}{{ p.spalten.tracks }}{{ p.spalten.geaendert }}{{ p.spalten.aktionen }}
{{ zeichen(l) }}{{ l.name }}{{ unsichtbar_intelligent(l) }}{% if l.art and l.art != 'fest' %} {% endif %} {{ l.anzahl }}{{ l.geaendert_text }} {{ p.oeffnen }}{% if l.anzahl %}{{ p.exportieren }}{% else %}{% endif %}
{# Handy schlank, Phase 3b (07.11.2026): am Handy statt der Tabelle eine Liste – Name, Anzahl · Datum; Tipp auf die Zeile öffnet, „Exportieren“ und „Als Ziel für +“ stecken im „…“ (tagliste.js alleMenue, Blatt wie in der Listenansicht). Breit verborgen. #} {% set hl = t.plus.liste %} {% for l in listen if not l.anzahl %}

{{ p.leer_grund | replace('{name}', l.name) }}

{% endfor %} {% if not store_app and not menue_c %}

{{ p.zusammenfassung_kommt }} {{ p.kommt }}

{% endif %} {% else %}

{{ p.eyebrow }}

{{ p.leer_titel }}

{{ p.leer_text }}

{{ x.zur_library }}
{{ p.wie }}
    {% for w in x.leer_wege %}
  • {{ w }}
  • {% endfor %}
{% endif %} {% elif modus == 'welche' %}

{{ p.eyebrow_export }}

{{ p.welche }}

{% if listen | selectattr('anzahl') | list %}
{{ p.exportieren_aus }} {% set erste = (listen | selectattr('anzahl') | first).id %} {% for l in listen %}{% endfor %}

{% else %}

{{ p.keine_liste }}

{{ x.zur_library }}

{% endif %} {% elif modus in ('erzeugen', 'regeln') %} {# Set bauen bzw. Regel-Baukasten: setbau.js zeichnet die Seite aus N13 und der Konfiguration (setbau-daten). #}

{{ g.g_eyebrow if modus == 'erzeugen' else g.r_eyebrow }}

{% if modus == 'erzeugen' %}{{ g.g_titel_bearbeiten if setbau.liste else g.g_titel }}{% else %}{{ g.r_titel_bearbeiten if setbau.liste else g.r_titel }}{% endif %}

{# Lade-Wörter (static/lade_woerter.js): setbau.js startet sie hier, erst nach 500 ms sichtbar #}
{% else %}
{# „Die Platten zuerst“ (11.11.2026): mit Menü C ein Kopf in einer Zeile, ohne Eyebrow (tagliste.js listenKopf) #}

{{ t.bib.laedt }}

{# Export-Editor (28.10.2026): außerhalb von #tl-haupt – tagliste.js zeichnet den Kopf dort neu #} {# Plattenregal (10.11.2026): dieselbe Tag List als Kofferliste – Platten nach Fächern, Dateien als USB-Stick #} {# Variante C (10.11.2026): Raus steht an der Liste – Export und (mit Plattenregal) Etiketten und Koffer, rechts = später (Zeit) #} {# Store-Builds ohne Menü C (11.11.2026): weder Koffer noch Export/Etiketten an der Liste – Aufbau wie am 09.11. #} {% if not menue_c %}{% if not store_app and modus == "ansehen" and not demo and not paket_seite and tagliste_id and plattenregal_an() %}

{{ t.regal.koffer }}

{% endif %} {% elif modus == "ansehen" and not demo and not paket_seite and tagliste_id %}

{{ t.menue.export }}{% if plattenregal_an() %}{{ t.menue.etiketten }}{{ t.regal.koffer }} {% endif %}

{% endif %} {% if modus == "export" and not demo %}

{{ export_texte[sprache].einstieg_liste }}

{% endif %} {% endif %}
{% if not demo %}

{{ p.wahl_titel }}

{{ schiene(none) }}
{% endif %} {# Ohne verbundenen Onlinespeicher nennt die Seite ihn nirgends (wie die Library): die M3U8-Sätze fehlen dann. #} {# Rekordbox-Test 17.10.2026: Hinweis und Pfadwahl der M3U8 aus denselben Texten wie der Library-Dialog (bib.export_rb_*, bib.export_pfade*); tagliste.js füllt {ordner} aus musikordner.js (nur im Browser). Ohne verbundenen Speicher trägt keine Location einen echten Pfad – dann nur die Aufforderung (rb_ohne), kein Wort vom Speicher. #} {% set ex = dict(t.plexport, rb_ohne=t.bib.export_rb_ohne, rb_mit=t.bib.export_rb_mit, rb_link=t.bib.export_rb_link, pfade=t.bib.export_pfade, pfade_relativ=t.bib.export_pfade_relativ, pfade_absolut=t.bib.export_pfade_absolut) %} {# Live-Demo: „zurück“ führt in die Demo, der Speichern-Dialog sagt ehrlich, wo das Set bleibt und dass Export ein Konto braucht #} {% set gd = dict(zurueck_alle=t.demo.credits_zur_demo, sp_export=(t.demo.setbau_export_neu if demo_neu else t.demo.setbau_export), sp_los=(t.store.los_klein if neutral else t.demo.setbau_los_neu if demo_neu else t.demo.setbau_los), sp_los_href="/registrieren") if demo else {} %} {# Desktop-Paket (08.11.2026): Kennung aus der Adresse, „Alle Playlists“ aus GET /api/v1/taglisten (desktop_paket.py rendert ohne Konto) #} {% if paket_seite %}{% endif %} {% if modus in ('ansehen', 'export') %} {# Grid-Export (31.10.2026): Texte für den Schalter „Beatgrid mitgeben“ (static/grid_export.js, tagliste.js exportTeil) #} {% elif modus in ('erzeugen', 'regeln') %} {% endif %} {% if modus == 'erzeugen' and energiekurve() %} {% endif %} {% if modus in ('ansehen', 'export') %}{% endif %} {% endblock %}